X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fuser%2FPasswordReset.php;h=530580d469f4d360d1fea0b34b269ce74e7c7117;hb=fba48c6dae69b7163580d936095b7dd16c9b3644;hp=bc87cd03dd781e11dbffbe63cd594c3a37510e94;hpb=bbb705a0b1465725cadccb6da70c1d057b6d1885;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/user/PasswordReset.php b/includes/user/PasswordReset.php index bc87cd03dd..530580d469 100644 --- a/includes/user/PasswordReset.php +++ b/includes/user/PasswordReset.php @@ -22,6 +22,9 @@ use MediaWiki\Auth\AuthManager; use MediaWiki\Auth\TemporaryPasswordAuthenticationRequest; +use Psr\Log\LoggerAwareInterface; +use Psr\Log\LoggerInterface; +use MediaWiki\Logger\LoggerFactory; /** * Helper class for the password reset functionality shared by the web UI and the API. @@ -30,13 +33,16 @@ use MediaWiki\Auth\TemporaryPasswordAuthenticationRequest; * EmailNotificationSecondaryAuthenticationProvider (or something providing equivalent * functionality) to be enabled. */ -class PasswordReset { +class PasswordReset implements LoggerAwareInterface { /** @var Config */ protected $config; /** @var AuthManager */ protected $authManager; + /** @var LoggerInterface */ + protected $logger; + /** * In-process cache for isAllowed lookups, by username. Contains pairs of StatusValue objects * (for false and true value of $displayPassword, respectively). @@ -48,6 +54,17 @@ class PasswordReset { $this->config = $config; $this->authManager = $authManager; $this->permissionCache = new HashBagOStuff( [ 'maxKeys' => 1 ] ); + $this->logger = LoggerFactory::getInstance( 'authentication' ); + } + + /** + * Set the logger instance to use. + * + * @param LoggerInterface $logger + * @since 1.29 + */ + public function setLogger( LoggerInterface $logger ) { + $this->logger = $logger; } /** @@ -134,12 +151,14 @@ class PasswordReset { if ( $resetRoutes['username'] && $username ) { $method = 'username'; $users = [ User::newFromName( $username ) ]; + $email = null; } elseif ( $resetRoutes['email'] && $email ) { if ( !Sanitizer::validateEmail( $email ) ) { return StatusValue::newFatal( 'passwordreset-invalidemail' ); } $method = 'email'; $users = $this->getUsersByEmail( $email ); + $username = null; } else { // The user didn't supply any data return StatusValue::newFatal( 'passwordreset-nodata' ); @@ -214,7 +233,20 @@ class PasswordReset { } } + $logContext = [ + 'requestingIp' => $ip, + 'requestingUser' => $performingUser->getName(), + 'targetUsername' => $username, + 'targetEmail' => $email, + 'actualUser' => $firstUser->getName(), + 'capture' => $displayPassword, + ]; + if ( !$result->isGood() ) { + $this->logger->info( + "{requestingUser} attempted password reset of {actualUser} but failed", + $logContext + [ 'errors' => $result->getErrors() ] + ); return $result; } @@ -227,6 +259,20 @@ class PasswordReset { } } + if ( $displayPassword ) { + // The password capture thing is scary, so log + // at a higher warning level. + $this->logger->warning( + "{requestingUser} did password reset of {actualUser} with password capturing!", + $logContext + ); + } else { + $this->logger->info( + "{requestingUser} did password reset of {actualUser}", + $logContext + ); + } + return StatusValue::newGood( $passwords ); } @@ -236,7 +282,7 @@ class PasswordReset { * @throws MWException On unexpected database errors */ protected function getUsersByEmail( $email ) { - $res = wfGetDB( DB_SLAVE )->select( + $res = wfGetDB( DB_REPLICA )->select( 'user', User::selectFields(), [ 'user_email' => $email ],