From 42e0b355e2a382f7a96764cb9d04e4d1490377a4 Mon Sep 17 00:00:00 2001 From: suecarmol Date: Tue, 7 Apr 2020 19:13:54 -0500 Subject: [PATCH] Optimize email sending on password reset Improve performance of sending emails when a user resets a password. Bug: T247017 Change-Id: I9edb0e4c8845f7a9082035de66f5965c3f9b762d --- autoload.php | 1 + .../deferred/SendPasswordResetEmailUpdate.php | 64 +++++++++++++++++++ includes/user/PasswordReset.php | 13 +--- 3 files changed, 68 insertions(+), 10 deletions(-) create mode 100644 includes/deferred/SendPasswordResetEmailUpdate.php diff --git a/autoload.php b/autoload.php index b306bf5aac..28d89263c1 100644 --- a/autoload.php +++ b/autoload.php @@ -1366,6 +1366,7 @@ $wgAutoloadLocalClasses = [ 'SearchUpdate' => __DIR__ . '/includes/deferred/SearchUpdate.php', 'SectionProfileCallback' => __DIR__ . '/includes/profiler/SectionProfiler.php', 'SectionProfiler' => __DIR__ . '/includes/profiler/SectionProfiler.php', + 'SendPasswordResetEmailUpdate' => __DIR__ . '/includes/deferred/SendPasswordResetEmailUpdate.php', 'SevenZipStream' => __DIR__ . '/maintenance/7zip.inc', 'ShiConverter' => __DIR__ . '/languages/classes/LanguageShi.php', 'ShortPagesPage' => __DIR__ . '/includes/specials/SpecialShortpages.php', diff --git a/includes/deferred/SendPasswordResetEmailUpdate.php b/includes/deferred/SendPasswordResetEmailUpdate.php new file mode 100644 index 0000000000..710f303cf9 --- /dev/null +++ b/includes/deferred/SendPasswordResetEmailUpdate.php @@ -0,0 +1,64 @@ +authManager = $authManager; + $this->reqs = $reqs; + $this->logContext = $logContext; + } + + public function doUpdate() { + $logger = LoggerFactory::getInstance( 'authentication' ); + foreach ( $this->reqs as $req ) { + // This is adding a new temporary password, not intentionally changing anything + // (even though it might technically invalidate an old temporary password). + $this->authManager->changeAuthenticationData( $req, /* $isAddition */ true ); + $logger->info( + "{requestingUser} did password reset of {targetUser} and an email was sent", + $this->logContext + [ 'targetUser' => $req->username ] + ); + } + } + +} diff --git a/includes/user/PasswordReset.php b/includes/user/PasswordReset.php index a1638ea13e..73e5cbc29f 100644 --- a/includes/user/PasswordReset.php +++ b/includes/user/PasswordReset.php @@ -226,7 +226,6 @@ class PasswordReset implements LoggerAwareInterface { 'requestingUser' => $performingUser->getName(), 'targetUsername' => $username, 'targetEmail' => $email, - 'actualUser' => $firstUser->getName(), ]; if ( !$result->isGood() ) { @@ -237,15 +236,9 @@ class PasswordReset implements LoggerAwareInterface { return $result; } - foreach ( $reqs as $req ) { - // This is adding a new temporary password, not intentionally changing anything - // (even though it might technically invalidate an old temporary password). - $this->authManager->changeAuthenticationData( $req, /* $isAddition */ true ); - } - - $this->logger->info( - "{requestingUser} did password reset of {actualUser}", - $logContext + DeferredUpdates::addUpdate( + new SendPasswordResetEmailUpdate( $this->authManager, $reqs, $logContext ), + DeferredUpdates::POSTSEND ); return StatusValue::newGood(); -- 2.20.1