WordPress.org

Making WordPress.org

Changeset 10965


Ignore:
Timestamp:
05/11/2021 06:51:46 AM (7 months ago)
Author:
dd32
Message:

Login: Include the forum description in the users list table for recently created users.

This helps spot spam profiles that have recently been created.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-login/admin/class-user-registrations-list-table.php

    r10964 r10965  
    5454
    5555                $count = $wpdb->get_var(
    56                     "SELECT count(*) FROM {$wpdb->base_prefix}user_pending_registrations WHERE " .
    57                     $this->get_where_sql( $item[0] )
     56                    "SELECT count(*) FROM {$wpdb->base_prefix}user_pending_registrations registrations " .
     57                    $this->get_join_where_sql( $item[0] )
    5858                );
    5959
     
    9898    }
    9999
    100     protected function get_where_sql( $view = null ) {
     100    protected function get_join_where_sql( $view = null ) {
    101101        global $wpdb;
    102102
    103         $where = $this->get_view_sql_where( $view ?: ( $_REQUEST['view'] ?? 'all' ) );
     103        $join  = '';
     104        $where = 'WHERE ';
     105        $where .= $this->get_view_sql_where( $view ?: ( $_REQUEST['view'] ?? 'all' ) );
    104106
    105107        if ( isset( $_GET['s'] ) && 'all' != $view ) {
    106108             $search_like = '%' . $wpdb->esc_like( wp_unslash( $_GET['s'] ) ) . '%';
    107109             $where .= $wpdb->prepare(
    108                  " AND ( user_login LIKE %s OR user_email LIKE %s OR meta LIKE %s )",
    109                  $search_like, $search_like, $search_like
    110             );
    111         }
    112 
    113         return $where;
     110                 " AND (
     111                    registrations.user_login LIKE %s OR
     112                    registrations.user_email LIKE %s OR
     113                    registrations.meta LIKE %s OR
     114                    description.meta_value LIKE %s
     115                )",
     116                 $search_like, $search_like, $search_like, $search_like
     117            );
     118
     119            $join = "
     120                LEFT JOIN {$wpdb->users} users ON registrations.created = 1 AND registrations.user_login = users.user_login
     121                LEFT JOIN {$wpdb->usermeta} description ON users.ID = description.user_id AND description.meta_key = 'description'
     122           ";
     123        }
     124
     125        return $join . $where;
    114126    }
    115127
     
    153165       $current_page = $this->get_pagenum();
    154166
    155        $where = $this->get_where_sql();
     167       $join_where = $this->get_join_where_sql();
    156168
    157169       $per_page_offset = ($current_page-1) * $per_page;
    158170
    159171        $this->items = $wpdb->get_results(
    160             "SELECT SQL_CALC_FOUND_ROWS *
    161             FROM {$wpdb->base_prefix}user_pending_registrations
    162             WHERE $where
     172            $sql = "SELECT SQL_CALC_FOUND_ROWS registrations.*
     173            FROM {$wpdb->base_prefix}user_pending_registrations registrations
     174            $join_where
    163175            ORDER BY {$sort_column} {$sort_order}
    164176            LIMIT {$per_page_offset}, {$per_page}"
     
    209221
    210222        echo '<hr>';
    211 
    212         list( $email_user, $domain ) = explode( '@', $item->user_email, 2 );
    213 
    214         printf(
    215             '%s@<a href="admin.php?page=user-registrations&s=%s">%s</a>',
    216             esc_html( $email_user ),
    217             urlencode( $domain ),
    218             esc_html( $domain )
    219         );
     223        echo $this->link_to_search( $item->user_email );
    220224
    221225        $row_actions = [];
     
    281285        echo implode( ', ',
    282286            array_map(
    283                 function( $ip ) {
    284                     $url = add_query_arg(
    285                         's',
    286                         urlencode( $ip ),
    287                         admin_url( 'admin.php?page=user-registrations' )
    288                     );
    289                     return '<a href="' . $url . '">' . esc_html( $ip ) . '</a>';
    290                 },
     287                [ $this, 'link_to_search' ],
    291288                array_filter( array_unique( [
    292289                    $meta->registration_ip ?? false,
     
    297294        echo '<hr>';
    298295
     296
    299297        foreach ( [ 'url', 'from', 'occ', 'interests' ] as $field ) {
    300298            if ( !empty( $meta->$field ) ) {
    301                 printf( "%s: %s<br>", esc_html( $field ), esc_html( $meta->$field ) );
    302             }
     299                printf( "%s: %s<br>", esc_html( $field ), $this->link_to_search( $meta->$field ) );
     300            }
     301        }
     302
     303        // Add other meta after an account is created
     304        if ( $user = get_user_by( 'login', $item->user_login ) ) {
     305            // Forum profile description (this is where the spam usually is)
     306            if ( $desc = get_user_meta( $user->ID, 'description', true ) ) {
     307                printf( "forum bio: %s<br>", $this->link_to_search( $desc ) );
     308            }
     309
    303310        }
    304311    }
     
    363370    }
    364371
     372    function link_to_search( $s ) {
     373        $parts = preg_split( '/([^\w\.-])/ui', $s, -1, PREG_SPLIT_DELIM_CAPTURE );
     374
     375        return implode( '', array_map( function( $s ) {
     376            if ( strlen( $s ) >= 3 ) {
     377                return '<a href="' . add_query_arg( 's', urlencode( $s ), admin_url( 'admin.php?page=user-registrations' ) ) . '">' . esc_html( $s ) . '</a>';
     378            }
     379            return esc_html( $s );
     380        }, $parts ) );
     381    }
     382
    365383}
Note: See TracChangeset for help on using the changeset viewer.