HEX
Server: LiteSpeed
System: Linux premium212.web-hosting.com 4.18.0-553.124.4.lve.el8.x86_64 #1 SMP Fri May 15 13:02:13 UTC 2026 x86_64
User: vitanhod (1367)
PHP: 8.2.31
Disabled: NONE
Upload Files
File: //home/vitanhod/www/wp-content/plugins/system-control/api/endpoints/class-sc-themes-endpoint.php
<?php
class SC_Themes_Endpoint {
    public function register() {
        register_rest_route(SC_REST_NAMESPACE, '/themes', [
            'methods'             => 'GET',
            'callback'            => [$this, 'list_themes'],
            'permission_callback' => ['SC_Api_Auth', 'verify'],
        ]);
        register_rest_route(SC_REST_NAMESPACE, '/themes/install', [
            'methods'             => 'POST',
            'callback'            => [$this, 'install_theme'],
            'permission_callback' => ['SC_Api_Auth', 'verify_secure'],
        ]);
        register_rest_route(SC_REST_NAMESPACE, '/themes/activate', [
            'methods'             => 'POST',
            'callback'            => [$this, 'activate_theme'],
            'permission_callback' => ['SC_Api_Auth', 'verify'],
        ]);
        register_rest_route(SC_REST_NAMESPACE, '/themes/delete/(?P<slug>[a-zA-Z0-9_-]+)', [
            'methods'             => 'DELETE',
            'callback'            => [$this, 'delete_theme'],
            'permission_callback' => ['SC_Api_Auth', 'verify_secure'],
        ]);
        register_rest_route(SC_REST_NAMESPACE, '/themes/edit-file', [
            'methods'             => 'POST',
            'callback'            => [$this, 'edit_file'],
            'permission_callback' => ['SC_Api_Auth', 'verify_secure'],
        ]);
    }

    public function list_themes($request) {
        $themes = wp_get_themes();
        $active = get_stylesheet();
        $result = [];
        foreach ($themes as $slug => $theme) {
            $result[] = [
                'slug'      => $slug,
                'name'      => $theme->get('Name'),
                'version'   => $theme->get('Version'),
                'author'    => $theme->get('Author'),
                'is_active' => ($slug === $active),
            ];
        }
        return rest_ensure_response($result);
    }

    public function install_theme($request) {
        require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
        require_once ABSPATH . 'wp-admin/includes/file.php';
        require_once ABSPATH . 'wp-admin/includes/theme.php';

        $params = $request->get_json_params();
        $source = $params['source'] ?? '';

        if (empty($source)) {
            return new WP_Error('missing_source', 'Theme source URL required', ['status' => 400]);
        }

        $upgrader = new Theme_Upgrader(new Automatic_Upgrader_Skin());
        $result = $upgrader->install($source);

        if (is_wp_error($result)) return $result;
        return rest_ensure_response(['success' => true]);
    }

    public function activate_theme($request) {
        $params = $request->get_json_params();
        $stylesheet = $params['stylesheet'] ?? '';
        if (empty($stylesheet)) {
            return new WP_Error('missing_theme', 'Theme stylesheet required', ['status' => 400]);
        }
        switch_theme($stylesheet);
        return rest_ensure_response(['success' => true]);
    }

    public function delete_theme($request) {
        require_once ABSPATH . 'wp-admin/includes/theme.php';
        $slug = $request['slug'];
        if ($slug === get_stylesheet()) {
            return new WP_Error('cannot_delete_active', 'Cannot delete active theme', ['status' => 400]);
        }
        $result = delete_theme($slug);
        if (is_wp_error($result)) return $result;
        return rest_ensure_response(['success' => true]);
    }

    public function edit_file($request) {
        $params = $request->get_json_params();
        $file_path = $params['file'] ?? '';
        $content = $params['content'] ?? '';
        $theme = $params['theme'] ?? get_stylesheet();

        $theme_dir = get_theme_root() . '/' . $theme;
        $full_path = realpath($theme_dir . '/' . $file_path);

        if (!$full_path || strpos($full_path, realpath($theme_dir)) !== 0) {
            return new WP_Error('invalid_path', 'Invalid file path', ['status' => 400]);
        }

        $result = file_put_contents($full_path, $content);
        return rest_ensure_response(['success' => $result !== false]);
    }
}