3 use MediaWiki\Auth\AuthenticationRequest
;
4 use MediaWiki\Auth\AuthenticationResponse
;
5 use MediaWiki\Auth\AuthManager
;
8 * Links/unlinks external accounts to the current user.
10 * To interact with this page, account providers need to register themselves with AuthManager.
12 class SpecialLinkAccounts
extends AuthManagerSpecialPage
{
13 protected static $allowedActions = [
14 AuthManager
::ACTION_LINK
, AuthManager
::ACTION_LINK_CONTINUE
,
17 public function __construct() {
18 parent
::__construct( 'LinkAccounts' );
21 protected function getGroupName() {
25 public function isListed() {
26 return AuthManager
::singleton()->canLinkAccounts();
29 protected function getRequestBlacklist() {
30 return $this->getConfig()->get( 'ChangeCredentialsBlacklist' );
34 * @param null|string $subPage
36 * @throws PermissionsError
38 public function execute( $subPage ) {
40 $this->loadAuth( $subPage );
42 if ( !$this->isActionAllowed( $this->authAction
) ) {
43 if ( $this->authAction
=== AuthManager
::ACTION_LINK
) {
44 // looks like no linking provider is installed or willing to take this user
45 $titleMessage = wfMessage( 'cannotlink-no-provider-title' );
46 $errorMessage = wfMessage( 'cannotlink-no-provider' );
47 throw new ErrorPageError( $titleMessage, $errorMessage );
49 // user probably back-button-navigated into an auth session that no longer exists
50 // FIXME would be nice to show a message
51 $this->getOutput()->redirect( $this->getPageTitle()->getFullURL( '', false,
57 $this->outputHeader();
59 $status = $this->trySubmit();
61 if ( $status === false ||
!$status->isOK() ) {
62 $this->displayForm( $status );
66 $response = $status->getValue();
68 switch ( $response->status
) {
69 case AuthenticationResponse
::PASS
:
72 case AuthenticationResponse
::FAIL
:
73 $this->loadAuth( '', AuthManager
::ACTION_LINK
, true );
74 $this->displayForm( StatusValue
::newFatal( $response->message
) );
76 case AuthenticationResponse
::REDIRECT
:
77 $this->getOutput()->redirect( $response->redirectTarget
);
79 case AuthenticationResponse
::UI
:
80 $this->authAction
= AuthManager
::ACTION_LINK_CONTINUE
;
81 $this->authRequests
= $response->neededRequests
;
82 $this->displayForm( StatusValue
::newFatal( $response->message
) );
85 throw new LogicException( 'invalid AuthenticationResponse' );
89 protected function getDefaultAction( $subPage ) {
90 return AuthManager
::ACTION_LINK
;
94 * @param AuthenticationRequest[] $requests
95 * @param string $action AuthManager action name, should be ACTION_LINK or ACTION_LINK_CONTINUE
98 protected function getAuthForm( array $requests, $action ) {
99 $form = parent
::getAuthForm( $requests, $action );
100 $form->setSubmitTextMsg( 'linkaccounts-submit' );
105 * Show a success message.
107 protected function success() {
108 $this->loadAuth( '', AuthManager
::ACTION_LINK
, true );
109 $this->displayForm( StatusValue
::newFatal( $this->msg( 'linkaccounts-success-text' ) ) );