WordPress.org

Make WordPress Core

Ticket #44044: 44044-5.diff

File 44044-5.diff, 7.6 KB (added by birgire, 3 years ago)
  • src/wp-admin/includes/file.php

    diff --git src/wp-admin/includes/file.php src/wp-admin/includes/file.php
    index efc846b..03f6e3c 100644
    function wp_print_request_filesystem_credentials_modal() { 
    19561956 * @return string The HTML for this group and its items.
    19571957 */
    19581958function wp_privacy_generate_personal_data_export_group_html( $group_data ) {
    1959         $allowed_tags      = array(
    1960                 'a'  => array(
    1961                         'href'   => array(),
    1962                         'target' => array(),
    1963                 ),
    1964                 'br' => array(),
    1965         );
    1966         $allowed_protocols = array( 'http', 'https' );
    1967         $group_html        = '';
    1968 
    1969         $group_html .= '<h2>' . esc_html( $group_data['group_label'] ) . '</h2>';
     1959        $group_html  = '<h2>' . esc_html( $group_data['group_label'] ) . '</h2>';
    19701960        $group_html .= '<div>';
    19711961
    19721962        foreach ( (array) $group_data['items'] as $group_item_id => $group_item_data ) {
    function wp_privacy_generate_personal_data_export_group_html( $group_data ) { 
    19751965
    19761966                foreach ( (array) $group_item_data as $group_item_datum ) {
    19771967                        $value = $group_item_datum['value'];
    1978                         // If it looks like a link, make it a link
     1968                        // If it looks like a link, make it a link.
    19791969                        if ( false === strpos( $value, ' ' ) && ( 0 === strpos( $value, 'http://' ) || 0 === strpos( $value, 'https://' ) ) ) {
    19801970                                $value = '<a href="' . esc_url( $value ) . '">' . esc_html( $value ) . '</a>';
    19811971                        }
    19821972
    19831973                        $group_html .= '<tr>';
    19841974                        $group_html .= '<th>' . esc_html( $group_item_datum['name'] ) . '</th>';
    1985                         $group_html .= '<td>' . wp_kses( $value, $allowed_tags, $allowed_protocols ) . '</td>';
     1975                        $group_html .= '<td>' . wp_kses( $value, 'personal_data_export' ) . '</td>';
    19861976                        $group_html .= '</tr>';
    19871977                }
    19881978
  • new file tests/phpunit/tests/privacy/wpPrivacyGeneratePersonalDataExportGroupHtml.php

    diff --git tests/phpunit/tests/privacy/wpPrivacyGeneratePersonalDataExportGroupHtml.php tests/phpunit/tests/privacy/wpPrivacyGeneratePersonalDataExportGroupHtml.php
    new file mode 100644
    index 0000000..f9f6dd5
    - +  
     1<?php
     2/**
     3 * Test cases for the `wp_privacy_generate_personal_data_export_group_html()` function.
     4 *
     5 * @package WordPress
     6 * @subpackage UnitTests
     7 * @since 5.2.0
     8 */
     9
     10/**
     11 * Tests_Privacy_WpPrivacyGeneratePersonalDataExportGroupHtml class.
     12 *
     13 * @group privacy
     14 * @covers ::wp_privacy_generate_personal_data_export_group_html
     15 *
     16 * @since 5.2.0
     17 */
     18class Tests_Privacy_WpPrivacyGeneratePersonalDataExportGroupHtml extends WP_UnitTestCase {
     19
     20        /**
     21         * Test when a single data item is passed.
     22         *
     23         * @ticket 44044
     24         */
     25        public function test_group_html_generation_single_data_item() {
     26                $data = array(
     27                        'group_label' => 'Test Data Group',
     28                        'items'       => array(
     29                                array(
     30                                        array(
     31                                                'name'  => 'Field 1 Name',
     32                                                'value' => 'Field 1 Value',
     33                                        ),
     34                                        array(
     35                                                'name'  => 'Field 2 Name',
     36                                                'value' => 'Field 2 Value',
     37                                        ),
     38                                ),
     39                        ),
     40                );
     41
     42                $actual                = wp_privacy_generate_personal_data_export_group_html( $data );
     43                $expected_table_markup = '<table><tbody><tr><th>Field 1 Name</th><td>Field 1 Value</td></tr><tr><th>Field 2 Name</th><td>Field 2 Value</td></tr></tbody></table>';
     44
     45                $this->assertContains( '<h2>Test Data Group</h2>', $actual );
     46                $this->assertContains( $expected_table_markup, $actual );
     47        }
     48
     49        /**
     50         * Test when a multiple data items are passed.
     51         *
     52         * @ticket 44044
     53         */
     54        public function test_group_html_generation_multiple_data_items() {
     55                $data = array(
     56                        'group_label' => 'Test Data Group',
     57                        'items'       => array(
     58                                array(
     59                                        array(
     60                                                'name'  => 'Field 1 Name',
     61                                                'value' => 'Field 1 Value',
     62                                        ),
     63                                        array(
     64                                                'name'  => 'Field 2 Name',
     65                                                'value' => 'Field 2 Value',
     66                                        ),
     67                                ),
     68                                array(
     69                                        array(
     70                                                'name'  => 'Field 1 Name',
     71                                                'value' => 'Another Field 1 Value',
     72                                        ),
     73                                        array(
     74                                                'name'  => 'Field 2 Name',
     75                                                'value' => 'Another Field 2 Value',
     76                                        ),
     77                                ),
     78                        ),
     79                );
     80
     81                $actual = wp_privacy_generate_personal_data_export_group_html( $data );
     82
     83                $this->assertContains( '<h2>Test Data Group</h2>', $actual );
     84                $this->assertContains( '<td>Field 1 Value', $actual );
     85                $this->assertContains( '<td>Another Field 1 Value', $actual );
     86                $this->assertContains( '<td>Field 2 Value', $actual );
     87                $this->assertContains( '<td>Another Field 2 Value', $actual );
     88                $this->assertSame( 2, substr_count( $actual, '<th>Field 1 Name' ) );
     89                $this->assertSame( 2, substr_count( $actual, '<th>Field 2 Name' ) );
     90                $this->assertSame( 4, substr_count( $actual, '<tr>' ) );
     91        }
     92
     93        /**
     94         * Values that appear to be links should be wrapped in `<a>` tags.
     95         *
     96         * @ticket 44044
     97         */
     98        public function test_links_become_anchors() {
     99                $data = array(
     100                        'group_label' => 'Test Data Group',
     101                        'items'       => array(
     102                                array(
     103                                        array(
     104                                                'name'  => 'HTTP Link',
     105                                                'value' => 'http://wordpress.org',
     106                                        ),
     107                                        array(
     108                                                'name'  => 'HTTPS Link',
     109                                                'value' => 'https://wordpress.org',
     110                                        ),
     111                                        array(
     112                                                'name'  => 'Link with Spaces',
     113                                                'value' => 'https://wordpress.org not a link.',
     114                                        ),
     115                                ),
     116                        ),
     117                );
     118
     119                $actual = wp_privacy_generate_personal_data_export_group_html( $data );
     120
     121                $this->assertContains( '<a href="http://wordpress.org">http://wordpress.org</a>', $actual );
     122                $this->assertContains( '<a href="https://wordpress.org">https://wordpress.org</a>', $actual );
     123                $this->assertContains( 'https://wordpress.org not a link.', $actual );
     124        }
     125
     126        /**
     127         * HTML in group labels should be escaped.
     128         *
     129         * @ticket 44044
     130         */
     131        public function test_group_labels_escaped() {
     132                $data = array(
     133                        'group_label' => '<div>Escape HTML in group lavels</div>',
     134                        'items'       => array(),
     135                );
     136
     137                $actual = wp_privacy_generate_personal_data_export_group_html( $data );
     138
     139                $this->assertContains( '<h2>&lt;div&gt;Escape HTML in group lavels&lt;/div&gt;</h2>', $actual );
     140        }
     141
     142        /**
     143         * Test that the exported data should contain allowed HTML.
     144         *
     145         * @ticket 44044
     146         */
     147        public function test_allowed_html_not_stripped() {
     148                $data = array(
     149                        'group_label' => 'Test Data Group',
     150                        'items'       => array(
     151                                array(
     152                                        'links'      => array(
     153                                                'name'  => 'Links are allowed',
     154                                                'value' => '<a href="http://wordpress.org">http://wordpress.org</a>',
     155                                        ),
     156                                        'formatting' => array(
     157                                                'name'  => 'Simple formatting is allowed',
     158                                                'value' => '<b>bold</b>, <em>emphasis</em>, <i>italics</i>, and <strong>strong</strong> are allowed.',
     159                                        ),
     160                                ),
     161                        ),
     162                );
     163
     164                $actual = wp_privacy_generate_personal_data_export_group_html( $data );
     165
     166                $this->assertContains( $data['items'][0]['links']['value'], $actual );
     167                $this->assertContains( $data['items'][0]['formatting']['value'], $actual );
     168        }
     169
     170        /**
     171         * Test that the exported data should not contain disallowed HTML.
     172         *
     173         * @ticket 44044
     174         */
     175        public function test_disallowed_html_is_stripped() {
     176                $data = array(
     177                        'group_label' => 'Test Data Group',
     178                        'items'       => array(
     179                                array(
     180                                        'scripts' => array(
     181                                                'name'  => 'Script tags are not allowed.',
     182                                                'value' => '<script>Testing that script tags are stripped.</script>',
     183                                        ),
     184                                        'images'  => array(
     185                                                'name'  => 'Images are not allowed',
     186                                                'value' => '<img src="https://example.com/logo.jpg" alt="Alt text" />',
     187                                        ),
     188                                ),
     189                        ),
     190                );
     191
     192                $actual = wp_privacy_generate_personal_data_export_group_html( $data );
     193
     194                $this->assertNotContains( $data['items'][0]['scripts']['value'], $actual );
     195                $this->assertContains( '<td>Testing that script tags are stripped.</td>', $actual );
     196
     197                $this->assertNotContains( $data['items'][0]['images']['value'], $actual );
     198                $this->assertContains( '<th>Images are not allowed</th><td></td>', $actual );
     199        }
     200}