Server : Apache System : Linux pod-100823:apache2_74:v0.5.7 5.4.0-1138-gcp #147~18.04.1-Ubuntu SMP Mon Oct 7 21:46:26 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33.7 Disable Function : apache_child_terminate,apache_get_modules,apache_get_version,apache_getenv,apache_note,apache_setenv,disk_free_space,disk_total_space,diskfreespace,dl,exec,fastcgi_finish_request,link,opcache_compile_file,opcache_get_configuration,opcache_invalidate,opcache_is_script_cached,opcache_reset,passthru,pclose,pcntl_exec,popen,posix_getpid,posix_getppid,posix_getpwuid,posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setuid,posix_uname,proc_close,proc_get_status,proc_nice,proc_open,proc_terminate,realpath_cache_get,shell_exec,show_source,symlink,system Directory : /nas/content/live/attorneyexperi/wp-content/plugins/worker/ |
<?php function mwp_autoload($class) { if (substr($class, 0, 8) === 'Symfony_' || substr($class, 0, 8) === 'Monolog_' || substr($class, 0, 5) === 'Gelf_' || substr($class, 0, 4) === 'MWP_' || substr($class, 0, 4) === 'MMB_' ) { $file = dirname(__FILE__).'/src/'.str_replace('_', '/', $class).'.php'; if (file_exists($file)) { include_once $file; } } } /** * @return Monolog_Psr_LoggerInterface */ function mwp_logger() { return mwp_container()->getLogger(); } /** * @return MWP_WordPress_Context */ function mwp_context() { return mwp_container()->getWordPressContext(); } function mwp_worker_configuration() { return mwp_container()->getConfiguration(); } function mwp_format_memory_limit($limit) { if ((string)(int)$limit === (string)$limit) { // The number is numeric. return mwp_format_bytes($limit); } $units = strtolower(substr($limit, -1)); if (!in_array($units, array('b', 'k', 'm', 'g'))) { // Invalid size unit. return $limit; } $number = substr($limit, 0, -1); if ((string)(int)$number !== $number) { // The number isn't numeric. return $number; } switch ($units) { case 'g': return $number.' GB'; case 'm': return $number.' MB'; case 'k': return $number.' KB'; case 'b': default: return $number.' B'; } } function mwp_format_bytes($bytes) { $bytes = (int)$bytes; if ($bytes > 1024 * 1024 * 1024) { return round($bytes / 1024 / 1024 / 1024, 2).' GB'; } elseif ($bytes > 1024 * 1024) { return round($bytes / 1024 / 1024, 2).' MB'; } elseif ($bytes > 1024) { return round($bytes / 1024, 2).' KB'; } return $bytes.' B'; } function cleanup_delete_worker($params = array()) { $revision_params = get_option('mmb_stats_filter'); $revision_limit = isset($revision_params['plugins']['cleanup']['revisions']) ? str_replace('r_', '', $revision_params['plugins']['cleanup']['revisions']) : 5; $params_array = explode('_', $params['actions']); $return_array = array(); foreach ($params_array as $param) { switch ($param) { case 'revision': if (mmb_delete_all_revisions($revision_limit)) { $return_array['revision'] = 'OK'; } else { $return_array['revision_error'] = 'OK, nothing to do'; } break; case 'overhead': if (mmb_handle_overhead(true)) { $return_array['overhead'] = 'OK'; } else { $return_array['overhead_error'] = 'OK, nothing to do'; } break; case 'comment': if (mmb_delete_spam_comments()) { $return_array['comment'] = 'OK'; } else { $return_array['comment_error'] = 'OK, nothing to do'; } break; default: break; } } unset($params); mmb_response($return_array, true); } function mmb_num_revisions($leaveRevsPerPost) { global $wpdb; $query = "SELECT SUM(t.cnt) FROM (SELECT COUNT(ID) - {$leaveRevsPerPost} as cnt FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_parent != 0 GROUP BY post_parent HAVING COUNT(ID) > {$leaveRevsPerPost}) as t"; return $wpdb->get_var($query); } function mmb_delete_all_revisions($filter) { global $wpdb; $num_rev = isset($filter['num_to_keep']) ? (int)str_replace("r_", "", $filter['num_to_keep']) : 5; $allRevisions = $wpdb->get_results("SELECT post_parent FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_parent != 0 GROUP BY post_parent HAVING COUNT(ID) > {$num_rev}"); if (!is_array($allRevisions)) { return false; } foreach ($allRevisions as $revision) { $toKeep = $wpdb->get_results("SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_parent = '{$revision->post_parent}' ORDER BY post_date DESC LIMIT ".$num_rev); $keepArray = array(); foreach ($toKeep as $keep) { $keepArray[] = $keep->ID; } if (empty($keepArray)) { continue; } $keepQuery = implode(', ', $keepArray); $wpdb->query("DELETE FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_parent = '{$revision->post_parent}' AND ID NOT IN ({$keepQuery})"); } return true; } function mmb_handle_overhead($clear = false) { /** @var wpdb $wpdb */ global $wpdb; $query = 'SHOW TABLE STATUS'; $tables = $wpdb->get_results($query, ARRAY_A); $tableOverhead = 0; $tablesToOptimize = array(); foreach ($tables as $table) { if (!isset($table['Engine']) || $table['Engine'] !== 'MyISAM' || $table['Data_free'] == 0) { continue; } if ($wpdb->base_prefix === $wpdb->prefix && !preg_match('/^'.preg_quote($wpdb->prefix).'/Ui', $table['Name'])) { continue; } if ($wpdb->base_prefix !== $wpdb->prefix && !preg_match('/^'.preg_quote($wpdb->prefix).'\d+_/Ui', $table['Name'])) { continue; } $tableOverhead += $table['Data_free'] / 1024; $tablesToOptimize[] = $table['Name']; } if (!$clear) { // we should only return the overhead return round($tableOverhead, 3); } $optimize = true; foreach ($tablesToOptimize as $tableToOptimize) { $query = 'OPTIMIZE TABLE '.$tableToOptimize; $optimize = ((bool)$wpdb->query($query)) && $optimize; } return $optimize; } function mmb_num_spam_comments() { global $wpdb; $sql = "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = 'spam'"; $num_spams = $wpdb->get_var($sql); return $num_spams; } function mmb_delete_spam_comments() { global $wpdb; $spam = 1; $total = 0; while (!empty($spam)) { $getCommentsQuery = "SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' LIMIT 1000"; $spam = $wpdb->get_results($getCommentsQuery); if (empty($spam)) { break; } $commentIds = array(); foreach ($spam as $comment) { $commentIds[] = $comment->comment_ID; // Avoid queries to comments by caching the comment. // Plugins which hook to 'delete_comment' might call get_comment($id), which in turn returns the cached version. wp_cache_add($comment->comment_ID, $comment, 'comment'); do_action('delete_comment', $comment->comment_ID); wp_cache_delete($comment->comment_ID, 'comment'); } $commentIdsList = implode(', ', array_map('intval', $commentIds)); $wpdb->query("DELETE FROM {$wpdb->comments} WHERE comment_ID IN ($commentIdsList)"); $wpdb->query("DELETE FROM {$wpdb->commentmeta} WHERE comment_id IN ($commentIdsList)"); $total += count($spam); if (!empty($spam)) { usleep(10000); } } return $total; } function mwp_is_nio_shell_available() { static $check; if (isset($check)) { return $check; } try { $process = new Symfony_Process_Process("cd .", dirname(__FILE__), array(), null, 1); $process->run(); $check = $process->isSuccessful(); } catch (Exception $e) { $check = false; } return $check; } function mwp_is_shell_available() { if (mwp_container()->getParameter('disable_shell')) { return false; } if (mwp_is_safe_mode()) { return false; } if (!function_exists('proc_open') || !function_exists('escapeshellarg')) { return false; } $neededFunction = array('proc_get_status', 'proc_open'); $disabledFunction = mwp_get_disabled_functions(); if (count(array_diff($neededFunction, $disabledFunction)) != count($neededFunction)) { return false; } if (!mwp_is_nio_shell_available()) { return false; } return true; } function mwp_get_disabled_functions() { $list = array_merge(explode(',', ini_get('disable_functions')), explode(',', ini_get('suhosin.executor.func.blacklist'))); $list = array_map('trim', $list); $list = array_map('strtolower', $list); $list = array_filter($list); return $list; } function mwp_is_safe_mode() { $value = ini_get("safe_mode"); if ((int)$value === 0 || strtolower($value) === "off") { return false; } return true; } function mmb_response($response = false, $success = true) { if (!$success) { if (!is_scalar($response)) { $response = json_encode($response); } throw new MWP_Worker_Exception(MWP_Worker_Exception::GENERAL_ERROR, $response); } throw new MWP_Worker_ActionResponse($response); } function mmb_remove_site($params) { mwp_core()->deactivate(false, false); mwp_remove_current_key(); mmb_response( array( 'removed_data' => 'Site removed successfully. <br /><br /><b>ManageWP Worker plugin was not deactivated.</b>', ), true ); } function mwp_get_stats(array $params) { mwp_context()->requireWpRewrite(); mwp_context()->requireTaxonomies(); mwp_context()->requirePostTypes(); mwp_context()->requireTheme(); mwp_logger()->debug('Starting get_stats after everything was required'); $return = mwp_core()->get_stats_instance()->get_stats($params); mmb_response($return); } function mmb_update_worker_plugin($params) { if (!empty($params['version'])) { $recoveryKit = new MwpRecoveryKit(); update_option('mwp_incremental_update_active', time()); try { $files = $recoveryKit->recover($params['version']); } catch (Exception $e) { update_option('mwp_incremental_update_active', ''); throw $e; } update_option('mwp_incremental_update_active', ''); mmb_response(array('files' => $files, 'success' => 'ManageWP Worker plugin successfully updated'), true); } else { mmb_response(mwp_core()->update_worker_plugin($params), true); } } function mmb_install_addon($params) { mwp_context()->requireTheme(); mwp_load_required_components(); $return = mwp_core()->get_installer_instance()->install_remote_file($params); mmb_response($return, true); } function mmb_do_upgrade($params) { mwp_context()->requireTheme(); $return = mwp_core()->get_installer_instance()->do_upgrade($params); mmb_response($return, true); } function mmb_bulk_action_comments($params) { $return = mwp_core()->get_comment_instance()->bulk_action_comments($params); if (is_array($return) && array_key_exists('error', $return)) { mmb_response($return['error'], false); } else { mmb_response($return, true); } } function mmb_add_user($params) { $return = mwp_core()->get_user_instance()->add_user($params); if (is_array($return) && array_key_exists('error', $return)) { mmb_response($return['error'], false); } else { mmb_response($return, true); } } function mmb_edit_users($params) { $users = mwp_core()->get_user_instance()->edit_users($params); $response = 'User updated.'; $check_error = false; foreach ($users as $username => $user) { $check_error = is_array($user) && array_key_exists('error', $user); if ($check_error) { $response = $username.': '.$user['error']; } } mmb_response($response, !$check_error); } function mmb_iframe_plugins_fix($update_actions) { foreach ($update_actions as $key => $action) { $update_actions[$key] = str_replace('target="_parent"', '', $action); } return $update_actions; } function mmb_execute_php_code($params) { ob_start(); $errorHandler = new MWP_Debug_EvalErrorHandler(); set_error_handler(array($errorHandler, 'handleError')); if (!empty($params['code64'])) { $params['code'] = base64_decode(substr($params['code64'], 2)); } $returnValue = eval($params['code']); // This code handles the "Execute PHP Snippet" functionality on ManageWP and is not a security issue. $errors = $errorHandler->getErrorMessages(); restore_error_handler(); $return = array('output' => ob_get_clean(), 'returnValue' => $returnValue); if (count($errors)) { $return['errorLog'] = $errors; } $lastError = error_get_last(); $fatalError = null; if (($lastError !== null) && ($lastError['type'] & (E_PARSE | E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR)) && (strpos($lastError['file'], __FILE__) !== false) && (strpos($lastError['file'], 'eval()') !== false) ) { $return['fatalError'] = $lastError; } mmb_response($return, true); } function mmb_upload_file_action($params) { $transactions = getUploadMessages(); if (!file_exists($params['file_path'])) { mmb_response(array('message' => $transactions['path_not_exist'], 'ok' => false), true); } if (!is_writable($params['file_path'])) { mmb_response(array('message' => $transactions['permissions_denied'], 'ok' => false), true); } $pathName = $params['file_path']; if (substr($pathName, -1) !== '/') { $pathName = $pathName.'/'; } $filePath = $pathName.$params['file_name']; if (file_exists($filePath) && !$params['overwrite']) { mmb_response(array('message' => $transactions['file_exist'], 'ok' => false), true); } $file = fopen($filePath, 'w'); if (!fwrite($file, base64_decode($params['content']))) { mmb_response(array('message' => $transactions['upload_failed'], 'ok' => false), true); } fclose($file); $isWritable = is_writable($filePath); $result = array( 'pathName' => $filePath, 'fileName' => basename($filePath), 'date' => filemtime($filePath), 'permissions' => substr(sprintf('%o', fileperms($filePath)), -4), 'fileType' => pathinfo($filePath, PATHINFO_EXTENSION), 'fileSize' => filesize($filePath), 'hasSubDir' => false, 'writable' => $isWritable, 'editable' => $isWritable ); mmb_response(array('message' => $transactions['upload_success'], 'ok' => true, 'result' => $result), true); } function mmb_edit_plugins_themes($params) { $return = mwp_core()->get_installer_instance()->edit($params); mmb_response($return, true); } function mmb_worker_brand($params) { $worker_brand = get_option('mwp_worker_brand'); $current_from_orion = !empty($worker_brand['from_orion']) ? $worker_brand['from_orion'] : false; $from_orion = !empty($params['brand']['from_orion']) ? $params['brand']['from_orion'] : false; if ($from_orion === false && $current_from_orion !== $from_orion) { mmb_response(true, true); //@TODO: Maybe return mmb_response(true, false) return; } update_option("mwp_worker_brand", $params['brand']); mmb_response(true, true); } function mmb_maintenance_mode($params) { global $wp_object_cache; $default = get_option('mwp_maintenace_mode'); $params = empty($default) ? $params : array_merge($default, $params); update_option("mwp_maintenace_mode", $params); if (!empty($wp_object_cache)) { @$wp_object_cache->flush(); } mmb_response(true, true); } function mmb_plugin_actions() { global $pagenow, $current_user, $mmode; if (!is_admin() && !(defined('WP_CLI') && WP_CLI) && !in_array($pagenow, array('wp-login.php'))) { $mmode = get_option('mwp_maintenace_mode'); if (!empty($mmode)) { if (isset($mmode['active']) && $mmode['active'] == true) { $status_code = empty($mmode['status_code']) ? 503 : $mmode['status_code']; if (!empty($current_user->ID) && !empty($mmode['hidecaps'])) { $usercaps = array(); if (isset($current_user->caps) && !empty($current_user->caps)) { $usercaps = $current_user->caps; } foreach ($mmode['hidecaps'] as $cap => $hide) { if (!$hide) { continue; } foreach ($usercaps as $ucap => $val) { if ($ucap == $cap) { ob_end_clean(); ob_end_flush(); if (!headers_sent()) { if ($status_code == 503) { header(sprintf('%s 503 Service Unavailable', isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1'), true, $status_code); } else { header(sprintf('%s %d Service Unavailable', isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1', $status_code), true, $status_code); } } die($mmode['template']); } } } } else { if (!headers_sent()) { if ($status_code == 503) { header(sprintf('%s 503 Service Unavailable', isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1'), true, 503); } else { header(sprintf('%s %d Service Unavailable', isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1', $status_code), true, $status_code); } } die($mmode['template']); } } } } if (file_exists(dirname(__FILE__).'/log')) { unlink(dirname(__FILE__).'/log'); } } function mwb_edit_redirect_override($location = false, $comment_id = false) { if (isset($_COOKIE[MMB_XFRAME_COOKIE])) { $location = get_site_url().'/wp-admin/edit-comments.php'; } return $location; } function mwp_set_plugin_priority() { $pluginBasename = 'worker/init.php'; $activePlugins = get_option('active_plugins'); if (!is_array($activePlugins) || reset($activePlugins) === $pluginBasename) { return; } $workerKey = array_search($pluginBasename, $activePlugins); if ($workerKey === false || $workerKey === null) { return; } unset($activePlugins[$workerKey]); array_unshift($activePlugins, $pluginBasename); update_option('active_plugins', array_values($activePlugins)); } /** * @return MMB_Core */ function mwp_core() { static $core; if (!$core instanceof MMB_Core) { $core = new MMB_Core(); } return $core; } /** * Auto-loads classes that may not exists after this plugin's update. */ function mwp_load_required_components() { class_exists('MWP_Http_ResponseInterface'); class_exists('MWP_Http_Response'); class_exists('MWP_Http_LegacyWorkerResponse'); class_exists('MWP_Http_JsonResponse'); class_exists('MWP_Worker_ActionResponse'); class_exists('MWP_Worker_Exception'); class_exists('MWP_Event_ActionResponse'); class_exists('MWP_Event_MasterResponse'); } function mwp_uninstall() { delete_option('mwp_core_autoupdate'); delete_option('mwp_recovering'); delete_option('mwp_container_parameters'); delete_option('mwp_container_site_parameters'); $loaderName = '0-worker.php'; try { $mustUsePluginDir = rtrim(WPMU_PLUGIN_DIR, '/'); $loaderPath = $mustUsePluginDir.'/'.$loaderName; if (!file_exists($loaderPath)) { return; } $removed = @unlink($loaderPath); if (!$removed) { $error = error_get_last(); throw new Exception(sprintf('Unable to remove loader: %s', $error['message'])); } } catch (Exception $e) { mwp_logger()->error('Unable to remove loader', array('exception' => $e)); } } function mwp_get_service_key() { $serviceKey = mwp_context()->optionGet('mwp_service_key'); if (empty($serviceKey)) { $serviceKey = mwp_generate_uuid4(); mwp_context()->optionSet('mwp_service_key', $serviceKey, true); } return $serviceKey; } function mwp_get_communication_keys() { return mwp_context()->optionGet('mwp_communication_keys', array()); } function mwp_remove_current_key() { mwp_remove_communication_key(!empty($_SERVER['HTTP_MWP_SITE_ID']) ? $_SERVER['HTTP_MWP_SITE_ID'] : 'any'); } function mwp_remove_communication_key($siteId) { if ($siteId === 'any') { mwp_context()->optionDelete('mwp_communication_key'); return; } $keys = mwp_context()->optionGet('mwp_communication_keys', array()); if (empty($keys[$siteId])) { return; } unset($keys[$siteId]); mwp_context()->optionSet('mwp_communication_keys', $keys, true); } function mwp_get_basic_communication_key() { $key = mwp_context()->optionGet('mwp_communication_key'); if (!empty($key)) { mwp_context()->optionSet('mwp_key_last_used_any', time(), true); } return $key; } function mwp_add_as_site_communication_key($key) { $siteId = !empty($_SERVER['HTTP_MWP_SITE_ID']) ? $_SERVER['HTTP_MWP_SITE_ID'] : null; if (empty($siteId)) { return; } $keys = mwp_context()->optionGet('mwp_communication_keys', array()); if (is_array($keys) && !empty($keys[$siteId])) { return; } mwp_accept_potential_key($key); } function mwp_get_communication_key($id = null) { $siteId = !empty($_SERVER['HTTP_MWP_SITE_ID']) ? $_SERVER['HTTP_MWP_SITE_ID'] : $id; if (empty($siteId)) { return mwp_get_basic_communication_key(); } $keys = mwp_context()->optionGet('mwp_communication_keys', array()); if (is_array($keys) && !empty($keys[$siteId])) { mwp_context()->optionSet('mwp_key_last_used_'.$siteId, time(), true); return $keys[$siteId]['key']; } return mwp_get_basic_communication_key(); } function mwp_accept_potential_key($keyToAccept = '') { $siteId = !empty($_SERVER['HTTP_MWP_SITE_ID']) ? $_SERVER['HTTP_MWP_SITE_ID'] : null; $addKey = !empty($keyToAccept) ? $keyToAccept : mwp_get_potential_key(); if (!empty($siteId)) { $keys = mwp_context()->optionGet('mwp_communication_keys', array()); if (empty($keys) || !is_array($keys)) { $keys = array(); } $time = time(); $keys[$siteId] = array( 'key' => $addKey, 'added' => $time, ); mwp_context()->optionSet('mwp_communication_keys', $keys, true); mwp_context()->optionSet('mwp_key_last_used_'.$addKey, $time, true); } else { mwp_context()->optionSet('mwp_communication_key', $addKey, true); } mwp_context()->optionDelete('mwp_potential_key', true); mwp_context()->optionDelete('mwp_potential_key_time', true); return $addKey; } function mwp_get_potential_key() { $potentialKey = mwp_context()->optionGet('mwp_potential_key', null); $potentialKeyTime = mwp_context()->optionGet('mwp_potential_key_time', 0); $now = time(); if (empty($potentialKey) || empty($potentialKeyTime) || !is_numeric($potentialKeyTime) || ($now - $potentialKeyTime) > 86400) { $potentialKey = mwp_generate_uuid4(); $potentialKeyTime = $now; mwp_context()->optionSet('mwp_potential_key', $potentialKey, true); mwp_context()->optionSet('mwp_potential_key_time', $potentialKeyTime, true); } return $potentialKey; } function mwp_provision_keys() { mwp_get_service_key(); mwp_get_potential_key(); } function mwp_add_post_to_link_monitor_check($postId) { if (wp_get_post_parent_id($postId) !== 0) { return; } $postsToSendToLinkMonitor = mwp_context()->transientGet('mwp_link_monitor_posts'); if ($postsToSendToLinkMonitor === false) { $postsToSendToLinkMonitor = array(); } if (in_array($postId, $postsToSendToLinkMonitor)) { return; } $postsToSendToLinkMonitor[] = $postId; //transient will expire after 30 days from time of update mwp_context()->transientSet('link_monitor_posts', $postsToSendToLinkMonitor, 2592000); } function mwp_link_monitor_cron_recurrence_interval($schedules) { $schedules['every_five_minutes'] = array( 'interval' => 300, 'display' => __('Every 5 Minutes') ); return $schedules; } function mwp_generate_uuid4() { $data = null; if (function_exists('openssl_random_pseudo_bytes')) { $data = @openssl_random_pseudo_bytes(16); } if (empty($data)) { $data = ''; for ($i = 0; $i < 16; ++$i) { $data .= chr(mt_rand(0, 255)); } } $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100 $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10 return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); } function mwp_refresh_live_public_keys($params = array()) { $liveKeys = null; $lastResponse = null; $servers = array('cdn.managewp.com', 'keys.managewp.com'); foreach ($servers as $server) { if (!empty($liveKeys)) { continue; } $lastResponse = mwp_get_and_decode_public_keys($server); if (is_array($lastResponse) && !empty($lastResponse['keys']) && !empty($lastResponse['success'])) { $liveKeys = $lastResponse['keys']; } } if (empty($liveKeys)) { return $lastResponse; } mwp_context()->optionSet('mwp_public_keys_refresh_time', time(), true); mwp_context()->optionSet('mwp_public_keys', $liveKeys, true); return $lastResponse; } function mwp_get_and_decode_public_keys($domain) { $liveContent = mwp_get_public_keys_from_live($domain); if ($liveContent['success'] === false) { return array( 'success' => false, 'message' => $liveContent['message'], ); } $liveContent = $liveContent['result']; if (empty($liveContent)) { return array( 'success' => false, 'message' => 'Empty content received from live.', ); } $liveKeys = @json_decode($liveContent, true); if (empty($liveKeys)) { return array( 'success' => false, 'message' => 'Could not json decode the received keys. Received: '.$liveKeys, ); } return array( 'success' => true, 'keys' => $liveKeys, ); } function mwp_get_public_keys_from_live($domain) { $result = wp_remote_get("https://$domain/public-keys"); if (!is_array($result) || empty($result['body'])) { return mwp_get_public_keys_from_live_fallback($domain); } return array( 'success' => true, 'result' => $result['body'], ); } function mwp_get_public_keys_from_live_fallback($domain) { $fixedDomainMap = array( 'keys.managewp.com' => '216.69.138.218', ); $originalDomain = $domain; $domain = dns_resolve_key_domain($domain); if (preg_match('/^\d+\.\d+\.\d+\.\d+$/', $domain) !== 1 && !empty($fixedDomainMap[$domain])) { $domain = $fixedDomainMap[$domain]; } $transportToUse = get_secure_protocol(); if ($transportToUse == null) { return array( 'success' => false, 'message' => 'Could not find a transport to use.', ); } $socket = @stream_socket_client("$transportToUse://$domain:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, @stream_context_create(array( 'ssl' => array( 'peer_name' => $originalDomain, 'verify_peer' => true, 'verify_peer_name' => true, 'allow_self_signed' => false, 'cafile' => dirname(__FILE__).'/publickeys/godaddy_g2_root.cer', ), ))); if (!$socket) { return array( 'success' => false, 'message' => 'Failed opening a socket to ManageWP keys (on '.$domain.'). Error: '.$errstr.', Error number: '.$errno, ); } $requestContent = <<<EOL GET /public-keys HTTP/1.1 Host: cdn.managewp.com Accept-Language: en-US,en;q=0.9,hr;q=0.8,sr;q=0.7 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Cache-Control: max-age=0 Authority: cdn.managewp.com Connection: close EOL; if (@fwrite($socket, $requestContent) === false) { return array( 'success' => false, 'message' => 'Could not write the public-key request to the socket.', ); } return read_stream_response($socket); } function get_secure_protocol() { $transports = array_flip(stream_get_transports()); $preferredTransport = array( 'tls', 'tlsv1.2', 'tlsv1.1', 'tlsv1.0', ); $transportToUse = null; foreach ($preferredTransport as $transport) { if (!empty($transportToUse) || !isset($transports[$transport])) { continue; } $transportToUse = $transport; } return $transportToUse; } function read_stream_response($socket) { do { $line = @fgets($socket); } while ($line !== false && $line !== "\n" && $line !== "\r\n"); if ($line === false) { return array( 'success' => false, 'message' => 'No response received from the public-key server.', ); } $content = @stream_get_contents($socket); @fclose($socket); if ($content === false || !is_string($content)) { return array( 'success' => false, 'message' => 'Invalid response received from the public-key server.', ); } return array( 'success' => true, 'result' => $content, ); } function dns_resolve_key_domain($domain) { $transportToUse = get_secure_protocol(); if ($transportToUse == null) { return $domain; } $socket = @stream_socket_client("$transportToUse://1.1.1.1:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT); if (!$socket) { return $domain; } $requestContent = <<<PHP GET /dns-query?name=[DOMAIN]&type=A HTTP/1.1 Host: 1.1.1.1 Accept: application/dns-json Connection: close PHP; $requestContent = str_replace('[DOMAIN]', $domain, $requestContent); if (@fwrite($socket, $requestContent) === false) { return $domain; } $result = read_stream_response($socket); if ($result['success'] === false || empty($result['result'])) { return $domain; } $content = @json_decode($result['result'], true); if (empty($content['Answer']) || !is_array($content['Answer'])) { return $domain; } $record = $content['Answer'][count($content['Answer']) - 1]; if (empty($record['data']) || preg_match('/^\d+\.\d+\.\d+\.\d+$/', $record['data']) !== 1) { return $domain; } return $record['data']; } function site_in_mwp_maintenance_mode() { $class = 'notice notice-warning is-dismissible'; $message = esc_html__('The site is currently in maintenance mode.', 'worker'); printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html($message)); } function getUploadMessages() { return array( 'path_not_exist' => 8, 'file_exist' => 9, 'upload_failed' => 10, 'upload_success' => 11, 'permissions_denied' => 13, ); }