192 lines
8.4 KiB
PHP
192 lines
8.4 KiB
PHP
<?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;
|
|
}
|
|
}
|