diff --git a/core/modules/user/src/Form/UserPasswordForm.php b/core/modules/user/src/Form/UserPasswordForm.php index 04f0bf629c5192c02582906e980c639119d53097..b881d6f053ae2defd51c9503b6a6e6eec7059c31 100644 --- a/core/modules/user/src/Form/UserPasswordForm.php +++ b/core/modules/user/src/Form/UserPasswordForm.php @@ -168,11 +168,9 @@ public function validateForm(array &$form, FormStateInterface $form_state) { * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { - $langcode = $this->languageManager->getCurrentLanguage()->getId(); - $account = $form_state->getValue('account'); // Mail one time login URL and instructions using current language. - $mail = _user_mail_notify('password_reset', $account, $langcode); + $mail = _user_mail_notify('password_reset', $account); if (!empty($mail)) { $this->logger('user')->notice('Password reset instructions mailed to %name at %email.', ['%name' => $account->getAccountName(), '%email' => $account->getEmail()]); $this->messenger()->addStatus($this->t('Further instructions have been sent to your email address.')); diff --git a/core/modules/user/tests/src/Functional/UserPasswordResetTest.php b/core/modules/user/tests/src/Functional/UserPasswordResetTest.php index f97bf9ed682a4feee7f1f2c4a344c6ed65045607..07c9abe6aeafaeecb3825e2af0acdd24ed15a0b2 100644 --- a/core/modules/user/tests/src/Functional/UserPasswordResetTest.php +++ b/core/modules/user/tests/src/Functional/UserPasswordResetTest.php @@ -6,6 +6,7 @@ use Drupal\Core\Database\Database; use Drupal\Core\Test\AssertMailTrait; use Drupal\Core\Url; +use Drupal\language\Entity\ConfigurableLanguage; use Drupal\Tests\BrowserTestBase; use Drupal\user\Entity\User; @@ -27,12 +28,19 @@ class UserPasswordResetTest extends BrowserTestBase { */ protected $account; + /** + * Language manager object. + * + * @var \Drupal\language\LanguageManagerInterface + */ + protected $languageManager; + /** * Modules to enable. * * @var array */ - protected static $modules = ['block']; + protected static $modules = ['block', 'language']; /** * {@inheritdoc} @@ -205,6 +213,79 @@ public function testUserPasswordReset() { $this->assertSession()->statusCodeEquals(403); } + /** + * Tests password reset functionality when user has set preferred language. + * + * @dataProvider languagePrefixTestProvider + */ + public function testUserPasswordResetPreferredLanguage($setPreferredLangcode, $activeLangcode, $prefix, $visitingUrl, $expectedResetUrl, $unexpectedResetUrl) { + // Set two new languages. + ConfigurableLanguage::createFromLangcode('fr')->save(); + ConfigurableLanguage::createFromLangcode('zh-hant')->save(); + + $this->languageManager = \Drupal::languageManager(); + + // Set language prefixes. + $config = $this->config('language.negotiation'); + $config->set('url.prefixes', ['en' => '', 'fr' => 'fr', 'zh-hant' => 'zh'])->save(); + $this->rebuildContainer(); + + $this->account->preferred_langcode = $setPreferredLangcode; + $this->account->save(); + $this->assertSame($setPreferredLangcode, $this->account->getPreferredLangcode(FALSE)); + + // Test Default langcode is different from active langcode when visiting different. + if ($setPreferredLangcode !== 'en') { + $this->drupalGet($prefix . '/user/password'); + $this->assertSame($activeLangcode, $this->getSession()->getResponseHeader('Content-language')); + $this->assertSame('en', $this->languageManager->getDefaultLanguage()->getId()); + } + + // Test password reset with language prefixes. + $this->drupalGet($visitingUrl); + $edit = ['name' => $this->account->getAccountName()]; + $this->submitForm($edit, t('Submit')); + $this->assertValidPasswordReset($edit['name']); + + $resetURL = $this->getResetURL(); + $this->assertStringContainsString($expectedResetUrl, $resetURL); + $this->assertStringNotContainsString($unexpectedResetUrl, $resetURL); + } + + /** + * Data provider for testUserPasswordResetPreferredLanguage(). + * + * @return array + */ + public function languagePrefixTestProvider() { + return [ + 'Test language prefix set as \'\', visiting default with preferred language as en' => [ + 'setPreferredLangcode' => 'en', + 'activeLangcode' => 'en', + 'prefix' => '', + 'visitingUrl' => 'user/password', + 'expectedResetUrl' => 'user/reset', + 'unexpectedResetUrl' => 'en/user/reset', + ], + 'Test language prefix set as fr, visiting zh with preferred language as fr' => [ + 'setPreferredLangcode' => 'fr', + 'activeLangcode' => 'fr', + 'prefix' => 'fr', + 'visitingUrl' => 'zh/user/password', + 'expectedResetUrl' => 'fr/user/reset', + 'unexpectedResetUrl' => 'zh/user/reset', + ], + 'Test language prefix set as zh, visiting zh with preferred language as \'\'' => [ + 'setPreferredLangcode' => '', + 'activeLangcode' => 'zh-hant', + 'prefix' => 'zh', + 'visitingUrl' => 'zh/user/password', + 'expectedResetUrl' => 'user/reset', + 'unexpectedResetUrl' => 'zh/user/reset', + ], + ]; + } + /** * Retrieves password reset email and extracts the login link. */