Пример #1
0
 /**
  * Get cached request results
  *
  * @param $server_url
  * @param $action
  * @param $args
  * @return bool
  */
 public function getCachedApiRequest($server_url, $action, $args)
 {
     $cache_action = $this->checkAction($action);
     if (!$cache_action) {
         $msg = sprintf("Cacher action: %s, cache_action: %s", $action, $cache_action ? 'YES' : 'NO');
         WPRC_Functions::log($msg, 'api', 'api.log');
         return false;
     }
     $foo = $this->model->getCachedRequest($server_url, $action, $args);
     $msg = sprintf("Cacher model get: %s", $foo == false ? 'NO' : 'YES');
     WPRC_Functions::log($msg, 'api', 'api.log');
     return $foo;
 }
 public static function wprc_update_themes()
 {
     global $wp_version;
     $WP_UPDATE_THEMES_URL = WPRC_WP_THEMES_UPDATE_REPO;
     //include ABSPATH . WPINC . '/version.php'; // include an unmodified $wp_version
     if (defined('WP_INSTALLING')) {
         return false;
     }
     //if ( !function_exists( 'get_themes' ) )
     //require_once( ABSPATH . 'wp-includes/theme.php' );
     //$installed_themes = get_themes( );
     $last_update = get_site_transient('update_themes');
     if (!is_object($last_update)) {
         $last_update = new stdClass();
     }
     // Check for updated every 60 minutes if hitting update pages; else, check every 12 hours.
     $timeout = in_array(current_filter(), array('load-themes.php', 'load-update.php', 'load-update-core.php')) ? 3600 : 43200;
     $time_not_changed = isset($last_update->last_checked) && $timeout > time() - $last_update->last_checked;
     //$themes = array();
     $checked = array();
     $exclude_fields = array('Template Files', 'Stylesheet Files', 'Status', 'Theme Root', 'Theme Root URI', 'Template Dir', 'Stylesheet Dir', 'Description', 'Tags', 'Screenshot');
     // Put slug of current theme into request.
     //$themes['current_theme'] = get_option( 'stylesheet' );
     // get themes data from the DB
     $extensions_model = WPRC_Loader::getModel('extensions');
     $extensions = $extensions_model->getFullExtensionsTree();
     $installed_themes = $extensions['themes'];
     // arrange themes according to repository (if enabled)
     $repos = array();
     $current_theme = get_option('stylesheet');
     foreach ($installed_themes as $key => $theme) {
         $checked[$theme['Stylesheet']] = $theme['Version'];
         $rkey = $theme['repository_endpoint_url'] === null ? WPRC_WP_THEMES_REPO : $theme['repository_endpoint_url'];
         $sendtheme = $theme;
         // remove unwanted fields from the theme that is going to be sent
         unset($sendtheme['repository_endpoint_url']);
         unset($sendtheme['repository_id']);
         unset($sendtheme['repository_user']);
         unset($sendtheme['repository_pass']);
         unset($sendtheme['repository_salt']);
         unset($sendtheme['repository_name']);
         unset($sendtheme['repository_enabled']);
         unset($sendtheme['repository_deleted']);
         unset($sendtheme['extension_was_installed']);
         unset($sendtheme['type_name']);
         unset($sendtheme['extension_slug']);
         foreach ((array) $theme as $key2 => $value) {
             if (in_array($key2, $exclude_fields)) {
                 unset($sendtheme[$key2]);
             }
         }
         if (!isset($repos[$rkey])) {
             $repos[$rkey] = array('id' => $theme['repository_id'], 'url' => $rkey, 'user' => $theme['repository_user'], 'pass' => $theme['repository_pass'], 'salt' => $theme['repository_salt'], 'name' => $theme['repository_name'], 'themes' => array('current_theme' => $current_theme, $sendtheme['Stylesheet'] => $sendtheme));
             // Wordpress uses different install repository URL from Update Repository URL so hardcode it
             if ($rkey === WPRC_WP_THEMES_REPO) {
                 $repos[$rkey]['url'] = $WP_UPDATE_THEMES_URL;
             }
         } else {
             $repos[$rkey]['themes'][$sendtheme['Stylesheet']] = $sendtheme;
         }
     }
     $theme_changed = false;
     foreach ($checked as $slug => $v) {
         $update_request->checked[$slug] = $v;
         if (!isset($last_update->checked[$slug]) || strval($last_update->checked[$slug]) !== strval($v)) {
             $theme_changed = true;
         }
     }
     if (isset($last_update->response) && is_array($last_update->response)) {
         foreach ($last_update->response as $slug => $update_details) {
             if (!isset($checked[$slug])) {
                 $theme_changed = true;
                 break;
             }
         }
     }
     if ($time_not_changed && !$theme_changed) {
         return false;
     }
     // Update last_checked for current to prevent multiple blocking requests if request hangs
     $last_update->last_checked = time();
     set_site_transient('update_themes', $last_update);
     $allresponses = array();
     //WPRC_Loader::includeSecurity();
     foreach ($repos as $repo) {
         $to_send = $repo['themes'];
         $server_url = $repo['url'];
         $repository_username = $repo['user'];
         $repository_password = $repo['pass'];
         $repository_salt = $repo['salt'];
         // action is themes-update by default
         $body_array = array('action' => 'themes_update');
         // add authorization if needed
         if ($repository_username != '' && $repository_username != null && $repository_password != '' && $repository_password != null) {
             //$sendpassword=WPRC_Security::encrypt($repository_salt,$repository_password);
             $body_array['auth'] = array('user' => $repository_username, 'pass' => $repository_password, 'salt' => $repository_salt);
         } else {
             unset($body_array['auth']);
         }
         $body_array['themes'] = serialize($to_send);
         if ($server_url === $WP_UPDATE_THEMES_URL) {
             unset($body_array['action']);
         }
         $options = array('timeout' => defined('DOING_CRON') && DOING_CRON ? 30 : 3, 'body' => $body_array, 'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo('url'));
         // debug log
         $reqargs = $body_array;
         if (isset($reqargs['auth'])) {
             $reqargs['auth'] = 'AUTH info';
         }
         $msg = sprintf("THEME UPDATE API Request to %s, timeout: %d, wpversion: %s, request args: %s", $server_url, $options['timeout'], $wp_version, print_r($reqargs, true));
         WPRC_Functions::log($msg, 'api', 'api.log');
         unset($reqargs);
         // send request
         $raw_response = wp_remote_post($server_url, $options);
         // log
         $msg = sprintf("THEME UPDATE API Request to %s, response: %s", $server_url, print_r($raw_response, true));
         WPRC_Functions::log($msg, 'api', 'api.log');
         if (is_wp_error($raw_response) || 200 != wp_remote_retrieve_response_code($raw_response)) {
             // log
             if (is_wp_error($raw_response)) {
                 $msg = sprintf("THEME UPDATE API Request to %s, response error: %s", $server_url, print_r($raw_response->get_error_message(), true));
                 WPRC_Functions::log($msg, 'api', 'api.log');
             }
             continue;
             //return false;
         }
         $response = @unserialize(wp_remote_retrieve_body($raw_response));
         // merge with other results
         if (false === $response) {
             // log
             $msg = sprintf("THEME UPDATE API Request to %s, response unserialize failed: %s", $server_url, print_r(wp_remote_retrieve_body($raw_response), true));
             WPRC_Functions::log($msg, 'api', 'api.log');
         } else {
             if (is_object($response) && isset($response->error)) {
                 $response = new WP_Error('extensions_api_failed', $response->error, wp_remote_retrieve_body($raw_response));
                 // log
                 $msg = sprintf("THEME UPDATE API Request to %s, action not implemented error: %s", $server_url, print_r($response, true));
                 WPRC_Functions::log($msg, 'api', 'api.log');
             } else {
                 if (is_array($response) && isset($response['error'])) {
                     $response = new WP_Error('extensions_api_failed', $response['error'], wp_remote_retrieve_body($raw_response));
                     // log
                     $msg = sprintf("THEME UPDATE API Request to %s, action not implemented error: %s", $server_url, print_r($response, true));
                     WPRC_Functions::log($msg, 'api', 'api.log');
                 } else {
                     // add some info about repository id etc..
                     foreach ($response as $key => $them) {
                         if (is_object($response[$key])) {
                             $response[$key]->repository_id = $repo['id'];
                             $response[$key]->repository_salt = $repo['salt'];
                         } else {
                             if (is_array($response[$key])) {
                                 $response[$key]['repository_id'] = $repo['id'];
                                 $response[$key]['repository_salt'] = $repo['salt'];
                             }
                         }
                         $response[$key] = (array) $response[$key];
                     }
                     $allresponses = array_merge($allresponses, $response);
                 }
             }
         }
     }
     // update transients for themes
     $new_update = new stdClass();
     $new_update->last_checked = time();
     $new_update->checked = $checked;
     $new_update->response = $allresponses;
     set_site_transient('update_themes', $new_update);
 }
 /**
  * Send request to any file
  * 
  * @param string method
  * @param string url to send
  * @param mixed arguments to send
  */
 public function sendRequest($method, $url, $args, $timeout = 15)
 {
     WPRC_Loader::includeWordpressHttp();
     if (isset($args['request'])) {
         $body_array = array('action' => $args['action'], 'request' => serialize($args['request']));
     } else {
         $body_array = array('action' => $args['action']);
     }
     // log
     $debug_msg = sprintf('SERVER REQUEST, method: %s, timeout: %d, uri: %s, args: %s', $method, $timeout, $url, print_r($args, true));
     WPRC_Functions::log($debug_msg, 'server', 'server.log');
     switch ($method) {
         case 'post':
             $request = wp_remote_post($url, array('timeout' => $timeout, 'body' => $body_array));
             // log
             $debug_msg = sprintf('SERVER REQUEST, response: %s', print_r($request, true));
             WPRC_Functions::log($debug_msg, 'server', 'server.log');
             if (is_wp_error($request) || 200 != wp_remote_retrieve_response_code($request)) {
                 // log
                 if (is_wp_error($request)) {
                     $debug_msg = sprintf('SERVER REQUEST, response error: %s', print_r($request->get_error_message(), true));
                 } else {
                     $debug_msg = sprintf('SERVER REQUEST, response error code: %s', print_r(wp_remote_retrieve_response_code($request), true));
                 }
                 WPRC_Functions::log($debug_msg, 'server', 'server.log');
                 // connection failed
                 return false;
             }
             $res = @unserialize(wp_remote_retrieve_body($request));
             if (false === $res) {
                 $res = new WP_Error('repository_connector_error', __('An unknown error occurred.', 'installer'), wp_remote_retrieve_body($request));
                 // log
                 $debug_msg = sprintf('SERVER REQUEST, response unknown error: %s', print_r(wp_remote_retrieve_body($request), true));
                 WPRC_Functions::log($debug_msg, 'server', 'server.log');
             }
             break;
     }
     return $res;
 }
 public function updateExtensionMap($get, $post)
 {
     if (isset($get['update_extension_map'])) {
         $msg = sprintf('Extension maps update entered');
         WPRC_Functions::log($msg, 'controller', 'controller.log');
         // clear cache
         delete_transient('wprc_update_extensions_maps');
         $result = WPRC_Installer::wprc_update_extensions_maps();
         echo json_encode(array('result' => $result));
         $msg = sprintf('Extension maps update complete');
         WPRC_Functions::log($msg, 'controller', 'controller.log');
         exit;
     }
     exit;
 }
 public function checkCompatibility($get, $post)
 {
     $msg = sprintf('Repository Reporter check compatibility enter');
     WPRC_Functions::log($msg, 'controller', 'controller.log');
     $reporter = WPRC_Loader::getRequester('compatibility-reporter');
     $check_extension_type = $get['extension_type_singular'];
     $check_extension_name = $get['extension_name'];
     $check_extension_repository_url = $get['repository_url'];
     $check_extension_version = $get['extension_version'];
     $check_extension_slug = isset($get['extension_slug']) ? $get['extension_slug'] : '';
     $parameters = array('check_extension_name' => $check_extension_name, 'check_extension_type' => $check_extension_type, 'check_extension_repository_url' => $check_extension_repository_url, 'check_extension_version' => $check_extension_version, 'check_extension_slug' => $check_extension_slug);
     $report = $reporter->prepareRequest($parameters);
     // send request only once even if it fails
     $response = $reporter->sendRequest($report, true);
     // layout
     if (isset($response) && isset($response->body) && is_array($response->body) && array_key_exists('left_extensions', $response->body)) {
         $left_extensions = $response->body['left_extensions'];
         $right_extensions = array();
         if (is_array($left_extensions) && count($left_extensions) > 0) {
             $left_extension = array_shift($left_extensions);
             $right_extensions = $left_extension['compatibility_info'];
         }
         $no_compatibility_information = false;
         if (count($right_extensions) == 0) {
             $no_compatibility_information = true;
         }
         $version_found = $response->body['version_found'];
     } else {
         $no_compatibility_information = true;
     }
     // Additional attributes to show later the table in a right way
     $report_extensions = $report['request']['right_extensions'];
     $new_right_extensions = array();
     if (isset($right_extensions) && is_array($right_extensions)) {
         foreach ($report_extensions as $report_key => $report_extension) {
             $name = $report_extension['name'];
             $version = $report_extension['version'];
             $extension_counts = 0;
             $last_key = '';
             $first_key = '';
             $works = 0;
             $broken = 0;
             $score = 0;
             foreach ($right_extensions as $key => $right_extension) {
                 if ($extension_counts == 0) {
                     $first_key = $key;
                 }
                 if ($right_extension['name'] == $name) {
                     $extension_counts++;
                     $last_key = $key;
                     $works += $right_extensions[$key]['works'];
                     $broken += $right_extensions[$key]['broken'];
                     $score += $right_extensions[$key]['score'];
                 }
             }
             if ($extension_counts == 1) {
                 $new_right_extensions[$last_key] = $right_extensions[$last_key];
             } elseif ($extension_counts > 1) {
                 $right_extensions[$first_key]['hide'] = false;
                 $right_extensions[$first_key]['link'] = true;
                 $new_right_extensions[$first_key] = $right_extensions[$first_key];
                 $new_right_extensions[$report_key . '_total'] = $right_extensions[$last_key];
                 $new_right_extensions[$report_key . '_total']['works'] = $works;
                 $new_right_extensions[$report_key . '_total']['broken'] = $broken;
                 $new_right_extensions[$report_key . '_total']['score'] = number_format($works * 100 / ($works + $broken), 0);
                 $new_right_extensions[$report_key . '_total']['total'] = true;
                 unset($new_right_extensions[$report_key . '_total']['version']);
             }
         }
     }
     require_once WPRC_TEMPLATES_DIR . '/extension-compatibility-information.tpl.php';
     //WPRC_Loader::includePage('check-compatibility');
     $msg = sprintf('Repository Reporter check compatibility complete');
     WPRC_Functions::log($msg, 'controller', 'controller.log');
 }
Пример #6
0
 /**
  * Search plugins in multiple repositories 
  * This method replaces 'plugins_api' and 'themes_api' function
  */
 public function extensionsApi($state, $action, $args, $extension_type)
 {
     // default wp behaviour for tabs other than search
     //if ($action=='hot_tags') return false;
     if (isset($_GET['tab'])) {
         if ($_GET['tab'] != 'dashboard' && $_GET['tab'] != 'search' && $_GET['tab'] != 'plugin-information' && $_GET['tab'] != 'theme-information') {
             return false;
         }
     }
     $rauth = true;
     $rpass = '';
     $ruser = '';
     if (isset($_GET['repository_id']) && isset($_GET['user']) && isset($_GET['pass']) && ($action == 'plugin_information' || $action == 'theme_information')) {
         $rm = WPRC_Loader::getModel('repositories');
         $rid = $_GET['repository_id'];
         $repository = $rm->getRepository($rid);
         $ruser = rawurldecode($_GET['user']);
         $rsalt = $repository->repository_authsalt;
         $rpass = rawurldecode($_GET['pass']);
         //WPRC_Security::decrypt($repository->repository_authsalt,rawurldecode($_GET['pass']));
         $login = $rm->testLogin($rid, $ruser, $rpass);
         if ($login != false && empty($login['error'])) {
             $rauth = true;
         } else {
             $rauth = false;
         }
     }
     $repositories_ids = array();
     if (isset($args->repositories)) {
         $repositories_ids = $args->repositories;
         unset($args->repositories);
     }
     $rm = WPRC_Loader::getModel('repositories');
     $repos = $rm->getRepositoriesByIds($repositories_ids);
     $results = array();
     // Remade per_page parameters in order to get consistent pagination
     $per_page = 0;
     $repos_number = count($repos);
     if ($action == 'query_plugins') {
         $per_page = WPRC_PLUGINS_API_QUERY_PLUGINS_PER_PAGE;
     } elseif ($action == 'query_themes') {
         $per_page = WPRC_THEMES_API_QUERY_THEMES_PER_PAGE;
     }
     $results_per_repo = array();
     for ($i = 0; $i < $repos_number; $i++) {
         $res = false;
         $server_url = $repos[$i]->repository_endpoint_url;
         $repository_name = $repos[$i]->repository_name;
         $repository_username = $repos[$i]->repository_username;
         $repository_password = $repos[$i]->repository_password;
         $salt = $repos[$i]->repository_authsalt;
         $rid = $repos[$i]->id;
         $body_array = array('action' => $action);
         if ($repository_username != '' && $repository_password != '') {
             /*$args->username = $repository_username;
               $args->password = $repository_password;*/
             //$send_password=WPRC_Security::encrypt($salt,$repository_password);
             $body_array['auth'] = array('user' => $repository_username, 'pass' => $repository_password, 'salt' => $salt);
             //$body_array['auth'] = array('user'=>$repository_username,'pass'=>$repository_password,'salt'=>$salt);
         } else {
             unset($args->username);
             unset($args->password);
         }
         $request_array = $args;
         $request_array->per_page = $per_page;
         $body_array['request'] = serialize($args);
         if (isset($args->slug)) {
             $body_array['slug'] = $args->slug;
         }
         // debug log
         $reqargs = $body_array;
         if (isset($reqargs['auth'])) {
             $reqargs['auth'] = 'AUTH info';
         }
         $msg = sprintf("API Request to %s, request args: %s", $server_url, print_r($reqargs, true));
         WPRC_Functions::log($msg, 'api', 'api.log');
         unset($reqargs);
         $cached_request_results = apply_filters('wprc_extensions_api_before_each_repository', $server_url, $action, $args);
         if ($cached_request_results) {
             $results[$server_url] = $cached_request_results;
             // log
             $msg = sprintf("API Request to %s, using cached results", $server_url);
             WPRC_Functions::log($msg, 'api', 'api.log');
             continue;
         }
         $request = wp_remote_post($server_url, array('timeout' => 15, 'body' => $body_array));
         // log
         $msg = sprintf("API Request to %s, timeout: %d, response: %s", $server_url, 15, print_r($request, true));
         WPRC_Functions::log($msg, 'api', 'api.log');
         if (is_wp_error($request)) {
             $res = new WP_Error('extensions_api_failed', __('An unexpected HTTP Error occurred during the API request.', 'installer'), $request->get_error_message());
             // log
             $msg = sprintf("API Request to %s, response error: %s", $server_url, print_r($request->get_error_message(), true));
             WPRC_Functions::log($msg, 'api', 'api.log');
         } else {
             $request_body = wp_remote_retrieve_body($request);
             if (is_serialized($request_body)) {
                 $res = @unserialize($request_body);
             }
             if (false === $res) {
                 $res = new WP_Error('extensions_api_failed', __('An unknown error occurred.', 'installer'), wp_remote_retrieve_body($request));
                 // log
                 $msg = sprintf("API Request to %s, unknown error in response body: %s", $server_url, print_r($request_body, true));
                 WPRC_Functions::log($msg, 'api', 'api.log');
             } else {
                 if (is_object($res) && isset($res->error)) {
                     $res = new WP_Error('extensions_api_failed', $res->error, wp_remote_retrieve_body($request));
                     // log
                     $msg = sprintf("API Request to %s, action not implemented error: %s", $server_url, print_r($res, true));
                     WPRC_Functions::log($msg, 'api', 'api.log');
                 } else {
                     if (is_array($res) && isset($res['error'])) {
                         $res = new WP_Error('extensions_api_failed', $res['error'], wp_remote_retrieve_body($request));
                         // log
                         $msg = sprintf("API Request to %s, action not implemented error: %s", $server_url, print_r($res, true));
                         WPRC_Functions::log($msg, 'api', 'api.log');
                     } else {
                         // add some custom info onto the results (like repository salt etc..)
                         if ($action == 'query_plugins') {
                             foreach ($res->plugins as $key => $extension) {
                                 $res->plugins[$key]->salt = $salt;
                                 $res->plugins[$key]->repository_id = $rid;
                                 // strip non-serializable characters
                                 $res->plugins[$key]->description = preg_replace('/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x80-\\xFF]/u', '', $res->plugins[$key]->description);
                             }
                         } elseif ($action == 'query_themes') {
                             foreach ($res->themes as $key => $extension) {
                                 $res->themes[$key]->salt = $salt;
                                 $res->themes[$key]->repository_id = $rid;
                                 // strip non-serializable characters
                                 $res->themes[$key]->description = preg_replace('/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x80-\\xFF]/u', '', $res->themes[$key]->description);
                             }
                         } elseif ($action == 'plugin_information' || $action == 'theme_information') {
                             if (is_object($res)) {
                                 $res->rauth = $rauth;
                                 $res->pass = $rpass;
                                 $res->user = $ruser;
                                 $res->salt = $salt;
                                 $res->repository_id = $rid;
                             }
                         }
                     }
                 }
             }
         }
         $cached_them = apply_filters('wprc_extensions_api_after_each_repository', $server_url, $action, $args, $res);
         // log
         $msg = sprintf("API Request to %s, results cached: %s", $server_url, $cached_them == false ? 'NO' : 'YES');
         WPRC_Functions::log($msg, 'api', 'api.log');
         // set source
         $results[$server_url] = $res;
     }
     $general_results = new stdClass();
     $general_results->results = $results;
     return $general_results;
 }
 public static function wprc_update_plugins()
 {
     global $wp_version;
     $WP_UPDATE_PLUGINS_URL = WPRC_WP_PLUGINS_UPDATE_REPO;
     //include ABSPATH . WPINC . '/version.php'; // include an unmodified $wp_version
     if (defined('WP_INSTALLING')) {
         return false;
     }
     // If running blog-side, bail unless we've not checked in the last 12 hours
     //if ( !function_exists( 'get_plugins' ) )
     //require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
     //$plugins = get_plugins();
     $active = get_option('active_plugins', array());
     $current = get_site_transient('update_plugins');
     if (!is_object($current)) {
         $current = new stdClass();
     }
     $new_option = new stdClass();
     $new_option->last_checked = time();
     // Check for updated every 60 minutes if hitting update pages; else, check every 12 hours.
     $timeout = in_array(current_filter(), array('load-plugins.php', 'load-update.php', 'load-update-core.php')) ? 3600 : 43200;
     $time_not_changed = isset($current->last_checked) && $timeout > time() - $current->last_checked;
     // get plugin data from the DB
     $extensions_model = WPRC_Loader::getModel('extensions');
     $extensions = $extensions_model->getFullExtensionsTree();
     $plugins = $extensions['plugins'];
     // arrange plugins according to repository (if enabled)
     $repos = array();
     $plugin_changed = false;
     foreach ($plugins as $key => $plugin) {
         $new_option->checked[$key] = $plugin['Version'];
         if (!isset($current->checked[$key]) || strval($current->checked[$key]) !== strval($plugin['Version'])) {
             $plugin_changed = true;
         }
         $rkey = $plugin['repository_endpoint_url'] === null ? WPRC_WP_PLUGINS_REPO : $plugin['repository_endpoint_url'];
         $sendplugin = $plugin;
         $sendplugin['slug'] = $sendplugin['extension_slug'];
         // remove unwanted fields from the plugin that is going to be sent
         unset($sendplugin['repository_endpoint_url']);
         unset($sendplugin['repository_id']);
         unset($sendplugin['repository_user']);
         unset($sendplugin['repository_pass']);
         unset($sendplugin['repository_salt']);
         unset($sendplugin['repository_name']);
         unset($sendplugin['repository_enabled']);
         unset($sendplugin['repository_deleted']);
         unset($sendplugin['extension_was_installed']);
         unset($sendplugin['type_name']);
         unset($sendplugin['extension_slug']);
         if (!isset($repos[$rkey])) {
             $repos[$rkey] = array('id' => $plugin['repository_id'], 'url' => $rkey, 'user' => $plugin['repository_user'], 'pass' => $plugin['repository_pass'], 'name' => $plugin['repository_name'], 'salt' => $plugin['repository_salt'], 'plugins' => array($key => $sendplugin));
             // Wordpress uses different install repository URL from Update Repository URL so hardcode it
             if ($rkey == WPRC_WP_PLUGINS_REPO) {
                 $repos[$rkey]['url'] = $WP_UPDATE_PLUGINS_URL;
             }
         } else {
             $repos[$rkey]['plugins'][$key] = $sendplugin;
         }
     }
     if (isset($current->response) && is_array($current->response)) {
         foreach ($current->response as $plugin_file => $update_details) {
             if (!isset($plugins[$plugin_file])) {
                 $plugin_changed = true;
                 break;
             }
         }
     }
     // Bail if we've checked in the last 12 hours and if nothing has changed
     if ($time_not_changed && !$plugin_changed) {
         return false;
     }
     // Update last_checked for current to prevent multiple blocking requests if request hangs
     $current->last_checked = time();
     set_site_transient('update_plugins', $current);
     $allresponses = array();
     //WPRC_Loader::includeSecurity();
     foreach ($repos as $repo) {
         $plugins = $repo['plugins'];
         $to_send = (object) compact('plugins', 'active');
         $server_url = $repo['url'];
         $repository_username = $repo['user'];
         $repository_password = $repo['pass'];
         $repository_salt = $repo['salt'];
         // action is plugins-update by default
         $body_array = array('action' => 'plugins_update');
         // add authorization if needed
         if ($repository_username != '' && $repository_username != null && $repository_password != '' && $repository_password != null) {
             //$sendpassword=WPRC_Security::encrypt($repository_salt,$repository_password);
             $body_array['auth'] = array('user' => $repository_username, 'pass' => $repository_password, 'salt' => $repository_salt);
         } else {
             unset($body_array['auth']);
         }
         $body_array['plugins'] = serialize($to_send);
         if ($server_url === $WP_UPDATE_PLUGINS_URL) {
             unset($body_array['action']);
         }
         $options = array('timeout' => defined('DOING_CRON') && DOING_CRON ? 30 : 3, 'body' => $body_array, 'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo('url'));
         // debug log
         $reqargs = $body_array;
         if (isset($reqargs['auth'])) {
             $reqargs['auth'] = 'AUTH info';
         }
         $msg = sprintf("PLUGIN UPDATE API Request to %s, timeout: %d, wpversion: %s, request args: %s", $server_url, $options['timeout'], $wp_version, print_r($reqargs, true));
         WPRC_Functions::log($msg, 'api', 'api.log');
         unset($reqargs);
         // send request
         $raw_response = wp_remote_post($server_url, $options);
         // log
         $msg = sprintf("PLUGIN UPDATE API Request to %s, response: %s", $server_url, print_r($raw_response, true));
         WPRC_Functions::log($msg, 'api', 'api.log');
         if (is_wp_error($raw_response) || 200 != wp_remote_retrieve_response_code($raw_response)) {
             // log
             if (is_wp_error($raw_response)) {
                 $msg = sprintf("PLUGIN UPDATE API Request to %s, response error: %s", $server_url, print_r($raw_response->get_error_message(), true));
                 WPRC_Functions::log($msg, 'api', 'api.log');
             }
             continue;
             //return false;
         }
         $response = @unserialize(wp_remote_retrieve_body($raw_response));
         // merge with other results
         if (false == $response) {
             // log
             $msg = sprintf("PLUGIN UPDATE API Request to %s, response unserialize failed: %s", $server_url, print_r(wp_remote_retrieve_body($raw_response), true));
             WPRC_Functions::log($msg, 'api', 'api.log');
         } else {
             if (is_object($response) && isset($response->error)) {
                 $response = new WP_Error('extensions_api_failed', $response->error, wp_remote_retrieve_body($raw_response));
                 // log
                 $msg = sprintf("PLUGIN UPDATE API Request to %s, action not implemented error: %s", $server_url, print_r($response, true));
                 WPRC_Functions::log($msg, 'api', 'api.log');
             } else {
                 if (is_array($response) && isset($response['error'])) {
                     $response = new WP_Error('extensions_api_failed', $response['error'], wp_remote_retrieve_body($raw_response));
                     // log
                     $msg = sprintf("PLUGIN UPDATE API Request to %s, action not implemented error: %s", $server_url, print_r($response, true));
                     WPRC_Functions::log($msg, 'api', 'api.log');
                 } else {
                     // add some info about repository id etc..
                     foreach ($response as $key => $plug) {
                         $response[$key]->repository_id = $repo['id'];
                         $response[$key]->repository_salt = $repo['salt'];
                     }
                     $allresponses = array_merge($allresponses, $response);
                 }
             }
         }
     }
     // update the options for plugins
     $new_option->response = $allresponses;
     set_site_transient('update_plugins', $new_option);
 }
 function testLogin($repository_id, $username, $password, $plain = false)
 {
     //$rm = $this->repo_model;//WPRC_Loader::getModel('repositories');
     $repo = $this->getRepositoryByField('id', $repository_id);
     $body_array = array('action' => 'repository_login');
     $salt = $repo->repository_authsalt;
     //WPRC_Loader::includeSecurity();
     //$body_array['auth'] = array('user'=>$username,'pass'=>WPRC_Security::encrypt($salt,$password),'salt'=>$salt);
     $body_array['auth'] = array('user' => $username, 'pass' => $password, 'salt' => $salt);
     if ($plain) {
         $body_array['auth']['_plain'] = 'true';
     }
     // log
     if (!$plain) {
         $msg = sprintf('Repository Login to %s with auth, timeout: %d, action: %s', $repo->repository_endpoint_url, 5, $body_array['action']);
     } else {
         $msg = sprintf('Repository Login to %s with auth plain, timeout: %d, action: %s', $repo->repository_endpoint_url, 5, $body_array['action']);
     }
     WPRC_Functions::log($msg, 'controller', 'controller.log');
     $request = wp_remote_post($repo->repository_endpoint_url, array('timeout' => 15, 'body' => $body_array));
     // log
     $msg = sprintf('Repository Login to %s with auth, response: %s', $repo->repository_endpoint_url, print_r($request, true));
     WPRC_Functions::log($msg, 'controller', 'controller.log');
     if (is_wp_error($request)) {
         $res = new WP_Error('repository_login_failed', __('An unexpected HTTP Error occurred during the API request.', 'installer'), $request->get_error_message());
         // log
         $msg = sprintf('Repository Login to %s with auth, response error: %s', $repo->repository_endpoint_url, print_r($request->get_error_message()));
         WPRC_Functions::log($msg, 'controller', 'controller.log');
     } else {
         $request_body = wp_remote_retrieve_body($request);
         if (is_serialized($request_body)) {
             $res = @unserialize($request_body);
         }
     }
     if (!isset($res) || $res == false || is_wp_error($res)) {
         // log
         $msg = sprintf('Repository Login to %s with auth, response unserialize error: %s', $repo->repository_endpoint_url, print_r(wp_remote_retrieve_body($request)));
         WPRC_Functions::log($msg, 'controller', 'controller.log');
         return false;
     }
     if (isset($res->error) && !isset($res->success)) {
         $response = array('error' => 1, 'message' => $res->error);
     } else {
         $response = array('error' => 0, 'message' => $res->success);
         $doupdate = false;
         if ($plain && isset($res->pass) && $res->pass != '') {
             $password = $res->pass;
             $doupdate = true;
         }
         if (!$plain) {
             $doupdate = true;
         }
         if ($doupdate) {
             $this->updateRepositoryAuth($repository_id, $username, $password);
             // clear cache
             $rmcache = WPRC_Loader::getModel('cached-requests');
             $rmcache->cleanCache();
             // clear update data
             delete_site_transient('update_plugins');
             delete_site_transient('update_themes');
         }
     }
     return $response;
 }