WordPress.org

Make WordPress Core

Ticket #43442: 43442.4.c.diff

File 43442.4.c.diff, 8.6 KB (added by birgire, 4 years ago)
  • src/wp-includes/comment.php

    diff --git src/wp-includes/comment.php src/wp-includes/comment.php
    index 595f825..4b6c70e 100644
    function wp_handle_comment_submission( $comment_data ) { 
    32763276}
    32773277
    32783278/**
    3279  * Registers the personal data exporter for comments
     3279 * Registers the personal data exporter for comments.
     3280 *
     3281 * @since 4.9.6
    32803282 *
    32813283 * @param array   $exporters   An array of personal data exporters.
    32823284 * @return array  An array of personal data exporters.
    function wp_comments_personal_data_exporter( $email_address, $page = 1 ) { 
    33753377                'done' => $done,
    33763378        );
    33773379}
     3380
     3381/**
     3382 * Registers the personal data eraser for comments.
     3383 *
     3384 * @since 4.9.6
     3385 *
     3386 * @param  array $erasers An array of personal data erasers.
     3387 * @return array $erasers An array of personal data erasers.
     3388 */
     3389function wp_register_comment_personal_data_eraser( $erasers ) {
     3390        $erasers[] = array(
     3391                'eraser_friendly_name' => __( 'WordPress Comments' ),
     3392                'callback'             => 'wp_comments_personal_data_eraser',
     3393        );
     3394
     3395        return $erasers;
     3396}
     3397
     3398/**
     3399 * Erases personal data associated with an email address from the comments table.
     3400 *
     3401 * @since 4.9.6
     3402 *
     3403 * @param  string $email_address The comment author email address.
     3404 * @param  int    $page          Comment page.
     3405 * @return array
     3406 */
     3407function wp_comments_personal_data_eraser( $email_address, $page = 1 ) {
     3408        global $wpdb;
     3409
     3410        // Limit us to 500 comments at a time to avoid timing out.
     3411        $number            = 500;
     3412        $page              = (int) $page;
     3413        $num_items_removed = 0;
     3414
     3415        $comments = get_comments(
     3416                array(
     3417                        'author_email'       => $email_address,
     3418                        'number'             => $number,
     3419                        'paged'              => $page,
     3420                        'order_by'           => 'comment_ID',
     3421                        'order'              => 'ASC',
     3422                        'include_unapproved' => true,
     3423                )
     3424        );
     3425
     3426        foreach ( (array) $comments as $comment ) {
     3427                $anonymized_comment                         = array();
     3428                $anonymized_comment['comment_agent']        = '';
     3429                $anonymized_comment['comment_author']       = __( 'Anonymous' );
     3430                $anonymized_comment['comment_author_email'] = wp_privacy_anonymize_data( 'email', $comment->comment_author_email );
     3431                $anonymized_comment['comment_author_IP']    = wp_privacy_anonymize_data( 'ip', $comment->comment_author_IP );
     3432                $anonymized_comment['comment_author_url']   = wp_privacy_anonymize_data( 'url', $comment->comment_author_url );
     3433                $anonymized_comment['user_id']              = 0;
     3434
     3435                $result = $wpdb->update(
     3436                        $wpdb->comments, $anonymized_comment,
     3437                        array(
     3438                                'comment_ID' => $comment->comment_ID,
     3439                        )
     3440                );
     3441
     3442                if ( $result ) {
     3443                        $num_items_removed++;
     3444                }
     3445
     3446                clean_comment_cache( $comment->comment_ID );
     3447        }
     3448
     3449        $done = count( $comments ) < $number;
     3450
     3451        return array(
     3452                'num_items_removed'  => $num_items_removed,
     3453                'num_items_retained' => count( $comments ) - $num_items_removed,
     3454                'messages'           => array(),
     3455                'done'               => $done,
     3456        );
     3457}
  • src/wp-includes/default-filters.php

    diff --git src/wp-includes/default-filters.php src/wp-includes/default-filters.php
    index bd8500e..510a045 100644
    add_action( 'do_pings', 'do_all_pings', 10, 1 ); 
    329329add_action( 'do_robots', 'do_robots' );
    330330add_action( 'set_comment_cookies', 'wp_set_comment_cookies', 10, 3 );
    331331add_filter( 'wp_privacy_personal_data_exporters', 'wp_register_comment_personal_data_exporter', 10 );
     332add_filter( 'wp_privacy_personal_data_erasers', 'wp_register_comment_personal_data_eraser', 10 );
    332333add_action( 'sanitize_comment_cookies', 'sanitize_comment_cookies' );
    333334add_action( 'admin_print_scripts', 'print_emoji_detection_script' );
    334335add_action( 'admin_print_scripts', 'print_head_scripts', 20 );
  • tests/phpunit/tests/comment.php

    diff --git tests/phpunit/tests/comment.php tests/phpunit/tests/comment.php
    index 43dacdb..6de614e 100644
    class Tests_Comment extends WP_UnitTestCase { 
    891891
    892892                $this->assertSame( '1', $comment->comment_approved );
    893893        }
     894
     895        /**
     896         * The `wp_comments_personal_data_eraser()` function should erase user's comments.
     897         *
     898         * @ticket 43442
     899         */
     900        public function test_wp_comments_personal_data_eraser() {
     901
     902                $post_id = self::factory()->post->create();
     903                $user_id = self::factory()->user->create();
     904
     905                $args       = array(
     906                        'user_id'              => $user_id,
     907                        'comment_post_ID'      => $post_id,
     908                        'comment_author'       => 'Comment Author',
     909                        'comment_author_email' => 'personal@local.host',
     910                        'comment_author_url'   => 'https://local.host/',
     911                        'comment_author_IP'    => '192.168.0.1',
     912                        'comment_date'         => '2018-04-14 17:20:00',
     913                        'comment_agent'        => 'COMMENT_AGENT',
     914                        'comment_content'      => 'Comment Content',
     915                );
     916                $comment_id = self::factory()->comment->create( $args );
     917
     918                wp_comments_personal_data_eraser( $args['comment_author_email'] );
     919
     920                $comment = get_comment( $comment_id );
     921
     922                $actual = array(
     923                        'comment_ID'           => $comment->comment_ID,
     924                        'user_id'              => $comment->user_id,
     925                        'comment_author'       => $comment->comment_author,
     926                        'comment_author_email' => $comment->comment_author_email,
     927                        'comment_author_url'   => $comment->comment_author_url,
     928                        'comment_author_IP'    => $comment->comment_author_IP,
     929                        'comment_date'         => $comment->comment_date,
     930                        'comment_date_gmt'     => $comment->comment_date_gmt,
     931                        'comment_agent'        => $comment->comment_agent,
     932                        'comment_content'      => $comment->comment_content,
     933                );
     934
     935                $expected = array(
     936                        'comment_ID'           => (string) $comment_id,
     937                        'user_id'              => '0', // Anonymized.
     938                        'comment_author'       => 'Anonymous', // Anonymized.
     939                        'comment_author_email' => 'deleted@site.invalid', // Anonymized.
     940                        'comment_author_url'   => 'https://site.invalid', // Anonymized.
     941                        'comment_author_IP'    => '192.168.0.0', // Anonymized.
     942                        'comment_date'         => '2018-04-14 17:20:00',
     943                        'comment_date_gmt'     => '2018-04-14 17:20:00',
     944                        'comment_agent'        => '', // Anonymized.
     945                        'comment_content'      => 'Comment Content',
     946                );
     947
     948                $this->assertSame( $expected, $actual );
     949        }
     950
     951        /**
     952         * Testing the `wp_comments_personal_data_eraser()` function's output on an empty first page.
     953         *
     954         * @ticket 43442
     955         */
     956        public function test_wp_comments_personal_data_eraser_empty_first_page_output() {
     957
     958                $actual   = wp_comments_personal_data_eraser( 'nocommentsfound@local.host' );
     959                $expected = array(
     960                        'num_items_removed'  => 0,
     961                        'num_items_retained' => 0,
     962                        'messages'           => array(),
     963                        'done'               => true,
     964                );
     965
     966                $this->assertSame( $expected, $actual );
     967        }
     968
     969        /**
     970         * Testing the `wp_comments_personal_data_eraser()` function's output, for the non-empty first page.
     971         *
     972         * @ticket 43442
     973         */
     974        public function test_wp_comments_personal_data_eraser_non_empty_first_page_output() {
     975
     976                $post_id = self::factory()->post->create();
     977                $args    = array(
     978                        'comment_post_ID'      => $post_id,
     979                        'comment_author'       => 'Comment Author',
     980                        'comment_author_email' => 'personal@local.host',
     981                        'comment_author_url'   => 'https://local.host/',
     982                        'comment_author_IP'    => '192.168.0.1',
     983                        'comment_date'         => '2018-04-14 17:20:00',
     984                        'comment_agent'        => 'COMMENT_AGENT',
     985                        'comment_content'      => 'Comment Content',
     986                );
     987                self::factory()->comment->create( $args );
     988
     989                $actual   = wp_comments_personal_data_eraser( $args['comment_author_email'] );
     990                $expected = array(
     991                        'num_items_removed'  => 1,
     992                        'num_items_retained' => 0,
     993                        'messages'           => array(),
     994                        'done'               => true,
     995                );
     996
     997                $this->assertSame( $expected, $actual );
     998        }
     999
     1000        /**
     1001         * Testing the `wp_comments_personal_data_eraser()` function's output, for an empty second page.
     1002         *
     1003         * @ticket 43442
     1004         */
     1005        public function test_wp_comments_personal_data_eraser_empty_second_page_output() {
     1006
     1007                $post_id = self::factory()->post->create();
     1008                $args    = array(
     1009                        'comment_post_ID'      => $post_id,
     1010                        'comment_author'       => 'Comment Author',
     1011                        'comment_author_email' => 'personal@local.host',
     1012                        'comment_author_url'   => 'https://local.host/',
     1013                        'comment_author_IP'    => '192.168.0.1',
     1014                        'comment_date'         => '2018-04-14 17:20:00',
     1015                        'comment_agent'        => 'COMMENT_AGENT',
     1016                        'comment_content'      => 'Comment Content',
     1017                );
     1018                self::factory()->comment->create( $args );
     1019
     1020                $actual   = wp_comments_personal_data_eraser( $args['comment_author_email'], 2 );
     1021                $expected = array(
     1022                        'num_items_removed'  => 0,
     1023                        'num_items_retained' => 0,
     1024                        'messages'           => array(),
     1025                        'done'               => true,
     1026                );
     1027
     1028                $this->assertSame( $expected, $actual );
     1029        }
     1030
    8941031}