diff options
Diffstat (limited to 'includes/api/ApiQueryInfo.php')
-rw-r--r-- | includes/api/ApiQueryInfo.php | 122 |
1 files changed, 65 insertions, 57 deletions
diff --git a/includes/api/ApiQueryInfo.php b/includes/api/ApiQueryInfo.php index d7037e3a..66178d4f 100644 --- a/includes/api/ApiQueryInfo.php +++ b/includes/api/ApiQueryInfo.php @@ -42,12 +42,14 @@ class ApiQueryInfo extends ApiQueryBase { private $pageRestrictions, $pageIsRedir, $pageIsNew, $pageTouched, $pageLatest, $pageLength; - private $protections, $watched, $watchers, $notificationtimestamps, + private $protections, $restrictionTypes, $watched, $watchers, $notificationtimestamps, $talkids, $subjectids, $displaytitles; private $showZeroWatchers = false; private $tokenFunctions; + private $countTestedActions = 0; + public function __construct( ApiQuery $query, $moduleName ) { parent::__construct( $query, $moduleName, 'in' ); } @@ -58,21 +60,21 @@ class ApiQueryInfo extends ApiQueryBase { */ public function requestExtraData( $pageSet ) { $pageSet->requestField( 'page_restrictions' ); - // when resolving redirects, no page will have this field - if ( !$pageSet->isResolvingRedirects() ) { - $pageSet->requestField( 'page_is_redirect' ); - } + // If the pageset is resolving redirects we won't get page_is_redirect. + // But we can't know for sure until the pageset is executed (revids may + // turn it off), so request it unconditionally. + $pageSet->requestField( 'page_is_redirect' ); $pageSet->requestField( 'page_is_new' ); $config = $this->getConfig(); - if ( !$config->get( 'DisableCounters' ) ) { - $pageSet->requestField( 'page_counter' ); - } $pageSet->requestField( 'page_touched' ); $pageSet->requestField( 'page_latest' ); $pageSet->requestField( 'page_len' ); if ( $config->get( 'ContentHandlerUseDB' ) ) { $pageSet->requestField( 'page_content_model' ); } + if ( $config->get( 'PageLanguageUseDB' ) ) { + $pageSet->requestField( 'page_lang' ); + } } /** @@ -88,8 +90,9 @@ class ApiQueryInfo extends ApiQueryBase { return $this->tokenFunctions; } - // If we're in JSON callback mode, no tokens can be obtained - if ( !is_null( $this->getMain()->getRequest()->getVal( 'callback' ) ) ) { + // If we're in a mode that breaks the same-origin policy, no tokens can + // be obtained + if ( $this->lacksSameOriginSecurity() ) { return array(); } @@ -104,7 +107,7 @@ class ApiQueryInfo extends ApiQueryBase { 'import' => array( 'ApiQueryInfo', 'getImportToken' ), 'watch' => array( 'ApiQueryInfo', 'getWatchToken' ), ); - wfRunHooks( 'APIQueryInfoTokens', array( &$this->tokenFunctions ) ); + Hooks::run( 'APIQueryInfoTokens', array( &$this->tokenFunctions ) ); return $this->tokenFunctions; } @@ -328,9 +331,6 @@ class ApiQueryInfo extends ApiQueryBase { : array(); $this->pageIsNew = $pageSet->getCustomField( 'page_is_new' ); - if ( !$this->getConfig()->get( 'DisableCounters' ) ) { - $this->pageCounter = $pageSet->getCustomField( 'page_counter' ); - } $this->pageTouched = $pageSet->getCustomField( 'page_touched' ); $this->pageLatest = $pageSet->getCustomField( 'page_latest' ); $this->pageLength = $pageSet->getCustomField( 'page_len' ); @@ -360,7 +360,7 @@ class ApiQueryInfo extends ApiQueryBase { /** @var $title Title */ foreach ( $this->everything as $pageid => $title ) { $pageInfo = $this->extractPageInfo( $pageid, $title ); - $fit = $result->addValue( array( + $fit = $pageInfo !== null && $result->addValue( array( 'query', 'pages' ), $pageid, $pageInfo ); @@ -377,7 +377,7 @@ class ApiQueryInfo extends ApiQueryBase { * Get a result array with information about a title * @param int $pageid Page ID (negative for missing titles) * @param Title $title - * @return array + * @return array|null */ private function extractPageInfo( $pageid, $title ) { $pageInfo = array(); @@ -392,16 +392,13 @@ class ApiQueryInfo extends ApiQueryBase { if ( $titleExists ) { $pageInfo['touched'] = wfTimestamp( TS_ISO_8601, $this->pageTouched[$pageid] ); $pageInfo['lastrevid'] = intval( $this->pageLatest[$pageid] ); - $pageInfo['counter'] = $this->getConfig()->get( 'DisableCounters' ) - ? '' - : intval( $this->pageCounter[$pageid] ); $pageInfo['length'] = intval( $this->pageLength[$pageid] ); if ( isset( $this->pageIsRedir[$pageid] ) && $this->pageIsRedir[$pageid] ) { - $pageInfo['redirect'] = ''; + $pageInfo['redirect'] = true; } if ( $this->pageIsNew[$pageid] ) { - $pageInfo['new'] = ''; + $pageInfo['new'] = true; } } @@ -424,11 +421,18 @@ class ApiQueryInfo extends ApiQueryBase { $pageInfo['protection'] = $this->protections[$ns][$dbkey]; } - $this->getResult()->setIndexedTagName( $pageInfo['protection'], 'pr' ); + ApiResult::setIndexedTagName( $pageInfo['protection'], 'pr' ); + + $pageInfo['restrictiontypes'] = array(); + if ( isset( $this->restrictionTypes[$ns][$dbkey] ) ) { + $pageInfo['restrictiontypes'] = + $this->restrictionTypes[$ns][$dbkey]; + } + ApiResult::setIndexedTagName( $pageInfo['restrictiontypes'], 'rt' ); } - if ( $this->fld_watched && isset( $this->watched[$ns][$dbkey] ) ) { - $pageInfo['watched'] = ''; + if ( $this->fld_watched ) { + $pageInfo['watched'] = isset( $this->watched[$ns][$dbkey] ); } if ( $this->fld_watchers ) { @@ -460,8 +464,8 @@ class ApiQueryInfo extends ApiQueryBase { $pageInfo['editurl'] = wfExpandUrl( $title->getFullURL( 'action=edit' ), PROTO_CURRENT ); $pageInfo['canonicalurl'] = wfExpandUrl( $title->getFullURL(), PROTO_CANONICAL ); } - if ( $this->fld_readable && $title->userCan( 'read', $this->getUser() ) ) { - $pageInfo['readable'] = ''; + if ( $this->fld_readable ) { + $pageInfo['readable'] = $title->userCan( 'read', $this->getUser() ); } if ( $this->fld_preload ) { @@ -469,7 +473,7 @@ class ApiQueryInfo extends ApiQueryBase { $pageInfo['preload'] = ''; } else { $text = null; - wfRunHooks( 'EditFormPreloadText', array( &$text, &$title ) ); + Hooks::run( 'EditFormPreloadText', array( &$text, &$title ) ); $pageInfo['preload'] = $text; } @@ -483,6 +487,20 @@ class ApiQueryInfo extends ApiQueryBase { } } + if ( $this->params['testactions'] ) { + $limit = $this->getMain()->canApiHighLimits() ? self::LIMIT_SML1 : self::LIMIT_SML2; + if ( $this->countTestedActions >= $limit ) { + return null; // force a continuation + } + + $user = $this->getUser(); + $pageInfo['actions'] = array(); + foreach ( $this->params['testactions'] as $action ) { + $this->countTestedActions++; + $pageInfo['actions'][$action] = $title->userCan( $action, $user ); + } + } + return $pageInfo; } @@ -512,7 +530,7 @@ class ApiQueryInfo extends ApiQueryBase { 'expiry' => $wgContLang->formatExpiry( $row->pr_expiry, TS_ISO_8601 ) ); if ( $row->pr_cascade ) { - $a['cascade'] = ''; + $a['cascade'] = true; } $this->protections[$title->getNamespace()][$title->getDBkey()][] = $a; } @@ -574,7 +592,8 @@ class ApiQueryInfo extends ApiQueryBase { } } - // Cascading protections + // Separate good and missing titles into files and other pages + // and populate $this->restrictionTypes $images = $others = array(); foreach ( $this->everything as $title ) { if ( $title->getNamespace() == NS_FILE ) { @@ -582,6 +601,9 @@ class ApiQueryInfo extends ApiQueryBase { } else { $others[] = $title; } + // Applicable protection types + $this->restrictionTypes[$title->getNamespace()][$title->getDBkey()] = + array_values( $title->getRestrictionTypes() ); } if ( count( $others ) ) { @@ -817,45 +839,31 @@ class ApiQueryInfo extends ApiQueryBase { 'displaytitle', // If you add more properties here, please consider whether they // need to be added to getCacheMode() - ) ), + ), + ApiBase::PARAM_HELP_MSG_PER_VALUE => array(), + ), + 'testactions' => array( + ApiBase::PARAM_TYPE => 'string', + ApiBase::PARAM_ISMULTI => true, + ), 'token' => array( ApiBase::PARAM_DEPRECATED => true, ApiBase::PARAM_DFLT => null, ApiBase::PARAM_ISMULTI => true, ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() ) ), - 'continue' => null, - ); - } - - public function getParamDescription() { - return array( - 'prop' => array( - 'Which additional properties to get:', - ' protection - List the protection level of each page', - ' talkid - The page ID of the talk page for each non-talk page', - ' watched - List the watched status of each page', - ' watchers - The number of watchers, if allowed', - ' notificationtimestamp - The watchlist notification timestamp of each page', - ' subjectid - The page ID of the parent page for each talk page', - ' url - Gives a full URL, an edit URL, and the canonical URL for each page', - ' readable - Whether the user can read this page', - ' preload - Gives the text returned by EditFormPreloadText', - ' displaytitle - Gives the way the page title is actually displayed', + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', ), - 'token' => 'Request a token to perform a data-modifying action on a page', - 'continue' => 'When more results are available, use this to continue', ); } - public function getDescription() { - return 'Get basic page information such as namespace, title, last touched date, ...'; - } - - public function getExamples() { + protected function getExamplesMessages() { return array( - 'api.php?action=query&prop=info&titles=Main%20Page', - 'api.php?action=query&prop=info&inprop=protection&titles=Main%20Page' + 'action=query&prop=info&titles=Main%20Page' + => 'apihelp-query+info-example-simple', + 'action=query&prop=info&inprop=protection&titles=Main%20Page' + => 'apihelp-query+info-example-protection', ); } |