Special:Upload should not crash on failing previews
[mediawiki.git] / includes / specials / SpecialLinkAccounts.php
blobda10b90b91add1e7668ae1261004b2463a90485e
1 <?php
3 use MediaWiki\Auth\AuthenticationRequest;
4 use MediaWiki\Auth\AuthenticationResponse;
5 use MediaWiki\Auth\AuthManager;
7 /**
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() {
22 return 'users';
25 public function isListed() {
26 return AuthManager::singleton()->canLinkAccounts();
29 protected function getRequestBlacklist() {
30 return $this->getConfig()->get( 'ChangeCredentialsBlacklist' );
33 /**
34 * @param null|string $subPage
35 * @throws MWException
36 * @throws PermissionsError
38 public function execute( $subPage ) {
39 $this->setHeaders();
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 );
48 } else {
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,
52 PROTO_HTTPS ) );
53 return;
57 $this->outputHeader();
59 $status = $this->trySubmit();
61 if ( $status === false || !$status->isOK() ) {
62 $this->displayForm( $status );
63 return;
66 $response = $status->getValue();
68 switch ( $response->status ) {
69 case AuthenticationResponse::PASS:
70 $this->success();
71 break;
72 case AuthenticationResponse::FAIL:
73 $this->loadAuth( '', AuthManager::ACTION_LINK, true );
74 $this->displayForm( StatusValue::newFatal( $response->message ) );
75 break;
76 case AuthenticationResponse::REDIRECT:
77 $this->getOutput()->redirect( $response->redirectTarget );
78 break;
79 case AuthenticationResponse::UI:
80 $this->authAction = AuthManager::ACTION_LINK_CONTINUE;
81 $this->authRequests = $response->neededRequests;
82 $this->displayForm( StatusValue::newFatal( $response->message ) );
83 break;
84 default:
85 throw new LogicException( 'invalid AuthenticationResponse' );
89 protected function getDefaultAction( $subPage ) {
90 return AuthManager::ACTION_LINK;
93 /**
94 * @param AuthenticationRequest[] $requests
95 * @param string $action AuthManager action name, should be ACTION_LINK or ACTION_LINK_CONTINUE
96 * @return HTMLForm
98 protected function getAuthForm( array $requests, $action ) {
99 $form = parent::getAuthForm( $requests, $action );
100 $form->setSubmitTextMsg( 'linkaccounts-submit' );
101 return $form;
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' ) ) );