Skip to content
Permalink
Browse files

Privacy: Ensure the user request email is sent in the requested user'…

…s locale (or the site's default locale if they are not a registered user) when the administrator creating the request uses a different locale.

Props desrosj, Chouby, iandunn, lbenicio, birgire, earnjam, swissspidy, garrett-eclipse.
Merges [43568] to the 4.9 branch.
Fixes #43985.

git-svn-id: https://develop.svn.wordpress.org/branches/4.9@43614 602fd350-edb4-49c9-b593-d223f7449a82
  • Loading branch information...
SergeyBiryukov committed Sep 3, 2018
1 parent 90b39a6 commit 00ab86547f57ebf37460622d2afe6b7d0c1598c6
@@ -2059,7 +2059,7 @@ function wp_privacy_send_personal_data_export_email( $request_id ) {
$request = wp_get_user_request_data( $request_id );
if ( ! $request || 'export_personal_data' !== $request->action_name ) {
return new WP_Error( 'invalid', __( 'Invalid request ID when sending personal data export email.' ) );
return new WP_Error( 'invalid_request', __( 'Invalid request ID when sending personal data export email.' ) );
}
/** This filter is documented in wp-includes/functions.php */
@@ -2119,7 +2119,7 @@ function wp_privacy_send_personal_data_export_email( $request_id ) {
);
if ( ! $mail_success ) {
return new WP_Error( 'error', __( 'Unable to send personal data export email.' ) );
return new WP_Error( 'privacy_email_error', __( 'Unable to send personal data export email.' ) );
}
return true;
@@ -3279,16 +3279,25 @@ function wp_user_request_action_description( $action_name ) {
* @since 4.9.6
*
* @param string $request_id ID of the request created via wp_create_user_request().
* @return WP_Error|bool Will return true/false based on the success of sending the email, or a WP_Error object.
* @return bool|WP_Error True on success, `WP_Error` on failure.
*/
function wp_send_user_request( $request_id ) {
$request_id = absint( $request_id );
$request = wp_get_user_request_data( $request_id );
if ( ! $request ) {
return new WP_Error( 'user_request_error', __( 'Invalid request.' ) );
return new WP_Error( 'invalid_request', __( 'Invalid user request.' ) );
}
// Localize message content for user; fallback to site default for visitors.
if ( ! empty( $request->user_id ) ) {
$locale = get_user_locale( $request->user_id );
} else {
$locale = get_locale();
}
$switched_locale = switch_to_locale( $locale );
$email_data = array(
'request' => $request,
'email' => $request->email,
@@ -3376,7 +3385,17 @@ function wp_send_user_request( $request_id ) {
*/
$subject = apply_filters( 'user_request_action_email_subject', $subject, $email_data['sitename'], $email_data );
return wp_mail( $email_data['email'], $subject, $content );
$email_sent = wp_mail( $email_data['email'], $subject, $content );
if ( $switched_locale ) {
restore_previous_locale();
}
if ( ! $email_sent ) {
return new WP_Error( 'privacy_email_error', __( 'Unable to send personal data export confirmation email.' ) );
}
return true;
}
/**
@@ -3426,7 +3445,7 @@ function wp_validate_user_request_key( $request_id, $key ) {
$request = wp_get_user_request_data( $request_id );
if ( ! $request ) {
return new WP_Error( 'user_request_error', __( 'Invalid request.' ) );
return new WP_Error( 'invalid_request', __( 'Invalid request.' ) );
}
if ( ! in_array( $request->status, array( 'request-pending', 'request-failed' ), true ) ) {
@@ -3513,7 +3532,6 @@ final class WP_User_Request {
*
* @var int
*/
public $user_id = 0;
/**
Binary file not shown.
@@ -1,15 +1,18 @@
# Translation of 4.6.x in German
# This file is distributed under the same license as the 4.6.x package.
# Translation of 4.9.x in German
# This file is distributed under the same license as the 4.9.x package.
msgid ""
msgstr ""
"PO-Revision-Date: 2016-10-25 18:27+0200\n"
"PO-Revision-Date: 2018-08-13 19:19+0300\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Poedit 1.8.10\n"
"Project-Id-Version: 4.6.x\n"
"X-Generator: Poedit 2.1.1\n"
"Project-Id-Version: Development (4.9.x)\n"
"Language: de_DE\n"
"POT-Creation-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"

#. translators: Translate this to the correct language tag for your locale, see
#. https://www.w3.org/International/articles/language-tags/ for reference. Do
@@ -40,3 +43,8 @@ msgstr "."
#: wp-includes/script-loader.php:620
msgid "Update %s now"
msgstr "Jetzt %s aktualisieren"

#. translators: Privacy data request subject. 1: Site name, 2: Name of the action
#: wp-includes/user.php:3445
msgid "[%1$s] Confirm Action: %2$s"
msgstr "[%1$s] Aktion bestätigen: %2$s"
Binary file not shown.
@@ -1,15 +1,18 @@
# Translation of Development (4.4.x) in Spanish (Spain)
# This file is distributed under the same license as the Development (4.4.x) package.
# Translation of Development (4.9.x) in Spanish (Spain)
# This file is distributed under the same license as the Development (4.9.x) package.
msgid ""
msgstr ""
"PO-Revision-Date: 2016-10-25 18:28+0200\n"
"PO-Revision-Date: 2018-08-13 19:19+0300\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Poedit 1.8.10\n"
"Project-Id-Version: Development (4.4.x)\n"
"X-Generator: Poedit 2.1.1\n"
"Project-Id-Version: Development (4.9.x)\n"
"Language: es_ES\n"
"POT-Creation-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"

#. translators: 'rtl' or 'ltr'. This sets the text direction for WordPress.
#: wp-includes/locale.php:201
@@ -36,3 +39,8 @@ msgstr "(Actual: %s)"
msgctxt "menu"
msgid "(Currently set to: %s)"
msgstr "(Actualmente fijado en: %s)"

#. translators: Privacy data request subject. 1: Site name, 2: Name of the action
#: wp-includes/user.php:3445
msgid "[%1$s] Confirm Action: %2$s"
msgstr "[%1$s] Confirma la acción: %2$s"
@@ -39,7 +39,7 @@ class Tests_Privacy_WpPrivacySendPersonalDataExportEmail extends WP_UnitTestCase
*
* @since 4.9.6
*/
function setUp() {
public function setUp() {
parent::setUp();
reset_phpmailer_instance();
}
@@ -49,7 +49,7 @@ function setUp() {
*
* @since 4.9.6
*/
function tearDown() {
public function tearDown() {
reset_phpmailer_instance();
parent::tearDown();
}
@@ -95,12 +95,12 @@ public function test_function_should_error_when_request_id_invalid() {
$request_id = 0;
$email_sent = wp_privacy_send_personal_data_export_email( $request_id );
$this->assertWPError( $email_sent );
$this->assertSame( 'invalid', $email_sent->get_error_code() );
$this->assertSame( 'invalid_request', $email_sent->get_error_code() );
$request_id = PHP_INT_MAX;
$email_sent = wp_privacy_send_personal_data_export_email( $request_id );
$this->assertWPError( $email_sent );
$this->assertSame( 'invalid', $email_sent->get_error_code() );
$this->assertSame( 'invalid_request', $email_sent->get_error_code() );
}
/**
@@ -111,10 +111,9 @@ public function test_function_should_error_when_request_id_invalid() {
public function test_return_wp_error_when_send_fails() {
add_filter( 'wp_mail_from', '__return_empty_string' ); // Cause `wp_mail()` to return false.
$email_sent = wp_privacy_send_personal_data_export_email( self::$request_id );
remove_filter( 'wp_mail_from', '__return_empty_string' );
$this->assertWPError( $email_sent );
$this->assertSame( 'error', $email_sent->get_error_code() );
$this->assertSame( 'privacy_email_error', $email_sent->get_error_code() );
}
/**
@@ -125,7 +124,6 @@ public function test_return_wp_error_when_send_fails() {
public function test_export_expiration_should_be_filterable() {
add_filter( 'wp_privacy_export_expiration', array( $this, 'modify_export_expiration' ) );
wp_privacy_send_personal_data_export_email( self::$request_id );
remove_filter( 'wp_privacy_export_expiration', array( $this, 'modify_export_expiration' ) );
$mailer = tests_retrieve_phpmailer_instance();
$this->assertContains( 'we will automatically delete the file on December 18, 2017,', $mailer->get_sent()->body );
@@ -152,7 +150,6 @@ public function modify_export_expiration( $expiration ) {
public function test_email_content_should_be_filterable() {
add_filter( 'wp_privacy_personal_data_email_content', array( $this, 'modify_email_content' ), 10, 2 );
wp_privacy_send_personal_data_export_email( self::$request_id );
remove_filter( 'wp_privacy_personal_data_email_content', array( $this, 'modify_email_content' ) );
$mailer = tests_retrieve_phpmailer_instance();
$this->assertContains( 'Custom content for request ID: ' . self::$request_id, $mailer->get_sent()->body );

0 comments on commit 00ab865

Please sign in to comment.
You can’t perform that action at this time.