Ansico-plugins/ansico-plugins/includes/class-ansico-plugins-installer.php

193 lines
8.4 KiB
PHP
Raw Permalink Normal View History

2026-04-18 20:50:31 +00:00
<?php
if (!defined('ABSPATH')) {
exit;
}
class Ansico_Plugins_Installer {
public function install_latest_release($repo_name, $slug) {
require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
require_once ABSPATH . 'wp-admin/includes/file.php';
require_once ABSPATH . 'wp-admin/includes/plugin.php';
$client = new Ansico_Plugins_Client();
$settings = Ansico_Plugins::get_settings();
$owner = $settings['forgejo_owner'];
$release = $client->get_latest_release($owner, $repo_name);
if (is_wp_error($release)) {
wp_die(esc_html($release->get_error_message()));
}
$zip_asset = $client->find_zip_asset($release);
if (!$zip_asset || empty($zip_asset['browser_download_url'])) {
wp_die(esc_html__('Ingen installérbar ZIP-fil fundet i seneste release.', 'ansico-plugins'));
}
add_filter('http_request_args', array($this, 'inject_auth_header'), 10, 2);
if (!function_exists('get_current_screen')) {
require_once ABSPATH . 'wp-admin/includes/screen.php';
}
set_current_screen('plugins_page_ansico-plugins-catalog');
require_once ABSPATH . 'wp-admin/admin-header.php';
$existing_plugin_file = $this->find_existing_plugin_file($owner, $repo_name, $slug);
$is_update = '' !== $existing_plugin_file;
echo '<div class="wrap">';
echo '<h1>' . esc_html(sprintf($is_update ? __('Opdaterer %s', 'ansico-plugins') : __('Installerer %s', 'ansico-plugins'), $repo_name)) . '</h1>';
$skin = new Automatic_Upgrader_Skin();
$upgrader = new Plugin_Upgrader($skin);
if ($is_update) {
$result = $upgrader->run(array(
'package' => $zip_asset['browser_download_url'],
'destination' => WP_PLUGIN_DIR,
'clear_destination' => true,
'clear_working' => true,
'hook_extra' => array(
'plugin' => $existing_plugin_file,
'type' => 'plugin',
'action' => 'update',
),
));
} else {
$result = $upgrader->install($zip_asset['browser_download_url']);
}
remove_filter('http_request_args', array($this, 'inject_auth_header'), 10);
if (is_wp_error($result) || false === $result) {
$message = is_wp_error($result) ? $result->get_error_message() : __('Plugin installation mislykkedes.', 'ansico-plugins');
echo '<div class="notice notice-error"><p>' . esc_html($message) . '</p></div>';
echo '<p><a class="button" href="' . esc_url(admin_url('plugins.php?page=ansico-plugins-catalog')) . '">' . esc_html__('Tilbage til Ansico Plugins', 'ansico-plugins') . '</a></p>';
echo '</div>';
require_once ABSPATH . 'wp-admin/admin-footer.php';
exit;
}
$plugin_file = $is_update ? $existing_plugin_file : $upgrader->plugin_info();
if ($plugin_file) {
$repo = $client->get_repository($owner, $repo_name);
Ansico_Plugins::set_managed_plugin($plugin_file, array(
'slug' => $slug,
'owner' => $owner,
'repo' => $repo_name,
'description' => !is_wp_error($repo) && !empty($repo['description']) ? $repo['description'] : '',
'repo_html_url' => !is_wp_error($repo) && !empty($repo['html_url']) ? $repo['html_url'] : '',
));
wp_clean_plugins_cache(true);
}
echo '<div class="notice notice-success"><p>' . esc_html($is_update ? __('Plugin opdateret.', 'ansico-plugins') : __('Plugin installeret.', 'ansico-plugins')) . '</p></div>';
echo '<p><a class="button button-secondary" href="' . esc_url(admin_url('plugins.php?page=ansico-plugins-catalog')) . '">' . esc_html__('Tilbage til Ansico Plugins', 'ansico-plugins') . '</a> ';
if ($plugin_file && function_exists('is_plugin_inactive') && is_plugin_inactive($plugin_file)) {
$activate_url = wp_nonce_url(admin_url('plugins.php?action=activate&plugin=' . rawurlencode($plugin_file)), 'activate-plugin_' . $plugin_file);
echo '<a class="button button-primary" href="' . esc_url($activate_url) . '">' . esc_html__('Aktivér plugin', 'ansico-plugins') . '</a> ';
}
echo '<a class="button" href="' . esc_url(admin_url('plugins.php')) . '">' . esc_html__('Gå til Plugins', 'ansico-plugins') . '</a></p>';
echo '</div>';
require_once ABSPATH . 'wp-admin/admin-footer.php';
exit;
}
public function delete_plugin($repo_name, $plugin_file) {
require_once ABSPATH . 'wp-admin/includes/file.php';
require_once ABSPATH . 'wp-admin/includes/plugin.php';
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
if ('' === $plugin_file || !file_exists(WP_PLUGIN_DIR . '/' . ltrim($plugin_file, '/'))) {
wp_die(esc_html__('Pluginfil blev ikke fundet.', 'ansico-plugins'));
}
if (!function_exists('deactivate_plugins')) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
}
if (!function_exists('get_current_screen')) {
require_once ABSPATH . 'wp-admin/includes/screen.php';
}
set_current_screen('plugins_page_ansico-plugins-catalog');
require_once ABSPATH . 'wp-admin/admin-header.php';
echo '<div class="wrap">';
echo '<h1>' . esc_html(sprintf(__('Afinstallerer %s', 'ansico-plugins'), $repo_name)) . '</h1>';
if (is_plugin_active($plugin_file)) {
deactivate_plugins($plugin_file, true);
}
$result = delete_plugins(array($plugin_file));
if (is_wp_error($result) || !$result) {
$message = is_wp_error($result) ? $result->get_error_message() : __('Plugin kunne ikke afinstalleres.', 'ansico-plugins');
echo '<div class="notice notice-error"><p>' . esc_html($message) . '</p></div>';
echo '<p><a class="button" href="' . esc_url(admin_url('plugins.php?page=ansico-plugins-catalog')) . '">' . esc_html__('Tilbage til Ansico Plugins', 'ansico-plugins') . '</a></p>';
echo '</div>';
require_once ABSPATH . 'wp-admin/admin-footer.php';
exit;
}
$managed = Ansico_Plugins::get_managed_plugins();
if (isset($managed[$plugin_file])) {
unset($managed[$plugin_file]);
update_option(ANSICO_PLUGINS_MANAGED_OPTION, $managed, false);
}
wp_clean_plugins_cache(true);
echo '<div class="notice notice-success"><p>' . esc_html__('Plugin afinstalleret.', 'ansico-plugins') . '</p></div>';
echo '<p><a class="button button-primary" href="' . esc_url(admin_url('plugins.php?page=ansico-plugins-catalog')) . '">' . esc_html__('Tilbage til Ansico Plugins', 'ansico-plugins') . '</a></p>';
echo '</div>';
require_once ABSPATH . 'wp-admin/admin-footer.php';
exit;
}
private function find_existing_plugin_file($owner, $repo_name, $slug) {
if (!function_exists('get_plugins')) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
}
$managed_plugins = Ansico_Plugins::get_managed_plugins();
foreach ($managed_plugins as $plugin_file => $meta) {
if (!empty($meta['owner']) && !empty($meta['repo']) && $meta['owner'] === $owner && $meta['repo'] === $repo_name) {
return $plugin_file;
}
}
$plugins = get_plugins();
$slug = sanitize_title($slug);
foreach ($plugins as $plugin_file => $data) {
if (dirname($plugin_file) === $slug) {
return $plugin_file;
}
}
return '';
}
public function inject_auth_header($args, $url) {
$settings = Ansico_Plugins::get_settings();
$base = trailingslashit($settings['forgejo_base_url']);
if (empty($settings['access_token']) || strpos($url, $base) !== 0) {
return $args;
}
if (empty($args['headers']) || !is_array($args['headers'])) {
$args['headers'] = array();
}
$args['headers']['Authorization'] = 'token ' . trim((string) $settings['access_token']);
$args['sslverify'] = !empty($settings['verify_ssl']);
return $args;
}
}