WordPress.org

Make WordPress Core

Ticket #47577: 47577.diff

File 47577.diff, 7.6 KB (added by flixos90, 5 months ago)
  • src/wp-admin/includes/class-wp-site-health.php

     
    12721272         */
    12731273        public function get_test_https_status() {
    12741274                $result = array(
    1275                         'label'       => __( 'Your website is using an active HTTPS connection.' ),
     1275                        'label'       => __( 'Your website is using an active HTTPS connection' ),
    12761276                        'status'      => 'good',
    12771277                        'badge'       => array(
    12781278                                'label' => __( 'Security' ),
     
    12931293                        'test'        => 'https_status',
    12941294                );
    12951295
    1296                 if ( is_ssl() ) {
    1297                         $wp_url   = get_bloginfo( 'wpurl' );
    1298                         $site_url = get_bloginfo( 'url' );
     1296                if ( ! wp_is_using_https() ) {
     1297                        $result['status'] = 'recommended';
    12991298
    1300                         if ( 'https' !== substr( $wp_url, 0, 5 ) || 'https' !== substr( $site_url, 0, 5 ) ) {
    1301                                 $result['status'] = 'recommended';
     1299                        $result['label'] = __( 'Your website does not use HTTPS' );
    13021300
    1303                                 $result['label'] = __( 'Only parts of your site are using HTTPS' );
    1304 
     1301                        if ( is_ssl() ) {
    13051302                                $result['description'] = sprintf(
    13061303                                        '<p>%s</p>',
     1304                                        __( 'You are accessing your site with HTTPS, but your site is not correctly configured to use HTTPS.' )
     1305                                );
     1306                        } else {
     1307                                $result['description'] = sprintf(
     1308                                        '<p>%s</p>',
     1309                                        __( 'Your site is not correctly configured to use HTTPS.' )
     1310                                );
     1311                        }
     1312
     1313                        if ( wp_is_https_supported() ) {
     1314                                $result['description'] .= sprintf(
     1315                                        '<p>%s</p>',
    13071316                                        sprintf(
    13081317                                                /* translators: %s: URL to Settings > General to change options. */
    1309                                                 __( 'You are accessing this website using HTTPS, but your <a href="%s">WordPress Address</a> is not set up to use HTTPS by default.' ),
     1318                                                __( 'HTTPS is supported for your website, so you should update your <a href="%s">WordPress Address</a> to use HTTPS by default.' ),
    13101319                                                esc_url( admin_url( 'options-general.php' ) )
    13111320                                        )
    13121321                                );
    1313 
    1314                                 $result['actions'] .= sprintf(
    1315                                         '<p><a href="%s">%s</a></p>',
    1316                                         esc_url( admin_url( 'options-general.php' ) ),
    1317                                         __( 'Update your site addresses' )
     1322                        } else {
     1323                                $result['description'] .= sprintf(
     1324                                        '<p>%s</p>',
     1325                                        __( 'Talk to your web host about supporting HTTPS for your website.' )
    13181326                                );
    13191327                        }
    1320                 } else {
    1321                         $result['status'] = 'recommended';
    1322 
    1323                         $result['label'] = __( 'Your site does not use HTTPS' );
    13241328                }
    13251329
    13261330                return $result;
  • src/wp-includes/default-filters.php

     
    332332        add_action( 'init', 'wp_cron' );
    333333}
    334334
     335// HTTPS detection
     336add_action( 'init', 'wp_cron_schedule_https_detection' );
     337add_action( 'wp_https_detection', 'wp_update_https_detection_errors' );
     338add_filter( 'cron_request', 'wp_cron_conditionally_prevent_sslverify', 9999 );
     339add_filter( 'the_content', 'wp_replace_insecure_self_links' );
     340add_filter( 'widget_text', 'wp_replace_insecure_self_links' );
     341
    335342// 2 Actions 2 Furious
    336343add_action( 'do_feed_rdf', 'do_feed_rdf', 10, 1 );
    337344add_action( 'do_feed_rss', 'do_feed_rss', 10, 1 );
  • src/wp-includes/https-detection.php

     
     1<?php
     2/**
     3 * HTTPS detection functions.
     4 *
     5 * @package WordPress
     6 * @since 5.4.0
     7 */
     8
     9/**
     10 * Checks whether the website is using HTTPS.
     11 *
     12 * This is based on whether the home and site URL are using HTTPS.
     13 *
     14 * @since 5.4.0
     15 *
     16 * @return bool True if using HTTPS, false otherwise.
     17 */
     18function wp_is_using_https() {
     19        if ( 'https' !== wp_parse_url( home_url(), PHP_URL_SCHEME ) ) {
     20                return false;
     21        }
     22
     23        if ( 'https' !== wp_parse_url( site_url(), PHP_URL_SCHEME ) ) {
     24                return false;
     25        }
     26
     27        return true;
     28}
     29
     30/**
     31 * Checks whether HTTPS is supported for the server and domain.
     32 *
     33 * @since 5.4.0
     34 *
     35 * @return bool True if HTTPS is supported, false otherwise.
     36 */
     37function wp_is_https_supported() {
     38        $https_detection_errors = get_option( 'https_detection_errors' );
     39
     40        // If option has never been set by the Cron hook before, run it on-the-fly as fallback.
     41        if ( false === $https_detection_errors ) {
     42                wp_update_https_detection_errors();
     43
     44                $https_detection_errors = get_option( 'https_detection_errors' );
     45        }
     46
     47        // If there are no detection errors, HTTPS is supported.
     48        return empty( $https_detection_errors );
     49}
     50
     51/**
     52 * Runs a remote HTTPS request to detect whether HTTPS supported, and stores potential errors.
     53 *
     54 * This internal function is called by a regular Cron hook to ensure HTTPS support is detected and maintained.
     55 *
     56 * @since 5.4.0
     57 * @access private
     58 */
     59function wp_update_https_detection_errors() {
     60        $support_errors = new WP_Error();
     61
     62        $response = wp_remote_request(
     63                home_url( '/', 'https' ),
     64                array(
     65                        'headers'   => array(
     66                                'Cache-Control' => 'no-cache',
     67                        ),
     68                        'sslverify' => true,
     69                )
     70        );
     71
     72        if ( is_wp_error( $response ) ) {
     73                $unverified_response = wp_remote_request(
     74                        home_url( '/', 'https' ),
     75                        array(
     76                                'headers'   => array(
     77                                        'Cache-Control' => 'no-cache',
     78                                ),
     79                                'sslverify' => false,
     80                        )
     81                );
     82
     83                if ( is_wp_error( $unverified_response ) ) {
     84                        $support_errors->add(
     85                                $unverified_response->get_error_code(),
     86                                $unverified_response->get_error_message()
     87                        );
     88                } else {
     89                        $support_errors->add(
     90                                'ssl_verification_failed',
     91                                $response->get_error_message()
     92                        );
     93                }
     94
     95                $response = $unverified_response;
     96        }
     97
     98        if ( ! is_wp_error( $response ) && 200 !== wp_remote_retrieve_response_code( $response ) ) {
     99                $support_errors->add( 'response_error', wp_remote_retrieve_response_message( $response ) );
     100        }
     101
     102        update_option( 'https_detection_errors', $support_errors->errors );
     103}
     104
     105/**
     106 * Schedules the Cron hook for detecting HTTPS support.
     107 *
     108 * @since 5.4.0
     109 * @access private
     110 */
     111function wp_cron_schedule_https_detection() {
     112        if ( ! wp_next_scheduled( 'wp_https_detection' ) ) {
     113                wp_schedule_event( time(), 'twicedaily', 'wp_https_detection' );
     114        }
     115}
     116
     117/**
     118 * Disables SSL verification if the 'cron_request' arguments include an HTTPS URL.
     119 *
     120 * This prevents an issue if HTTPS breaks, where there would be a failed attempt to verify HTTPS.
     121 *
     122 * @since 5.4.0
     123 * @access private
     124 *
     125 * @param array $request The Cron request arguments.
     126 * @return array $request The filtered Cron request arguments.
     127 */
     128function wp_cron_conditionally_prevent_sslverify( $request ) {
     129        if ( 'https' === wp_parse_url( $request['url'], PHP_URL_SCHEME ) ) {
     130                $request['args']['sslverify'] = false;
     131        }
     132        return $request;
     133}
     134
     135/**
     136 * Replaces insecure HTTP URLs with HTTPS URLs in the given content.
     137 *
     138 * @since 5.4.0
     139 *
     140 * @param string $content Content to replace insecure URLs in.
     141 * @return string Modified content.
     142 */
     143function wp_replace_insecure_self_links( $content ) {
     144        if ( ! wp_is_using_https() ) {
     145                return $content;
     146        }
     147
     148        return str_replace( home_url( '', 'http' ), home_url( '', 'https' ), $content );
     149}
  • src/wp-settings.php

     
    167167require( ABSPATH . WPINC . '/theme.php' );
    168168require( ABSPATH . WPINC . '/class-wp-theme.php' );
    169169require( ABSPATH . WPINC . '/template.php' );
     170require( ABSPATH . WPINC . '/https-detection.php' );
    170171require( ABSPATH . WPINC . '/class-wp-user-request.php' );
    171172require( ABSPATH . WPINC . '/user.php' );
    172173require( ABSPATH . WPINC . '/class-wp-user-query.php' );