MediaWiki master
ConfirmLinkSecondaryAuthenticationProvider.php
Go to the documentation of this file.
1<?php
2
3namespace 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.AuthenticationResponse Expected responses:PASS: The user creation is ...
continueSecondaryAuthentication( $user, array $reqs)
Continue an authentication flow.AuthenticationResponse Expected responses:PASS: The user is authentic...
getAuthenticationRequests( $action, array $options)
Return the applicable list of AuthenticationRequests.
beginSecondaryAccountCreation( $user, $creator, array $reqs)
Start an account creation flow.
internal since 1.36
Definition User.php:93