MediaWiki  master
ConfirmLinkSecondaryAuthenticationProvider.php
Go to the documentation of this file.
1 <?php
2 
3 namespace MediaWiki\Auth;
4 
6 
19 
20  public function getAuthenticationRequests( $action, array $options ) {
21  return [];
22  }
23 
24  public function beginSecondaryAuthentication( $user, array $reqs ) {
25  return $this->beginLinkAttempt( $user, AuthManager::AUTHN_STATE );
26  }
27 
28  public function continueSecondaryAuthentication( $user, array $reqs ) {
29  return $this->continueLinkAttempt( $user, AuthManager::AUTHN_STATE, $reqs );
30  }
31 
32  public function beginSecondaryAccountCreation( $user, $creator, array $reqs ) {
34  }
35 
36  public function continueSecondaryAccountCreation( $user, $creator, array $reqs ) {
37  return $this->continueLinkAttempt( $user, AuthManager::ACCOUNT_CREATION_STATE, $reqs );
38  }
39 
46  protected function beginLinkAttempt( $user, $key ) {
47  $session = $this->manager->getRequest()->getSession();
48  $state = $session->getSecret( $key );
49  if ( !is_array( $state ) ) {
51  }
52 
53  $maybeLink = array_filter( $state['maybeLink'], function ( $req ) use ( $user ) {
54  if ( !$req->action ) {
55  $req->action = AuthManager::ACTION_CHANGE;
56  }
57  $req->username = $user->getName();
58  return $this->manager->allowsAuthenticationDataChange( $req )->isGood();
59  } );
60  if ( !$maybeLink ) {
62  }
63 
64  $req = new ConfirmLinkAuthenticationRequest( $maybeLink );
66  [ $req ],
67  wfMessage( 'authprovider-confirmlink-message' ),
68  'warning'
69  );
70  }
71 
79  protected function continueLinkAttempt( $user, $key, array $reqs ) {
80  $req = ButtonAuthenticationRequest::getRequestByName( $reqs, 'linkOk' );
81  if ( $req ) {
83  }
84 
85  $req = AuthenticationRequest::getRequestByClass( $reqs, ConfirmLinkAuthenticationRequest::class );
86  if ( !$req ) {
87  // WTF? Retry.
88  return $this->beginLinkAttempt( $user, $key );
89  }
90 
91  $session = $this->manager->getRequest()->getSession();
92  $state = $session->getSecret( $key );
93  if ( !is_array( $state ) ) {
95  }
96 
97  $maybeLink = [];
98  foreach ( $state['maybeLink'] as $linkReq ) {
99  $maybeLink[$linkReq->getUniqueId()] = $linkReq;
100  }
101  if ( !$maybeLink ) {
103  }
104 
105  $state['maybeLink'] = [];
106  $session->setSecret( $key, $state );
107 
108  $statuses = [];
109  $anyFailed = false;
110  foreach ( $req->confirmedLinkIDs as $id ) {
111  if ( isset( $maybeLink[$id] ) ) {
112  $req = $maybeLink[$id];
113  $req->username = $user->getName();
114  if ( !$req->action ) {
115  // Make sure the action is set, but don't override it if
116  // the provider filled it in.
117  $req->action = AuthManager::ACTION_CHANGE;
118  }
119  $status = $this->manager->allowsAuthenticationDataChange( $req );
120  $statuses[] = [ $req, $status ];
121  if ( $status->isGood() ) {
122  // We're not changing credentials, just adding a new link
123  // to an already-known user.
124  $this->manager->changeAuthenticationData( $req, /* $isAddition */ true );
125  } else {
126  $anyFailed = true;
127  }
128  }
129  }
130  if ( !$anyFailed ) {
132  }
133 
134  $combinedStatus = \MediaWiki\Status\Status::newGood();
135  foreach ( $statuses as [ $req, $status ] ) {
136  $descriptionInfo = $req->describeCredentials();
137  $description = wfMessage(
138  'authprovider-confirmlink-option',
139  $descriptionInfo['provider']->text(), $descriptionInfo['account']->text()
140  )->text();
141  if ( $status->isGood() ) {
142  $combinedStatus->error( wfMessage( 'authprovider-confirmlink-success-line', $description ) );
143  } else {
144  $combinedStatus->error( wfMessage(
145  'authprovider-confirmlink-failed-line', $description, $status->getMessage()->text()
146  ) );
147  }
148  }
150  [
152  'linkOk', wfMessage( 'ok' ), wfMessage( 'authprovider-confirmlink-ok-help' )
153  )
154  ],
155  $combinedStatus->getMessage( 'authprovider-confirmlink-failed' ),
156  'error'
157  );
158  }
159 }
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
A base class that implements some of the boilerplate for a SecondaryAuthenticationProvider.
const ACTION_CHANGE
Change a user's credentials.
static getRequestByClass(array $reqs, $class, $allowSubclasses=false)
Select a request by class name.
static newUI(array $reqs, Message $msg, $msgtype='warning')
This is an authentication request that just implements a simple button.
static getRequestByName(array $reqs, $name)
Fetch a ButtonAuthenticationRequest or subclass by name.
continueSecondaryAccountCreation( $user, $creator, array $reqs)
Continue an authentication flow.User being created (has been added to the database)....
beginSecondaryAuthentication( $user, array $reqs)
Start an authentication flow.
continueSecondaryAuthentication( $user, array $reqs)
Continue an authentication flow.User being authenticated. This may become a "UserValue" in the future...
getAuthenticationRequests( $action, array $options)
Return the applicable list of AuthenticationRequests.
continueLinkAttempt( $user, $key, array $reqs)
Continue the link attempt.
beginSecondaryAccountCreation( $user, $creator, array $reqs)
Start an account creation flow.
internal since 1.36
Definition: User.php:98
static newGood( $value=null)
Factory function for good results.
Definition: StatusValue.php:85