MediaWiki  master
ApiClientLogin.php
Go to the documentation of this file.
1 <?php
26 
32 class ApiClientLogin extends ApiBase {
33 
34  public function __construct( ApiMain $main, $action ) {
35  parent::__construct( $main, $action, 'login' );
36  }
37 
38  public function getFinalDescription() {
39  // A bit of a hack to append 'api-help-authmanager-general-usage'
40  $msgs = parent::getFinalDescription();
41  $msgs[] = ApiBase::makeMessage( 'api-help-authmanager-general-usage', $this->getContext(), [
42  $this->getModulePrefix(),
43  $this->getModuleName(),
44  $this->getModulePath(),
45  AuthManager::ACTION_LOGIN,
46  self::needsToken(),
47  ] );
48  return $msgs;
49  }
50 
51  public function execute() {
52  $params = $this->extractRequestParams();
53 
54  $this->requireAtLeastOneParameter( $params, 'continue', 'returnurl' );
55 
56  if ( $params['returnurl'] !== null ) {
57  $bits = wfParseUrl( $params['returnurl'] );
58  if ( !$bits || $bits['scheme'] === '' ) {
59  $encParamName = $this->encodeParamName( 'returnurl' );
60  $this->dieWithError(
61  [ 'apierror-badurl', $encParamName, wfEscapeWikiText( $params['returnurl'] ) ],
62  "badurl_{$encParamName}"
63  );
64  }
65  }
66 
67  $helper = new ApiAuthManagerHelper( $this );
68  $manager = AuthManager::singleton();
69 
70  // Make sure it's possible to log in
71  if ( !$manager->canAuthenticateNow() ) {
72  $this->getResult()->addValue( null, 'clientlogin', $helper->formatAuthenticationResponse(
73  AuthenticationResponse::newFail( $this->msg( 'userlogin-cannot-' . AuthManager::ACTION_LOGIN ) )
74  ) );
75  $helper->logAuthenticationResult( 'login', 'userlogin-cannot-' . AuthManager::ACTION_LOGIN );
76  return;
77  }
78 
79  // Perform the login step
80  if ( $params['continue'] ) {
81  $reqs = $helper->loadAuthenticationRequests( AuthManager::ACTION_LOGIN_CONTINUE );
82  $res = $manager->continueAuthentication( $reqs );
83  } else {
84  $reqs = $helper->loadAuthenticationRequests( AuthManager::ACTION_LOGIN );
85  if ( $params['preservestate'] ) {
86  $req = $helper->getPreservedRequest();
87  if ( $req ) {
88  $reqs[] = $req;
89  }
90  }
91  $res = $manager->beginAuthentication( $reqs, $params['returnurl'] );
92  }
93 
94  // Remove CreateFromLoginAuthenticationRequest from $res->neededRequests.
95  // It's there so a RESTART treated as UI will work right, but showing
96  // it to the API client is just confusing.
98  $res->neededRequests, [ CreateFromLoginAuthenticationRequest::class ]
99  );
100 
101  $this->getResult()->addValue( null, 'clientlogin',
102  $helper->formatAuthenticationResponse( $res ) );
103  $helper->logAuthenticationResult( 'login', $res );
104  }
105 
106  public function isReadMode() {
107  return false;
108  }
109 
110  public function needsToken() {
111  return 'login';
112  }
113 
114  public function getAllowedParams() {
115  return ApiAuthManagerHelper::getStandardParams( AuthManager::ACTION_LOGIN,
116  'requests', 'messageformat', 'mergerequestfields', 'preservestate', 'returnurl', 'continue'
117  );
118  }
119 
120  public function dynamicParameterDocumentation() {
121  return [ 'api-help-authmanagerhelper-additional-params', AuthManager::ACTION_LOGIN ];
122  }
123 
124  protected function getExamplesMessages() {
125  return [
126  'action=clientlogin&username=Example&password=ExamplePassword&'
127  . 'loginreturnurl=http://example.org/&logintoken=123ABC'
128  => 'apihelp-clientlogin-example-login',
129  'action=clientlogin&logincontinue=1&OATHToken=987654&logintoken=123ABC'
130  => 'apihelp-clientlogin-example-login2',
131  ];
132  }
133 
134  public function getHelpUrls() {
135  return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Login';
136  }
137 }
requireAtLeastOneParameter( $params,... $required)
Die if none of a certain set of parameters is set and not false.
Definition: ApiBase.php:953
wfEscapeWikiText( $text)
Escapes the given text so that it may be output using addWikiText() without any linking, formatting, etc.
getResult()
Get the result object.
Definition: ApiBase.php:640
wfParseUrl( $url)
parse_url() work-alike, but non-broken.
Log in to the wiki with AuthManager.
dieWithError( $msg, $code=null, $data=null, $httpCode=null)
Abort execution with an error.
Definition: ApiBase.php:2006
extractRequestParams( $options=[])
Using getAllowedParams(), this function makes an array of the values provided by the user...
Definition: ApiBase.php:761
static makeMessage( $msg, IContextSource $context, array $params=null)
Create a Message from a string or array.
Definition: ApiBase.php:1792
getModulePath()
Get the path to this module.
Definition: ApiBase.php:584
getContext()
Get the base IContextSource object.
This is the main API class, used for both external and internal processing.
Definition: ApiMain.php:42
getModuleName()
Get the name of the module being executed by this instance.
Definition: ApiBase.php:520
static getStandardParams( $action,... $wantedParams)
Fetch the standard parameters this helper recognizes.
__construct(ApiMain $main, $action)
encodeParamName( $paramName)
This method mangles parameter name based on the prefix supplied to the constructor.
Definition: ApiBase.php:739
getModulePrefix()
Get parameter prefix (usually two letters or an empty string).
Definition: ApiBase.php:528
static blacklistAuthenticationRequests(array $reqs, array $blacklist)
Filter out authentication requests by class name.
This abstract class implements many basic API functions, and is the base of all API classes...
Definition: ApiBase.php:42
Helper class for AuthManager-using API modules.