WordPress.org

Make WordPress Core

Ticket #32816: 32816-egregor-fixes-tests.diff

File 32816-egregor-fixes-tests.diff, 3.5 KB (added by EGregor, 3 years ago)

Fixes to previous patch, tests.

  • src/wp-admin/js/customize-nav-menus.js

     
    536536                submitLink: function() {
    537537                        var menuItem,
    538538                                itemName = $( '#custom-menu-item-name' ),
    539                                 itemUrl = $( '#custom-menu-item-url' );
     539                                itemUrl = $( '#custom-menu-item-url' ),
     540                                testRegex;
    540541
    541542                        if ( ! this.currentMenuControl ) {
    542543                                return;
    543544                        }
    544545
     546                        // Copyright (c) 2010-2013 Diego Perini, MIT licensed
     547                        // https://gist.github.com/dperini/729294
     548                        // see also https://mathiasbynens.be/demo/url-regex
     549                        // modified to allow protocol-relative URLs
     550
     551                        testRegex = /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i;
     552
    545553                        if ( '' === itemName.val() ) {
    546554                                itemName.addClass( 'invalid' );
    547555                                return;
    548                         } else if ( '' === itemUrl.val() || 'http://' === itemUrl.val() ) {
     556                        } else if ( '' === itemUrl.val() ||
     557                                'http://' === itemUrl.val() ||
     558                                ! testRegex.test( itemUrl.val() )
     559                        ) {
    549560                                itemUrl.addClass( 'invalid' );
    550561                                return;
    551562                        }
  • src/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php

     
    722722                $menu_item_value['attr_title'] = wp_unslash( apply_filters( 'excerpt_save_pre', wp_slash( $menu_item_value['attr_title'] ) ) );
    723723                $menu_item_value['description'] = wp_unslash( apply_filters( 'content_save_pre', wp_slash( $menu_item_value['description'] ) ) );
    724724
    725                 $menu_item_value['url'] = esc_url_raw( $menu_item_value['url'] );
     725                if ( '' !== $menu_item_value['url'] ) {
     726                        $menu_item_value['url'] = esc_url_raw( $menu_item_value['url'] );
     727                        if ( '' === $menu_item_value['url'] ) {
     728                                return new WP_Error( 'invalid_nav_menu_url', __( 'Invalid URL.' ) ); // Fail sanitization if URL is invalid.
     729                        }
     730                }
    726731                if ( 'publish' !== $menu_item_value['status'] ) {
    727732                        $menu_item_value['status'] = 'draft';
    728733                }
  • tests/phpunit/tests/customize/nav-menu-item-setting.php

     
    472472                $this->assertNull( $setting->sanitize( 'not an array' ) );
    473473                $this->assertNull( $setting->sanitize( 123 ) );
    474474
     475                $url_setting = $setting->sanitize( array( 'url' => 'javascript:alert(1)' ) );
     476                $this->assertInstanceOf( 'WP_Error', $url_setting );
     477
    475478                $unsanitized = array(
    476479                        'object_id' => 'bad',
    477480                        'object' => '<b>hello</b>',
     
    479482                        'position' => -123,
    480483                        'type' => 'custom<b>',
    481484                        'title' => '\o/ o\'o Hi<script>unfilteredHtml()</script>',
    482                         'url' => 'javascript:alert(1)',
     485                        'url' => '',
    483486                        'target' => '" onclick="',
    484487                        'attr_title' => '\o/ o\'o <b>bolded</b><script>unfilteredHtml()</script>',
    485488                        'description' => '\o/ o\'o <b>Hello world</b><script>unfilteredHtml()</script>',