wiki.techinc.nl/includes/specials/SpecialLinkAccounts.php
Umherirrender 29222f11aa Inject AuthManager into SpecialPage and use it
The AuthManager service is only used in one method call in the
SpecialPage class, so make it optional and provide it
when needed with a setter/getter.
Use the getter also in some sub classes which needs an
AuthManager as well.

Bug: T259960
Change-Id: Ib0cbdb719d2a748622d843824b73ebb4c29fab89
2020-11-20 18:18:36 +00:00

115 lines
3.2 KiB
PHP

<?php
use MediaWiki\Auth\AuthenticationRequest;
use MediaWiki\Auth\AuthenticationResponse;
use MediaWiki\Auth\AuthManager;
/**
* Links/unlinks external accounts to the current user.
*
* To interact with this page, account providers need to register themselves with AuthManager.
*/
class SpecialLinkAccounts extends AuthManagerSpecialPage {
protected static $allowedActions = [
AuthManager::ACTION_LINK, AuthManager::ACTION_LINK_CONTINUE,
];
/**
* @param AuthManager $authManager
*/
public function __construct( AuthManager $authManager ) {
parent::__construct( 'LinkAccounts' );
$this->setAuthManager( $authManager );
}
protected function getGroupName() {
return 'users';
}
public function isListed() {
return $this->getAuthManager()->canLinkAccounts();
}
protected function getRequestBlacklist() {
return $this->getConfig()->get( 'ChangeCredentialsBlacklist' );
}
/**
* @param null|string $subPage
* @throws ErrorPageError
* @throws LogicException
*/
public function execute( $subPage ) {
$this->setHeaders();
$this->loadAuth( $subPage );
if ( !$this->isActionAllowed( $this->authAction ) ) {
if ( $this->authAction === AuthManager::ACTION_LINK ) {
// looks like no linking provider is installed or willing to take this user
$titleMessage = $this->msg( 'cannotlink-no-provider-title' );
$errorMessage = $this->msg( 'cannotlink-no-provider' );
throw new ErrorPageError( $titleMessage, $errorMessage );
} else {
// user probably back-button-navigated into an auth session that no longer exists
// FIXME would be nice to show a message
$this->getOutput()->redirect( $this->getPageTitle()->getFullURL( '', false,
PROTO_HTTPS ) );
return;
}
}
$this->outputHeader();
$status = $this->trySubmit();
if ( $status === false || !$status->isOK() ) {
$this->displayForm( $status );
return;
}
$response = $status->getValue();
switch ( $response->status ) {
case AuthenticationResponse::PASS:
$this->success();
break;
case AuthenticationResponse::FAIL:
$this->loadAuth( '', AuthManager::ACTION_LINK, true );
$this->displayForm( StatusValue::newFatal( $response->message ) );
break;
case AuthenticationResponse::REDIRECT:
$this->getOutput()->redirect( $response->redirectTarget );
break;
case AuthenticationResponse::UI:
$this->authAction = AuthManager::ACTION_LINK_CONTINUE;
$this->authRequests = $response->neededRequests;
$this->displayForm( StatusValue::newFatal( $response->message ) );
break;
default:
throw new LogicException( 'invalid AuthenticationResponse' );
}
}
protected function getDefaultAction( $subPage ) {
return AuthManager::ACTION_LINK;
}
/**
* @param AuthenticationRequest[] $requests
* @param string $action AuthManager action name, should be ACTION_LINK or ACTION_LINK_CONTINUE
* @return HTMLForm
*/
protected function getAuthForm( array $requests, $action ) {
$form = parent::getAuthForm( $requests, $action );
$form->setSubmitTextMsg( 'linkaccounts-submit' );
return $form;
}
/**
* Show a success message.
*/
protected function success() {
$this->loadAuth( '', AuthManager::ACTION_LINK, true );
$this->displayForm( StatusValue::newFatal( $this->msg( 'linkaccounts-success-text' ) ) );
}
}