]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - includes/auth/EmailNotificationSecondaryAuthenticationProvider.php
MediaWiki 1.30.2-scripts2
[autoinstalls/mediawiki.git] / includes / auth / EmailNotificationSecondaryAuthenticationProvider.php
1 <?php
2
3 namespace MediaWiki\Auth;
4
5 use Config;
6
7 /**
8  * Handles email notification / email address confirmation for account creation.
9  *
10  * Set 'no-email' to true (via AuthManager::setAuthenticationSessionData) to skip this provider.
11  * Primary providers doing so are expected to take care of email address confirmation.
12  */
13 class EmailNotificationSecondaryAuthenticationProvider
14         extends AbstractSecondaryAuthenticationProvider
15 {
16         /** @var bool */
17         protected $sendConfirmationEmail;
18
19         /**
20          * @param array $params
21          *  - sendConfirmationEmail: (bool) send an email asking the user to confirm their email
22          *    address after a successful registration
23          */
24         public function __construct( $params = [] ) {
25                 if ( isset( $params['sendConfirmationEmail'] ) ) {
26                         $this->sendConfirmationEmail = (bool)$params['sendConfirmationEmail'];
27                 }
28         }
29
30         public function setConfig( Config $config ) {
31                 parent::setConfig( $config );
32
33                 if ( $this->sendConfirmationEmail === null ) {
34                         $this->sendConfirmationEmail = $this->config->get( 'EnableEmail' )
35                                 && $this->config->get( 'EmailAuthentication' );
36                 }
37         }
38
39         public function getAuthenticationRequests( $action, array $options ) {
40                 return [];
41         }
42
43         public function beginSecondaryAuthentication( $user, array $reqs ) {
44                 return AuthenticationResponse::newAbstain();
45         }
46
47         public function beginSecondaryAccountCreation( $user, $creator, array $reqs ) {
48                 if (
49                         $this->sendConfirmationEmail
50                         && $user->getEmail()
51                         && !$this->manager->getAuthenticationSessionData( 'no-email' )
52                 ) {
53                         // TODO show 'confirmemail_oncreate'/'confirmemail_sendfailed' message
54                         wfGetDB( DB_MASTER )->onTransactionIdle(
55                                 function () use ( $user ) {
56                                         $user = $user->getInstanceForUpdate();
57                                         $status = $user->sendConfirmationMail();
58                                         $user->saveSettings();
59                                         if ( !$status->isGood() ) {
60                                                 $this->logger->warning( 'Could not send confirmation email: ' .
61                                                         $status->getWikiText( false, false, 'en' ) );
62                                         }
63                                 },
64                                 __METHOD__
65                         );
66                 }
67
68                 return AuthenticationResponse::newPass();
69         }
70 }