Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
immortalist
/
wp-content
/
plugins
/
tenweb-speed-optimizer
/
vendor
/
10web
/
authorization
/
src
:
Helper.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php namespace Tenweb_Authorization; use Tenweb_Authorization\ProductState; class Helper { private static $site_state = array(); private static $error_logs = array(); private static $plugins_state = array(); private static $themes_state = array(); private static $addons_state = array(); private static $domain_id; private static $instance; private static $network_domain_id; private static $auto_update_plugins; private $login_instance; public static $products_raw_data = array(); private static $installed_plugins_wp_info = null; private static $installed_themes_wp_info = null; private static $expiration = array( 'send_states' => array( 'expiration' => 43200,//12 hour 43200 'block_time' => 300,//5 minute 300 ), 'user_info' => array( 'expiration' => 43200,//12 hour 'block_time' => 300,//5 minute ), 'user_agreements' => array( 'expiration' => 43200,//12 hour 'block_time' => 300,//5 minute ), 'user_products' => array( 'expiration' => 86400,//24 hour 'block_time' => 300,//5 minute ), ); private static $plugins = array(); private static $themes = array(); private static $addons = array(); public static $notices = array(); public $last_response; public function __construct() { $this->login_instance = Login::get_instance(); self::$network_domain_id = get_site_option('tenweb_domain_id'); self::$domain_id = get_option('tenweb_domain_id'); } public static function get_site_info($blog_id = null, $reset = false) { if (self::$site_state != null && $reset === false && is_null($blog_id)) { return self::$site_state; } global $wp_version, $wpdb; if ((is_multisite() && is_null($blog_id)) || (is_multisite() && $blog_id == 'multisite')) { $home_url = network_admin_url();// or site_url $admin_url = network_admin_url(); $site_title = get_site_option('site_name'); } else { $home_url = get_home_url($blog_id); $admin_url = get_admin_url($blog_id); $site_title = get_bloginfo('name'); } $sql_version = $wpdb->get_var("SELECT VERSION() AS version"); if (is_multisite() && $blog_id && $blog_id != 'multisite') { $time_zone = get_blog_option($blog_id, 'timezone_string'); } else { $time_zone = get_option('timezone_string'); } if (empty($time_zone)) { $time_zone = date_default_timezone_get(); if (!$time_zone || empty($time_zone)) { $time_zone = "America/Los_Angeles"; } } $server_software = isset($_SERVER['SERVER_SOFTWARE']) && trim($_SERVER['SERVER_SOFTWARE']) !== '' ? $_SERVER['SERVER_SOFTWARE'] : 'unknown'; $iowd_version = defined('TENWEBIO_VERSION') ? 'iowd_'. TENWEBIO_VERSION : 'iowd_'; $site_info = array( 'platform' => 'wordpress', 'site_url' => $home_url, 'admin_url' => $admin_url, 'name' => $home_url, 'site_title' => $site_title, 'site_screenshot_url' => $home_url, 'platform_version' => $wp_version, 'php_version' => PHP_VERSION, 'mysql_version' => $sql_version, 'timezone' => $time_zone,//todo check on multisite 'server_type' => $server_software, 'server_version' => $server_software, 'other_data' => array( 'file_system' => array( 'method' => self::get_fs_method(), 'config' => self::check_fs_configs() ? 1 : 0 ), "is_network" => ((is_multisite()) ? 1 : 0), "blog_id" => $blog_id, "manager_version" => TENWEB_VERSION ), "is_network" => ((is_multisite()) ? 1 : 0), "manager_version" => get_site_option(TENWEB_PREFIX . '_from_image_optimizer') ? $iowd_version : TENWEB_VERSION, ); if (is_multisite() && is_numeric($blog_id)) { $blog_details = get_blog_details($blog_id); if (!empty($blog_details)) { $site_info['other_data']['multisite_data'] = array( 'registered' => $blog_details->registered, 'last_updated' => $blog_details->last_updated, ); } } self::$site_state = $site_info; return self::$site_state; } public static function get_blogs_info() { $domains = array(); if (is_multisite()) { $sites = get_sites(); foreach ($sites as $site) { $blog_time_zone = get_blog_option($site->blog_id, 'timezone_string'); if (empty($blog_time_zone)) { $blog_time_zone = date_default_timezone_get(); if (!$blog_time_zone || empty($blog_time_zone)) { $blog_time_zone = "America/Los_Angeles"; } } $blog_details = get_blog_details($site->blog_id); $domains[$site->blog_id]['site_url'] = get_home_url($site->blog_id); $domains[$site->blog_id]['admin_url'] = get_admin_url($site->blog_id); $domains[$site->blog_id]['site_title'] = $blog_details->blogname; $domains[$site->blog_id]['timezone'] = $blog_time_zone; $domains[$site->blog_id]['name'] = get_home_url($site->blog_id); } } return $domains; } public static function set_error_log($key, $msg) { $logs = self::get_error_logs(); $logs[$key] = array('msg' => $msg, 'date' => date('Y-m-d H:i:s')); $expiration = 31 * 24 * 60 * 60; set_site_transient(TENWEB_PREFIX . '_auth_error_logs', $logs, $expiration); self::$error_logs = $logs; } public static function clear_cache() { delete_site_transient(TENWEB_PREFIX . '_client_products_transient'); delete_site_transient(TENWEB_PREFIX . '_send_states_transient'); delete_site_transient(TENWEB_PREFIX . '_user_info_transient'); delete_site_transient(TENWEB_PREFIX . '_user_agreements_transient'); delete_site_option(TENWEB_PREFIX . '_requests_block'); } public static function check_site_state($force_send = false, $screen_id = null, $current_blog_id = null, $additional_data=null) { if (is_multisite()) { if (in_array($screen_id, array('options-general', 'site-info-network', 'plugins', 'themes'))) { switch_to_blog($current_blog_id); self::check_site_state_single($force_send, $current_blog_id); restore_current_blog(); } else if ($screen_id == 'settings-network') { self::check_site_state_single($force_send, 'multisite'); } else { self::check_site_state_single($force_send, 'multisite'); $sites = get_sites(); foreach ($sites as $site) { switch_to_blog($site->blog_id); self::check_site_state_single($force_send, $site->blog_id); restore_current_blog(); } } } else { self::check_site_state_single($force_send, null, $additional_data); } } public static function get_error_logs() { if (self::$error_logs == null) { $logs = get_site_transient(TENWEB_PREFIX . '_auth_error_logs'); if (!is_array($logs)) { $logs = array(); } self::$error_logs = $logs; } return self::$error_logs; } public static function remove_error_logs(){ delete_site_transient(TENWEB_PREFIX . '_auth_error_logs'); } private static function check_site_state_single($force_send, $blog_id = null, $additional_data=null) { $self = self::get_instance(); $self->set_products(); self::site_state($force_send, $blog_id, $additional_data); } public static function site_state($force_send = false, $current_blog_id = null, $additional_data=null) { $plugins_hash = get_option(TENWEB_PREFIX . '_plugins_state_hash'); $themes_hash = get_option(TENWEB_PREFIX . '_themes_state_hash'); $addons_hash = get_option(TENWEB_PREFIX . '_addons_state_hash'); if ($current_blog_id == 'multisite') { $site_hash = get_site_option(TENWEB_PREFIX . '_site_state_hash'); } else { $site_hash = get_option(TENWEB_PREFIX . '_site_state_hash'); } $plugins_current_state = md5(json_encode(self::$plugins_state)); $themes_current_state = md5(json_encode(self::$themes_state)); $addons_current_state = md5(json_encode(self::$addons_state)); $site_info = self::get_site_info($current_blog_id); $site_current_state = md5(json_encode($site_info)); if ($force_send === false) { /* transient expired after 12 hour*/ $transient = get_site_transient(TENWEB_PREFIX . '_send_states_transient'); } else { $transient = false; } $state_data = array("blog_id" => $current_blog_id); if ($current_blog_id != 'multisite') { if ($plugins_hash !== $plugins_current_state || $transient == false) { $state_data['plugins_info'] = array( "is_network" => ((is_multisite()) ? 1 : 0), "products" => self::states_to_array(self::$plugins_state) ); update_option(TENWEB_PREFIX . '_plugins_state_hash', $plugins_current_state); } if ($themes_hash !== $themes_current_state || $transient == false) { $state_data['themes_info'] = array( "is_network" => ((is_multisite()) ? 1 : 0), "products" => self::states_to_array(self::$themes_state) ); update_option(TENWEB_PREFIX . '_themes_state_hash', $themes_current_state); } if ($addons_hash !== $addons_current_state || $transient == false) { $state_data['addons_info'] = array( "is_network" => ((is_multisite()) ? 1 : 0), "products" => self::states_to_array(self::$addons_state) ); update_option(TENWEB_PREFIX . '_addons_state_hash', $addons_current_state); } } if ($site_hash !== $site_current_state || $transient == false) { $state_data['site_info'] = $site_info; if ($current_blog_id == 'multisite') { update_site_option(TENWEB_PREFIX . '_site_state_hash', $site_current_state); } else { update_option(TENWEB_PREFIX . '_site_state_hash', $site_current_state); } } if (!empty($state_data)) { if ($current_blog_id == 'multisite') { $domain_id = get_site_option('tenweb_domain_id'); } else { $domain_id = get_option('tenweb_domain_id'); } self::set_domain_id($domain_id); $result = self::send_site_state($state_data, $additional_data); $send_all_data = ( !empty($state_data['plugins_info']) && !empty($state_data['themes_info']) && !empty($state_data['addons_info']) && !empty($state_data['site_info']) ); if ($send_all_data == true && $result == true) { $expiration = self::$expiration['send_states']['expiration']; self::calc_request_block('send_states', true); } else { $block_count = self::calc_request_block('send_states'); $expiration = self::$expiration['send_states']['block_time'] * $block_count; } set_site_transient(TENWEB_PREFIX . '_send_states_transient', '1', $expiration); do_action('tenweb_state_changed'); } } public static function states_to_array($states = array()) { foreach ($states as $key => $state) { if ($state instanceof ProductState) { $states[$key] = $state->get_info(); } else { unset($states[$key]); } } if (!is_array($states)) { return array(); } return $states; } public static function send_site_state($data, $additional_data=null) { $connected_from = get_site_option(TENWEB_PREFIX . '_connected_from'); if ($connected_from == 'speed_optimizer') { $data = self::filter_plugins_data($data, $additional_data); } if(empty(self::$domain_id)) { self::$domain_id = get_option('tenweb_domain_id'); } $url = TENWEB_API_URL . '/site-state/' . self::$domain_id; if (!empty($data["site_info"])) { $data["site_info"]["other_data"] = json_encode($data["site_info"]["other_data"]); } $args = array( 'method' => 'POST', 'body' => array('data' => $data) ); $self = self::get_instance(); $response = $self->request($url, $args, 'send_site_state'); if ($response == null || isset($response['error'])) { false; } return true; } public static function set_domain_id($domain_id) { self::$domain_id = $domain_id; } public function request($url, $args = array(), $error_key = null) { $blocked_request_option = get_site_transient(TENWEB_PREFIX . '_refresh_request_count', 0); if ($blocked_request_option > 2 && $error_key !== 'check_single_token') { return null; } if ($this->check_url($url) === false) { return null; } if (empty($args['headers'])) { $args['headers'] = array(); } if ($error_key == null) { $error_key = uniqid(); } $args['headers']["Authorization"] = "Bearer " . $this->login_instance->get_access_token(); if (empty($args['headers']["Accept"])) { $args['headers']["Accept"] = "application/x.10webmanager.v1+json"; } $args['timeout'] = 50000; $result = wp_remote_request($url, $args); $this->last_response = $result; if (is_wp_error($result)) { self::set_error_log($error_key . '_wp_error', $result->get_error_message()); return null; } $body = json_decode($result['body'], true); unset($args['headers']["Authorization"]); //do not log Auth token $code = wp_remote_retrieve_response_code($result); $is_hosted_website = self::check_if_manager_mu(); /* token refresh */ if ( $code == 401 && isset($body['error']['status_code']) && $body['error']['status_code'] == 401 && isset($body['error']['message']) && $body['error']['message'] == '10WebError:Authorization Error') { self::set_error_log($error_key . '_token_error', json_encode($body['error'])); $in_progress_key = TENWEB_PREFIX . '_refreshing_token_in_progress'; $refreshing_token_in_progress = get_site_transient($in_progress_key); if ($refreshing_token_in_progress) { // Do NOT allow other refresh tokens while one of them is in progress return $body; } else { set_site_transient($in_progress_key, 1, 300); $token_refreshed = $this->refresh_token(); delete_site_transient($in_progress_key); if ($token_refreshed) { set_site_transient(TENWEB_PREFIX . '_refresh_request_count', ($blocked_request_option + 1), 3600 * 2); // 2 hours // repeat current request return $this->request($url, $args = array(), $error_key = null); } else { // error log already preserved // force logout, token_refresh failed if (!$is_hosted_website) { $this->login_instance->logout(false); } return $body; } } } else if ($code == 401) { // unknown authorization error self::set_error_log($error_key . '_api_auth_error', json_encode([$body['error'], $url, $args])); if (!$is_hosted_website) { $this->login_instance->logout(false); } return $body; } else if (isset($body['error'])) { // other errors self::set_error_log($error_key . '_api_error', json_encode([$body['error'], $url, $args])); } return $body; } public function check_url($url) { global $tenweb_services; $parsed_url = parse_url($url); return (in_array($parsed_url['host'], $tenweb_services)); } public static function check_if_manager_mu() { if (is_file(WPMU_PLUGIN_DIR . '/10web-manager/10web-manager.php')) { return true; } return false; } public function refresh_token() { $tokens_data = array( 'refresh_token' => $this->login_instance->get_refresh_token(), 'access_token' => $this->login_instance->get_access_token(), ); $url = TENWEB_API_URL . '/token/refresh'; $args = array( 'method' => 'POST', 'body' => $tokens_data, 'headers' => array( 'Accept' => "application/x.10webmanager.v1+json" ) ); $this->login_instance->set_access_token(false); $result = wp_remote_request($url, $args); if (is_wp_error($result)) { self::set_error_log('refresh_token_error', $result->get_error_message()); return false; } $res_array = json_decode($result['body'], true); if (isset($res_array['error'])) { /*API error */ self::set_error_log('refresh_token_error', json_encode($res_array['error'])); $this->login_instance->set_refresh_token(false); return false; } else if (isset($res_array['status']) && $res_array['status'] == 'ok') { /* success */ $access_token = isset($res_array['token']) ? $res_array['token'] : false; $refresh_token = isset($res_array['refresh_token']) ? $res_array['refresh_token'] : false; self::set_error_log('refresh_token_success', ($access_token ? 'A' : '') . ($refresh_token ? 'R' : '')); $this->login_instance->set_access_token($access_token); $this->login_instance->set_refresh_token($refresh_token); return true; } else { /* unknown error */ self::set_error_log('refresh_token_error', "unknown error"); return false; } } public static function calc_request_block($key, $reset = false) { $blocks = get_site_option(TENWEB_PREFIX . '_requests_block'); if (!is_array($blocks)) { $blocks = array(); } if ($reset == true) { $blocks[$key] = 0; update_site_option(TENWEB_PREFIX . '_requests_block', $blocks); return 1; } if (!isset($blocks[$key]) || $blocks[$key] < 0) { $blocks[$key] = 0; } $blocks[$key] = ($blocks[$key] == 0) ? 1 : $blocks[$key] * 2; if ($blocks[$key] > 200) { $blocks[$key] = 200; } update_site_option(TENWEB_PREFIX . '_requests_block', $blocks); return $blocks[$key]; } public static function get_fs_method() { require_once(ABSPATH . 'wp-admin/includes/file.php'); require_once(ABSPATH . 'wp-admin/includes/misc.php'); // extract_from_markers() wp-super-cache deactivation fatal error fix return get_filesystem_method(); } public static function check_fs_configs() { $fs_method = self::get_fs_method(); if ($fs_method == "direct") { return true; } $credentials['connection_type'] = $fs_method; $credentials['hostname'] = (defined('FTP_HOST')) ? FTP_HOST : ""; $credentials['username'] = (defined('FTP_USER')) ? FTP_USER : ""; $credentials['password'] = (defined('FTP_PASS')) ? FTP_PASS : ""; $credentials['public_key'] = (defined('FTP_PUBKEY')) ? FTP_PUBKEY : ""; $credentials['private_key'] = (defined('FTP_PRIKEY')) ? FTP_PRIKEY : ""; if ( (!empty($credentials['password']) && !empty($credentials['username']) && !empty($credentials['hostname'])) || ('ssh' == $credentials['connection_type'] && !empty($credentials['public_key']) && !empty($credentials['private_key'])) ) { return true; } else { return false; } } public static function get_instance() { if (null == self::$instance) { self::$instance = new self; } return self::$instance; } public function set_products($reset = false) { $in_progress_key = TENWEB_PREFIX . '_setting_products_in_progress'; $setting_products_in_progress = get_site_transient($in_progress_key); $plugins = get_site_option(TENWEB_PREFIX . '_plugins_list'); $themes = get_site_option(TENWEB_PREFIX . '_themes_list'); $addons = get_site_option(TENWEB_PREFIX . '_addons_list'); $transient = get_site_transient(TENWEB_PREFIX . '_client_products_transient'); if (($transient === false || $reset === true) && !$setting_products_in_progress) { set_site_transient($in_progress_key, 1, 300); $products = $this->get_products(); if (!(empty($products['plugins']) && empty($products['themes']) && empty($products['addons']))) { $plugins = $products['plugins']; $themes = $products['themes']; $addons = $products['addons']; update_site_option(TENWEB_PREFIX . '_plugins_list', $plugins); update_site_option(TENWEB_PREFIX . '_themes_list', $themes); update_site_option(TENWEB_PREFIX . '_addons_list', $addons); self::calc_request_block('user_products', true); $expiration = self::get_expiration('user_products'); $expiration = $expiration['expiration']; } else { $block_count = self::calc_request_block('user_products'); $expiration = self::get_expiration('user_products'); $expiration = $expiration['block_time'] * $block_count; } set_site_transient(TENWEB_PREFIX . '_client_products_transient', '1', $expiration); } //if first api call failed $plugins = (!is_array($plugins)) ? array() : $plugins; $themes = (!is_array($themes)) ? array() : $themes; $addons = (!is_array($addons)) ? array() : $addons; self::$products_raw_data = array('plugins' => $plugins, 'themes' => $themes, 'addons' => $addons); $products_objects = self::get_products_objects($plugins, $themes, $addons); self::$plugins = $products_objects['plugins']; self::$themes = $products_objects['themes']; self::$addons = $products_objects['addons']; delete_site_transient($in_progress_key); } public function get_products($type = 'all') { $result = array( 'plugins' => array(), 'themes' => array(), 'addons' => array() ); $endpoint = TENWEB_API_URL . '/products'; /*$data = $this->get_product_data_from_api($endpoint . '/plugins'); if (!empty($data)) { $result['plugins'] = $data; }*/ $data = $this->get_product_data_from_api($endpoint); if (!empty($data['plugins'])) { $result['plugins'] = $data['plugins']; } if (!empty($data['themes'])) { $result['themes'] = $data['themes']; } if (!empty($data['addons'])) { $result['addons'] = $data['addons']; } return $result; } public function get_product_data_from_api($url) { $args = array( 'method' => 'GET', ); $response = $this->request($url, $args, 'get_product_data'); if ($response == null || isset($response['error'])) { null; } if (!empty($response['data'])) { return $response['data']; } return array(); } public static function get_products_objects($plugins_data = array(), $themes_data = array(), $addons_data = array()) { if (!function_exists('get_plugins')) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } self::$plugins_state = array(); self::$addons_state = array(); self::$themes_state = array(); self::$auto_update_plugins = get_site_option('auto_update_plugins', array()); $site_installed_plugins = get_plugins(); //if domain hosted on 10Web $mu_plugins = get_mu_plugins(); if (isset($mu_plugins['tenweb-init.php'])) { $site_installed_plugins['10web-manager/10web-manager.php'] = $mu_plugins['tenweb-init.php']; } $site_installed_themes = wp_get_themes(array('errors' => null)); $plugins = self::get_plugins_objects($plugins_data, $site_installed_plugins); $addons = self::get_plugins_objects($addons_data, $site_installed_plugins, true); $themes = self::get_themes_objects($themes_data, $site_installed_themes); $result = array( 'plugins' => $plugins, 'addons' => $addons, 'themes' => $themes ); self::add_more_states($site_installed_plugins, $site_installed_themes); return $result; } private static function add_more_states($site_installed_plugins, $site_installed_themes) { foreach ($site_installed_plugins as $file_name => $installed_plugin) { $slug = explode('/', $file_name); $slug = $slug[0]; $found = false; foreach (self::$plugins_state as $state) { if ($state->slug === $slug) { $found = true; break; } } if ($found === false) { foreach (self::$addons_state as $state) { if ($state->slug === $slug) { $found = true; break; } } } if ($found === false) { $state = new ProductState( 0, $slug, $installed_plugin['Title'], $installed_plugin['Description'], 'plugin', $installed_plugin['Version'], 1 ); $state->set_active($file_name); $state->set_tenweb_product(false); $state->set_other_wp_info($file_name, $installed_plugin, self::get_installed_plugins_wp_info()); $state->set_is_autoupdate_enabled(in_array($file_name, self::$auto_update_plugins, true)); self::$plugins_state[] = $state; } } foreach ($site_installed_themes as $slug => $installed_theme) { $found = false; foreach (self::$themes_state as $state) { if ($state->slug === $slug) { $found = true; break; } } if ($found === false) { $state = new ProductState( 0, $slug, $installed_theme['Name'], $installed_theme->get('Description'), 'theme', $installed_theme['Version'], 1 ); $state->set_active($slug); $state->set_screenshot(self::get_theme_screenshot_url($slug)); $state->set_tenweb_product(false); $state->set_other_wp_info($slug, $installed_theme, self::get_installed_themes_wp_info()); self::$themes_state[] = $state; } } } private static function get_themes_objects($themes_data, $site_installed_themes) { $themes = array(); $installed_themes = array(); foreach ($themes_data as $theme_data) { if (isset($site_installed_themes[$theme_data['slug']])) { $installed_theme = $site_installed_themes[$theme_data['slug']]; $state = new ProductState( $theme_data['product_id'], $theme_data['slug'], $installed_theme['Name'], $installed_theme->get('Description'), 'theme', $installed_theme['Version'], 1 ); $state->set_active($theme_data['slug']); $state->set_screenshot(self::get_theme_screenshot_url($theme_data['slug'])); $state->set_is_paid($theme_data['current_version']); $state->set_other_wp_info($theme_data['slug'], $installed_theme, self::get_installed_themes_wp_info()); self::$themes_state[] = $state; $theme = new InstalledTheme( $state, $theme_data['product_id'], $theme_data['slug'], $theme_data['title'], $theme_data['description'] ); $theme->set_product_data($theme_data); $installed_themes[] = $theme; } else { $theme = new Product( $theme_data['product_id'], $theme_data['slug'], $theme_data['title'], $theme_data['description'], 'theme' ); $theme->set_product_data($theme_data); $themes[] = $theme; } } return array( 'installed_products' => $installed_themes, 'products' => $themes ); } private static function get_plugins_objects($plugins_data, $site_installed_plugins, $addons = false) { $plugins = array(); $installed_plugins = array(); $manager_exists = false; $installed_plugins_info = self::get_installed_plugins_wp_info(); foreach ($plugins_data as $plugin_data) { $plugin_slug = null; foreach ($site_installed_plugins as $slug => $plugin) { $slug_data = explode('/', $slug); if ($slug_data[0] == $plugin_data['slug']) { $plugin_slug = $slug; break; } } if ($plugin_slug != null) { $installed_plugin = $site_installed_plugins[$plugin_slug]; if ($plugin_data['product_id'] == TENWEB_MANAGER_ID) { $manager_exists = true; } $state = new ProductState( $plugin_data['product_id'], $plugin_data['slug'], $installed_plugin['Title'], $installed_plugin['Description'], 'plugin', $installed_plugin['Version'], 1 ); $state->set_active($plugin_slug); $state->set_is_paid($plugin_data['current_version']); $state->set_other_wp_info($plugin_slug, $installed_plugin, $installed_plugins_info); $state->set_is_autoupdate_enabled(in_array($plugin_slug, self::$auto_update_plugins, true)); if ($addons == true) { self::$addons_state[] = $state; } else { self::$plugins_state[] = $state; } $plugin = new InstalledPlugin( $state, $plugin_data['product_id'], $plugin_data['slug'], $plugin_data['title'], $plugin_data['description'], $plugin_slug ); $plugin->set_product_data($plugin_data); $installed_plugins[] = $plugin; } else { $plugin = new Product( $plugin_data['product_id'], $plugin_data['slug'], $plugin_data['title'], $plugin_data['description'] ); $plugin->set_product_data($plugin_data); $plugins[] = $plugin; } } if ($manager_exists == false && $addons == false && is_admin()) { $plugin = self::create_manager_plugin_object(); $installed_plugins[] = $plugin; $notice = "Fail on connection with api. <a href='#' class='tenweb_clear_cache_button'>Try again</a>"; self::add_notices($notice); } return array( 'installed_products' => $installed_plugins, 'products' => $plugins ); } public static function get_theme_screenshot_url($slug) { $theme_folder = get_theme_root(); $theme_folder .= '/' . $slug; //file extensions https://codex.wordpress.org/Theme_Development#Screenshot $file_name = ""; if (file_exists($theme_folder . '/screenshot.png')) { $file_name = 'screenshot.png'; } else if (file_exists($theme_folder . '/screenshot.jpg')) { $file_name = 'screenshot.jpg'; } else if (file_exists($theme_folder . '/screenshot.jpeg')) { $file_name = 'screenshot.jpeg'; } else if (file_exists($theme_folder . '/screenshot.gif')) { $file_name = 'screenshot.gif'; } if (!empty($file_name)) { $file = get_theme_root_uri(); $file .= '/' . $slug . '/' . $file_name; return $file; } else { return ""; } } public static function get_expiration($key) { return (isset(self::$expiration[$key])) ? self::$expiration[$key] : null; } public static function get_installed_plugins_wp_info() { if (self::$installed_plugins_wp_info === null) { include_once ABSPATH . WPINC . '/update.php'; wp_update_plugins(); self::$installed_plugins_wp_info = get_site_transient('update_plugins'); self::filter_installed_plugins_wp_info(); } return self::$installed_plugins_wp_info; } public static function get_installed_themes_wp_info() { if (self::$installed_themes_wp_info === null) { include_once ABSPATH . WPINC . '/update.php'; wp_update_themes(); self::$installed_themes_wp_info = get_site_transient('update_themes'); self::filter_installed_themes_wp_info(); } return self::$installed_themes_wp_info; } private static function filter_installed_plugins_wp_info() { $slugs = array( 'js_composer/js_composer.php', 'elementor-pro/elementor-pro.php', 'wordpress-seo-premium/wp-seo-premium.php' ); foreach ($slugs as $slug) { if (isset(self::$installed_plugins_wp_info->response[$slug])) { unset(self::$installed_plugins_wp_info->response[$slug]); } if (isset(self::$installed_plugins_wp_info->no_update[$slug])) { unset(self::$installed_plugins_wp_info->no_update[$slug]); } } } private static function filter_installed_themes_wp_info() { $slugs = array('divi'); foreach ($slugs as $slug) { if (isset(self::$installed_themes_wp_info->response[$slug])) { unset(self::$installed_themes_wp_info->response[$slug]); } } } public function get_amazon_tokens($product_id) { $url = TENWEB_API_URL . '/products/' . $product_id . '/request'; $args = array( 'method' => 'GET', ); $response = $this->request($url, $args, 'get_amazon_tokens'); if ($response == null || isset($response['error'])) { return null; } return $response; } public static function send_state_before_deactivation() { if (is_multisite()) { $sites = get_sites(); foreach ($sites as $site) { switch_to_blog($site->blog_id); self::send_state_before_deactivation_single(); restore_current_blog(); } } else { self::send_state_before_deactivation_single(); } } private static function send_state_before_deactivation_single() { $self = self::get_instance(); $self->set_products(); foreach (self::$plugins_state as $i => $state) { if ($state->product_id == TENWEB_MANAGER_ID) { $state->active = false; } } $manager_info = self::get_manager_info(); $result = self::send_site_state($manager_info); } public static function get_manager_info() { return array( 'site_info' => self::get_site_info(), 'plugins_info' => array( "is_network" => ((is_multisite()) ? 1 : 0), "products" => self::states_to_array(self::$plugins_state) ), 'themes_info' => array( "is_network" => ((is_multisite()) ? 1 : 0), "products" => self::states_to_array(self::$themes_state) ), 'addons_info' => array( "is_network" => ((is_multisite()) ? 1 : 0), "products" => self::states_to_array(self::$addons_state) ) ); } public static function get_site_full_state() { $plugins_state = array(); $themes_state = array(); $plugins = get_plugins(); foreach ($plugins as $slug => $plugin) { $state = new ProductState($slug, $slug, $plugin['Title'], $plugin['Description'], 'plugin', $plugin['Version'], 1); $state->set_active($slug); $plugins_state[] = $state->get_wp_info(); } $themes = wp_get_themes(array('errors' => null)); foreach ($themes as $slug => $theme) { $state = new ProductState($slug, $slug, $theme['Name'], $theme->get('Description'), 'theme', $theme['Version'], 1); $state->set_active($slug); $state->set_screenshot(self::get_theme_screenshot_url($slug)); $themes_state[] = $state->get_wp_info(); } return array( 'site_info' => self::get_site_info(), 'plugins' => $plugins_state, 'themes' => $themes_state ); } private static function create_manager_plugin_object() { $plugin_slug = explode('/', TENWEB_SLUG); $plugin_slug = $plugin_slug[0]; $state = new ProductState( TENWEB_MANAGER_ID, $plugin_slug, "10WEB Manager", "", 'plugin', "0.0.0", 1 ); $state->active = true; $state->is_paid = false; self::$plugins_state[] = $state; $plugin = new InstalledPlugin( $state, TENWEB_MANAGER_ID, $plugin_slug, "10WEB Manager", "", TENWEB_SLUG ); return $plugin; } public static function get_products_state() { return array( 'plugins' => self::$plugins_state, 'addons' => self::$addons_state, 'themes' => self::$themes_state ); } public static function get_site_info_diff($screen) { $current_blog_id = null; if (is_multisite()) { $current_blog_id = $screen->id == 'settings-network' ? 'multisite' : get_current_blog_id(); } $site_info = self::get_site_info($current_blog_id); $site_current_state = md5(json_encode($site_info)); if ($current_blog_id == 'multisite') { $site_hash = get_site_option(TENWEB_PREFIX . '_site_state_hash'); } else { $site_hash = get_option(TENWEB_PREFIX . '_site_state_hash'); } if ($site_hash !== $site_current_state) { return true; } return false; } public static function add_notices($notice_text, $error = true) { $container_class = "notice is-dismissible"; if ($error) { $container_class .= " error"; } if (!function_exists('get_current_screen')) { return false; } $screen = get_current_screen(); $notice = '<div class="' . $container_class . ' tenweb_manager_notice ' . ($screen !== null && $screen->parent_base == "tenweb_menu" ? "tenweb_menu_notice" : "") . '">' . '<p>' . $notice_text . '</p>' . '</div>'; self::$notices[] = $notice; } public function check_single_token($token, $check_for_network = false, $is_login = false, $email = null) { if ($check_for_network) { $domain_id = self::$network_domain_id; } else { $domain_id = self::$domain_id; } $body = array('one_time_token' => $token); if ($email) { $body['email'] = $email; } if ($is_login) { $body['is_login'] = true; } $args = array( 'method' => 'POST', 'body' => $body ); $url = TENWEB_API_URL . '/domains/' . $domain_id . '/check-single'; $response = $this->request($url, $args, 'check_single_token'); if ($response == null || isset($response['error'])) { return false; } return (!empty($response['status']) && $response['status'] == "ok"); } private static function filter_plugins_data($data, $additional_data=null) { $slugs = array( 'tenweb-speed-optimizer', 'image-optimizer-wd' ); foreach($data as $k => $v) { if ($k != "plugins_info" && $k != "site_info"){ unset($data[$k]); } else if ($k == "plugins_info") { foreach ($data["plugins_info"] as $key => $value) { if(!empty($value) and is_array($value)){ foreach ($value as $k=>$v){ if (!in_array($v["slug"], $slugs)){ unset($data["plugins_info"][$key][$k]); } else { if (!empty($additional_data) && isset($additional_data[$v["slug"]])){ $data["plugins_info"][$key][$k]["active"] = $additional_data[$v["slug"]]; } } } } } } } $data['plugins_info']['products'] = array_values($data['plugins_info']['products']); unset($data["themes_info"]); return $data; } }