Make WordPress Core

Ticket #42195: 42195.diff

File 42195.diff, 4.6 KB (added by whyisjake, 4 years ago)
  • src/wp-includes/formatting.php

     
    54965496}
    54975497
    54985498/**
    5499  * Add slashes to a string or array of strings.
     5499 * Add slashes to a string or array of strings, in a recursive manner.
    55005500 *
    55015501 * This should be used when preparing data for core API that expects slashed data.
    55025502 * This should not be used to escape data going directly into an SQL query.
    55035503 *
    55045504 * @since 3.6.0
     5505 * @since 5.5.0 Leave a non-string value untouched.
    55055506 *
    55065507 * @param string|array $value String or array of strings to slash.
    55075508 * @return string|array Slashed $value
     
    55085509 */
    55095510function wp_slash( $value ) {
    55105511        if ( is_array( $value ) ) {
    5511                 foreach ( $value as $k => $v ) {
    5512                         if ( is_array( $v ) ) {
    5513                                 $value[ $k ] = wp_slash( $v );
    5514                         } else {
    5515                                 $value[ $k ] = addslashes( $v );
    5516                         }
    5517                 }
    5518         } else {
    5519                 $value = addslashes( $value );
     5512                $value = array_map( 'wp_slash', $value );
    55205513        }
    55215514
     5515        if ( is_string( $value ) ) {
     5516                return addslashes( $value );
     5517        }
     5518
    55225519        return $value;
    55235520}
    55245521
  • tests/phpunit/tests/formatting/StripSlashesDeep.php

     
    22
    33/**
    44 * @group formatting
     5 * @group slashes
    56 */
    67class Tests_Formatting_StripSlashesDeep extends WP_UnitTestCase {
    78        /**
  • tests/phpunit/tests/formatting/WPSlash.php

     
     1<?php
     2
     3/**
     4 * @group formatting
     5 */
     6class Tests_Formatting_WPSlash extends WP_UnitTestCase {
     7
     8        /**
     9         * @dataProvider data_wp_slash
     10         *
     11         * @ticket 42195
     12         *
     13         * @param string $value
     14         * @param string $expected
     15         */
     16        public function test_wp_slash_with( $value, $expected ) {
     17                $this->assertSame( $expected, wp_slash( $value ) );
     18        }
     19
     20        /**
     21         * Data provider for test_wp_slash().
     22         *
     23         * @return array {
     24         *     @type array {
     25         *         @type mixed  $value    The value passed to wp_slash().
     26         *         @type string $expected The expected output of wp_slash().
     27         *     }
     28         * }
     29         */
     30        public function data_wp_slash() {
     31                return array(
     32                        array( 123, 123 ),
     33                        array( 123.4, 123.4 ),
     34                        array( true, true ),
     35                        array( false, false ),
     36                        array(
     37                                array(
     38                                        'hello',
     39                                        null,
     40                                        '"string"',
     41                                        125.41,
     42                                ),
     43                                array(
     44                                        'hello',
     45                                        null,
     46                                        '\"string\"',
     47                                        125.41,
     48                                ),
     49                        ),
     50                        array( "first level 'string'", "first level \'string\'" ),
     51                );
     52        }
     53
     54        /**
     55         * @ticket 24106
     56         */
     57        function test_adds_slashes() {
     58                $old = "I can't see, isn't that it?";
     59                $new = "I can\'t see, isn\'t that it?";
     60                $this->assertEquals( $new, wp_slash( $old ) );
     61                $this->assertEquals( "I can\\\\\'t see, isn\\\\\'t that it?", wp_slash( $new ) );
     62                $this->assertEquals( array( 'a' => $new ), wp_slash( array( 'a' => $old ) ) ); // Keyed array
     63                $this->assertEquals( array( $new ), wp_slash( array( $old ) ) ); // Non-keyed
     64        }
     65
     66        /**
     67         * @ticket 24106
     68         */
     69        function test_preserves_original_datatype() {
     70
     71                $this->assertEquals( true, wp_slash( true ) );
     72                $this->assertEquals( false, wp_slash( false ) );
     73                $this->assertEquals( 4, wp_slash( 4 ) );
     74                $this->assertEquals( 'foo', wp_slash( 'foo' ) );
     75                $arr      = array(
     76                        'a' => true,
     77                        'b' => false,
     78                        'c' => 4,
     79                        'd' => 'foo',
     80                );
     81                $arr['e'] = $arr; // Add a sub-array
     82                $this->assertEquals( $arr, wp_slash( $arr ) ); // Keyed array
     83                $this->assertEquals( array_values( $arr ), wp_slash( array_values( $arr ) ) ); // Non-keyed
     84
     85                $obj = new stdClass;
     86                foreach ( $arr as $k => $v ) {
     87                        $obj->$k = $v;
     88                }
     89                $this->assertEquals( $obj, wp_slash( $obj ) );
     90        }
     91
     92        /**
     93         * @ticket 24106
     94         */
     95        function test_add_even_more_slashes() {
     96                $old = 'single\\slash double\\\\slash triple\\\\\\slash';
     97                $new = 'single\\\\slash double\\\\\\\\slash triple\\\\\\\\\\\\slash';
     98                $this->assertEquals( $new, wp_slash( $old ) );
     99                $this->assertEquals( array( 'a' => $new ), wp_slash( array( 'a' => $old ) ) ); // Keyed array
     100                $this->assertEquals( array( $new ), wp_slash( array( $old ) ) ); // Non-keyed
     101        }
     102}