Make WordPress Core

Ticket #43929: 43929.6.diff

File 43929.6.diff, 19.0 KB (added by xkon, 7 years ago)
  • src/wp-admin/includes/user.php

     
    663663                                'updated'
    664664                        );
    665665                }
    666 
    667666        } elseif ( isset( $_POST['action'] ) ) {
    668667                $action = isset( $_POST['action'] ) ? sanitize_key( wp_unslash( $_POST['action'] ) ) : ''; // WPCS: input var ok, CSRF ok.
    669668
     
    760759                'posts_per_page' => -1,
    761760                'post_status'    => 'request-pending',
    762761                'fields'         => 'ids',
    763                 'date_query' => array(
     762                'date_query'     => array(
    764763                        array(
    765764                                'column' => 'post_modified_gmt',
    766765                                'before' => $expires . ' seconds ago',
     
    11121111         * @return array
    11131112         */
    11141113        protected function get_views() {
    1115                 $current_status = isset( $_REQUEST['filter-status'] ) ? sanitize_text_field( $_REQUEST['filter-status'] ): '';
     1114                $current_status = isset( $_REQUEST['filter-status'] ) ? sanitize_text_field( $_REQUEST['filter-status'] ) : '';
    11161115                $statuses       = _wp_privacy_statuses();
    11171116                $views          = array();
    11181117                $admin_url      = admin_url( 'tools.php?page=' . $this->request_type );
     
    11511150        public function process_bulk_action() {
    11521151                $action      = $this->current_action();
    11531152                $request_ids = isset( $_REQUEST['request_id'] ) ? wp_parse_id_list( wp_unslash( $_REQUEST['request_id'] ) ) : array(); // WPCS: input var ok, CSRF ok.
    1154                 $count = 0;
     1153                $count       = 0;
    11551154
    11561155                if ( $request_ids ) {
    11571156                        check_admin_referer( 'bulk-privacy_requests' );
     
    11681167                                add_settings_error(
    11691168                                        'bulk_action',
    11701169                                        'bulk_action',
     1170                                        /* translators: %d: number of requests */
    11711171                                        sprintf( _n( 'Deleted %d request', 'Deleted %d requests', $count ), $count ),
    11721172                                        'updated'
    11731173                                );
     
    11841184                                add_settings_error(
    11851185                                        'bulk_action',
    11861186                                        'bulk_action',
     1187                                        /* translators: %d: number of requests */
    11871188                                        sprintf( _n( 'Re-sent %d request', 'Re-sent %d requests', $count ), $count ),
    11881189                                        'updated'
    11891190                                );
     
    12131214                        'post_type'      => $this->post_type,
    12141215                        'post_name__in'  => array( $this->request_type ),
    12151216                        'posts_per_page' => $posts_per_page,
    1216                         'offset'         => isset( $_REQUEST['paged'] ) ? max( 0, absint( $_REQUEST['paged'] ) - 1 ) * $posts_per_page: 0,
     1217                        'offset'         => isset( $_REQUEST['paged'] ) ? max( 0, absint( $_REQUEST['paged'] ) - 1 ) * $posts_per_page : 0,
    12171218                        'post_status'    => 'any',
    12181219                        's'              => isset( $_REQUEST['s'] ) ? sanitize_text_field( $_REQUEST['s'] ) : '',
    12191220                );
     
    13051306                $time_diff = current_time( 'timestamp', true ) - $timestamp;
    13061307
    13071308                if ( $time_diff >= 0 && $time_diff < DAY_IN_SECONDS ) {
     1309                        /* translators: human readable timestamp */
    13081310                        return sprintf( __( '%s ago' ), human_time_diff( $timestamp ) );
    13091311                }
    13101312
     
    14121414                $request_id      = $item->ID;
    14131415                $nonce           = wp_create_nonce( 'wp-privacy-export-personal-data-' . $request_id );
    14141416
    1415                 $download_data_markup = '<div class="export_personal_data" ' .
     1417                $download_data_markup = '<div class="export-personal-data" ' .
    14161418                        'data-exporters-count="' . esc_attr( $exporters_count ) . '" ' .
    14171419                        'data-request-id="' . esc_attr( $request_id ) . '" ' .
    14181420                        'data-nonce="' . esc_attr( $nonce ) .
    14191421                        '">';
    14201422
    1421                 $download_data_markup .= '<span class="export_personal_data_idle"><a href="#" >' . __( 'Download Personal Data' ) . '</a></span>' .
    1422                         '<span style="display:none" class="export_personal_data_processing" >' . __( 'Downloading Data...' ) . '</span>' .
    1423                         '<span style="display:none" class="export_personal_data_success"><a href="#" >' . __( 'Download Personal Data Again' ) . '</a></span>' .
    1424                         '<span style="display:none" class="export_personal_data_failed">' . __( 'Download has failed.' ) . ' <a href="#" >' . __( 'Retry' ) . '</a></span>';
     1423                $download_data_markup .= '<span class="export-personal-data-idle"><button type="button" class="button-link export-personal-data-handle">' . __( 'Download Personal Data' ) . '</button></span>' .
     1424                        '<span style="display:none" class="export-personal-data-processing" >' . __( 'Downloading Data...' ) . '</span>' .
     1425                        '<span style="display:none" class="export-personal-data-success"><button type="button" class="button-link export-personal-data-handle">' . __( 'Download Personal Data Again' ) . '</button></span>' .
     1426                        '<span style="display:none" class="export-personal-data-failed">' . __( 'Download has failed.' ) . ' <button type="button" class="button-link">' . __( 'Retry' ) . '</button></span>';
    14251427
    14261428                $download_data_markup .= '</div>';
    14271429
    14281430                $row_actions = array(
    1429                         'download_data' => $download_data_markup,
     1431                        'download-data' => $download_data_markup,
    14301432                );
    14311433
    14321434                return sprintf( '<a href="%1$s">%2$s</a> %3$s', esc_url( 'mailto:' . $item->email ), $item->email, $this->row_actions( $row_actions ) );
     
    14521454                                $request_id      = $item->ID;
    14531455                                $nonce           = wp_create_nonce( 'wp-privacy-export-personal-data-' . $request_id );
    14541456
    1455                                 echo '<div class="export_personal_data" ' .
     1457                                echo '<div class="export-personal-data" ' .
    14561458                                        'data-send-as-email="1" ' .
    14571459                                        'data-exporters-count="' . esc_attr( $exporters_count ) . '" ' .
    14581460                                        'data-request-id="' . esc_attr( $request_id ) . '" ' .
     
    14601462                                        '">';
    14611463
    14621464                                ?>
    1463                                 <span class="export_personal_data_idle"><a class="button" href="#" ><?php _e( 'Send Export Link' ); ?></a></span>
    1464                                 <span style="display:none" class="export_personal_data_processing button updating-message" ><?php _e( 'Sending Email...' ); ?></span>
    1465                                 <span style="display:none" class="export_personal_data_success success-message" ><?php _e( 'Email sent.' ); ?></span>
    1466                                 <span style="display:none" class="export_personal_data_failed"><?php _e( 'Email could not be sent.' ); ?> <a class="button" href="#" ><?php _e( 'Retry' ); ?></a></span>
     1465                                <span class="export-personal-data-idle"><button type="button" class="button export-personal-data-handle"><?php _e( 'Email Data' ); ?></button></span>
     1466                                <span style="display:none" class="export-personal-data-processing button updating-message" ><?php _e( 'Sending Email...' ); ?></span>
     1467                                <span style="display:none" class="export-personal-data-success success-message" ><?php _e( 'Email sent.' ); ?></span>
     1468                                <span style="display:none" class="export-personal-data-failed"><?php _e( 'Email could not be sent.' ); ?> <button type="button" class="button export-personal-data-handle"><?php _e( 'Retry' ); ?></button></span>
    14671469                                <?php
    14681470
    14691471                                echo '</div>';
     
    14731475                                break;
    14741476                        case 'request-completed':
    14751477                                echo '<a href="' . esc_url( wp_nonce_url( add_query_arg( array(
    1476                                         'action' => 'delete',
    1477                                         'request_id' => array( $item->ID )
    1478                                 ), admin_url( 'tools.php?page=export_personal_data' ) ), 'bulk-privacy_requests' ) ) . '">' . esc_html__( 'Remove request' ) . '</a>';
     1478                                        'action'     => 'delete',
     1479                                        'request_id' => array( $item->ID ),
     1480                                ), admin_url( 'tools.php?page=export_personal_data' ) ), 'bulk-privacy_requests' ) ) . '" class="button">' . esc_html__( 'Remove request' ) . '</a>';
    14791481                                break;
    14801482                }
    14811483        }
     
    15241526                        $request_id    = $item->ID;
    15251527                        $nonce         = wp_create_nonce( 'wp-privacy-erase-personal-data-' . $request_id );
    15261528
    1527                         $remove_data_markup = '<div class="remove_personal_data force_remove_personal_data" ' .
     1529                        $remove_data_markup = '<div class="remove-personal-data force-remove-personal-data" ' .
    15281530                                'data-erasers-count="' . esc_attr( $erasers_count ) . '" ' .
    15291531                                'data-request-id="' . esc_attr( $request_id ) . '" ' .
    15301532                                'data-nonce="' . esc_attr( $nonce ) .
    15311533                                '">';
    15321534
    1533                         $remove_data_markup .= '<span class="remove_personal_data_idle"><a href="#" >' . __( 'Force Erase Personal Data' ) . '</a></span>' .
    1534                                 '<span style="display:none" class="remove_personal_data_processing" >' . __( 'Erasing Data...' ) . '</span>' .
    1535                                 '<span style="display:none" class="remove_personal_data_failed">' . __( 'Force Erase has failed.' ) . ' <a href="#" >' . __( 'Retry' ) . '</a></span>';
     1535                        $remove_data_markup .= '<span class="remove-personal-data-idle"><button type="button" class="button-link remove-personal-data-handle">' . __( 'Force Erase Personal Data' ) . '</button></span>' .
     1536                                '<span style="display:none" class="remove-personal-data-processing" >' . __( 'Erasing Data...' ) . '</span>' .
     1537                                '<span style="display:none" class="remove-personal-data-failed">' . __( 'Force Erase has failed.' ) . ' <button type="button" class="button-link remove-personal-data-handle">' . __( 'Retry' ) . '</button></span>';
    15361538
    15371539                        $remove_data_markup .= '</div>';
    15381540
    15391541                        $row_actions = array(
    1540                                 'remove_data' => $remove_data_markup,
     1542                                'remove-data' => $remove_data_markup,
    15411543                        );
    15421544                }
    15431545
     
    15641566                                $request_id    = $item->ID;
    15651567                                $nonce         = wp_create_nonce( 'wp-privacy-erase-personal-data-' . $request_id );
    15661568
    1567                                 echo '<div class="remove_personal_data" ' .
     1569                                echo '<div class="remove-personal-data" ' .
    15681570                                        'data-force-erase="1" ' .
    15691571                                        'data-erasers-count="' . esc_attr( $erasers_count ) . '" ' .
    15701572                                        'data-request-id="' . esc_attr( $request_id ) . '" ' .
     
    15721574                                        '">';
    15731575
    15741576                                ?>
    1575                                 <span class="remove_personal_data_idle"><a class="button" href="#" ><?php _e( 'Erase Personal Data' ); ?></a></span>
    1576                                 <span style="display:none" class="remove_personal_data_processing button updating-message" ><?php _e( 'Erasing Data...' ); ?></span>
    1577                                 <span style="display:none" class="remove_personal_data_failed"><?php _e( 'Erasing Data has failed.' ); ?> <a class="button" href="#" ><?php _e( 'Retry' ); ?></a></span>
     1577                                <span class="remove-personal-data-idle"><button type="button" class="button remove-personal-data-handle"><?php _e( 'Erase Personal Data' ); ?></button></span>
     1578                                <span style="display:none" class="remove-personal-data-processing button updating-message" ><?php _e( 'Erasing Data...' ); ?></span>
     1579                                <span style="display:none" class="remove-personal-data-failed"><?php _e( 'Erasing Data has failed.' ); ?> <button type="button" class="button remove-personal-data-handle"><?php _e( 'Retry' ); ?></button></span>
    15781580                                <?php
    15791581
    15801582                                echo '</div>';
     
    15851587                                break;
    15861588                        case 'request-completed':
    15871589                                echo '<a href="' . esc_url( wp_nonce_url( add_query_arg( array(
    1588                                         'action' => 'delete',
     1590                                        'action'     => 'delete',
    15891591                                        'request_id' => array( $item->ID ),
    1590                                 ), admin_url( 'tools.php?page=remove_personal_data' ) ), 'bulk-privacy_requests' ) ) . '">' . esc_html__( 'Remove request' ) . '</a>';
     1592                                ), admin_url( 'tools.php?page=remove_personal_data' ) ), 'bulk-privacy_requests' ) ) . '" class="button">' . esc_html__( 'Remove request' ) . '</a>';
    15911593                                break;
    15921594                }
    15931595        }
  • src/wp-admin/js/xfn.js

     
    2525jQuery( document ).ready( function( $ ) {
    2626        var strings = window.privacyToolsL10n || {};
    2727
    28         function set_action_state( $action, state ) {
     28        function setActionState( $action, state ) {
    2929                $action.children().hide();
    3030                $action.children( '.' + state ).show();
    3131        }
     
    3737        }
    3838
    3939        function appendResultsAfterRow( $requestRow, classes, summaryMessage, additionalMessages ) {
     40                var itemList = '';
     41
    4042                clearResultsAfterRow( $requestRow );
    4143
    42                 var itemList = '';
    4344                if ( additionalMessages.length ) {
    4445                        $.each( additionalMessages, function( index, value ) {
    4546                                itemList = itemList + '<li>' + value + '</li>';
    46                         } );
     47                        });
    4748                        itemList = '<ul>' + itemList + '</ul>';
    4849                }
    4950
     
    5556                                '</div>' +
    5657                                '</td>' +
    5758                                '</tr>';
    58                 } );
     59                });
    5960        }
    6061
    61         $( '.export_personal_data a' ).click( function( event ) {
     62        $( '.export-personal-data-handle' ).click( function( event ) {
     63
     64                var $this          = $( this ),
     65                        $action        = $this.parents( '.export-personal-data' ),
     66                        $requestRow    = $this.parents( 'tr' ),
     67                        requestID      = $action.data( 'request-id' ),
     68                        nonce          = $action.data( 'nonce' ),
     69                        exportersCount = $action.data( 'exporters-count' ),
     70                        sendAsEmail    = $action.data( 'send-as-email' ) ? true : false;
     71
    6272                event.preventDefault();
    6373                event.stopPropagation();
    6474
    65                 var $this          = $( this );
    66                 var $action        = $this.parents( '.export_personal_data' );
    67                 var $requestRow    = $this.parents( 'tr' );
    68                 var requestID      = $action.data( 'request-id' );
    69                 var nonce          = $action.data( 'nonce' );
    70                 var exportersCount = $action.data( 'exporters-count' );
    71                 var sendAsEmail    = $action.data( 'send-as-email' ) ? true : false;
    72 
    7375                $action.blur();
    7476                clearResultsAfterRow( $requestRow );
    7577
    76                 function on_export_done_success( zipUrl ) {
    77                         set_action_state( $action, 'export_personal_data_success' );
     78                function onExportDoneSuccess( zipUrl ) {
     79                        setActionState( $action, 'export-personal-data-success' );
    7880                        if ( 'undefined' !== typeof zipUrl ) {
    7981                                window.location = zipUrl;
    8082                        } else if ( ! sendAsEmail ) {
    81                                 on_export_failure( strings.noExportFile );
     83                                onExportFailure( strings.noExportFile );
    8284                        }
    8385                }
    8486
    85                 function on_export_failure( errorMessage ) {
    86                         set_action_state( $action, 'export_personal_data_failed' );
     87                function onExportFailure( errorMessage ) {
     88                        setActionState( $action, 'export-personal-data-failed' );
    8789                        if ( errorMessage ) {
    8890                                appendResultsAfterRow( $requestRow, 'notice-error', strings.exportError, [ errorMessage ] );
    8991                        }
    9092                }
    9193
    92                 function do_next_export( exporterIndex, pageIndex ) {
     94                function doNextExport( exporterIndex, pageIndex ) {
    9395                        $.ajax(
    9496                                {
    9597                                        url: window.ajaxurl,
     
    104106                                        method: 'post'
    105107                                }
    106108                        ).done( function( response ) {
     109                                var responseData = response.data;
     110
    107111                                if ( ! response.success ) {
     112
    108113                                        // e.g. invalid request ID
    109                                         on_export_failure( response.data );
     114                                        onExportFailure( response.data );
    110115                                        return;
    111116                                }
    112                                 var responseData = response.data;
     117
    113118                                if ( ! responseData.done ) {
    114                                         setTimeout( do_next_export( exporterIndex, pageIndex + 1 ) );
     119                                        setTimeout( doNextExport( exporterIndex, pageIndex + 1 ) );
    115120                                } else {
    116121                                        if ( exporterIndex < exportersCount ) {
    117                                                 setTimeout( do_next_export( exporterIndex + 1, 1 ) );
     122                                                setTimeout( doNextExport( exporterIndex + 1, 1 ) );
    118123                                        } else {
    119                                                 on_export_done_success( responseData.url );
     124                                                onExportDoneSuccess( responseData.url );
    120125                                        }
    121126                                }
    122                         } ).fail( function( jqxhr, textStatus, error ) {
     127                        }).fail( function( jqxhr, textStatus, error ) {
     128
    123129                                // e.g. Nonce failure
    124                                 on_export_failure( error );
    125                         } );
     130                                onExportFailure( error );
     131                        });
    126132                }
    127133
    128134                // And now, let's begin
    129                 set_action_state( $action, 'export_personal_data_processing' );
    130                 do_next_export( 1, 1 );
    131         } );
     135                setActionState( $action, 'export-personal-data-processing' );
     136                doNextExport( 1, 1 );
     137        });
    132138
    133         $( '.remove_personal_data a' ).click( function( event ) {
    134                 event.preventDefault();
    135                 event.stopPropagation();
     139        $( '.remove-personal-data-handle' ).click( function( event ) {
    136140
    137                 var $this         = $( this );
    138                 var $action       = $this.parents( '.remove_personal_data' );
    139                 var $requestRow   = $this.parents( 'tr' );
    140                 var requestID     = $action.data( 'request-id' );
    141                 var nonce         = $action.data( 'nonce' );
    142                 var erasersCount  = $action.data( 'erasers-count' );
     141                var $this         = $( this ),
     142                        $action       = $this.parents( '.remove-personal-data' ),
     143                        $requestRow   = $this.parents( 'tr' ),
     144                        requestID     = $action.data( 'request-id' ),
     145                        nonce         = $action.data( 'nonce' ),
     146                        erasersCount  = $action.data( 'erasers-count' ),
     147                        hasRemoved    = false,
     148                        hasRetained   = false,
     149                        messages      = [];
    143150
    144                 var hasRemoved    = false;
    145                 var hasRetained   = false;
    146                 var messages      = [];
     151                event.stopPropagation();
    147152
    148153                $action.blur();
    149154                clearResultsAfterRow( $requestRow );
    150155
    151                 function on_erasure_done_success() {
    152                         set_action_state( $action, 'remove_personal_data_idle' );
     156                function onErasureDoneSuccess() {
    153157                        var summaryMessage = strings.noDataFound;
    154158                        var classes = 'notice-success';
     159
     160                        setActionState( $action, 'remove-personal-data-idle' );
     161
    155162                        if ( false === hasRemoved ) {
    156163                                if ( false === hasRetained ) {
    157164                                        summaryMessage = strings.noDataFound;
     
    170177                        appendResultsAfterRow( $requestRow, 'notice-success', summaryMessage, messages );
    171178                }
    172179
    173                 function on_erasure_failure() {
    174                         set_action_state( $action, 'remove_personal_data_failed' );
     180                function onErasureFailure() {
     181                        setActionState( $action, 'remove-personal-data-failed' );
    175182                        appendResultsAfterRow( $requestRow, 'notice-error', strings.removalError, [] );
    176183                }
    177184
    178                 function do_next_erasure( eraserIndex, pageIndex ) {
    179                         $.ajax( {
     185                function doNextErasure( eraserIndex, pageIndex ) {
     186                        $.ajax({
    180187                                url: window.ajaxurl,
    181188                                data: {
    182189                                        action: 'wp-privacy-erase-personal-data',
     
    186193                                        security: nonce
    187194                                },
    188195                                method: 'post'
    189                         } ).done( function( response ) {
     196                        }).done( function( response ) {
     197                                var responseData = response.data;
     198
    190199                                if ( ! response.success ) {
    191                                         on_erasure_failure();
     200                                        onErasureFailure();
    192201                                        return;
    193202                                }
    194                                 var responseData = response.data;
    195203                                if ( responseData.items_removed ) {
    196204                                        hasRemoved = hasRemoved || responseData.items_removed;
    197205                                }
     
    202210                                        messages = messages.concat( responseData.messages );
    203211                                }
    204212                                if ( ! responseData.done ) {
    205                                         setTimeout( do_next_erasure( eraserIndex, pageIndex + 1 ) );
     213                                        setTimeout( doNextErasure( eraserIndex, pageIndex + 1 ) );
    206214                                } else {
    207215                                        if ( eraserIndex < erasersCount ) {
    208                                                 setTimeout( do_next_erasure( eraserIndex + 1, 1 ) );
     216                                                setTimeout( doNextErasure( eraserIndex + 1, 1 ) );
    209217                                        } else {
    210                                                 on_erasure_done_success();
     218                                                onErasureDoneSuccess();
    211219                                        }
    212220                                }
    213                         } ).fail( function() {
    214                                 on_erasure_failure();
    215                         } );
     221                        }).fail( function() {
     222                                onErasureFailure();
     223                        });
    216224                }
    217225
    218226                // And now, let's begin
    219                 set_action_state( $action, 'remove_personal_data_processing' );
     227                setActionState( $action, 'remove-personal-data-processing' );
    220228
    221                 do_next_erasure( 1, 1 );
    222         } );
    223 } );
     229                doNextErasure( 1, 1 );
     230        });
     231});
    224232
    225233( function( $ ) {
     234
    226235        // Privacy policy page, copy button.
    227236        $( document ).on( 'click', function( event ) {
    228237                var $target = $( event.target );
     
    253262                }
    254263        });
    255264
    256 } )( jQuery );
     265} ( jQuery ) );
  • src/wp-includes/user.php

     
    30783078        $request = wp_get_user_request_data( $request_id );
    30793079
    30803080        if ( $request && in_array( $request->action_name, _wp_privacy_action_request_types(), true ) ) {
    3081                 $message = '<p class="message">' . __( 'Action has been confirmed.' ) . '</p>';
     3081                $message  = '<p class="message">' . __( 'Action has been confirmed.' ) . '</p>';
    30823082                $message .= __( 'The site administrator has been notified and will fulfill your request as soon as possible.' );
    30833083        }
    30843084
     
    31113111        }
    31123112
    31133113        $user    = get_user_by( 'email', $email_address );
    3114         $user_id = $user && ! is_wp_error( $user ) ? $user->ID: 0;
     3114        $user_id = $user && ! is_wp_error( $user ) ? $user->ID : 0;
    31153115
    31163116        // Check for duplicates.
    31173117        $requests_query = new WP_Query( array(