Make WordPress Core

Ticket #35379: 35379.5.diff

File 35379.5.diff, 10.1 KB (added by codex-m, 9 years ago)

sanitize_network_option function

  • src/wp-includes/formatting.php

     
    36273627}
    36283628
    36293629/**
    3630  * Sanitises various option values based on the nature of the option.
     3630 * Validates default option values based on the nature of the option.
    36313631 *
    3632  * This is basically a switch statement which will pass $value through a number
    3633  * of functions depending on the $option.
     3632 * This validation functions are usable for validating WordPress core options in both single-site and multisite-mode
    36343633 *
    3635  * @since 2.0.5
     3634 * @since 4.6.0
    36363635 *
    36373636 * @global wpdb $wpdb WordPress database abstraction object.
    36383637 *
    36393638 * @param string $option The name of the option.
    3640  * @param string $value  The unsanitised value.
    3641  * @return string Sanitized value.
     3639 * @param string $value  The unsanitised value or original value
     3640 * @return array Array of validated value or error
    36423641 */
    3643 function sanitize_option( $option, $value ) {
     3642
     3643function wp_validate_default_options( $option , $value ) {
     3644       
    36443645        global $wpdb;
    36453646
    36463647        $original_value = $value;
     
    36593660                                }
    36603661                        }
    36613662                        break;
    3662 
     3663       
    36633664                case 'thumbnail_size_w':
    36643665                case 'thumbnail_size_h':
    36653666                case 'medium_size_w':
     
    36843685                case 'site_icon':
    36853686                        $value = absint( $value );
    36863687                        break;
    3687 
     3688       
    36883689                case 'posts_per_page':
    36893690                case 'posts_per_rss':
    36903691                        $value = (int) $value;
    36913692                        if ( empty($value) )
    36923693                                $value = 1;
    3693                         if ( $value < -1 )
    3694                                 $value = abs($value);
    3695                         break;
    3696 
     3694                                if ( $value < -1 )
     3695                                        $value = abs($value);
     3696                                        break;
     3697       
    36973698                case 'default_ping_status':
    36983699                case 'default_comment_status':
    36993700                        // Options that if not there have 0 value but need to be something like "closed"
    37003701                        if ( $value == '0' || $value == '')
    37013702                                $value = 'closed';
    3702                         break;
    3703 
     3703                                break;
     3704       
    37043705                case 'blogdescription':
    37053706                case 'blogname':
    37063707                        $value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
     
    37073708                        if ( $value !== $original_value ) {
    37083709                                $value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', wp_encode_emoji( $original_value ) );
    37093710                        }
    3710 
     3711       
    37113712                        if ( is_wp_error( $value ) ) {
    37123713                                $error = $value->get_error_message();
    37133714                        } else {
     
    37143715                                $value = esc_html( $value );
    37153716                        }
    37163717                        break;
    3717 
     3718       
    37183719                case 'blog_charset':
    37193720                        $value = preg_replace('/[^a-zA-Z0-9_-]/', '', $value); // strips slashes
    37203721                        break;
    3721 
     3722       
    37223723                case 'blog_public':
    37233724                        // This is the value if the settings checkbox is not checked on POST. Don't rely on this.
    37243725                        if ( null === $value )
    37253726                                $value = 1;
    3726                         else
    3727                                 $value = intval( $value );
    3728                         break;
    3729 
     3727                                else
     3728                                        $value = intval( $value );
     3729                                        break;
     3730       
    37303731                case 'date_format':
    37313732                case 'time_format':
    37323733                case 'mailserver_url':
     
    37413742                                $value = wp_kses_data( $value );
    37423743                        }
    37433744                        break;
    3744 
     3745       
    37453746                case 'ping_sites':
    37463747                        $value = explode( "\n", $value );
    37473748                        $value = array_filter( array_map( 'trim', $value ) );
     
    37483749                        $value = array_filter( array_map( 'esc_url_raw', $value ) );
    37493750                        $value = implode( "\n", $value );
    37503751                        break;
    3751 
     3752       
    37523753                case 'gmt_offset':
    37533754                        $value = preg_replace('/[^0-9:.-]/', '', $value); // strips slashes
    37543755                        break;
    3755 
     3756       
    37563757                case 'siteurl':
    37573758                        $value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
    37583759                        if ( is_wp_error( $value ) ) {
     
    37653766                                }
    37663767                        }
    37673768                        break;
    3768 
     3769       
    37693770                case 'home':
    37703771                        $value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
    37713772                        if ( is_wp_error( $value ) ) {
     
    37783779                                }
    37793780                        }
    37803781                        break;
    3781 
     3782       
    37823783                case 'WPLANG':
    37833784                        $allowed = get_available_languages();
    37843785                        if ( ! is_multisite() && defined( 'WPLANG' ) && '' !== WPLANG && 'en_US' !== WPLANG ) {
    37853786                                $allowed[] = WPLANG;
    37863787                        }
    3787                         if ( ! in_array( $value, $allowed ) && ! empty( $value ) ) {
    3788                                 $value = get_option( $option );
     3788                        if ( ! in_array( $value, $allowed ) && ! empty( $value ) ) {                           
     3789                                $error = __( 'The WPLANG seems incorrect.' );
    37893790                        }
    37903791                        break;
    3791 
     3792       
    37923793                case 'illegal_names':
    37933794                        $value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
    37943795                        if ( is_wp_error( $value ) ) {
     
    37963797                        } else {
    37973798                                if ( ! is_array( $value ) )
    37983799                                        $value = explode( ' ', $value );
    3799 
    3800                                 $value = array_values( array_filter( array_map( 'trim', $value ) ) );
    3801 
    3802                                 if ( ! $value )
    3803                                         $value = '';
     3800       
     3801                                        $value = array_values( array_filter( array_map( 'trim', $value ) ) );
     3802       
     3803                                        if ( ! $value )
     3804                                                $value = '';
    38043805                        }
    38053806                        break;
    3806 
     3807       
    38073808                case 'limited_email_domains':
    38083809                case 'banned_email_domains':
    38093810                        $value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
     
    38123813                        } else {
    38133814                                if ( ! is_array( $value ) )
    38143815                                        $value = explode( "\n", $value );
    3815 
    3816                                 $domains = array_values( array_filter( array_map( 'trim', $value ) ) );
    3817                                 $value = array();
    3818 
    3819                                 foreach ( $domains as $domain ) {
    3820                                         if ( ! preg_match( '/(--|\.\.)/', $domain ) && preg_match( '|^([a-zA-Z0-9-\.])+$|', $domain ) ) {
    3821                                                 $value[] = $domain;
     3816       
     3817                                        $domains = array_values( array_filter( array_map( 'trim', $value ) ) );
     3818                                        $value = array();
     3819       
     3820                                        foreach ( $domains as $domain ) {
     3821                                                if ( ! preg_match( '/(--|\.\.)/', $domain ) && preg_match( '|^([a-zA-Z0-9-\.])+$|', $domain ) ) {
     3822                                                        $value[] = $domain;
     3823                                                }
    38223824                                        }
    3823                                 }
    3824                                 if ( ! $value )
    3825                                         $value = '';
     3825                                        if ( ! $value )
     3826                                                $value = '';
    38263827                        }
    38273828                        break;
    3828 
     3829       
    38293830                case 'timezone_string':
    38303831                        $allowed_zones = timezone_identifiers_list();
    38313832                        if ( ! in_array( $value, $allowed_zones ) && ! empty( $value ) ) {
     
    38323833                                $error = __( 'The timezone you have entered is not valid. Please select a valid timezone.' );
    38333834                        }
    38343835                        break;
    3835 
     3836       
    38363837                case 'permalink_structure':
    38373838                case 'category_base':
    38383839                case 'tag_base':
     
    38443845                                $value = str_replace( 'http://', '', $value );
    38453846                        }
    38463847                        break;
    3847 
     3848       
    38483849                case 'default_role' :
    38493850                        if ( ! get_role( $value ) && get_role( 'subscriber' ) )
    38503851                                $value = 'subscriber';
    3851                         break;
    3852 
     3852                                break;
     3853       
    38533854                case 'moderation_keys':
    38543855                case 'blacklist_keys':
    38553856                        $value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );
     
    38623863                                $value = implode( "\n", $value );
    38633864                        }
    38643865                        break;
    3865         }
     3866        }       
    38663867
     3868        return array( 'value'                   => $value ,
     3869                                  'original_value'      => $original_value,     
     3870                                  'error'                       => $error
     3871        );
     3872}
     3873/**
     3874 * Sanitises various option values based on the nature of the option.
     3875 * @since 2.0.5
     3876 * @since 4.6.0 Calls 'wp_validate_default_options' to validate core WordPress default options
     3877 *
     3878 * @param string $option The name of the option.
     3879 * @param string $value  The unsanitised value.
     3880 * @return string Sanitized value.
     3881 */
     3882function sanitize_option( $option, $value ) {
     3883
     3884        $result                 = wp_validate_default_options( $option , $value );     
     3885        $error                  = $result['error'];
     3886        $original_value = $result['original_value'];
     3887        $value                  = $result['value'];
     3888       
    38673889        if ( ! empty( $error ) ) {
    38683890                $value = get_option( $option );
    38693891                if ( function_exists( 'add_settings_error' ) ) {
     
    38853907}
    38863908
    38873909/**
     3910 * Sanitises various network option values based on the nature of the option.
     3911 *
     3912 * Calls 'wp_validate_default_options' to validate core WordPress default options
     3913 *
     3914 * If called on a non-multisite mode, it will fallback to sanitize_option function.
     3915 *
     3916 * @since 4.6
     3917 *
     3918 * @global wpdb $wpdb WordPress database abstraction object.
     3919 * @param int   $network_id ID of the network. Can be null to default to the current network ID.
     3920 * @param string $option The name of the network option.
     3921 * @param string $value  The unsanitised network value.
     3922 * @return string Sanitized value.
     3923 */
     3924
     3925function sanitize_network_option( $network_id, $option, $value ) {
     3926
     3927        if ( is_multisite() ) {
     3928                //Multisite             
     3929                if ( ! $network_id ) {
     3930                        global $current_site;
     3931                        $network_id = $current_site->id;
     3932                }
     3933
     3934        } else {
     3935                //Not in multisite, fallback to 'sanitize_option'
     3936                return sanitize_option( $option, $value );
     3937        }
     3938                       
     3939        $result = wp_validate_default_options( $option , $value );
     3940
     3941        /**
     3942         * We can add specialized 'case' statement here if needed for sanitizing network options
     3943         * that do not match the names of site options that exists in single site mode.
     3944         */     
     3945       
     3946        $error                  = $result['error'];     
     3947        $original_value = $result['original_value'];   
     3948        $value                  = $result['value'];
     3949       
     3950        if ( ! empty( $error ) ) {
     3951                $value = get_network_option( $network_id, $option, false );     
     3952                if ( function_exists( 'add_settings_error' ) ) {
     3953                        add_settings_error( $option, "invalid_{$option}", $error );
     3954                }
     3955        }
     3956       
     3957        /**
     3958         * Filters an network option value following sanitization.
     3959         *
     3960         * @since 4.6
     3961         * @param string $value          The sanitized network option value.
     3962         * @param string $option         The network option name.
     3963         * @param string $original_value The original value passed to the function.
     3964         */
     3965        return apply_filters( "sanitize_network_option_{$option}", $value, $option, $original_value ); 
     3966       
     3967}
     3968
     3969/**
    38883970 * Maps a function to all non-iterable elements of an array or an object.
    38893971 *
    38903972 * This is similar to `array_walk_recursive()` but acts upon objects too.
  • src/wp-includes/option.php

     
    12391239                        }
    12401240                }
    12411241
    1242                 $value = sanitize_option( $option, $value );
     1242                $value = sanitize_network_option( $network_id, $option, $value );
    12431243
    12441244                $serialized_value = maybe_serialize( $value );
    12451245                $result = $wpdb->insert( $wpdb->sitemeta, array( 'site_id'    => $network_id, 'meta_key'   => $option, 'meta_value' => $serialized_value ) );
     
    14371437        if ( ! is_multisite() ) {
    14381438                $result = update_option( $option, $value, 'no' );
    14391439        } else {
    1440                 $value = sanitize_option( $option, $value );
     1440                $value = sanitize_network_option( $network_id, $option, $value );
    14411441
    14421442                $serialized_value = maybe_serialize( $value );
    14431443                $result = $wpdb->update( $wpdb->sitemeta, array( 'meta_value' => $serialized_value ), array( 'site_id' => $network_id, 'meta_key' => $option ) );