WordPress.org

Make WordPress Core

Ticket #43442: 43442.5.diff

File 43442.5.diff, 9.0 KB (added by azaozz, 4 years ago)
  • src/wp-includes/comment.php

     
    33783378                'done' => $done,
    33793379        );
    33803380}
     3381
     3382/**
     3383 * Registers the personal data eraser for comments.
     3384 *
     3385 * @since 4.9.6
     3386 *
     3387 * @param  array $erasers An array of personal data erasers.
     3388 * @return array $erasers An array of personal data erasers.
     3389 */
     3390function wp_register_comment_personal_data_eraser( $erasers ) {
     3391        $erasers[] = array(
     3392                'eraser_friendly_name' => __( 'WordPress Comments' ),
     3393                'callback'             => 'wp_comments_personal_data_eraser',
     3394        );
     3395
     3396        return $erasers;
     3397}
     3398
     3399/**
     3400 * Erases personal data associated with an email address from the comments table.
     3401 *
     3402 * @since 4.9.6
     3403 *
     3404 * @param  string $email_address The comment author email address.
     3405 * @param  int    $page          Comment page.
     3406 * @return array
     3407 */
     3408function wp_comments_personal_data_eraser( $email_address, $page = 1 ) {
     3409        global $wpdb;
     3410
     3411        // Limit us to 500 comments at a time to avoid timing out.
     3412        $number            = 500;
     3413        $page              = (int) $page;
     3414        $num_items_removed = 0;
     3415
     3416        $comments = get_comments(
     3417                array(
     3418                        'author_email'       => $email_address,
     3419                        'number'             => $number,
     3420                        'paged'              => $page,
     3421                        'order_by'           => 'comment_ID',
     3422                        'order'              => 'ASC',
     3423                        'include_unapproved' => true,
     3424                )
     3425        );
     3426
     3427        $anon_author = __( 'Anonymous' );
     3428        $messages = array();
     3429
     3430        foreach ( (array) $comments as $comment ) {
     3431                $anonymized_comment                         = array();
     3432                $anonymized_comment['comment_agent']        = '';
     3433                $anonymized_comment['comment_author']       = $anon_author;
     3434                $anonymized_comment['comment_author_email'] = wp_privacy_anonymize_data( 'email', $comment->comment_author_email );
     3435                $anonymized_comment['comment_author_IP']    = wp_privacy_anonymize_data( 'ip', $comment->comment_author_IP );
     3436                $anonymized_comment['comment_author_url']   = wp_privacy_anonymize_data( 'url', $comment->comment_author_url );
     3437                $anonymized_comment['user_id']              = 0;
     3438
     3439                $comment_id   = (int) $comment->comment_ID;
     3440                $anon_message = apply_filters( 'wp_anonymize_comment', true, $comment, $anonymized_comment );
     3441
     3442                if ( $anon_message !== true ) {
     3443                        if ( $anon_message && is_string( $anon_message ) ) {
     3444                                $messages[] = esc_html( $anon_message );
     3445                        } else {
     3446                                $messages[] = sprintf( 'Comment %d contains personal data but could not be anonymized.', $comment_id );
     3447                        }
     3448
     3449                        continue;
     3450                }
     3451
     3452                $args = array(
     3453                        'comment_ID' => $comment_id,
     3454                );
     3455
     3456                $result = $wpdb->update( $wpdb->comments, $anonymized_comment, $args );
     3457
     3458                if ( $result ) {
     3459                        $num_items_removed++;
     3460                } else {
     3461                        $edit_url = admin_url( 'comment.php?action=editcomment&c=' . $comment_id );
     3462                        $messages[] = sprintf( 'Ah error occured while anonymizing comment %d.', $comment_id ) .
     3463                                '<a href="' . $edit_url . '" target="_blank" rel="noreferrer noopener">' . __( 'Try to edit or delete it separately.' ) . '</a>';
     3464                }
     3465
     3466                clean_comment_cache( $comment_id );
     3467        }
     3468
     3469        $done = count( $comments ) < $number;
     3470
     3471        return array(
     3472                'num_items_removed'  => $num_items_removed,
     3473                'num_items_retained' => count( $comments ) - $num_items_removed,
     3474                'messages'           => $messages,
     3475                'done'               => $done,
     3476        );
     3477}
  • src/wp-includes/default-filters.php

     
    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

     
    812812                }
    813813        }
    814814
     815        /**
     816         * The `wp_comments_personal_data_eraser()` function should erase user's comments.
     817         *
     818         * @ticket 43442
     819         */
     820        public function test_wp_comments_personal_data_eraser() {
     821
     822                $post_id = self::factory()->post->create();
     823                $user_id = self::factory()->user->create();
     824
     825                $args       = array(
     826                        'user_id'              => $user_id,
     827                        'comment_post_ID'      => $post_id,
     828                        'comment_author'       => 'Comment Author',
     829                        'comment_author_email' => 'personal@local.host',
     830                        'comment_author_url'   => 'https://local.host/',
     831                        'comment_author_IP'    => '192.168.0.1',
     832                        'comment_date'         => '2018-04-14 17:20:00',
     833                        'comment_agent'        => 'COMMENT_AGENT',
     834                        'comment_content'      => 'Comment Content',
     835                );
     836                $comment_id = self::factory()->comment->create( $args );
     837
     838                wp_comments_personal_data_eraser( $args['comment_author_email'] );
     839
     840                $comment = get_comment( $comment_id );
     841
     842                $actual = array(
     843                        'comment_ID'           => $comment->comment_ID,
     844                        'user_id'              => $comment->user_id,
     845                        'comment_author'       => $comment->comment_author,
     846                        'comment_author_email' => $comment->comment_author_email,
     847                        'comment_author_url'   => $comment->comment_author_url,
     848                        'comment_author_IP'    => $comment->comment_author_IP,
     849                        'comment_date'         => $comment->comment_date,
     850                        'comment_date_gmt'     => $comment->comment_date_gmt,
     851                        'comment_agent'        => $comment->comment_agent,
     852                        'comment_content'      => $comment->comment_content,
     853                );
     854
     855                $expected = array(
     856                        'comment_ID'           => (string) $comment_id,
     857                        'user_id'              => '0', // Anonymized.
     858                        'comment_author'       => 'Anonymous', // Anonymized.
     859                        'comment_author_email' => 'deleted@site.invalid', // Anonymized.
     860                        'comment_author_url'   => 'https://site.invalid', // Anonymized.
     861                        'comment_author_IP'    => '192.168.0.0', // Anonymized.
     862                        'comment_date'         => '2018-04-14 17:20:00',
     863                        'comment_date_gmt'     => '2018-04-14 17:20:00',
     864                        'comment_agent'        => '', // Anonymized.
     865                        'comment_content'      => 'Comment Content',
     866                );
     867
     868                $this->assertSame( $expected, $actual );
     869        }
     870
     871        /**
     872         * Testing the `wp_comments_personal_data_eraser()` function's output on an empty first page.
     873         *
     874         * @ticket 43442
     875         */
     876        public function test_wp_comments_personal_data_eraser_empty_first_page_output() {
     877
     878                $actual   = wp_comments_personal_data_eraser( 'nocommentsfound@local.host' );
     879                $expected = array(
     880                        'num_items_removed'  => 0,
     881                        'num_items_retained' => 0,
     882                        'messages'           => array(),
     883                        'done'               => true,
     884                );
     885
     886                $this->assertSame( $expected, $actual );
     887        }
     888
     889        /**
     890         * Testing the `wp_comments_personal_data_eraser()` function's output, for the non-empty first page.
     891         *
     892         * @ticket 43442
     893         */
     894        public function test_wp_comments_personal_data_eraser_non_empty_first_page_output() {
     895
     896                $post_id = self::factory()->post->create();
     897                $args    = array(
     898                        'comment_post_ID'      => $post_id,
     899                        'comment_author'       => 'Comment Author',
     900                        'comment_author_email' => 'personal@local.host',
     901                        'comment_author_url'   => 'https://local.host/',
     902                        'comment_author_IP'    => '192.168.0.1',
     903                        'comment_date'         => '2018-04-14 17:20:00',
     904                        'comment_agent'        => 'COMMENT_AGENT',
     905                        'comment_content'      => 'Comment Content',
     906                );
     907                self::factory()->comment->create( $args );
     908
     909                $actual   = wp_comments_personal_data_eraser( $args['comment_author_email'] );
     910                $expected = array(
     911                        'num_items_removed'  => 1,
     912                        'num_items_retained' => 0,
     913                        'messages'           => array(),
     914                        'done'               => true,
     915                );
     916
     917                $this->assertSame( $expected, $actual );
     918        }
     919
     920        /**
     921         * Testing the `wp_comments_personal_data_eraser()` function's output, for an empty second page.
     922         *
     923         * @ticket 43442
     924         */
     925        public function test_wp_comments_personal_data_eraser_empty_second_page_output() {
     926
     927                $post_id = self::factory()->post->create();
     928                $args    = array(
     929                        'comment_post_ID'      => $post_id,
     930                        'comment_author'       => 'Comment Author',
     931                        'comment_author_email' => 'personal@local.host',
     932                        'comment_author_url'   => 'https://local.host/',
     933                        'comment_author_IP'    => '192.168.0.1',
     934                        'comment_date'         => '2018-04-14 17:20:00',
     935                        'comment_agent'        => 'COMMENT_AGENT',
     936                        'comment_content'      => 'Comment Content',
     937                );
     938                self::factory()->comment->create( $args );
     939
     940                $actual   = wp_comments_personal_data_eraser( $args['comment_author_email'], 2 );
     941                $expected = array(
     942                        'num_items_removed'  => 0,
     943                        'num_items_retained' => 0,
     944                        'messages'           => array(),
     945                        'done'               => true,
     946                );
     947
     948                $this->assertSame( $expected, $actual );
     949        }
     950
    815951        public function test_update_should_invalidate_comment_cache() {
    816952                global $wpdb;
    817953