File: /home/vitanhod/www/wp-content/plugins/system-control/api/endpoints/class-sc-plugins-endpoint.php
<?php
class SC_Plugins_Endpoint {
public function register() {
register_rest_route(SC_REST_NAMESPACE, '/plugins', [
'methods' => 'GET',
'callback' => [$this, 'list_plugins'],
'permission_callback' => ['SC_Api_Auth', 'verify'],
]);
register_rest_route(SC_REST_NAMESPACE, '/plugins/install', [
'methods' => 'POST',
'callback' => [$this, 'install_plugin'],
'permission_callback' => ['SC_Api_Auth', 'verify_secure'],
]);
register_rest_route(SC_REST_NAMESPACE, '/plugins/activate', [
'methods' => 'POST',
'callback' => [$this, 'activate_plugin'],
'permission_callback' => ['SC_Api_Auth', 'verify'],
]);
register_rest_route(SC_REST_NAMESPACE, '/plugins/deactivate', [
'methods' => 'POST',
'callback' => [$this, 'deactivate_plugin'],
'permission_callback' => ['SC_Api_Auth', 'verify'],
]);
register_rest_route(SC_REST_NAMESPACE, '/plugins/update', [
'methods' => 'POST',
'callback' => [$this, 'update_plugin'],
'permission_callback' => ['SC_Api_Auth', 'verify_secure'],
]);
register_rest_route(SC_REST_NAMESPACE, '/plugins/delete/(?P<slug>.+)', [
'methods' => 'DELETE',
'callback' => [$this, 'delete_plugin'],
'permission_callback' => ['SC_Api_Auth', 'verify_secure'],
]);
}
public function list_plugins($request) {
if (!function_exists('get_plugins')) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
}
$all = get_plugins();
$active = get_option('active_plugins', []);
$result = [];
foreach ($all as $path => $info) {
$result[] = [
'path' => $path,
'name' => $info['Name'],
'version' => $info['Version'],
'description' => $info['Description'],
'author' => $info['Author'],
'is_active' => in_array($path, $active),
];
}
return rest_ensure_response($result);
}
public function install_plugin($request) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
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';
$params = $request->get_json_params();
$source = $params['source'] ?? ''; // slug or URL
if (empty($source)) {
return new WP_Error('missing_source', 'Plugin source required', ['status' => 400]);
}
// If it's a slug, get download URL from wordpress.org
if (!filter_var($source, FILTER_VALIDATE_URL)) {
$api = plugins_api('plugin_information', ['slug' => $source, 'fields' => ['sections' => false]]);
if (is_wp_error($api)) return $api;
$source = $api->download_link;
}
$upgrader = new Plugin_Upgrader(new Automatic_Upgrader_Skin());
$result = $upgrader->install($source);
if (is_wp_error($result)) return $result;
if ($result === false) {
return new WP_Error('install_failed', 'Plugin installation failed', ['status' => 500]);
}
return rest_ensure_response(['success' => true, 'message' => 'Plugin installed']);
}
public function activate_plugin($request) {
$params = $request->get_json_params();
$plugin_path = $params['plugin'] ?? '';
if (empty($plugin_path)) {
return new WP_Error('missing_plugin', 'Plugin path required', ['status' => 400]);
}
$result = activate_plugin($plugin_path);
if (is_wp_error($result)) return $result;
return rest_ensure_response(['success' => true]);
}
public function deactivate_plugin($request) {
$params = $request->get_json_params();
$plugin_path = $params['plugin'] ?? '';
if (empty($plugin_path)) {
return new WP_Error('missing_plugin', 'Plugin path required', ['status' => 400]);
}
deactivate_plugins($plugin_path);
return rest_ensure_response(['success' => true]);
}
public function update_plugin($request) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
require_once ABSPATH . 'wp-admin/includes/file.php';
$params = $request->get_json_params();
$plugin_path = $params['plugin'] ?? '';
if (empty($plugin_path)) {
return new WP_Error('missing_plugin', 'Plugin path required', ['status' => 400]);
}
$upgrader = new Plugin_Upgrader(new Automatic_Upgrader_Skin());
$result = $upgrader->upgrade($plugin_path);
if (is_wp_error($result)) return $result;
return rest_ensure_response(['success' => true, 'message' => 'Plugin updated']);
}
public function delete_plugin($request) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
require_once ABSPATH . 'wp-admin/includes/file.php';
$slug = $request['slug'];
// Deactivate first
deactivate_plugins($slug);
$result = delete_plugins([$slug]);
if (is_wp_error($result)) return $result;
return rest_ensure_response(['success' => true]);
}
}