WordPress.org

Make WordPress Core

Ticket #36901: 36901.patch

File 36901.patch, 7.3 KB (added by websupporter, 4 years ago)

This patch is supposed to solve this problem. I am not quite happy about some of the structures and have som questions, so for example, why do we needed to hook check_comment_flood_db() and should we still, but it gives a start. I've also added some unit tests, since we could now test for duplicate comments and flood.

  • src/wp-includes/comment.php

     
    3838 */
    3939function check_comment($author, $email, $url, $comment, $user_ip, $user_agent, $comment_type) {
    4040        global $wpdb;
    41 
    4241        // If manual moderation is enabled, skip all checks and return false.
    4342        if ( 1 == get_option('comment_moderation') )
    4443                return false;
     
    633632                 * @param array $commentdata Comment data.
    634633                 */
    635634                do_action( 'comment_duplicate_trigger', $commentdata );
    636                 if ( defined( 'DOING_AJAX' ) ) {
    637                         die( __('Duplicate comment detected; it looks as though you’ve already said that!') );
    638                 }
    639                 wp_die( __( 'Duplicate comment detected; it looks as though you’ve already said that!' ), 409 );
     635                return new WP_Error( 'duplicate_comment', __( 'Duplicate comment detected; it looks as though you’ve already said that!' ), 409 );
    640636        }
    641637
    642638        /**
     
    657653                $commentdata['comment_date_gmt']
    658654        );
    659655
     656        $is_flood = apply_filters( 'is_comment_flood', false, $commentdata['comment_author_IP'], $commentdata['comment_author_email'], $commentdata['comment_date_gmt'] );
     657        if ( $is_flood ) {
     658                return new WP_Error( 'comment_flood', __( 'You are posting comments too quickly. Slow down.' ), 429 );
     659        }
     660
    660661        if ( ! empty( $commentdata['user_id'] ) ) {
    661662                $user = get_userdata( $commentdata['user_id'] );
    662663                $post_author = $wpdb->get_var( $wpdb->prepare(
     
    718719 *
    719720 * @global wpdb $wpdb WordPress database abstraction object.
    720721 *
     722 * @param bool   $is_flood Is comment flood.
    721723 * @param string $ip Comment IP.
    722724 * @param string $email Comment author email address.
    723725 * @param string $date MySQL time string.
     726
    724727 */
    725 function check_comment_flood_db( $ip, $email, $date ) {
     728function check_comment_flood_db( $is_flood, $ip, $email, $date = false ) {
     729        //Check for backwards compatibility
     730        if( ! is_bool( $is_flood ) ){
     731                $date = $email;
     732                $email = $ip;
     733                $ip = $is_flood;
     734                $is_flood = false;
     735        }
     736        if( $is_flood )
     737                return $is_flood;
     738
    726739        global $wpdb;
    727740        // don't throttle admins or moderators
    728741        if ( current_user_can( 'manage_options' ) || current_user_can( 'moderate_comments' ) ) {
    729                 return;
     742                return false;
    730743        }
    731744        $hour_ago = gmdate( 'Y-m-d H:i:s', time() - HOUR_IN_SECONDS );
    732745
     
    757770                 * @param int  $time_lastcomment Timestamp of when the last comment was posted.
    758771                 * @param int  $time_newcomment  Timestamp of when the new comment was posted.
    759772                 */
    760                 $flood_die = apply_filters( 'comment_flood_filter', false, $time_lastcomment, $time_newcomment );
    761                 if ( $flood_die ) {
     773                $is_flood = apply_filters( 'comment_flood_filter', $is_flood, $time_lastcomment, $time_newcomment );
     774                if ( $is_flood ) {
    762775                        /**
    763776                         * Fires before the comment flood message is triggered.
    764777                         *
     
    769782                         */
    770783                        do_action( 'comment_flood_trigger', $time_lastcomment, $time_newcomment );
    771784
    772                         if ( defined('DOING_AJAX') )
    773                                 die( __('You are posting comments too quickly. Slow down.') );
    774 
    775                         wp_die( __( 'You are posting comments too quickly. Slow down.' ), 429 );
     785                        return $is_flood;
    776786                }
    777787        }
     788        return $is_flood;
    778789}
    779790
    780791/**
     
    17861797        $commentdata = wp_filter_comment($commentdata);
    17871798
    17881799        $commentdata['comment_approved'] = wp_allow_comment($commentdata);
     1800        if ( is_wp_error( $commentdata['comment_approved'] ) ) {
     1801                return $commentdata['comment_approved'];
     1802        }
    17891803
    17901804        $comment_ID = wp_insert_comment($commentdata);
    17911805        if ( ! $comment_ID ) {
     
    18001814                $commentdata = wp_filter_comment( $commentdata );
    18011815
    18021816                $commentdata['comment_approved'] = wp_allow_comment( $commentdata );
     1817                if ( is_wp_error( $commentdata['comment_approved'] ) ) {
     1818                        return $commentdata['comment_approved'];
     1819                }
    18031820
    18041821                $comment_ID = wp_insert_comment( $commentdata );
    18051822                if ( ! $comment_ID ) {
     
    29172934        );
    29182935
    29192936        $comment_id = wp_new_comment( wp_slash( $commentdata ) );
     2937        if ( is_wp_error( $comment_id ) ) {
     2938                return $comment_id;
     2939        }
     2940
    29202941        if ( ! $comment_id ) {
    29212942                return new WP_Error( 'comment_save_error', __( '<strong>ERROR</strong>: The comment could not be saved. Please try again later.' ), 500 );
    29222943        }
  • src/wp-includes/default-filters.php

     
    190190add_filter( 'teeny_mce_before_init',    '_mce_set_direction'                  );
    191191add_filter( 'pre_kses',                 'wp_pre_kses_less_than'               );
    192192add_filter( 'sanitize_title',           'sanitize_title_with_dashes',   10, 3 );
    193 add_action( 'check_comment_flood',      'check_comment_flood_db',       10, 3 );
     193add_filter( 'is_comment_flood',         'check_comment_flood_db',       10, 4 );
    194194add_filter( 'comment_flood_filter',     'wp_throttle_comment_flood',    10, 3 );
    195195add_filter( 'pre_comment_content',      'wp_rel_nofollow',              15    );
    196196add_filter( 'comment_email',            'antispambot'                         );
  • tests/phpunit/tests/comment-submission.php

     
    714714                return $commentdata;
    715715        }
    716716
    717 }
     717
     718
     719        public function test_submitting_duplicate_comments() {
     720                $post = self::factory()->post->create_and_get( array(
     721                        'post_status' => 'publish',
     722                ) );
     723                $data = array(
     724                        'comment_post_ID'       => $post->ID,
     725                        'comment'               => 'Did I say that?',
     726                        'author'                => 'Repeat myself',
     727                        'email'                 => 'mail@example.com',
     728                );
     729                $first_comment = wp_handle_comment_submission( $data );         
     730                $second_comment = wp_handle_comment_submission( $data );
     731                $this->assertWPError( $second_comment );
     732                $this->assertSame( 'duplicate_comment', $second_comment->get_error_code() );
     733        }
     734
     735        public function test_comments_flood() {
     736                $post = self::factory()->post->create_and_get( array(
     737                        'post_status' => 'publish',
     738                ) );
     739                $data = array(
     740                        'comment_post_ID'       => $post->ID,
     741                        'comment'               => 'Did I say that?',
     742                        'author'                => 'Repeat myself',
     743                        'email'                 => 'mail@example.com',
     744                );
     745                $first_comment = wp_handle_comment_submission( $data );
     746
     747                $data['comment'] = 'Wow! I am quick!'; 
     748                $second_comment = wp_handle_comment_submission( $data );
     749
     750                $this->assertWPError( $second_comment );
     751                $this->assertSame( 'comment_flood', $second_comment->get_error_code() );
     752        }
     753
     754        public function test_comments_flood_user_is_admin() {
     755                $user = self::factory()->user->create_and_get( array(
     756                        'role' => 'administrator',
     757                ) );
     758                wp_set_current_user( $user->ID );
     759
     760                $post = self::factory()->post->create_and_get( array(
     761                        'post_status' => 'publish',
     762                ) );
     763                $data = array(
     764                        'comment_post_ID'       => $post->ID,
     765                        'comment'               => 'Did I say that?',
     766                        'author'                => 'Repeat myself',
     767                        'email'                 => 'mail@example.com',
     768                );
     769                $first_comment = wp_handle_comment_submission( $data );
     770               
     771                $data['comment'] = 'Wow! I am quick!'; 
     772                $second_comment = wp_handle_comment_submission( $data );
     773
     774                $this->assertNotWPError( $second_comment );
     775                $this->assertEquals( $post->ID, $second_comment->comment_post_ID );
     776        }
     777
     778}
     779 No newline at end of file