diff -r c7c34916027a -r 177826044cd9 wp/wp-admin/includes/plugin-install.php --- a/wp/wp-admin/includes/plugin-install.php Mon Oct 14 18:06:33 2019 +0200 +++ b/wp/wp-admin/includes/plugin-install.php Mon Oct 14 18:28:13 2019 +0200 @@ -99,19 +99,27 @@ * for more information on the make-up of possible return values depending on the value of `$action`. */ function plugins_api( $action, $args = array() ) { + // include an unmodified $wp_version + include( ABSPATH . WPINC . '/version.php' ); if ( is_array( $args ) ) { $args = (object) $args; } - if ( ! isset( $args->per_page ) ) { - $args->per_page = 24; + if ( 'query_plugins' == $action ) { + if ( ! isset( $args->per_page ) ) { + $args->per_page = 24; + } } if ( ! isset( $args->locale ) ) { $args->locale = get_user_locale(); } + if ( ! isset( $args->wp_version ) ) { + $args->wp_version = substr( $wp_version, 0, 3 ); // X.y + } + /** * Filters the WordPress.org Plugin Installation API arguments. * @@ -141,22 +149,26 @@ $res = apply_filters( 'plugins_api', false, $action, $args ); if ( false === $res ) { - // include an unmodified $wp_version - include( ABSPATH . WPINC . '/version.php' ); - $url = $http_url = 'http://api.wordpress.org/plugins/info/1.0/'; - if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) + $url = 'http://api.wordpress.org/plugins/info/1.2/'; + $url = add_query_arg( + array( + 'action' => $action, + 'request' => $args, + ), + $url + ); + + $http_url = $url; + if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) { $url = set_url_scheme( $url, 'https' ); + } $http_args = array( - 'timeout' => 15, + 'timeout' => 15, 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ), - 'body' => array( - 'action' => $action, - 'request' => serialize( $args ) - ) ); - $request = wp_remote_post( $url, $http_args ); + $request = wp_remote_get( $url, $http_args ); if ( $ssl && is_wp_error( $request ) ) { trigger_error( @@ -167,11 +179,12 @@ ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE ); - $request = wp_remote_post( $http_url, $http_args ); + $request = wp_remote_get( $http_url, $http_args ); } - if ( is_wp_error($request) ) { - $res = new WP_Error( 'plugins_api_failed', + if ( is_wp_error( $request ) ) { + $res = new WP_Error( + 'plugins_api_failed', sprintf( /* translators: %s: support forums URL */ __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ), @@ -180,9 +193,13 @@ $request->get_error_message() ); } else { - $res = maybe_unserialize( wp_remote_retrieve_body( $request ) ); - if ( ! is_object( $res ) && ! is_array( $res ) ) { - $res = new WP_Error( 'plugins_api_failed', + $res = json_decode( wp_remote_retrieve_body( $request ), true ); + if ( is_array( $res ) ) { + // Object casting is required in order to match the info/1.0 format. + $res = (object) $res; + } elseif ( null === $res ) { + $res = new WP_Error( + 'plugins_api_failed', sprintf( /* translators: %s: support forums URL */ __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ), @@ -191,8 +208,12 @@ wp_remote_retrieve_body( $request ) ); } + + if ( isset( $res->error ) ) { + $res = new WP_Error( 'plugins_api_failed', $res->error ); + } } - } elseif ( !is_wp_error($res) ) { + } elseif ( ! is_wp_error( $res ) ) { $res->external = true; } @@ -217,14 +238,16 @@ * @return array */ function install_popular_tags( $args = array() ) { - $key = md5(serialize($args)); - if ( false !== ($tags = get_site_transient('poptags_' . $key) ) ) + $key = md5( serialize( $args ) ); + if ( false !== ( $tags = get_site_transient( 'poptags_' . $key ) ) ) { return $tags; + } - $tags = plugins_api('hot_tags', $args); + $tags = plugins_api( 'hot_tags', $args ); - if ( is_wp_error($tags) ) + if ( is_wp_error( $tags ) ) { return $tags; + } set_site_transient( 'poptags_' . $key, $tags, 3 * HOUR_IN_SECONDS ); @@ -241,30 +264,36 @@
'; } @@ -280,7 +309,8 @@ function install_search_form( $deprecated = true ) { $type = isset( $_REQUEST['type'] ) ? wp_unslash( $_REQUEST['type'] ) : 'term'; $term = isset( $_REQUEST['s'] ) ? wp_unslash( $_REQUEST['s'] ) : ''; - ?> + + ?>' . __( 'You are using a development version of WordPress. These feature plugins are also under development. Learn more.' ) . '
', 'https://make.wordpress.org/core/handbook/about/release-cycle/features-as-plugins/' @@ -385,29 +417,32 @@ * @type string $file Plugin filename relative to the plugins directory. * } */ -function install_plugin_install_status($api, $loop = false) { +function install_plugin_install_status( $api, $loop = false ) { // This function is called recursively, $loop prevents further loops. - if ( is_array($api) ) + if ( is_array( $api ) ) { $api = (object) $api; + } // Default to a "new" plugin - $status = 'install'; - $url = false; + $status = 'install'; + $url = false; $update_file = false; + $version = ''; /* * Check to see if this plugin is known to be installed, * and has an update awaiting it. */ - $update_plugins = get_site_transient('update_plugins'); + $update_plugins = get_site_transient( 'update_plugins' ); if ( isset( $update_plugins->response ) ) { - foreach ( (array)$update_plugins->response as $file => $plugin ) { + foreach ( (array) $update_plugins->response as $file => $plugin ) { if ( $plugin->slug === $api->slug ) { - $status = 'update_available'; + $status = 'update_available'; $update_file = $file; - $version = $plugin->new_version; - if ( current_user_can('update_plugins') ) - $url = wp_nonce_url(self_admin_url('update.php?action=upgrade-plugin&plugin=' . $update_file), 'upgrade-plugin_' . $update_file); + $version = $plugin->new_version; + if ( current_user_can( 'update_plugins' ) ) { + $url = wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' . $update_file ), 'upgrade-plugin_' . $update_file ); + } break; } } @@ -415,36 +450,39 @@ if ( 'install' == $status ) { if ( is_dir( WP_PLUGIN_DIR . '/' . $api->slug ) ) { - $installed_plugin = get_plugins('/' . $api->slug); - if ( empty($installed_plugin) ) { - if ( current_user_can('install_plugins') ) - $url = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=' . $api->slug), 'install-plugin_' . $api->slug); + $installed_plugin = get_plugins( '/' . $api->slug ); + if ( empty( $installed_plugin ) ) { + if ( current_user_can( 'install_plugins' ) ) { + $url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $api->slug ), 'install-plugin_' . $api->slug ); + } } else { - $key = array_keys( $installed_plugin ); - $key = reset( $key ); //Use the first plugin regardless of the name, Could have issues for multiple-plugins in one directory if they share different version numbers + $key = array_keys( $installed_plugin ); + $key = reset( $key ); //Use the first plugin regardless of the name, Could have issues for multiple-plugins in one directory if they share different version numbers $update_file = $api->slug . '/' . $key; - if ( version_compare($api->version, $installed_plugin[ $key ]['Version'], '=') ){ + if ( version_compare( $api->version, $installed_plugin[ $key ]['Version'], '=' ) ) { $status = 'latest_installed'; - } elseif ( version_compare($api->version, $installed_plugin[ $key ]['Version'], '<') ) { - $status = 'newer_installed'; + } elseif ( version_compare( $api->version, $installed_plugin[ $key ]['Version'], '<' ) ) { + $status = 'newer_installed'; $version = $installed_plugin[ $key ]['Version']; } else { //If the above update check failed, Then that probably means that the update checker has out-of-date information, force a refresh if ( ! $loop ) { - delete_site_transient('update_plugins'); + delete_site_transient( 'update_plugins' ); wp_update_plugins(); - return install_plugin_install_status($api, true); + return install_plugin_install_status( $api, true ); } } } } else { // "install" & no directory with that slug - if ( current_user_can('install_plugins') ) - $url = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=' . $api->slug), 'install-plugin_' . $api->slug); + if ( current_user_can( 'install_plugins' ) ) { + $url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $api->slug ), 'install-plugin_' . $api->slug ); + } } } - if ( isset($_GET['from']) ) + if ( isset( $_GET['from'] ) ) { $url .= '&from=' . urlencode( wp_unslash( $_GET['from'] ) ); + } $file = $update_file; return compact( 'status', 'url', 'version', 'file' ); @@ -464,45 +502,63 @@ return; } - $api = plugins_api( 'plugin_information', array( - 'slug' => wp_unslash( $_REQUEST['plugin'] ), - 'is_ssl' => is_ssl(), - 'fields' => array( - 'banners' => true, - 'reviews' => true, - 'downloaded' => false, - 'active_installs' => true + $api = plugins_api( + 'plugin_information', + array( + 'slug' => wp_unslash( $_REQUEST['plugin'] ), ) - ) ); + ); if ( is_wp_error( $api ) ) { wp_die( $api ); } $plugins_allowedtags = array( - 'a' => array( 'href' => array(), 'title' => array(), 'target' => array() ), - 'abbr' => array( 'title' => array() ), 'acronym' => array( 'title' => array() ), - 'code' => array(), 'pre' => array(), 'em' => array(), 'strong' => array(), - 'div' => array( 'class' => array() ), 'span' => array( 'class' => array() ), - 'p' => array(), 'br' => array(), 'ul' => array(), 'ol' => array(), 'li' => array(), - 'h1' => array(), 'h2' => array(), 'h3' => array(), 'h4' => array(), 'h5' => array(), 'h6' => array(), - 'img' => array( 'src' => array(), 'class' => array(), 'alt' => array() ), + 'a' => array( + 'href' => array(), + 'title' => array(), + 'target' => array(), + ), + 'abbr' => array( 'title' => array() ), + 'acronym' => array( 'title' => array() ), + 'code' => array(), + 'pre' => array(), + 'em' => array(), + 'strong' => array(), + 'div' => array( 'class' => array() ), + 'span' => array( 'class' => array() ), + 'p' => array(), + 'br' => array(), + 'ul' => array(), + 'ol' => array(), + 'li' => array(), + 'h1' => array(), + 'h2' => array(), + 'h3' => array(), + 'h4' => array(), + 'h5' => array(), + 'h6' => array(), + 'img' => array( + 'src' => array(), + 'class' => array(), + 'alt' => array(), + ), 'blockquote' => array( 'cite' => true ), ); $plugins_section_titles = array( - 'description' => _x( 'Description', 'Plugin installer section title' ), + 'description' => _x( 'Description', 'Plugin installer section title' ), 'installation' => _x( 'Installation', 'Plugin installer section title' ), - 'faq' => _x( 'FAQ', 'Plugin installer section title' ), - 'screenshots' => _x( 'Screenshots', 'Plugin installer section title' ), - 'changelog' => _x( 'Changelog', 'Plugin installer section title' ), - 'reviews' => _x( 'Reviews', 'Plugin installer section title' ), - 'other_notes' => _x( 'Other Notes', 'Plugin installer section title' ) + 'faq' => _x( 'FAQ', 'Plugin installer section title' ), + 'screenshots' => _x( 'Screenshots', 'Plugin installer section title' ), + 'changelog' => _x( 'Changelog', 'Plugin installer section title' ), + 'reviews' => _x( 'Reviews', 'Plugin installer section title' ), + 'other_notes' => _x( 'Other Notes', 'Plugin installer section title' ), ); // Sanitize HTML foreach ( (array) $api->sections as $section_name => $content ) { - $api->sections[$section_name] = wp_kses( $content, $plugins_allowedtags ); + $api->sections[ $section_name ] = wp_kses( $content, $plugins_allowedtags ); } foreach ( array( 'version', 'author', 'requires', 'tested', 'homepage', 'downloaded', 'slug' ) as $key ) { @@ -516,7 +572,7 @@ $section = isset( $_REQUEST['section'] ) ? wp_unslash( $_REQUEST['section'] ) : 'description'; // Default to the Description tab, Do not translate, API returns English. if ( empty( $section ) || ! isset( $api->sections[ $section ] ) ) { $section_titles = array_keys( (array) $api->sections ); - $section = reset( $section_titles ); + $section = reset( $section_titles ); } iframe_header( __( 'Plugin Installation' ) ); @@ -525,8 +581,8 @@ if ( ! empty( $api->banners ) && ( ! empty( $api->banners['low'] ) || ! empty( $api->banners['high'] ) ) ) { $_with_banner = 'with-banner'; - $low = empty( $api->banners['low'] ) ? $api->banners['high'] : $api->banners['low']; - $high = empty( $api->banners['high'] ) ? $api->banners['low'] : $api->banners['high']; + $low = empty( $api->banners['low'] ) ? $api->banners['high'] : $api->banners['low']; + $high = empty( $api->banners['high'] ) ? $api->banners['low'] : $api->banners['high']; ?>