WordPress.org

Make WordPress Core

Ticket #34451: 34451.2.diff

File 34451.2.diff, 7.9 KB (added by swissspidy, 5 years ago)
  • src/wp-includes/embed-functions.php

    diff --git src/wp-includes/embed-functions.php src/wp-includes/embed-functions.php
    index 360399e..32a3e79 100644
    function get_post_embed_html( $post = null, $width, $height ) { 
    461461
    462462        $embed_url = get_post_embed_url( $post );
    463463
    464         $output = '<blockquote><a href="' . get_permalink( $post ) . '">' . get_the_title( $post ) . "</a></blockquote>\n";
     464        $output = '<blockquote class="wp-embedded-content"><a href="' . get_permalink( $post ) . '">' . get_the_title( $post ) . "</a></blockquote>\n";
    465465
    466466        $output .= "<script type='text/javascript'>\n";
    467467        $output .= "<!--//--><![CDATA[//><!--\n";
    function wp_filter_oembed_result( $result, $data, $url ) { 
    757757                'a'          => array(
    758758                                'href' => true,
    759759                ),
    760                 'blockquote' => array(),
     760                'blockquote' => array(
     761                        'class'        => true,
     762                ),
    761763                'iframe'     => array(
    762764                        'src'          => true,
    763765                        'width'        => true,
    function wp_filter_oembed_result( $result, $data, $url ) { 
    773775
    774776        $html = wp_kses( $result, $allowed_html );
    775777
    776         preg_match( '|(<blockquote>.*?</blockquote>)?.*(<iframe.*?></iframe>)|ms', $html, $content );
     778        preg_match( '|(<blockquote.*?>.*?</blockquote>)?.*(<iframe.*?></iframe>)|ms', $html, $content );
    777779        // We require at least the iframe to exist.
    778780        if ( empty( $content[2] ) ) {
    779781                return false;
    function wp_filter_oembed_result( $result, $data, $url ) { 
    785787                $html = str_replace( '<iframe', '<iframe style="display:none;"', $html );
    786788        }
    787789
    788         $html = str_replace( '<iframe', '<iframe sandbox="allow-scripts" security="restricted"', $html );
    789 
    790         preg_match( '/ src=[\'"]([^\'"]*)[\'"]/', $html, $results );
    791 
    792         if ( ! empty( $results ) ) {
    793                 $secret = wp_generate_password( 10, false );
    794 
    795                 $url = esc_url( "{$results[1]}#?secret=$secret" );
    796 
    797                 $html = str_replace( $results[0], " src=\"$url\" data-secret=\"$secret\"", $html );
    798                 $html = str_replace( '<blockquote', "<blockquote data-secret=\"$secret\"", $html );
    799         }
    800 
    801         return $html;
     790        return str_replace( '<iframe', '<iframe sandbox="allow-scripts" security="restricted"', $html );
    802791}
    803792
    804793/**
  • src/wp-includes/js/wp-embed-template.js

    diff --git src/wp-includes/js/wp-embed-template.js src/wp-includes/js/wp-embed-template.js
    index 847ebcf..819ef0c 100644
     
    11(function ( window, document ) {
    22        'use strict';
    33
    4         var secret = window.location.hash.replace( /.*secret=([\d\w]{10}).*/, '$1' ),
    5                 resizing;
     4        var secret, secretTimeout, resizing;
    65
    76        function sendEmbedMessage( message, value ) {
    87                window.parent.postMessage( {
     
    159158        }
    160159
    161160        window.addEventListener( 'resize', onResize, false );
     161
     162        /**
     163         * Re-get the secret when it was added later on.
     164         */
     165        function getSecret() {
     166                if ( window.self === window.top || !!secret ) {
     167                        return;
     168                }
     169
     170                secret = window.location.hash.replace( /.*secret=([\d\w]{10}).*/, '$1' );
     171
     172                clearTimeout( secretTimeout );
     173
     174                secretTimeout = setTimeout( function () {
     175                        getSecret();
     176                }, 100 );
     177        }
     178
     179        getSecret();
    162180})( window, document );
  • src/wp-includes/js/wp-embed.js

    diff --git src/wp-includes/js/wp-embed.js src/wp-includes/js/wp-embed.js
    index 3829d0d..71f2bed 100644
     
    1313                        return;
    1414                }
    1515
    16                 var iframes = document.querySelectorAll( 'iframe[data-secret="' + data.secret + '"]' ),
    17                         blockquotes = document.querySelectorAll( 'blockquote[data-secret="' + data.secret + '"]' ),
     16                var iframes = document.querySelectorAll( '.wp-embedded-content[data-secret="' + data.secret + '"]' ),
    1817                        i, source, height, sourceURL, targetURL;
    1918
    20                 for ( i = 0; i < blockquotes.length; i++ ) {
    21                         blockquotes[ i ].style.display = 'none';
    22                 }
    23 
    2419                for ( i = 0; i < iframes.length; i++ ) {
    2520                        source = iframes[ i ];
    2621
    27                         source.style.display = '';
    28 
    2922                        /* Resize the iframe on request. */
    3023                        if ( 'height' === data.message ) {
    3124                                height = data.value;
     
    5851
    5952        function onLoad() {
    6053                var isIE10 = -1 !== navigator.appVersion.indexOf( 'MSIE 10' ),
    61                         isIE11 = !!navigator.userAgent.match( /Trident.*rv\:11\./ ),
    62                         iframes, iframeClone, i;
     54                        isIE11 = !!navigator.userAgent.match( /Trident.*rv:11\./ ),
     55                        iframes = document.querySelectorAll( 'iframe.wp-embedded-content' ),
     56                        blockquotes = document.querySelectorAll( 'blockquote.wp-embedded-content' ),
     57                        iframeClone, i, source, secret;
     58
     59                for ( i = 0; i < blockquotes.length; i++ ) {
     60                        blockquotes[ i ].style.display = 'none';
     61                }
     62
     63                for ( i = 0; i < iframes.length; i++ ) {
     64                        source = iframes[ i ];
     65                        source.style.display = '';
     66
     67                        if ( !!source.getAttribute( 'data-secret' ) ) {
     68                                continue;
     69                        }
    6370
    64                 /* Remove security attribute from iframes in IE10 and IE11. */
    65                 if ( isIE10 || isIE11 ) {
    66                         iframes = document.querySelectorAll( '.wp-embedded-content[security]' );
     71                        /* Add secret to iframe */
     72                        secret = Math.random().toString( 36 ).substr( 2, 10 );
     73                        source.src += '#?secret=' + secret;
     74                        source.setAttribute( 'data-secret', secret );
    6775
    68                         for ( i = 0; i < iframes.length; i++ ) {
    69                                 iframeClone = iframes[ i ].cloneNode( true );
     76                        /* Remove security attribute from iframes in IE10 and IE11. */
     77                        if ( ( isIE10 || isIE11 ) && !!source.getAttribute( 'security' ) ) {
     78                                iframeClone = source.cloneNode( true );
    7079                                iframeClone.removeAttribute( 'security' );
    71                                 iframes[ i ].parentNode.insertBefore( iframeClone, iframes[ i ].nextSibling );
    72                                 iframes[ i ].parentNode.removeChild( iframes[ i ] );
     80                                source.parentNode.replaceChild( iframeClone, source );
    7381                        }
    7482                }
    7583        }
  • tests/phpunit/tests/oembed/filterResult.php

    diff --git tests/phpunit/tests/oembed/filterResult.php tests/phpunit/tests/oembed/filterResult.php
    index 7559f62..063fdd0 100644
    class Tests_Filter_oEmbed_Result extends WP_UnitTestCase { 
    1616                $html   = '<p></p><iframe onload="alert(1)" src="http://example.com/sample-page/"></iframe>';
    1717                $actual = wp_filter_oembed_result( $html, (object) array( 'type' => 'rich' ), 'http://example.com/sample-page/' );
    1818
    19                 $matches = array();
    20                 preg_match( '|src=".*#\?secret=([\w\d]+)" data-secret="([\w\d]+)"|', $actual, $matches );
    21 
    22                 $this->assertTrue( isset( $matches[1] ) );
    23                 $this->assertTrue( isset( $matches[2] ) );
    24                 $this->assertEquals( $matches[1], $matches[2] );
     19                $this->assertEquals( '<iframe sandbox="allow-scripts" security="restricted" src="http://example.com/sample-page/"></iframe>', $actual );
    2520        }
    2621
    2722        function test_filter_oembed_result_only_one_iframe_is_allowed() {
    EOD; 
    5651                $this->assertFalse( $actual );
    5752        }
    5853
    59         function test_filter_oembed_result_secret_param_available() {
    60                 $html   = '<iframe src="https://wordpress.org"></iframe>';
    61                 $actual = wp_filter_oembed_result( $html, (object) array( 'type' => 'rich' ), '' );
    62 
    63                 $matches = array();
    64                 preg_match( '|src="https://wordpress.org#\?secret=([\w\d]+)" data-secret="([\w\d]+)"|', $actual, $matches );
    65 
    66                 $this->assertTrue( isset( $matches[1] ) );
    67                 $this->assertTrue( isset( $matches[2] ) );
    68                 $this->assertEquals( $matches[1], $matches[2] );
    69         }
    70 
    7154        function test_filter_oembed_result_wrong_type_provided() {
    7255                $actual = wp_filter_oembed_result( 'some string', (object) array( 'type' => 'link' ), '' );
    7356
    EOD; 
    8770        }
    8871
    8972        function test_filter_oembed_result_allowed_html() {
    90                 $html   = '<blockquote><strong><a href="" target=""></a></strong></blockquote><iframe></iframe>';
     73                $html   = '<blockquote class="foo" id="bar"><strong><a href="" target=""></a></strong></blockquote><iframe></iframe>';
    9174                $actual = wp_filter_oembed_result( $html, (object) array( 'type' => 'rich' ), '' );
    9275
    93                 $this->assertEquals( '<blockquote><a href=""></a></blockquote><iframe sandbox="allow-scripts" security="restricted" style="display:none;"></iframe>', $actual );
     76                $this->assertEquals( '<blockquote class="foo"><a href=""></a></blockquote><iframe sandbox="allow-scripts" security="restricted" style="display:none;"></iframe>', $actual );
    9477        }
    9578}