private function getTokenTypes() { // If we're in a mode that breaks the same-origin policy, no tokens can // be obtained if ($this->lacksSameOriginSecurity()) { return []; } static $types = null; if ($types) { return $types; } $types = ['patrol' => ['ApiQueryRecentChanges', 'getPatrolToken']]; $names = ['edit', 'delete', 'protect', 'move', 'block', 'unblock', 'email', 'import', 'watch', 'options']; foreach ($names as $name) { $types[$name] = ['ApiQueryInfo', 'get' . ucfirst($name) . 'Token']; } Hooks::run('ApiTokensGetTokenTypes', [&$types]); // For forwards-compat, copy any token types from ApiQueryTokens that // we don't already have something for. $user = $this->getUser(); $request = $this->getRequest(); foreach (ApiQueryTokens::getTokenTypeSalts() as $name => $salt) { if (!isset($types[$name])) { $types[$name] = function () use($salt, $user, $request) { return ApiQueryTokens::getToken($user, $request->getSession(), $salt)->toString(); }; } } ksort($types); return $types; }
/** * Validate the supplied token. * * @since 1.24 * @param string $token Supplied token * @param array $params All supplied parameters for the module * @return bool * @throws MWException */ public final function validateToken($token, array $params) { $tokenType = $this->needsToken(); $salts = ApiQueryTokens::getTokenTypeSalts(); if (!isset($salts[$tokenType])) { throw new MWException("Module '{$this->getModuleName()}' tried to use token type '{$tokenType}' " . 'without registering it'); } if ($this->getUser()->matchEditToken($token, $salts[$tokenType], $this->getRequest())) { return true; } $webUiSalt = $this->getWebUITokenSalt($params); if ($webUiSalt !== null && $this->getUser()->matchEditToken($token, $webUiSalt, $this->getRequest())) { return true; } return false; }
public function getAllowedParams() { return array('type' => array(ApiBase::PARAM_TYPE => array_keys(ApiQueryTokens::getTokenTypeSalts()), ApiBase::PARAM_REQUIRED => true), 'token' => array(ApiBase::PARAM_TYPE => 'string', ApiBase::PARAM_REQUIRED => true), 'maxtokenage' => array(ApiBase::PARAM_TYPE => 'integer')); }