1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
<?php
namespace MediaWiki\Auth;
use MediaWiki\MainConfigNames;
use Wikimedia\Rdbms\IConnectionProvider;
/**
* 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;
/** @var IConnectionProvider */
private $dbProvider;
/**
* @param IConnectionProvider $dbProvider
* @param array $params
* - sendConfirmationEmail: (bool) send an email asking the user to confirm their email
* address after a successful registration
*/
public function __construct( IConnectionProvider $dbProvider, $params = [] ) {
if ( isset( $params['sendConfirmationEmail'] ) ) {
$this->sendConfirmationEmail = (bool)$params['sendConfirmationEmail'];
}
$this->dbProvider = $dbProvider;
}
protected function postInitSetup() {
$this->sendConfirmationEmail ??= $this->config->get( MainConfigNames::EnableEmail )
&& $this->config->get( MainConfigNames::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
$this->dbProvider->getPrimaryDatabase()->onTransactionCommitOrIdle(
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();
}
}
|