diff options
Diffstat (limited to 'www/wiki/includes/auth/EmailNotificationSecondaryAuthenticationProvider.php')
-rw-r--r-- | www/wiki/includes/auth/EmailNotificationSecondaryAuthenticationProvider.php | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/www/wiki/includes/auth/EmailNotificationSecondaryAuthenticationProvider.php b/www/wiki/includes/auth/EmailNotificationSecondaryAuthenticationProvider.php new file mode 100644 index 00000000..a4855318 --- /dev/null +++ b/www/wiki/includes/auth/EmailNotificationSecondaryAuthenticationProvider.php @@ -0,0 +1,70 @@ +<?php + +namespace MediaWiki\Auth; + +use Config; + +/** + * Handles email notification / email address confirmation for account creation. + * + * Set 'no-email' to true (via AuthManager::setAuthenticationSessionData) to skip this provider. + * Primary providers doing so are expected to take care of email address confirmation. + */ +class EmailNotificationSecondaryAuthenticationProvider + extends AbstractSecondaryAuthenticationProvider +{ + /** @var bool */ + protected $sendConfirmationEmail; + + /** + * @param array $params + * - sendConfirmationEmail: (bool) send an email asking the user to confirm their email + * address after a successful registration + */ + public function __construct( $params = [] ) { + if ( isset( $params['sendConfirmationEmail'] ) ) { + $this->sendConfirmationEmail = (bool)$params['sendConfirmationEmail']; + } + } + + public function setConfig( Config $config ) { + parent::setConfig( $config ); + + if ( $this->sendConfirmationEmail === null ) { + $this->sendConfirmationEmail = $this->config->get( 'EnableEmail' ) + && $this->config->get( 'EmailAuthentication' ); + } + } + + public function getAuthenticationRequests( $action, array $options ) { + return []; + } + + public function beginSecondaryAuthentication( $user, array $reqs ) { + return AuthenticationResponse::newAbstain(); + } + + public function beginSecondaryAccountCreation( $user, $creator, array $reqs ) { + if ( + $this->sendConfirmationEmail + && $user->getEmail() + && !$this->manager->getAuthenticationSessionData( 'no-email' ) + ) { + // TODO show 'confirmemail_oncreate'/'confirmemail_sendfailed' message + wfGetDB( DB_MASTER )->onTransactionIdle( + function () use ( $user ) { + $user = $user->getInstanceForUpdate(); + $status = $user->sendConfirmationMail(); + $user->saveSettings(); + if ( !$status->isGood() ) { + $this->logger->warning( 'Could not send confirmation email: ' . + $status->getWikiText( false, false, 'en' ) ); + } + }, + __METHOD__ + ); + } + + return AuthenticationResponse::newPass(); + } +} |