Make WordPress Core


Ignore:
Timestamp:
05/02/2018 01:03:53 AM (8 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.