From: suecarmol Date: Wed, 8 Apr 2020 00:13:54 +0000 (-0500) Subject: Optimize email sending on password reset X-Git-Tag: 1.34.2~18 X-Git-Url: http://git.cyclocoop.org/?p=lhc%2Fweb%2Fwiklou.git;a=commitdiff_plain;h=d07521a0ab71ec6c0a23adab0ead28cea2af44f4 Optimize email sending on password reset Improve performance of sending emails when a user resets a password. Bug: T247017 Change-Id: I9edb0e4c8845f7a9082035de66f5965c3f9b762d --- diff --git a/autoload.php b/autoload.php index b2147a50a0..0a95e7fb56 100644 --- a/autoload.php +++ b/autoload.php @@ -1309,6 +1309,7 @@ $wgAutoloadLocalClasses = [ 'SearchUpdate' => __DIR__ . '/includes/deferred/SearchUpdate.php', 'SectionProfileCallback' => __DIR__ . '/includes/profiler/SectionProfileCallback.php', 'SectionProfiler' => __DIR__ . '/includes/profiler/SectionProfiler.php', + 'SendPasswordResetEmailUpdate' => __DIR__ . '/includes/deferred/SendPasswordResetEmailUpdate.php', 'SerializedValueContainer' => __DIR__ . '/includes/libs/objectcache/serialized/SerializedValueContainer.php', 'SevenZipStream' => __DIR__ . '/maintenance/includes/SevenZipStream.php', 'ShiConverter' => __DIR__ . '/languages/classes/LanguageShi.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 25543a6caa..5491b6c98f 100644 --- a/includes/user/PasswordReset.php +++ b/includes/user/PasswordReset.php @@ -277,7 +277,6 @@ class PasswordReset implements LoggerAwareInterface { 'requestingUser' => $performingUser->getName(), 'targetUsername' => $username, 'targetEmail' => $email, - 'actualUser' => $firstUser->getName(), ]; if ( !$result->isGood() ) { @@ -288,15 +287,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(); diff --git a/tests/phpunit/includes/user/PasswordResetTest.php b/tests/phpunit/includes/user/PasswordResetTest.php index 7acaa0651e..351ef540bd 100644 --- a/tests/phpunit/includes/user/PasswordResetTest.php +++ b/tests/phpunit/includes/user/PasswordResetTest.php @@ -224,6 +224,7 @@ class PasswordResetTest extends MediaWikiTestCase { * @param string|null $username * @param string|null $email * @param User[] $usersWithEmail + * @covers SendPasswordResetEmailUpdate */ public function testExecute( $expectedError, @@ -584,6 +585,8 @@ class PasswordResetTest extends MediaWikiTestCase { ? Status::newGood( $value ) : Status::newFatal( 'rejected by test mock' ); } ); + // changeAuthenticationData is executed in the deferred update class + // SendPasswordResetEmailUpdate $authManager->expects( $this->exactly( $numUsersToAuth ) ) ->method( 'changeAuthenticationData' );