WordPress.org

Make WordPress Core


Ignore:
Timestamp:
05/02/2018 01:03:53 AM (2 years ago)
Author:
SergeyBiryukov
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, desrosj.
Merges [43011] and [43014] to the 4.9 branch.
See #43443.

Location:
branches/4.9
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/4.9

  • branches/4.9/src/wp-admin/includes/user.php

    r43083 r43084  
    586586
    587587    update_post_meta( $request_id, '_wp_user_request_confirmed_timestamp', time() );
     588
    588589    $request = wp_update_post( array(
    589         'ID'          => $request_data['request_id'],
     590        'ID'          => $request_id,
    590591        'post_status' => 'request-confirmed',
    591592    ) );
     593
    592594    return $request;
    593595}
     
    732734
    733735/**
     736 * Cleans up failed and expired requests before displaying the list table.
     737 *
     738 * @since 4.9.6
     739 * @access private
     740 */
     741function _wp_personal_data_cleanup_requests() {
     742    $expires        = (int) apply_filters( 'user_request_key_expiration', DAY_IN_SECONDS );
     743    $requests_query = new WP_Query( array(
     744        'post_type'      => 'user_request',
     745        'posts_per_page' => -1,
     746        'post_status'    => 'request-pending',
     747        'fields'         => 'ids',
     748        'date_query' => array(
     749            array(
     750                'column' => 'post_modified_gmt',
     751                'before' => $expires . ' seconds ago',
     752            ),
     753        ),
     754    ) );
     755
     756    $request_ids = $requests_query->posts;
     757
     758    foreach ( $request_ids as $request_id ) {
     759        wp_update_post( array(
     760            'ID'            => $request_id,
     761            'post_status'   => 'request-failed',
     762            'post_password' => '',
     763        ) );
     764    }
     765}
     766
     767/**
    734768 * Personal data export.
    735769 *
     
    743777
    744778    _wp_personal_data_handle_actions();
     779    _wp_personal_data_cleanup_requests();
    745780
    746781    $requests_table = new WP_Privacy_Data_Export_Requests_Table( array(
     
    804839
    805840    _wp_personal_data_handle_actions();
     841    _wp_personal_data_cleanup_requests();
    806842
    807843    // "Borrow" xfn.js for now so we don't have to create new files.
     
    842878        <form class="search-form wp-clearfix">
    843879            <?php $requests_table->search_box( __( 'Search Requests' ), 'requests' ); ?>
    844             <input type="hidden" name="page" value="export_personal_data" />
     880            <input type="hidden" name="page" value="remove_personal_data" />
    845881            <input type="hidden" name="filter-status" value="<?php echo isset( $_REQUEST['filter-status'] ) ? esc_attr( sanitize_text_field( $_REQUEST['filter-status'] ) ) : ''; ?>" />
    846882            <input type="hidden" name="orderby" value="<?php echo isset( $_REQUEST['orderby'] ) ? esc_attr( sanitize_text_field( $_REQUEST['orderby'] ) ) : ''; ?>" />
     
    908944    public function get_columns() {
    909945        $columns = array(
    910             'cb'                  => '<input type="checkbox" />',
    911             'email'               => __( 'Requester' ),
    912             'status'              => __( 'Status' ),
    913             'requested_timestamp' => __( 'Requested' ),
    914             'next_steps'          => __( 'Next Steps' ),
     946            'cb'                => '<input type="checkbox" />',
     947            'email'             => __( 'Requester' ),
     948            'status'            => __( 'Status' ),
     949            'created_timestamp' => __( 'Requested' ),
     950            'next_steps'        => __( 'Next Steps' ),
    915951        );
    916952        return $columns;
     
    960996            FROM {$wpdb->posts}
    961997            WHERE post_type = %s
    962             AND post_title = %s
     998            AND post_name = %s
    963999            GROUP BY post_status";
    9641000
     
    10481084                foreach ( $request_ids as $request_id ) {
    10491085                    $resend = _wp_privacy_resend_request( $request_id );
    1050                    
     1086
    10511087                    if ( $resend && ! is_wp_error( $resend ) ) {
    10521088                        $count++;
     
    10841120        $args           = array(
    10851121            'post_type'      => $this->post_type,
    1086             'title'          => $this->request_type,
     1122            'post_name__in'  => array( $this->request_type ),
    10871123            'posts_per_page' => $posts_per_page,
    10881124            'offset'         => isset( $_REQUEST['paged'] ) ? max( 0, absint( $_REQUEST['paged'] ) - 1 ) * $posts_per_page: 0,
    10891125            'post_status'    => 'any',
     1126            's'              => isset( $_REQUEST['s'] ) ? sanitize_text_field( $_REQUEST['s'] ) : '',
    10901127        );
    10911128
     
    10951132        }
    10961133
    1097         if ( ! empty( $_REQUEST['s'] ) ) {
    1098             $args['meta_query'] = array(
    1099                 $name_query,
    1100                 'relation'  => 'AND',
    1101                 array(
    1102                     'key'     => '_wp_user_request_user_email',
    1103                     'value'   => isset( $_REQUEST['s'] ) ? sanitize_text_field( $_REQUEST['s'] ): '',
    1104                     'compare' => 'LIKE',
    1105                 ),
    1106             );
    1107         }
    1108 
    11091134        $requests_query = new WP_Query( $args );
    11101135        $requests       = $requests_query->posts;
     
    11131138            $this->items[] = wp_get_user_request_data( $request->ID );
    11141139        }
     1140
     1141        $this->items = array_filter( $this->items );
    11151142
    11161143        $this->set_pagination_args(
     
    11271154     * @since 4.9.6
    11281155     *
    1129      * @param array $item Item being shown.
     1156     * @param WP_User_Request $item Item being shown.
    11301157     * @return string
    11311158     */
    11321159    public function column_cb( $item ) {
    1133         return sprintf( '<input type="checkbox" name="request_id[]" value="%1$s" /><span class="spinner"></span>', esc_attr( $item['request_id'] ) );
     1160        return sprintf( '<input type="checkbox" name="request_id[]" value="%1$s" /><span class="spinner"></span>', esc_attr( $item->ID ) );
    11341161    }
    11351162
     
    11391166     * @since 4.9.6
    11401167     *
    1141      * @param array $item Item being shown.
     1168     * @param WP_User_Request $item Item being shown.
    11421169     * @return string
    11431170     */
    11441171    public function column_status( $item ) {
    1145         $status        = get_post_status( $item['request_id'] );
     1172        $status        = get_post_status( $item->ID );
    11461173        $status_object = get_post_status_object( $status );
    11471174
     
    11541181        switch ( $status ) {
    11551182            case 'request-confirmed':
    1156                 $timestamp = $item['confirmed_timestamp'];
     1183                $timestamp = $item->confirmed_timestamp;
    11571184                break;
    11581185            case 'request-completed':
    1159                 $timestamp = $item['completed_timestamp'];
     1186                $timestamp = $item->completed_timestamp;
    11601187                break;
    11611188        }
     
    11981225     * @since 4.9.6
    11991226     *
    1200      * @param array $item         Item being shown.
    1201      * @param string $column_name Name of column being shown.
     1227     * @param WP_User_Request $item         Item being shown.
     1228     * @param string          $column_name Name of column being shown.
    12021229     * @return string
    12031230     */
    12041231    public function column_default( $item, $column_name ) {
    1205         $cell_value = $item[ $column_name ];
    1206 
    1207         if ( in_array( $column_name, array( 'requested_timestamp' ), true ) ) {
     1232        $cell_value = $item->$column_name;
     1233
     1234        if ( in_array( $column_name, array( 'created_timestamp' ), true ) ) {
    12081235            return $this->get_timestamp_as_date( $cell_value );
    12091236        }
     
    12171244     * @since 4.9.6
    12181245     *
    1219      * @param array $item Item being shown.
     1246     * @param WP_User_Request $item Item being shown.
    12201247     * @return string
    12211248     */
    12221249    public function column_email( $item ) {
    1223         return sprintf( '%1$s %2$s', $item['email'], $this->row_actions( array() ) );
     1250        return sprintf( '%1$s %2$s', $item->email, $this->row_actions( array() ) );
    12241251    }
    12251252
     
    12291256     * @since 4.9.6
    12301257     *
    1231      * @param array $item Item being shown.
     1258     * @param WP_User_Request $item Item being shown.
    12321259     */
    12331260    public function column_next_steps( $item ) {}
     
    12381265     * @since 4.9.6
    12391266     *
    1240      * @param object $item The current item
     1267     * @param WP_User_Request $item The current item
    12411268     */
    12421269    public function single_row( $item ) {
    1243         $status = get_post_status( $item['request_id'] );
     1270        $status = $item->status;
    12441271
    12451272        echo '<tr class="status-' . esc_attr( $status ) . '">';
     
    12851312     * @since 4.9.6
    12861313     *
    1287      * @param array $item Item being shown.
     1314     * @param WP_User_Request $item Item being shown.
    12881315     * @return string
    12891316     */
     
    12911318        $exporters       = apply_filters( 'wp_privacy_personal_data_exporters', array() );
    12921319        $exporters_count = count( $exporters );
    1293         $request_id      = $item['request_id'];
     1320        $request_id      = $item->ID;
    12941321        $nonce           = wp_create_nonce( 'wp-privacy-export-personal-data-' . $request_id );
    12951322
     
    13081335        );
    13091336
    1310         return sprintf( '%1$s %2$s', $item['email'], $this->row_actions( $row_actions ) );
     1337        return sprintf( '%1$s %2$s', $item->email, $this->row_actions( $row_actions ) );
    13111338    }
    13121339
     
    13161343     * @since 4.9.6
    13171344     *
    1318      * @param array $item Item being shown.
     1345     * @param WP_User_Request $item Item being shown.
    13191346     */
    13201347    public function column_next_steps( $item ) {
    1321         $status = get_post_status( $item['request_id'] );
     1348        $status = $item->status;
    13221349
    13231350        switch ( $status ) {
     
    13291356                break;
    13301357            case 'request-failed':
    1331                 submit_button( __( 'Retry' ), 'secondary', 'privacy_action_email_retry[' . $item['request_id'] . ']', false );
     1358                submit_button( __( 'Retry' ), 'secondary', 'privacy_action_email_retry[' . $item->ID . ']', false );
    13321359                break;
    13331360            case 'request-completed':
    13341361                echo '<a href="' . esc_url( wp_nonce_url( add_query_arg( array(
    13351362                    'action' => 'delete',
    1336                     'request_id' => array( $item['request_id'] )
     1363                    'request_id' => array( $item->ID )
    13371364                ), admin_url( 'tools.php?page=export_personal_data' ) ), 'bulk-privacy_requests' ) ) . '">' . esc_html__( 'Remove request' ) . '</a>';
    13381365                break;
     
    13701397     * @since 4.9.6
    13711398     *
    1372      * @param array $item Item being shown.
     1399     * @param WP_User_Request $item Item being shown.
    13731400     * @return string
    13741401     */
     
    13761403        $row_actions = array();
    13771404
    1378         // Allow the administrator to "force remove" the personal data even if confirmation has not yet been received
    1379         $status = get_post_status( $item['request_id'] );
     1405        // Allow the administrator to "force remove" the personal data even if confirmation has not yet been received.
     1406        $status = $item->status;
    13801407        if ( 'request-confirmed' !== $status ) {
    13811408            $erasers       = apply_filters( 'wp_privacy_personal_data_erasers', array() );
    13821409            $erasers_count = count( $erasers );
    1383             $request_id    = $item['request_id'];
     1410            $request_id    = $item->ID;
    13841411            $nonce         = wp_create_nonce( 'wp-privacy-erase-personal-data-' . $request_id );
    13851412
     
    13991426        }
    14001427
    1401         return sprintf( '%1$s %2$s', $item['email'], $this->row_actions( $row_actions ) );
     1428        return sprintf( '%1$s %2$s', $item->email, $this->row_actions( $row_actions ) );
    14021429    }
    14031430
     
    14071434     * @since 4.9.6
    14081435     *
    1409      * @param array $item Item being shown.
     1436     * @param WP_User_Request $item Item being shown.
    14101437     */
    14111438    public function column_next_steps( $item ) {
    1412         $status = get_post_status( $item['request_id'] );
     1439        $status = $item->status;
    14131440
    14141441        switch ( $status ) {
     
    14191446                $erasers       = apply_filters( 'wp_privacy_personal_data_erasers', array() );
    14201447                $erasers_count = count( $erasers );
    1421                 $request_id    = $item['request_id'];
     1448                $request_id    = $item->ID;
    14221449                $nonce         = wp_create_nonce( 'wp-privacy-erase-personal-data-' . $request_id );
    14231450
     
    14371464                break;
    14381465            case 'request-failed':
    1439                 submit_button( __( 'Retry' ), 'secondary', 'privacy_action_email_retry[' . $item['request_id'] . ']', false );
     1466                submit_button( __( 'Retry' ), 'secondary', 'privacy_action_email_retry[' . $item->ID . ']', false );
    14401467                break;
    14411468            case 'request-completed':
    14421469                echo '<a href="' . esc_url( wp_nonce_url( add_query_arg( array(
    14431470                    'action' => 'delete',
    1444                     'request_id' => array( $item['request_id'] ),
     1471                    'request_id' => array( $item->ID ),
    14451472                ), admin_url( 'tools.php?page=remove_personal_data' ) ), 'bulk-privacy_requests' ) ) . '">' . esc_html__( 'Remove request' ) . '</a>';
    14461473                break;
Note: See TracChangeset for help on using the changeset viewer.