WordPress.org

Make WordPress Core

Ticket #43985: 43985.8.diff

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