WordPress.org

Make WordPress Core

Ticket #43985: 43985.7.diff

File 43985.7.diff, 21.8 KB (added by desrosj, 16 months ago)
  • src/wp-admin/includes/file.php

     
    21962196        $request = wp_get_user_request_data( $request_id );
    21972197
    21982198        if ( ! $request || 'export_personal_data' !== $request->action_name ) {
    2199                 return new WP_Error( 'invalid', __( 'Invalid request ID when sending personal data export email.' ) );
     2199                return new WP_Error( 'invalid_request', __( 'Invalid request ID when sending personal data export email.' ) );
    22002200        }
    22012201
    22022202        /** This filter is documented in wp-includes/functions.php */
     
    22562256        );
    22572257
    22582258        if ( ! $mail_success ) {
    2259                 return new WP_Error( 'error', __( 'Unable to send personal data export email.' ) );
     2259                return new WP_Error( 'privacy_email_error', __( 'Unable to send personal data export email.' ) );
    22602260        }
    22612261
    22622262        return true;
  • src/wp-includes/user.php

     
    33573357 * @since 4.9.6
    33583358 *
    33593359 * @param string $request_id ID of the request created via wp_create_user_request().
    3360  * @return WP_Error|bool Will return true/false based on the success of sending the email, or a WP_Error object.
     3360 * @return bool|WP_Error true on success or `WP_Error` on failure.
    33613361 */
    33623362function wp_send_user_request( $request_id ) {
    33633363        $request_id = absint( $request_id );
     
    33643364        $request    = wp_get_user_request_data( $request_id );
    33653365
    33663366        if ( ! $request ) {
    3367                 return new WP_Error( 'user_request_error', __( 'Invalid request.' ) );
     3367                return new WP_Error( 'invalid_request', __( 'Invalid user request.' ) );
    33683368        }
    33693369
     3370        // Localize message content for user; fallback to site default for visitors.
     3371        if ( ! empty( $request->user_id ) ) {
     3372                $locale = get_user_locale( $request->user_id );
     3373        } else {
     3374                $locale = get_locale();
     3375        }
     3376
     3377        $switched_locale = switch_to_locale( $locale );
     3378
    33703379        $email_data = array(
    33713380                'request'     => $request,
    33723381                'email'       => $request->email,
     
    34543463         */
    34553464        $subject = apply_filters( 'user_request_action_email_subject', $subject, $email_data['sitename'], $email_data );
    34563465
    3457         return wp_mail( $email_data['email'], $subject, $content );
     3466        $email_sent = wp_mail( $email_data['email'], $subject, $content );
     3467
     3468        if ( $switched_locale ) {
     3469                restore_current_locale();
     3470        }
     3471
     3472        if ( ! $email_sent ) {
     3473                return new WP_Error( 'privacy_email_error', __( 'Unable to send personal data export confirmation email.' ) );
     3474        }
     3475
     3476        return true;
    34583477}
    34593478
    34603479/**
     
    35913610         *
    35923611         * @var int
    35933612         */
    3594 
    35953613        public $user_id = 0;
    35963614
    35973615        /**
     
    36663684         */
    36673685        public function __construct( $post ) {
    36683686                $this->ID                  = $post->ID;
    3669                 $this->user_id             = $post->post_author;
     3687                $this->user_id             = (int) $post->post_author;
    36703688                $this->email               = $post->post_title;
    36713689                $this->action_name         = $post->post_name;
    36723690                $this->status              = $post->post_status;
  • tests/phpunit/data/languages/de_DE.po

    Cannot display: file marked as a binary type.
    svn:mime-type = application/octet-stream
     
    1 # Translation of 4.6.x in German
    2 # This file is distributed under the same license as the 4.6.x package.
     1# Translation of 4.9.x in German
     2# This file is distributed under the same license as the 4.9.x package.
    33msgid ""
    44msgstr ""
    5 "PO-Revision-Date: 2016-10-25 18:27+0200\n"
     5"PO-Revision-Date: 2018-08-01 17:08-0400\n"
    66"MIME-Version: 1.0\n"
    77"Content-Type: text/plain; charset=UTF-8\n"
    88"Content-Transfer-Encoding: 8bit\n"
    99"Plural-Forms: nplurals=2; plural=n != 1;\n"
    10 "X-Generator: Poedit 1.8.10\n"
    11 "Project-Id-Version: 4.6.x\n"
     10"X-Generator: Poedit 2.1\n"
     11"Project-Id-Version: Development (4.9.x)\n"
    1212"Language: de_DE\n"
    1313
    1414#. translators: Translate this to the correct language tag for your locale, see
     
    4040#: wp-includes/script-loader.php:620
    4141msgid "Update %s now"
    4242msgstr "Jetzt %s aktualisieren"
     43
     44#. translators: Privacy data request subject. 1: Site name, 2: Name of the action
     45#: wp-includes/user.php:3445
     46msgid "[%1$s] Confirm Action: %2$s"
     47msgstr "[%1$s] Aktion bestätigen: %2$s"
  • tests/phpunit/data/languages/es_ES.po

    Cannot display: file marked as a binary type.
    svn:mime-type = application/octet-stream
     
    1 # Translation of Development (4.4.x) in Spanish (Spain)
    2 # This file is distributed under the same license as the Development (4.4.x) package.
     1# Translation of Development (4.9.x) in Spanish (Spain)
     2# This file is distributed under the same license as the Development (4.9.x) package.
    33msgid ""
    44msgstr ""
    5 "PO-Revision-Date: 2016-10-25 18:28+0200\n"
     5"PO-Revision-Date: 2018-08-01 17:08-0400\n"
    66"MIME-Version: 1.0\n"
    77"Content-Type: text/plain; charset=UTF-8\n"
    88"Content-Transfer-Encoding: 8bit\n"
    99"Plural-Forms: nplurals=2; plural=n != 1;\n"
    10 "X-Generator: Poedit 1.8.10\n"
    11 "Project-Id-Version: Development (4.4.x)\n"
     10"X-Generator: Poedit 2.1\n"
     11"Project-Id-Version: Development (4.9.x)\n"
    1212"Language: es_ES\n"
    1313
    1414#. translators: 'rtl' or 'ltr'. This sets the text direction for WordPress.
     
    3636msgctxt "menu"
    3737msgid "(Currently set to: %s)"
    3838msgstr "(Actualmente fijado en: %s)"
     39
     40#. translators: Privacy data request subject. 1: Site name, 2: Name of the action
     41#: wp-includes/user.php:3445
     42msgid "[%1$s] Confirm Action: %2$s"
     43msgstr "[%1$s] Confirma la acción: %2$s"
  • tests/phpunit/tests/privacy/wpPrivacySendPersonalDataExportEmail.php

     
    9595                $request_id = 0;
    9696                $email_sent = wp_privacy_send_personal_data_export_email( $request_id );
    9797                $this->assertWPError( $email_sent );
    98                 $this->assertSame( 'invalid', $email_sent->get_error_code() );
     98                $this->assertSame( 'invalid_request', $email_sent->get_error_code() );
    9999
    100100                $request_id = PHP_INT_MAX;
    101101                $email_sent = wp_privacy_send_personal_data_export_email( $request_id );
    102102                $this->assertWPError( $email_sent );
    103                 $this->assertSame( 'invalid', $email_sent->get_error_code() );
     103                $this->assertSame( 'invalid_request', $email_sent->get_error_code() );
    104104        }
    105105
    106106        /**
     
    111111        public function test_return_wp_error_when_send_fails() {
    112112                add_filter( 'wp_mail_from', '__return_empty_string' ); // Cause `wp_mail()` to return false.
    113113                $email_sent = wp_privacy_send_personal_data_export_email( self::$request_id );
    114                 remove_filter( 'wp_mail_from', '__return_empty_string' );
    115114
    116115                $this->assertWPError( $email_sent );
    117                 $this->assertSame( 'error', $email_sent->get_error_code() );
     116                $this->assertSame( 'privacy_email_error', $email_sent->get_error_code() );
    118117        }
    119118
    120119        /**
     
    125124        public function test_export_expiration_should_be_filterable() {
    126125                add_filter( 'wp_privacy_export_expiration', array( $this, 'modify_export_expiration' ) );
    127126                wp_privacy_send_personal_data_export_email( self::$request_id );
    128                 remove_filter( 'wp_privacy_export_expiration', array( $this, 'modify_export_expiration' ) );
    129127
    130128                $mailer = tests_retrieve_phpmailer_instance();
    131129                $this->assertContains( 'we will automatically delete the file on December 18, 2017,', $mailer->get_sent()->body );
     
    152150        public function test_email_content_should_be_filterable() {
    153151                add_filter( 'wp_privacy_personal_data_email_content', array( $this, 'modify_email_content' ), 10, 2 );
    154152                wp_privacy_send_personal_data_export_email( self::$request_id );
    155                 remove_filter( 'wp_privacy_personal_data_email_content', array( $this, 'modify_email_content' ) );
    156153
    157154                $mailer = tests_retrieve_phpmailer_instance();
    158155                $this->assertContains( 'Custom content for request ID: ' . self::$request_id, $mailer->get_sent()->body );
  • tests/phpunit/tests/user/wpSendUserRequest.php

     
     1<?php
     2/**
     3 * Test cases for the `wp_send_user_request()` function.
     4 *
     5 * @package WordPress
     6 * @since 4.9.9
     7 */
     8
     9/**
     10 * Tests_User_WpSendUserRequest class.
     11 *
     12 * @since 4.9.9
     13 *
     14 * @group privacy
     15 * @group user
     16 * @covers wp_send_user_request
     17 */
     18class Tests_User_WpSendUserRequest extends WP_UnitTestCase {
     19        /**
     20         * Reset the mocked phpmailer instance before each test method.
     21         *
     22         * @since 4.9.9
     23         */
     24        public function setUp() {
     25                parent::setUp();
     26                reset_phpmailer_instance();
     27        }
     28
     29        /**
     30         * Reset the mocked phpmailer instance after each test method.
     31         *
     32         * @since 4.9.9
     33         */
     34        public function tearDown() {
     35                reset_phpmailer_instance();
     36                parent::tearDown();
     37        }
     38
     39        /**
     40         * The function should error when the request ID is invalid.
     41         *
     42         * @ticket 43985
     43         */
     44        public function test_should_error_when_invalid_request_id() {
     45                $result = wp_send_user_request( null );
     46
     47                $this->assertWPError( $result );
     48                $this->assertSame( 'invalid_request', $result->get_error_code() );
     49        }
     50
     51        /**
     52         * The function should send a user request export email when the requester is a registered user.
     53         *
     54         * @ticket 43985
     55         */
     56        public function test_should_send_user_request_export_email_when_requester_registered_user() {
     57                $email      = 'export.request.from.user@example.com';
     58                $user_id    = $this->factory->user->create(
     59                        array(
     60                                'user_email' => $email,
     61                                'role'       => 'administrator',
     62                        )
     63                );
     64                $request_id = wp_create_user_request( $email, 'export_personal_data' );
     65
     66                $result = wp_send_user_request( $request_id );
     67                $mailer = tests_retrieve_phpmailer_instance();
     68
     69                $this->assertTrue( $result );
     70                $this->assertSame( $email, $mailer->get_recipient( 'to' )->address );
     71                $this->assertContains( 'Confirm Action: Export Personal Data', $mailer->get_sent()->subject );
     72                $this->assertContains( 'action=confirmaction&request_id=', $mailer->get_sent()->body );
     73                $this->assertContains( 'Export Personal Data', $mailer->get_sent()->body );
     74        }
     75
     76        /**
     77         * The function should send a user request erase email when the requester is a registered user.
     78         *
     79         * @ticket 43985
     80         */
     81        public function test_should_send_user_request_erase_email_when_requester_registered_user() {
     82                $email      = 'erase.request.from.user@example.com';
     83                $user_id    = $this->factory->user->create(
     84                        array(
     85                                'user_email' => $email,
     86                                'role'       => 'author',
     87                        )
     88                );
     89                $request_id = wp_create_user_request( $email, 'remove_personal_data' );
     90
     91                $result = wp_send_user_request( $request_id );
     92                $mailer = tests_retrieve_phpmailer_instance();
     93
     94                $this->assertTrue( $result );
     95                $this->assertSame( $email, $mailer->get_recipient( 'to' )->address );
     96                $this->assertContains( 'Confirm Action: Erase Personal Data', $mailer->get_sent()->subject );
     97                $this->assertContains( 'action=confirmaction&request_id=', $mailer->get_sent()->body );
     98                $this->assertContains( 'Erase Personal Data', $mailer->get_sent()->body );
     99        }
     100
     101        /**
     102         * The function should send a user request export email when the requester is an un-registered user.
     103         *
     104         * @ticket 43985
     105         */
     106        public function test_should_send_user_request_export_email_when_user_not_registered() {
     107                $email      = 'export.request.from.unregistered.user@example.com';
     108                $request_id = wp_create_user_request( $email, 'export_personal_data' );
     109
     110                $result = wp_send_user_request( $request_id );
     111                $mailer = tests_retrieve_phpmailer_instance();
     112
     113                $this->assertTrue( $result );
     114                $this->assertSame( $email, $mailer->get_recipient( 'to' )->address );
     115                $this->assertContains( 'Confirm Action: Export Personal Data', $mailer->get_sent()->subject );
     116                $this->assertContains( 'action=confirmaction&request_id=', $mailer->get_sent()->body );
     117                $this->assertContains( 'Export Personal Data', $mailer->get_sent()->body );
     118        }
     119
     120        /**
     121         * The function should send a user request erase email when the requester is an un-registered user.
     122         *
     123         * @ticket 43985
     124         */
     125        public function test_should_send_user_request_erase_email_when_user_not_registered() {
     126                $email      = 'erase.request.from.unregistered.user@example.com';
     127                $request_id = wp_create_user_request( $email, 'remove_personal_data' );
     128
     129                $result = wp_send_user_request( $request_id );
     130                $mailer = tests_retrieve_phpmailer_instance();
     131
     132                $this->assertTrue( $result );
     133                $this->assertSame( $email, $mailer->get_recipient( 'to' )->address );
     134                $this->assertContains( 'Confirm Action: Erase Personal Data', $mailer->get_sent()->subject );
     135                $this->assertContains( 'action=confirmaction&request_id=', $mailer->get_sent()->body );
     136                $this->assertContains( 'Erase Personal Data', $mailer->get_sent()->body );
     137        }
     138
     139        /**
     140         * The email subject should be filterable.
     141         *
     142         * @ticket 43985
     143         */
     144        public function test_email_subject_should_be_filterable() {
     145                $email      = 'erase.request.from.user@example.com';
     146                $user_id    = $this->factory->user->create(
     147                        array(
     148                                'user_email' => $email,
     149                        )
     150                );
     151                $request_id = wp_create_user_request( $email, 'remove_personal_data' );
     152
     153                add_filter( 'user_request_action_email_subject', array( $this, 'modify_email_subject' ) );
     154                $result = wp_send_user_request( $request_id );
     155                $mailer = tests_retrieve_phpmailer_instance();
     156
     157                $this->assertTrue( $result );
     158                $this->assertSame( 'Custom Email Subject', $mailer->get_sent()->subject );
     159        }
     160
     161        /**
     162         * Filter callback to modify the subject of the email sent when an account action is attempted.
     163         *
     164         * @since 4.9.9
     165         *
     166         * @param string $subject The email subject.
     167         * @return string Filtered email subject.
     168         */
     169        public function modify_email_subject( $subject ) {
     170                return 'Custom Email Subject';
     171        }
     172
     173        /**
     174         * The email content should be filterable.
     175         *
     176         * @ticket 43985
     177         */
     178        public function test_email_content_should_be_filterable() {
     179                $email      = 'erase.request.from.user@example.com';
     180                $user_id    = $this->factory->user->create(
     181                        array(
     182                                'user_email' => $email,
     183                        )
     184                );
     185                $request_id = wp_create_user_request( $email, 'remove_personal_data' );
     186
     187                add_filter( 'user_request_action_email_content', array( $this, 'modify_email_content' ), 10, 2 );
     188                $result = wp_send_user_request( $request_id );
     189                $mailer = tests_retrieve_phpmailer_instance();
     190
     191                $this->assertTrue( $result );
     192                $this->assertContains( 'Custom Email Content.', $mailer->get_sent()->body );
     193        }
     194
     195        /**
     196         * Filter callback to modify the content of the email sent when an account action is attempted.
     197         *
     198         * @since 4.9.9
     199         *
     200         * @param string $email_text Confirmation email text.
     201         * @return string $email_text Filtered email text.
     202         */
     203        public function modify_email_content( $email_text ) {
     204                return 'Custom Email Content.';
     205        }
     206
     207        /**
     208         * The function should error when the email was not sent.
     209         *
     210         * @since 4.9.9
     211         *
     212         * @ticket 43985
     213         */
     214        public function test_return_wp_error_when_sending_fails() {
     215                $request_id = wp_create_user_request( 'erase.request.from.unergistered.user@example.com', 'remove_personal_data' );
     216
     217                add_filter( 'wp_mail_from', '__return_empty_string' ); // Cause `wp_mail()` to return false.
     218                $result = wp_send_user_request( $request_id );
     219
     220                $this->assertWPError( $result );
     221                $this->assertSame( 'privacy_email_error', $result->get_error_code() );
     222        }
     223
     224        /**
     225         * The function should respect the user locale settings when the site uses the default locale.
     226         *
     227         * @ticket 43985
     228         */
     229        public function test_should_send_user_request_email_in_user_locale() {
     230                delete_option( 'WPLANG' );
     231
     232                $email         = 'export.request.from.user@example.com';
     233                $admin_user_id = $this->factory->user->create(
     234                        array(
     235                                'user_email' => 'admin@local.test',
     236                                'role'       => 'administrator',
     237                        )
     238                );
     239                $user_id       = $this->factory->user->create(
     240                        array(
     241                                'user_email' => $email,
     242                                'locale'     => 'es_ES',
     243                                'role'       => 'author',
     244                        )
     245                );
     246
     247                wp_set_current_user( $admin_user_id );
     248                $request_id = wp_create_user_request( $email, 'export_personal_data' );
     249
     250                $result = wp_send_user_request( $request_id );
     251                $mailer = tests_retrieve_phpmailer_instance();
     252
     253                $this->assertContains( 'Confirma la', $mailer->get_sent()->subject );
     254        }
     255
     256        /**
     257         * The function should respect the user locale settings when the site has a default locale and the administrator
     258         * uses the site default.
     259         *
     260         * @ticket 43985
     261         */
     262        public function test_should_send_user_request_email_in_user_locale_when_site_has_non_default_locale() {
     263                update_option( 'WPLANG', 'es_ES' );
     264                switch_to_locale( 'es_ES' );
     265
     266                $email         = 'remove.request.from.user@example.com';
     267                $admin_user_id = $this->factory->user->create(
     268                        array(
     269                                'user_email' => 'admin@local.test',
     270                                'role'       => 'administrator',
     271                        )
     272                );
     273                $user_id       = $this->factory->user->create(
     274                        array(
     275                                'user_email' => $email,
     276                                'locale'     => 'de_DE',
     277                                'role'       => 'author',
     278                        )
     279                );
     280
     281                wp_set_current_user( $admin_user_id );
     282                $request_id = wp_create_user_request( $email, 'remove_personal_data' );
     283
     284                $result = wp_send_user_request( $request_id );
     285                $mailer = tests_retrieve_phpmailer_instance();
     286
     287                $this->assertContains( 'Aktion bestätigen', $mailer->get_sent()->subject );
     288
     289                restore_current_locale();
     290                delete_option( 'WPLANG' );
     291        }
     292
     293        /**
     294         * The function should respect the user locale settings when the site has a default locale, the administrator
     295         * has a different locale, and the user uses the site's default.
     296         *
     297         * @ticket 43985
     298         */
     299        public function test_should_send_user_request_email_in_user_locale_when_admin_has_different_locale_than_site() {
     300                update_option( 'WPLANG', 'es_ES' );
     301                switch_to_locale( 'es_ES' );
     302
     303                $email         = 'export.request.from.user@example.com';
     304                $admin_user_id = $this->factory->user->create(
     305                        array(
     306                                'user_email' => 'admin@local.test',
     307                                'locale'     => 'de_DE',
     308                                'role'       => 'administrator',
     309                        )
     310                );
     311                $user_id       = $this->factory->user->create(
     312                        array(
     313                                'user_email' => $email,
     314                                'role'       => 'author',
     315                        )
     316                );
     317
     318                wp_set_current_user( $admin_user_id );
     319
     320                $request_id = wp_create_user_request( $email, 'export_personal_data' );
     321
     322                $result = wp_send_user_request( $request_id );
     323                $mailer = tests_retrieve_phpmailer_instance();
     324
     325                $this->assertContains( 'Confirma la', $mailer->get_sent()->subject );
     326
     327                restore_current_locale();
     328                delete_option( 'WPLANG' );
     329        }
     330
     331        /**
     332         * The function should respect the user locale settings when the site has a default locale and both the
     333         * administrator and the user use different locales.
     334         *
     335         * @ticket 43985
     336         */
     337        public function test_should_send_user_request_email_in_user_locale_when_admin_and_site_have_different_locales() {
     338                update_option( 'WPLANG', 'es_ES' );
     339                switch_to_locale( 'es_ES' );
     340
     341                $email         = 'export.request.from.user@example.com';
     342                $admin_user_id = $this->factory->user->create(
     343                        array(
     344                                'user_email' => 'admin@local.test',
     345                                'locale'     => 'de_DE',
     346                                'role'       => 'administrator',
     347                        )
     348                );
     349                $user_id       = $this->factory->user->create(
     350                        array(
     351                                'user_email' => $email,
     352                                'role'       => 'author',
     353                                'locale'     => 'en_US',
     354                        )
     355                );
     356
     357                wp_set_current_user( $admin_user_id );
     358
     359                $request_id = wp_create_user_request( $email, 'export_personal_data' );
     360
     361                $result = wp_send_user_request( $request_id );
     362                $mailer = tests_retrieve_phpmailer_instance();
     363
     364                $this->assertContains( 'Confirm Action', $mailer->get_sent()->subject );
     365
     366                restore_current_locale();
     367                delete_option( 'WPLANG' );
     368        }
     369
     370        /**
     371         * The function should respect the site's locale when the request is for an unregistered user and the
     372         * administrator does not use the site's locale.
     373         *
     374         * @ticket 43985
     375         */
     376        public function test_should_send_user_request_email_in_site_locale() {
     377                delete_option( 'WPLANG' );
     378
     379                $email         = 'erase-user-not-registered@example.com';
     380                $admin_user_id = $this->factory->user->create(
     381                        array(
     382                                'user_email' => 'admin@local.test',
     383                                'role'       => 'administrator',
     384                                'locale'     => 'es_ES',
     385                        )
     386                );
     387
     388                wp_set_current_user( $admin_user_id );
     389                $request_id = wp_create_user_request( $email, 'erase_personal_data' );
     390
     391                $result = wp_send_user_request( $request_id );
     392                $mailer = tests_retrieve_phpmailer_instance();
     393
     394                $this->assertContains( 'Confirm Action', $mailer->get_sent()->subject );
     395        }
     396
     397        /**
     398         * The function should respect the site's locale when it is not the default (en_US), the request is for an
     399         * unregistered user and the administrator does not use the site's locale.
     400         *
     401         * @ticket 43985
     402         */
     403        public function test_should_send_user_request_email_in_site_locale_not_default() {
     404                update_option( 'WPLANG', 'es_ES' );
     405                switch_to_locale( 'es_ES' );
     406
     407                $email         = 'export-user-not-registered@example.com';
     408                $admin_user_id = $this->factory->user->create(
     409                        array(
     410                                'user_email' => 'admin@local.test',
     411                                'role'       => 'administrator',
     412                                'locale'     => 'de_DE',
     413                        )
     414                );
     415
     416                wp_set_current_user( $admin_user_id );
     417                $request_id = wp_create_user_request( $email, 'export_personal_data' );
     418
     419                $result = wp_send_user_request( $request_id );
     420                $mailer = tests_retrieve_phpmailer_instance();
     421
     422                $this->assertContains( 'Confirma la', $mailer->get_sent()->subject );
     423
     424                restore_current_locale();
     425                delete_option( 'WPLANG' );
     426        }
     427
     428}