HEX
Server: Apache
System: Linux cpanelx.inxs.ro 4.18.0-477.27.2.lve.el8.x86_64 #1 SMP Wed Oct 11 12:32:56 UTC 2023 x86_64
User: crowdandsafety (1041)
PHP: 8.1.34
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //proc/self/cwd/wp-content/plugins/cornerstone/includes/classes/Services/AdminDashboard.php
<?php

namespace Themeco\Cornerstone\Services;

use DomainException;
use Themeco\Cornerstone\Services\Routes;
use Themeco\Cornerstone\Util\CssAsset;
use Themeco\Cornerstone\Util\JsAsset;

class AdminDashboard implements Service {

  private $routes;
  private $jsAsset;
  private $cssAsset;
  private $permissions;


  public function __construct(
    Routes $routes,
    JsAsset $jsAsset,
    CssAsset $cssAsset,
    Permissions $permissions
  ) {
    $this->routes = $routes;
    $this->jsAsset = $jsAsset;
    $this->cssAsset = $cssAsset;
    $this->permissions = $permissions;
  }

  public function setup() {
    add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );

    $this->routes->add_route('post', 'dashboard-save', [$this, 'saveDashboard']);
  }

  /**
   * Update dashboard from params
   */
  public function saveDashboard($params = []) {
    if (!current_user_can('manage_options')) {
      throw new DomainException('User does not have permissions for `manage_options`');
    }

    $this->updateInternal($params);

    do_action('cs_dashboard_save', $params);

    return [
      'success' => true,
    ];
  }

  /**
   * Updates that are internally used
   */
  private function updateInternal($params) {
    // Product validation
    if (
      isset($params['cs_product_validation_key'])
      && $params['cs_product_validation_key'] !== get_option('cs_product_validation_key')
    ) {
      // @TODO Check validation
    }

    // Workspace Position / Side
    if (
      !empty($params['workspace_position'])
      && in_array($params['workspace_position'], ['left', 'right'])
    ) {
      update_option('cs_workspace_position_default', $params['workspace_position']);
    }

    // Custom App Slug
    if (isset($params['custom_app_slug'])) {
      cornerstone('Settings')->update([
        'custom_app_slug' => $params['custom_app_slug'],
      ]);
    }

    // Permissions
    if (!empty($params['role_manager'])) {
      $save_permissions = cornerstone('Permissions')->updateStoredPermissions( $params['role_manager'] );

      if ( is_wp_error( $save_permissions ) ) {
        return wp_send_json_error( $save_permissions );
      }
    }
  }

  /**
   * Launch dashboard app
   */
  public function launchDashboard() {
    do_action('cornerstone_before_boot_app');

    $dashboardApp = $this->jsAsset->get('assets/js/dashboard');

    $deps = [
      'wp-api-fetch',
      'jquery',
      'lodash',
      'moment',
      'react',
      'react-dom',
    ];

    wp_register_script( 'cs-dashboard', $dashboardApp['url'], $deps, $dashboardApp['version'] );

    // App config extras
    add_filter('cs_app_config', function($data) {
      $settings = get_option('cornerstone_settings', []);

      $app_url = apply_filters("cs_app_url", "");
      $max_url = $app_url . "/max";

      // Values for dashboard controls
      $values = [
        'cs_product_validation_key' => get_option('cs_product_validation_key', ''),
        'custom_app_slug' => cs_get_array_value($settings, 'custom_app_slug', ''),
        'workspace_position' => get_option('cs_workspace_position_default', 'right'),
        'max_url' => $max_url,
      ];

      $values = apply_filters('cs_dashboard_values', $values);

      $roleManagerData = $this->permissions->getAppData();

      $values['role_manager'] = $roleManagerData['permissions'];

      // @TODO move most of this
      $data['settings'] = [
        'role-manager' => $roleManagerData,
        'extensions' => apply_filters('cs_dashboard_extensions', []),
        'values' => $values,
      ];

      $data['app']['use_late_data'] = false;

      // Main data for JS app
      $data['dashboard_app'] = [
        'controls' => apply_filters('cs_dashboard_controls', $this->defaultControls()),
      ];

      // Localization
      $data['app']['shared']['admin_i18n'] = cornerstone('I18n')->group('admin');

      return $data;
    });

    add_filter('cs_app_gzip_data', '__return_false');

    $app = cornerstone('App');
    $app->setArgs([ 'permalinks' => [ '', '' ] ]);
    $app->setupAppConfig('cs-dashboard', false, false);

    wp_enqueue_script('cs-dashboard');

    // Root
    echo '<div id="tco-root"><h2>Loading...</h2></div>';

  }

  /**
   * Built in controls
   */
  private function defaultControls() {

    return [
      // General
      [
        'value' => 'general',
        'label' => __('General', CS_LOCALIZE),
        'options' => [
          'className' => 'tco-dashboard-tab-max-width',
        ],
        'controls' => apply_filters('cs_dashboard_general_controls', [
          // This is still handled by the validation page
          //[
            //'type' => 'license-validation',
            //'key' => 'cs_product_validation_key',
            //'label' => __('License Key', CS_LOCALIZE),
            //'description' => __('Place your Themeco license to unlock automatic updates, access to support, and Extensions', CS_LOCALIZE),
          //],

          // Custom Path
          [
            'type' => 'text',
            'key' => 'custom_app_slug',
            'label' => __('Path', CS_LOCALIZE),
            'description' => __('Set the location used to load Cornerstone. It will default to /cornerstone if not set.', CS_LOCALIZE),
            'options' => [
              'placeholder' => 'cornerstone',
            ],
          ],

          // Workspace Default
          [
            'type' => 'select',
            'key' => 'workspace_position',
            'label' => __('Workspace', CS_LOCALIZE),
            'description' => __('Set the location of the workspace in Cornerstone. See preferences in the app for more options.', CS_LOCALIZE),
            'options' => [
              'choices' => [
                [
                  'value' => 'left',
                  'label' => __('Workspace Left', CS_LOCALIZE),
                ],
                [
                  'value' => 'right',
                  'label' => __('Workspace Right', CS_LOCALIZE),
                ],
              ],
            ],
          ],

        ]),
      ],

      // Permissions
      [
        'value' => 'permissions',
        'label' => __('Permissions', CS_LOCALIZE),
        'options' => [
          'className' => 'tco-dash-tab-container-no-padding tco-dash-tab-container-role-manager',
        ],
        'controls' => [
          [
            'type' => 'role-manager',
            'key' => 'role_manager',
            'label' => __('Permissions', CS_LOCALIZE),
          ],
        ],
      ],

      // Extensions
      //[
        //'value' => 'extensions',
        //'label' => __('Extensions', CS_LOCALIZE),
        //'controls' => [
          //[
            //'type' => 'extension-manager',
            //'key' => 'extension',
            //'options' => [
              //'extension_key' => 'extensions',
              //'ignoreControlData' => true,
            //],
          //],

          //[
            //'type' => 'extension-manager',
            //'label' => __('Approved Plugins', 'cornerstone'),
            //'key' => 'extension',
            //'options' => [
              //'extension_key' => 'approvedPlugins',
              //'ignoreControlData' => true,
            //],
          //],
        //],
      //],

      // Max
      //[
        //'value' => 'max',
        //'label' => __('Max', CS_LOCALIZE),
        //'controls' => [
          //[
            //'type' => 'max-content',
            //'key' => 'max_content',
            //'options' => [
              //'ignoreControlData' => true,
            //],
          //],

          //[
            //'type' => 'extension-manager',
            //'key' => 'max_extensions',
            //'options' => [
              //'extension_key' => 'max',
              //'ignoreControlData' => true,
              //'is_max' => true,
            //],
          //],
        //],
      //],

      // Advanced
      [
        'value' => 'advanced',
        'label' => __('Advanced', CS_LOCALIZE),
        'controls' => (array)apply_filters('cs_dashboard_advanced_controls', []),
      ],

    ];
  }

  /**
   * Enqueue dashboard styles
   */
  public function enqueue($hook) {
    if ($hook === 'cornerstone_page_cornerstone-dashboard') {
      // Styles
      $app_style_asset = $this->cssAsset->get( "assets/css/app/dashboard");
      wp_register_style('cs_dashboard_style', $app_style_asset['url'], [
        'code-editor',
        'wp-auth-check'
      ], $app_style_asset['version']);
      wp_enqueue_style('cs_dashboard_style');
    }
  }
}