Make WordPress Core

Ticket #43438: 43438.9.diff

File 43438.9.diff, 18.6 KB (added by birgire, 7 years ago)
  • src/wp-admin/includes/ajax-actions.php

    diff --git src/wp-admin/includes/ajax-actions.php src/wp-admin/includes/ajax-actions.php
    index 4f30007..b24c90a 100644
    function wp_ajax_edit_theme_plugin_file() { 
    43334333 * @since 4.9.6
    43344334 */
    43354335function wp_ajax_wp_privacy_export_personal_data() {
    4336         $request_id  = (int) $_POST['id'];
    43374336
    4338         if ( empty( $request_id ) ) {
    4339                 wp_send_json_error( __( 'Error: Invalid request ID.' ) );
     4337        if ( ! isset( $_POST['id'] ) ) {
     4338                wp_send_json_error( __( 'Missing request ID.' ) );
     4339        }
     4340        $request_id = (int) $_POST['id'];
     4341
     4342        if ( $request_id < 0 ) {
     4343                wp_send_json_error( __( 'Invalid request ID.' ) );
    43404344        }
    43414345
    43424346        if ( ! current_user_can( 'manage_options' ) ) {
    4343                 wp_send_json_error( __( 'Error: Invalid request.' ) );
     4347                wp_send_json_error( __( 'Invalid request.' ) );
    43444348        }
    43454349
    43464350        check_ajax_referer( 'wp-privacy-export-personal-data-' . $request_id, 'security' );
    function wp_ajax_wp_privacy_export_personal_data() { 
    43494353        $request = wp_get_user_request_data( $request_id );
    43504354
    43514355        if ( ! $request || 'export_personal_data' !== $request->action_name ) {
    4352                 wp_send_json_error( __( 'Error: Invalid request type.' ) );
     4356                wp_send_json_error( __( 'Invalid request type.' ) );
    43534357        }
    43544358
    43554359        $email_address = $request->email;
    4356         if ( ! is_email( $email_address ) ) {
    4357                 wp_send_json_error( __( 'Error: A valid email address must be given.' ) );
     4360        if ( ! is_email( strtolower( $email_address ) ) ) {
     4361                wp_send_json_error( __( 'A valid email address must be given.' ) );
    43584362        }
    43594363
     4364        if ( ! isset( $_POST['exporter'] ) ) {
     4365                wp_send_json_error( __( 'Missing exporter index.' ) );
     4366        }
    43604367        $exporter_index = (int) $_POST['exporter'];
    4361         $page           = (int) $_POST['page'];
    4362         $send_as_email  = isset( $_POST['sendAsEmail'] ) ? ( "true" === $_POST['sendAsEmail'] ) : false;
     4368
     4369        if ( ! isset( $_POST['page'] ) ) {
     4370                wp_send_json_error( __( 'Missing page index.' ) );
     4371        }
     4372        $page = (int) $_POST['page'];
     4373
     4374        $send_as_email = isset( $_POST['sendAsEmail'] ) ? ( 'true' === $_POST['sendAsEmail'] ) : false;
    43634375
    43644376        /**
    43654377         * Filters the array of exporter callbacks.
    function wp_ajax_wp_privacy_export_personal_data() { 
    43684380         *
    43694381         * @param array $args {
    43704382         *     An array of callable exporters of personal data. Default empty array.
    4371          *     [
    4372          *         callback               string  Callable exporter that accepts an email address and
    4373          *                                        a page and returns an array of name => value
    4374          *                                        pairs of personal data.
    4375          *         exporter_friendly_name string  Translated user facing friendly name for the exporter.
    4376          *     ]
     4383         *
     4384         *     @type array {
     4385         *         Array of personal data exporters.
     4386         *
     4387         *         @type string $callback               Callable exporter function that accepts an
     4388         *                                              email address and a page and returns an array
     4389         *                                              of name => value pairs of personal data.
     4390         *         @type string $exporter_friendly_name Translated user facing friendly name for the
     4391         *                                              exporter.
     4392         *     }
    43774393         * }
    43784394         */
    43794395        $exporters = apply_filters( 'wp_privacy_personal_data_exporters', array() );
    43804396
    43814397        if ( ! is_array( $exporters ) ) {
    4382                 wp_send_json_error( 'An exporter has improperly used the registration filter.' );
     4398                wp_send_json_error( __( 'An exporter has improperly used the registration filter.' ) );
    43834399        }
    43844400
    43854401        // Do we have any registered exporters?
    43864402        if ( 0 < count( $exporters ) ) {
    43874403                if ( $exporter_index < 1 ) {
    4388                         wp_send_json_error( 'Exporter index cannot be negative.' );
     4404                        wp_send_json_error( __( 'Exporter index cannot be negative.' ) );
    43894405                }
    43904406
    43914407                if ( $exporter_index > count( $exporters ) ) {
    4392                         wp_send_json_error( 'Exporter index out of range.' );
     4408                        wp_send_json_error( __( 'Exporter index out of range.' ) );
    43934409                }
    43944410
    43954411                $index = $exporter_index - 1;
    43964412
    43974413                if ( $page < 1 ) {
    4398                         wp_send_json_error( 'Page index cannot be less than one.' );
     4414                        wp_send_json_error( __( 'Page index cannot be less than one.' ) );
    43994415                }
    44004416
    44014417                $exporter = $exporters[ $index ];
    44024418
    44034419                if ( ! is_array( $exporter ) ) {
    4404                         wp_send_json_error( "Expected an array describing the exporter at index {$exporter_index}." );
     4420                        wp_send_json_error(
     4421                                sprintf(
     4422                                        /* translators: %d: array index */
     4423                                        __( 'Expected an array describing the exporter at index %d.' ),
     4424                                        $exporter_index
     4425                                )
     4426                        );
    44054427                }
    44064428                if ( ! array_key_exists( 'exporter_friendly_name', $exporter ) ) {
    4407                         wp_send_json_error( "Exporter array at index {$exporter_index} does not include a friendly name." );
     4429                        wp_send_json_error(
     4430                                sprintf(
     4431                                        /* translators: %d: array index */
     4432                                        __( 'Exporter array at index %d does not include a friendly name.' ),
     4433                                        $exporter_index
     4434                                )
     4435                        );
    44084436                }
    44094437                if ( ! array_key_exists( 'callback', $exporter ) ) {
    4410                         wp_send_json_error( "Exporter does not include a callback: {$exporter['exporter_friendly_name']}." );
     4438                        wp_send_json_error(
     4439                                sprintf(
     4440                                        /* translators: %s: exporter friendly name */
     4441                                        __( 'Exporter does not include a callback: %s.' ),
     4442                                        $exporter['exporter_friendly_name']
     4443                                )
     4444                        );
    44114445                }
    44124446                if ( ! is_callable( $exporter['callback'] ) ) {
    4413                         wp_send_json_error( "Exporter callback is not a valid callback: {$exporter['exporter_friendly_name']}." );
     4447                        wp_send_json_error(
     4448                                sprintf(
     4449                                        /* translators: %s: exporter friendly name */
     4450                                        __( 'Exporter callback is not a valid callback: %s.' ),
     4451                                        $exporter['exporter_friendly_name']
     4452                                )
     4453                        );
    44144454                }
    44154455
    4416                 $callback = $exporters[ $index ]['callback'];
     4456                $callback               = $exporters[ $index ]['callback'];
    44174457                $exporter_friendly_name = $exporters[ $index ]['exporter_friendly_name'];
    44184458
    44194459                $response = call_user_func( $callback, $email_address, $page );
    function wp_ajax_wp_privacy_export_personal_data() { 
    44224462                }
    44234463
    44244464                if ( ! is_array( $response ) ) {
    4425                         wp_send_json_error( "Expected response as an array from exporter: {$exporter_friendly_name}." );
     4465                        wp_send_json_error(
     4466                                sprintf(
     4467                                        /* translators: %s: exporter friendly name */
     4468                                        __( 'Expected response as an array from exporter: %s.' ),
     4469                                        $exporter_friendly_name
     4470                                )
     4471                        );
    44264472                }
    44274473                if ( ! array_key_exists( 'data', $response ) ) {
    4428                         wp_send_json_error( "Expected data in response array from exporter: {$exporter_friendly_name}." );
     4474                        wp_send_json_error(
     4475                                sprintf(
     4476                                        /* translators: %s: exporter friendly name */
     4477                                        __( 'Expected data in response array from exporter: %s.' ),
     4478                                        $exporter_friendly_name
     4479                                )
     4480                        );
    44294481                }
    44304482                if ( ! is_array( $response['data'] ) ) {
    4431                         wp_send_json_error( "Expected data array in response array from exporter: {$exporter_friendly_name}." );
     4483                        wp_send_json_error(
     4484                                sprintf(
     4485                                        /* translators: %s: exporter friendly name */
     4486                                        __( 'Expected data array in response array from exporter: %s.' ),
     4487                                        $exporter_friendly_name
     4488                                )
     4489                        );
    44324490                }
    44334491                if ( ! array_key_exists( 'done', $response ) ) {
    4434                         wp_send_json_error( "Expected done (boolean) in response array from exporter: {$exporter_friendly_name}." );
     4492                        wp_send_json_error(
     4493                                sprintf(
     4494                                        /* translators: %s: exporter friendly name */
     4495                                        __( 'Expected done (boolean) in response array from exporter: %s.' ),
     4496                                        $exporter_friendly_name
     4497                                )
     4498                        );
    44354499                }
    44364500        } else {
    44374501                // No exporters, so we're done.
    function wp_ajax_wp_privacy_export_personal_data() { 
    44484512         *
    44494513         * @since 4.9.6
    44504514         *
    4451          * @param array  $response        The personal data for the given exporter and page.
    4452          * @param int    $exporter_index  The index of the exporter that provided this data.
    4453          * @param string $email_address   The email address associated with this personal data.
    4454          * @param int    $page            The zero-based page for this response.
    4455          * @param int    $request_id      The privacy request post ID associated with this request.
    4456          * @param bool   $send_as_email   Whether the final results of the export should be emailed to the user.
     4515         * @param array|WP_Error $response        The personal data for the given exporter and page. WP_Error on failure.
     4516         * @param int            $exporter_index  The index of the exporter that provided this data.
     4517         * @param string         $email_address   The email address associated with this personal data.
     4518         * @param int            $page            The page for this response.
     4519         * @param int            $request_id      The privacy request post ID associated with this request.
     4520         * @param bool           $send_as_email   Whether the final results of the export should be emailed to the user.
    44574521         */
    44584522        $response = apply_filters( 'wp_privacy_personal_data_export_page', $response, $exporter_index, $email_address, $page, $request_id, $send_as_email );
    44594523
    function wp_ajax_wp_privacy_export_personal_data() { 
    44704534 * @since 4.9.6
    44714535 */
    44724536function wp_ajax_wp_privacy_erase_personal_data() {
    4473         $request_id  = (int) $_POST['id'];
    44744537
    4475         if ( empty( $request_id ) ) {
    4476                 wp_send_json_error( __( 'Error: Invalid request ID.' ) );
     4538        if ( ! isset( $_POST['id'] ) ) {
     4539                wp_send_json_error( __( 'Missing request ID.' ) );
     4540        }
     4541        $request_id = (int) $_POST['id'];
     4542
     4543        if ( $request_id < 0 ) {
     4544                wp_send_json_error( __( 'Invalid request ID.' ) );
    44774545        }
    44784546
    44794547        if ( ! current_user_can( 'delete_users' ) ) {
    4480                 wp_send_json_error( __( 'Error: Invalid request.' ) );
     4548                wp_send_json_error( __( 'Invalid request.' ) );
    44814549        }
    44824550
    44834551        check_ajax_referer( 'wp-privacy-erase-personal-data-' . $request_id, 'security' );
    function wp_ajax_wp_privacy_erase_personal_data() { 
    44864554        $request = wp_get_user_request_data( $request_id );
    44874555
    44884556        if ( ! $request || 'remove_personal_data' !== $request->action_name ) {
    4489                 wp_send_json_error( __( 'Error: Invalid request ID.' ) );
     4557                wp_send_json_error( __( 'Invalid request ID.' ) );
    44904558        }
    44914559
    44924560        $email_address = $request->email;
    44934561
    44944562        if ( ! is_email( $email_address ) ) {
    4495                 wp_send_json_error( __( 'Error: Invalid email address in request.' ) );
     4563                wp_send_json_error( __( 'Invalid email address in request.' ) );
    44964564        }
    44974565
     4566        if ( ! isset( $_POST['eraser'] ) ) {
     4567                wp_send_json_error( __( 'Missing eraser index.' ) );
     4568        }
    44984569        $eraser_index = (int) $_POST['eraser'];
    4499         $page         = (int) $_POST['page'];
     4570
     4571        if ( ! isset( $_POST['page'] ) ) {
     4572                wp_send_json_error( __( 'Missing page index.' ) );
     4573        }
     4574        $page = (int) $_POST['page'];
    45004575
    45014576        /**
    45024577         * Filters the array of personal data eraser callbacks.
    function wp_ajax_wp_privacy_erase_personal_data() { 
    45054580         *
    45064581         * @param array $args {
    45074582         *     An array of callable erasers of personal data. Default empty array.
    4508          *     [
    4509          *         callback             string Callable eraser that accepts an email address and
    4510          *                                     a page and returns an array with the number of items
    4511          *                                     removed, the number of items retained and any messages
    4512          *                                     from the eraser, as well as if additional pages are
    4513          *                                     available.
    4514          *         eraser_friendly_name string Translated user facing friendly name for the eraser.
    4515          *     ]
     4583         *     @type array {
     4584         *         Array of personal data exporters.
     4585         *
     4586         *         @type string $callback               Callable eraser that accepts an email address and
     4587         *                                              a page and returns an array with the number of items
     4588         *                                              removed, the number of items retained and any messages
     4589         *                                              from the eraser, as well as if additional pages are
     4590         *                                              available.
     4591         *         @type string $exporter_friendly_name Translated user facing friendly name for the eraser.
     4592         *     }
    45164593         * }
    45174594         */
    45184595        $erasers = apply_filters( 'wp_privacy_personal_data_erasers', array() );
    45194596
    45204597        // Do we have any registered erasers?
    45214598        if ( 0 < count( $erasers ) ) {
     4599
    45224600                if ( $eraser_index < 1 ) {
    4523                         wp_send_json_error( __( 'Error: Eraser index cannot be less than one.' ) );
     4601                        wp_send_json_error( __( 'Eraser index cannot be less than one.' ) );
    45244602                }
    45254603
    45264604                if ( $eraser_index > count( $erasers ) ) {
    4527                         wp_send_json_error( __( 'Error: Eraser index is out of range.' ) );
     4605                        wp_send_json_error( __( 'Eraser index is out of range.' ) );
    45284606                }
    45294607
    45304608                if ( $page < 1 ) {
    4531                         wp_send_json_error( __( 'Error: Page index cannot be less than one.' ) );
     4609                        wp_send_json_error( __( 'Page index cannot be less than one.' ) );
    45324610                }
    45334611
    4534                 $index = $eraser_index - 1; // Convert to zero based for eraser index
     4612                $index  = $eraser_index - 1; // Convert to zero based for eraser index.
    45354613                $eraser = $erasers[ $index ];
    45364614                if ( ! is_array( $eraser ) ) {
    45374615                        wp_send_json_error(
    45384616                                sprintf(
    4539                                         __( 'Error: Expected an array describing the eraser at index %d.' ),
     4617                                        /* translators: %d: array index */
     4618                                        __( 'Expected an array describing the eraser at index %d.' ),
    45404619                                        $eraser_index
    45414620                                )
    45424621                        );
    function wp_ajax_wp_privacy_erase_personal_data() { 
    45444623                if ( ! array_key_exists( 'callback', $eraser ) ) {
    45454624                        wp_send_json_error(
    45464625                                sprintf(
    4547                                         __( 'Error: Eraser array at index %d does not include a callback.' ),
     4626                                        /* translators: %d: array index */
     4627                                        __( 'Eraser array at index %d does not include a callback.' ),
    45484628                                        $eraser_index
    45494629                                )
    45504630                        );
    function wp_ajax_wp_privacy_erase_personal_data() { 
    45524632                if ( ! is_callable( $eraser['callback'] ) ) {
    45534633                        wp_send_json_error(
    45544634                                sprintf(
    4555                                         __( 'Error: Eraser callback at index %d is not a valid callback.' ),
     4635                                        /* translators: %d: array index */
     4636                                        __( 'Eraser callback at index %d is not a valid callback.' ),
    45564637                                        $eraser_index
    45574638                                )
    45584639                        );
    function wp_ajax_wp_privacy_erase_personal_data() { 
    45604641                if ( ! array_key_exists( 'eraser_friendly_name', $eraser ) ) {
    45614642                        wp_send_json_error(
    45624643                                sprintf(
    4563                                         __( 'Error: Eraser array at index %d does not include a friendly name.' ),
     4644                                        /* translators: %d: array index */
     4645                                        __( 'Eraser array at index %d does not include a friendly name.' ),
    45644646                                        $eraser_index
    45654647                                )
    45664648                        );
    45674649                }
    45684650
    4569                 $callback = $erasers[ $index ]['callback'];
     4651                $callback             = $erasers[ $index ]['callback'];
    45704652                $eraser_friendly_name = $erasers[ $index ]['eraser_friendly_name'];
    45714653
    45724654                $response = call_user_func( $callback, $email_address, $page );
    function wp_ajax_wp_privacy_erase_personal_data() { 
    45774659                if ( ! is_array( $response ) ) {
    45784660                        wp_send_json_error(
    45794661                                sprintf(
    4580                                         __( 'Error: Did not receive array from %s eraser (index %d).' ),
     4662                                        /* translators: %1$s: eraser friendly name, %2$d: array index */
     4663                                        __( 'Did not receive array from %1$s eraser (index %2$d).' ),
    45814664                                        $eraser_friendly_name,
    45824665                                        $eraser_index
    45834666                                )
    function wp_ajax_wp_privacy_erase_personal_data() { 
    45864669                if ( ! array_key_exists( 'num_items_removed', $response ) ) {
    45874670                        wp_send_json_error(
    45884671                                sprintf(
    4589                                         __( 'Error: Expected num_items_removed key in response array from %s eraser (index %d).' ),
     4672                                        /* translators: %1$s: eraser friendly name, %2$d: array index */
     4673                                        __( 'Expected num_items_removed key in response array from %1$s eraser (index %2$d).' ),
    45904674                                        $eraser_friendly_name,
    45914675                                        $eraser_index
    45924676                                )
    function wp_ajax_wp_privacy_erase_personal_data() { 
    45954679                if ( ! array_key_exists( 'num_items_retained', $response ) ) {
    45964680                        wp_send_json_error(
    45974681                                sprintf(
    4598                                         __( 'Error: Expected num_items_retained key in response array from %s eraser (index %d).' ),
     4682                                        /* translators: %1$s: eraser friendly name, %2$d: array index */
     4683                                        __( 'Expected num_items_retained key in response array from %1$s eraser (index %2$d).' ),
    45994684                                        $eraser_friendly_name,
    46004685                                        $eraser_index
    46014686                                )
    function wp_ajax_wp_privacy_erase_personal_data() { 
    46044689                if ( ! array_key_exists( 'messages', $response ) ) {
    46054690                        wp_send_json_error(
    46064691                                sprintf(
    4607                                         __( 'Error: Expected messages key in response array from %s eraser (index %d).' ),
     4692                                        /* translators: %1$s: eraser friendly name, %2$d: array index */
     4693                                        __( 'Expected messages key in response array from %1$s eraser (index %2$d).' ),
    46084694                                        $eraser_friendly_name,
    46094695                                        $eraser_index
    46104696                                )
    function wp_ajax_wp_privacy_erase_personal_data() { 
    46134699                if ( ! is_array( $response['messages'] ) ) {
    46144700                        wp_send_json_error(
    46154701                                sprintf(
    4616                                         __( 'Error: Expected messages key to reference an array in response array from %s eraser (index %d).' ),
     4702                                        /* translators: %1$s: eraser friendly name, %2$d: array index */
     4703                                        __( 'Expected messages key to reference an array in response array from %1$s eraser (index %2$d).' ),
    46174704                                        $eraser_friendly_name,
    46184705                                        $eraser_index
    46194706                                )
    function wp_ajax_wp_privacy_erase_personal_data() { 
    46224709                if ( ! array_key_exists( 'done', $response ) ) {
    46234710                        wp_send_json_error(
    46244711                                sprintf(
    4625                                         __( 'Error: Expected done flag in response array from %s eraser (index %d).' ),
     4712                                        /* translators: %1$s: eraser friendly name, %2$d: array index */
     4713                                        __( 'Expected done flag in response array from %1$s eraser (index %2$d).' ),
    46264714                                        $eraser_friendly_name,
    46274715                                        $eraser_index
    46284716                                )
    46294717                        );
    46304718                }
    46314719        } else {
    4632                 // No erasers, so we're done
     4720                // No erasers, so we're done.
    46334721                $response = array(
    4634                         'num_items_removed' => 0,
     4722                        'num_items_removed'  => 0,
    46354723                        'num_items_retained' => 0,
    4636                         'messages' => array(),
    4637                         'done' => true,
     4724                        'messages'           => array(),
     4725                        'done'               => true,
    46384726                );
    46394727        }
    46404728
    function wp_ajax_wp_privacy_erase_personal_data() { 
    46454733         *
    46464734         * @since 4.9.6
    46474735         *
    4648          * @param array  $response        The personal data for the given exporter and page.
    4649          * @param int    $exporter_index  The index of the exporter that provided this data.
    4650          * @param string $email_address   The email address associated with this personal data.
    4651          * @param int    $page            The zero-based page for this response.
    4652          * @param int    $request_id      The privacy request post ID associated with this request.
     4736         * @param array|WP_Error  $response        The personal data for the given exporter and page. WP_Error on failure.
     4737         * @param int             $exporter_index  The index of the exporter that provided this data.
     4738         * @param string          $email_address   The email address associated with this personal data.
     4739         * @param int             $page            The page for this response.
     4740         * @param int             $request_id      The privacy request post ID associated with this request.
    46534741         */
    46544742        $response = apply_filters( 'wp_privacy_personal_data_erasure_page', $response, $eraser_index, $email_address, $page, $request_id );
     4743
    46554744        if ( is_wp_error( $response ) ) {
    46564745                wp_send_json_error( $response );
    46574746        }