Make WordPress Core


Ignore:
Timestamp:
04/27/2018 05:30:28 PM (7 years ago)
Author:
azaozz
Message:

Privacy: update and enhance the method to confirm user requests by email. Introduce WP_User_Request to hold all request vars similarly to WP_Post.

Props mikejolley.
See #43443.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/user.php

    r43008 r43011  
    627627
    628628    update_post_meta( $request_id, '_wp_user_request_confirmed_timestamp', time() );
     629
    629630    $request = wp_update_post( array(
    630         'ID'          => $request_data['request_id'],
     631        'ID'          => $request_id,
    631632        'post_status' => 'request-confirmed',
    632633    ) );
     634
    633635    return $request;
    634636}
     
    773775
    774776/**
     777 * Cleans up failed and expired requests before displaying the list table.
     778 *
     779 * @since 4.9.6
     780 * @access private
     781 */
     782function _wp_personal_data_cleanup_requests() {
     783    $expires        = (int) apply_filters( 'user_request_key_expiration', DAY_IN_SECONDS );
     784    $requests_query = new WP_Query( array(
     785        'post_type'      => 'user_request',
     786        'posts_per_page' => -1,
     787        'post_status'    => 'request-pending',
     788        'fields'         => 'ids',
     789        'date_query' => array(
     790            array(
     791                'column' => 'post_modified_gmt',
     792                'before' => $expires . ' seconds ago',
     793            ),
     794        ),
     795    ) );
     796
     797    $request_ids = $requests_query->posts;
     798
     799    foreach ( $request_ids as $request_id ) {
     800        wp_update_post( array(
     801            'ID'            => $request_id,
     802            'post_status'   => 'request-failed',
     803            'post_password' => '',
     804        ) );
     805    }
     806}
     807
     808/**
    775809 * Personal data export.
    776810 *
     
    784818
    785819    _wp_personal_data_handle_actions();
     820    _wp_personal_data_cleanup_requests();
    786821
    787822    $requests_table = new WP_Privacy_Data_Export_Requests_Table( array(
     
    845880
    846881    _wp_personal_data_handle_actions();
     882    _wp_personal_data_cleanup_requests();
    847883
    848884    // "Borrow" xfn.js for now so we don't have to create new files.
     
    883919        <form class="search-form wp-clearfix">
    884920            <?php $requests_table->search_box( __( 'Search Requests' ), 'requests' ); ?>
    885             <input type="hidden" name="page" value="export_personal_data" />
     921            <input type="hidden" name="page" value="remove_personal_data" />
    886922            <input type="hidden" name="filter-status" value="<?php echo isset( $_REQUEST['filter-status'] ) ? esc_attr( sanitize_text_field( $_REQUEST['filter-status'] ) ) : ''; ?>" />
    887923            <input type="hidden" name="orderby" value="<?php echo isset( $_REQUEST['orderby'] ) ? esc_attr( sanitize_text_field( $_REQUEST['orderby'] ) ) : ''; ?>" />
     
    949985    public function get_columns() {
    950986        $columns = array(
    951             'cb'                  => '<input type="checkbox" />',
    952             'email'               => __( 'Requester' ),
    953             'status'              => __( 'Status' ),
    954             'requested_timestamp' => __( 'Requested' ),
    955             'next_steps'          => __( 'Next Steps' ),
     987            'cb'                => '<input type="checkbox" />',
     988            'email'             => __( 'Requester' ),
     989            'status'            => __( 'Status' ),
     990            'created_timestamp' => __( 'Requested' ),
     991            'next_steps'        => __( 'Next Steps' ),
    956992        );
    957993        return $columns;
     
    10011037            FROM {$wpdb->posts}
    10021038            WHERE post_type = %s
    1003             AND post_title = %s
     1039            AND post_name = %s
    10041040            GROUP BY post_status";
    10051041
     
    10891125                foreach ( $request_ids as $request_id ) {
    10901126                    $resend = _wp_privacy_resend_request( $request_id );
    1091                    
     1127
    10921128                    if ( $resend && ! is_wp_error( $resend ) ) {
    10931129                        $count++;
     
    11251161        $args           = array(
    11261162            'post_type'      => $this->post_type,
    1127             'title'          => $this->request_type,
     1163            'post_name__in'  => array( $this->request_type ),
    11281164            'posts_per_page' => $posts_per_page,
    11291165            'offset'         => isset( $_REQUEST['paged'] ) ? max( 0, absint( $_REQUEST['paged'] ) - 1 ) * $posts_per_page: 0,
    11301166            'post_status'    => 'any',
     1167            's'              => isset( $_REQUEST['s'] ) ? sanitize_text_field( $_REQUEST['s'] ) : '',
    11311168        );
    11321169
     
    11361173        }
    11371174
    1138         if ( ! empty( $_REQUEST['s'] ) ) {
    1139             $args['meta_query'] = array(
    1140                 $name_query,
    1141                 'relation'  => 'AND',
    1142                 array(
    1143                     'key'     => '_wp_user_request_user_email',
    1144                     'value'   => isset( $_REQUEST['s'] ) ? sanitize_text_field( $_REQUEST['s'] ): '',
    1145                     'compare' => 'LIKE',
    1146                 ),
    1147             );
    1148         }
    1149 
    11501175        $requests_query = new WP_Query( $args );
    11511176        $requests       = $requests_query->posts;
     
    11541179            $this->items[] = wp_get_user_request_data( $request->ID );
    11551180        }
     1181
     1182        $this->items = array_filter( $this->items );
    11561183
    11571184        $this->set_pagination_args(
     
    11681195     * @since 4.9.6
    11691196     *
    1170      * @param array $item Item being shown.
     1197     * @param WP_User_Request $item Item being shown.
    11711198     * @return string
    11721199     */
    11731200    public function column_cb( $item ) {
    1174         return sprintf( '<input type="checkbox" name="request_id[]" value="%1$s" /><span class="spinner"></span>', esc_attr( $item['request_id'] ) );
     1201        return sprintf( '<input type="checkbox" name="request_id[]" value="%1$s" /><span class="spinner"></span>', esc_attr( $item->ID ) );
    11751202    }
    11761203
     
    11801207     * @since 4.9.6
    11811208     *
    1182      * @param array $item Item being shown.
     1209     * @param WP_User_Request $item Item being shown.
    11831210     * @return string
    11841211     */
    11851212    public function column_status( $item ) {
    1186         $status        = get_post_status( $item['request_id'] );
     1213        $status        = get_post_status( $item->ID );
    11871214        $status_object = get_post_status_object( $status );
    11881215
     
    11951222        switch ( $status ) {
    11961223            case 'request-confirmed':
    1197                 $timestamp = $item['confirmed_timestamp'];
     1224                $timestamp = $item->confirmed_timestamp;
    11981225                break;
    11991226            case 'request-completed':
    1200                 $timestamp = $item['completed_timestamp'];
     1227                $timestamp = $item->completed_timestamp;
    12011228                break;
    12021229        }
     
    12391266     * @since 4.9.6
    12401267     *
    1241      * @param array $item         Item being shown.
    1242      * @param string $column_name Name of column being shown.
     1268     * @param WP_User_Request $item         Item being shown.
     1269     * @param string          $column_name Name of column being shown.
    12431270     * @return string
    12441271     */
    12451272    public function column_default( $item, $column_name ) {
    1246         $cell_value = $item[ $column_name ];
    1247 
    1248         if ( in_array( $column_name, array( 'requested_timestamp' ), true ) ) {
     1273        $cell_value = $item->$column_name;
     1274
     1275        if ( in_array( $column_name, array( 'created_timestamp' ), true ) ) {
    12491276            return $this->get_timestamp_as_date( $cell_value );
    12501277        }
     
    12581285     * @since 4.9.6
    12591286     *
    1260      * @param array $item Item being shown.
     1287     * @param WP_User_Request $item Item being shown.
    12611288     * @return string
    12621289     */
    12631290    public function column_email( $item ) {
    1264         return sprintf( '%1$s %2$s', $item['email'], $this->row_actions( array() ) );
     1291        return sprintf( '%1$s %2$s', $item->email, $this->row_actions( array() ) );
    12651292    }
    12661293
     
    12701297     * @since 4.9.6
    12711298     *
    1272      * @param array $item Item being shown.
     1299     * @param WP_User_Request $item Item being shown.
    12731300     */
    12741301    public function column_next_steps( $item ) {}
     
    12791306     * @since 4.9.6
    12801307     *
    1281      * @param object $item The current item
     1308     * @param WP_User_Request $item The current item
    12821309     */
    12831310    public function single_row( $item ) {
    1284         $status = get_post_status( $item['request_id'] );
     1311        $status = $item->status;
    12851312
    12861313        echo '<tr class="status-' . esc_attr( $status ) . '">';
     
    13261353     * @since 4.9.6
    13271354     *
    1328      * @param array $item Item being shown.
     1355     * @param WP_User_Request $item Item being shown.
    13291356     * @return string
    13301357     */
     
    13321359        $exporters       = apply_filters( 'wp_privacy_personal_data_exporters', array() );
    13331360        $exporters_count = count( $exporters );
    1334         $request_id      = $item['request_id'];
     1361        $request_id      = $item->ID;
    13351362        $nonce           = wp_create_nonce( 'wp-privacy-export-personal-data-' . $request_id );
    13361363
     
    13491376        );
    13501377
    1351         return sprintf( '%1$s %2$s', $item['email'], $this->row_actions( $row_actions ) );
     1378        return sprintf( '%1$s %2$s', $item->email, $this->row_actions( $row_actions ) );
    13521379    }
    13531380
     
    13571384     * @since 4.9.6
    13581385     *
    1359      * @param array $item Item being shown.
     1386     * @param WP_User_Request $item Item being shown.
    13601387     */
    13611388    public function column_next_steps( $item ) {
    1362         $status = get_post_status( $item['request_id'] );
     1389        $status = $item->status;
    13631390
    13641391        switch ( $status ) {
     
    13701397                break;
    13711398            case 'request-failed':
    1372                 submit_button( __( 'Retry' ), 'secondary', 'privacy_action_email_retry[' . $item['request_id'] . ']', false );
     1399                submit_button( __( 'Retry' ), 'secondary', 'privacy_action_email_retry[' . $item->ID . ']', false );
    13731400                break;
    13741401            case 'request-completed':
    13751402                echo '<a href="' . esc_url( wp_nonce_url( add_query_arg( array(
    13761403                    'action' => 'delete',
    1377                     'request_id' => array( $item['request_id'] )
     1404                    'request_id' => array( $item->ID )
    13781405                ), admin_url( 'tools.php?page=export_personal_data' ) ), 'bulk-privacy_requests' ) ) . '">' . esc_html__( 'Remove request' ) . '</a>';
    13791406                break;
     
    14111438     * @since 4.9.6
    14121439     *
    1413      * @param array $item Item being shown.
     1440     * @param WP_User_Request $item Item being shown.
    14141441     * @return string
    14151442     */
     
    14171444        $row_actions = array();
    14181445
    1419         // Allow the administrator to "force remove" the personal data even if confirmation has not yet been received
    1420         $status = get_post_status( $item['request_id'] );
     1446        // Allow the administrator to "force remove" the personal data even if confirmation has not yet been received.
     1447        $status = $item->status;
    14211448        if ( 'request-confirmed' !== $status ) {
    14221449            $erasers       = apply_filters( 'wp_privacy_personal_data_erasers', array() );
    14231450            $erasers_count = count( $erasers );
    1424             $request_id    = $item['request_id'];
     1451            $request_id    = $item->ID;
    14251452            $nonce         = wp_create_nonce( 'wp-privacy-erase-personal-data-' . $request_id );
    14261453
     
    14401467        }
    14411468
    1442         return sprintf( '%1$s %2$s', $item['email'], $this->row_actions( $row_actions ) );
     1469        return sprintf( '%1$s %2$s', $item->email, $this->row_actions( $row_actions ) );
    14431470    }
    14441471
     
    14481475     * @since 4.9.6
    14491476     *
    1450      * @param array $item Item being shown.
     1477     * @param WP_User_Request $item Item being shown.
    14511478     */
    14521479    public function column_next_steps( $item ) {
    1453         $status = get_post_status( $item['request_id'] );
     1480        $status = $item->status;
    14541481
    14551482        switch ( $status ) {
     
    14601487                $erasers       = apply_filters( 'wp_privacy_personal_data_erasers', array() );
    14611488                $erasers_count = count( $erasers );
    1462                 $request_id    = $item['request_id'];
     1489                $request_id    = $item->ID;
    14631490                $nonce         = wp_create_nonce( 'wp-privacy-erase-personal-data-' . $request_id );
    14641491
     
    14781505                break;
    14791506            case 'request-failed':
    1480                 submit_button( __( 'Retry' ), 'secondary', 'privacy_action_email_retry[' . $item['request_id'] . ']', false );
     1507                submit_button( __( 'Retry' ), 'secondary', 'privacy_action_email_retry[' . $item->ID . ']', false );
    14811508                break;
    14821509            case 'request-completed':
    14831510                echo '<a href="' . esc_url( wp_nonce_url( add_query_arg( array(
    14841511                    'action' => 'delete',
    1485                     'request_id' => array( $item['request_id'] ),
     1512                    'request_id' => array( $item->ID ),
    14861513                ), admin_url( 'tools.php?page=remove_personal_data' ) ), 'bulk-privacy_requests' ) ) . '">' . esc_html__( 'Remove request' ) . '</a>';
    14871514                break;
Note: See TracChangeset for help on using the changeset viewer.