WordPress.org

Make WordPress Core

Ticket #47509: 47509.4.diff

File 47509.4.diff, 6.8 KB (added by pbiron, 6 months ago)
  • src/wp-includes/user.php

    From 42c05abfac2ebf0d335e7f0627648d1f0b3b1492 Mon Sep 17 00:00:00 2001
    From: Paul Biron <paul@sparrowhawkcomputing.com>
    Date: Sat, 25 Jan 2020 13:46:47 -0700
    Subject: [PATCH] add a filter in wp_user_personal_data_exporter() to make it
     easier to include additional user meta in a personal data export.  Includes
     improved unit test.
    
    ---
     src/wp-includes/user.php     |  49 ++++++++++++-
     tests/phpunit/tests/user.php | 135 +++++++++++++++++++++++++++++++++++
     2 files changed, 183 insertions(+), 1 deletion(-)
    
    diff --git a/src/wp-includes/user.php b/src/wp-includes/user.php
    index a1478679f6..f84bade569 100644
    a b function wp_user_personal_data_exporter( $email_address ) { 
    30033003                }
    30043004        }
    30053005
     3006        // get the list of reserved names.
     3007        $reserved_names = array_values( $user_prop_to_export );
     3008
     3009        /**
     3010         * Filter to extend the Users personal data for the privacy exporter.
     3011         *
     3012         * @since 5.4.0
     3013         *
     3014         * @param array    $additional_user_data {
     3015         *     An array of name-value pairs of additional user data items.  Default: the empty array.
     3016         *
     3017         *     @type string $name  The user-facing name of an item name-value pair, e.g. 'IP Address'.
     3018         *     @type string $value The user-facing value of an item data pair, e.g. '50.60.70.0'.
     3019         * }
     3020         * @param WP_User  $user           The user whose data is being exported.
     3021         * @param string[] $reserved_names An array of reserved names.  Any item in
     3022         *                                 `$additional_user_data` that uses one of these
     3023         *                                 for it's `name` will not be included in the export.
     3024         */
     3025        $_extra_data = apply_filters( 'wp_privacy_additional_user_data', array(), $user, $reserved_names );
     3026
     3027        if ( is_array( $_extra_data ) && ! empty( $_extra_data ) ) {
     3028                // remove items that use reserved names.
     3029                $extra_data  = array_filter(
     3030                        $_extra_data,
     3031                        function( $item ) use ( $reserved_names ) {
     3032                                return ! in_array( $item['name'], $reserved_names );
     3033                        }
     3034                );
     3035
     3036                if ( count( $extra_data ) !== count( $_extra_data ) ) {
     3037                        _doing_it_wrong(
     3038                                __FUNCTION__,
     3039                                sprintf(
     3040                                        /* translators: %s: wp_privacy_additional_user_data */
     3041                                        __( 'Filter %s returned items with reserved names.' ),
     3042                                        '<code>wp_privacy_additional_user_data</code>'
     3043                                ),
     3044                                '5.4.0'
     3045                        );
     3046                }
     3047
     3048                if ( ! empty( $extra_data ) ) {
     3049                        $user_data_to_export = array_merge( $user_data_to_export, $extra_data );
     3050                }
     3051        }
     3052
    30063053        $data_to_export[] = array(
    30073054                'group_id'          => 'user',
    30083055                'group_label'       => __( 'User' ),
    3009                 'group_description' => __( 'User&#8217;s profile data.' ),
     3056                'group_description' => __( 'User&#8217;s meta data.' ),
    30103057                'item_id'           => "user-{$user->ID}",
    30113058                'data'              => $user_data_to_export,
    30123059        );
  • tests/phpunit/tests/user.php

    diff --git a/tests/phpunit/tests/user.php b/tests/phpunit/tests/user.php
    index 74c533b69d..3330e24447 100644
    a b class Tests_User extends WP_UnitTestCase { 
    16711671                // Number of exported user properties.
    16721672                $this->assertSame( 11, count( $actual['data'][0]['data'] ) );
    16731673        }
     1674
     1675        /**
     1676         * Testing the `wp_privacy_additional_user_data` filter works.
     1677         *
     1678         * @since 5.4.0
     1679         *
     1680         * @ticket 47509
     1681         */
     1682        function test_filter_wp_privacy_additional_user_data() {
     1683                $test_user = new WP_User( self::$contrib_id );
     1684
     1685                add_filter( 'wp_privacy_additional_user_data', array( $this, 'export_additional_user_data' ) );
     1686
     1687                $actual = wp_user_personal_data_exporter( $test_user->user_email );
     1688
     1689                remove_filter( 'wp_privacy_additional_user_data', array( $this, 'export_additional_user_data' ) );
     1690
     1691                $this->assertTrue( $actual['done'] );
     1692
     1693                // Number of exported users.
     1694                $this->assertSame( 1, count( $actual['data'] ) );
     1695
     1696                // Number of exported user properties (the 11 core properties,
     1697                // plus 1 additional from the filter).
     1698                $this->assertSame( 12, count( $actual['data'][0]['data'] ) );
     1699
     1700                // check that the item added by the filter was retained.
     1701                $this->assertSame(
     1702                        1,
     1703                        count(
     1704                                wp_list_filter(
     1705                                        $actual['data'][0]['data'],
     1706                                        array(
     1707                                                'name'  => 'Test Additional Data Name',
     1708                                                'value' => 'Test Additional Data Value'
     1709                                        )
     1710                                )
     1711                        )
     1712                );
     1713
     1714                // _doing_wrong() should be called because the filter callback
     1715                // adds a item with a 'name' that is the same as one generated by core.
     1716                $this->setExpectedIncorrectUsage( 'wp_user_personal_data_exporter' );
     1717                add_filter( 'wp_privacy_additional_user_data', array( $this, 'export_additional_user_data_with_dup_name' ) );
     1718
     1719                $actual = wp_user_personal_data_exporter( $test_user->user_email );
     1720
     1721                remove_filter( 'wp_privacy_additional_user_data', array( $this, 'export_additional_user_data' ) );
     1722
     1723                $this->assertTrue( $actual['done'] );
     1724
     1725                // Number of exported users.
     1726                $this->assertSame( 1, count( $actual['data'] ) );
     1727
     1728                // Number of exported user properties (the 11 core properties,
     1729                // plus 1 additional from the filter).
     1730                $this->assertSame( 12, count( $actual['data'][0]['data'] ) );
     1731
     1732                // check that the duplicate 'name' => 'User ID' was stripped.
     1733                $this->assertSame(
     1734                        1,
     1735                        count(
     1736                                wp_list_filter(
     1737                                        $actual['data'][0]['data'],
     1738                                        array(
     1739                                                'name'  => 'User ID',
     1740                                        )
     1741                                )
     1742                        )
     1743                );
     1744
     1745                // check that the item added by the filter was retained.
     1746                $this->assertSame(
     1747                        1,
     1748                        count(
     1749                                wp_list_filter(
     1750                                        $actual['data'][0]['data'],
     1751                                        array(
     1752                                                'name'  => 'Test Additional Data Name',
     1753                                                'value' => 'Test Additional Data Value'
     1754                                        )
     1755                                )
     1756                        )
     1757                );
     1758        }
     1759
     1760        /**
     1761         * Filter callback to add additional data to the User Group on Export Requests.
     1762         *
     1763         * @since 5.4.0
     1764         *
     1765         * @ticket 47509
     1766         *
     1767         * @return array $additional_data The additional User data.
     1768         */
     1769        public function export_additional_user_data() {
     1770                $additional_data = array(
     1771                        // this item should be retained and included in the export.
     1772                        array(
     1773                                'name'  => 'Test Additional Data Name',
     1774                                'value' => 'Test Additional Data Value',
     1775                        ),
     1776                );
     1777
     1778                return $additional_data;
     1779        }
     1780
     1781        /**
     1782         * Filter callback to add additional data to the User Group on Export Requests.
     1783         *
     1784         * This callback should generate a `_doing_it_wrong()`.
     1785         *
     1786         * @since 5.4.0
     1787         *
     1788         * @ticket 47509
     1789         *
     1790         * @return array $additional_data The additional User data.
     1791         */
     1792        public function export_additional_user_data_with_dup_name() {
     1793                $additional_data = array(
     1794                        // this item should be stripped out by wp_user_personal_data_exporter()
     1795                        // because it's 'name' duplicates one exported by core.
     1796                        array(
     1797                                'name'  => 'User ID',
     1798                                'value' => 'Some User ID',
     1799                        ),
     1800                        // this item should be retained and included in the export.
     1801                        array(
     1802                                'name'  => 'Test Additional Data Name',
     1803                                'value' => 'Test Additional Data Value',
     1804                        ),
     1805                );
     1806
     1807                return $additional_data;
     1808        }
    16741809}