X-Git-Url: https://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiQuery.php;h=ecc27464bfedd7471d0ad597483b213b088afe23;hb=1405fa3c8319d45e7ebfb151fe5b781a65346d06;hp=43a2caf1e140546f0342bc38776ab241b0c1f722;hpb=79efadb25cb3f76e7b02c2cbe89dc663e7a73e1b;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php index 43a2caf1e1..ecc27464bf 100644 --- a/includes/api/ApiQuery.php +++ b/includes/api/ApiQuery.php @@ -1,10 +1,9 @@ @gmail.com * * This program is free software; you can redistribute it and/or modify @@ -21,6 +20,8 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * http://www.gnu.org/copyleft/gpl.html + * + * @file */ if ( !defined( 'MEDIAWIKI' ) ) { @@ -43,7 +44,7 @@ class ApiQuery extends ApiBase { private $mPropModuleNames, $mListModuleNames, $mMetaModuleNames; private $mPageSet; - private $params, $redirect; + private $params; private $mQueryPropModules = array( 'info' => 'ApiQueryInfo', @@ -58,6 +59,7 @@ class ApiQuery extends ApiBase { 'extlinks' => 'ApiQueryExternalLinks', 'categoryinfo' => 'ApiQueryCategoryInfo', 'duplicatefiles' => 'ApiQueryDuplicateFiles', + 'pageprops' => 'ApiQueryPageProps', ); private $mQueryListModules = array( @@ -174,7 +176,7 @@ class ApiQuery extends ApiBase { function getModules() { return array_merge( $this->mQueryPropModules, $this->mQueryListModules, $this->mQueryMetaModules ); } - + /** * Get whether the specified module is a prop, list or a meta query module * @param $moduleName string Name of the module to find type for @@ -184,15 +186,15 @@ class ApiQuery extends ApiBase { if ( array_key_exists ( $moduleName, $this->mQueryPropModules ) ) { return 'prop'; } - + if ( array_key_exists ( $moduleName, $this->mQueryListModules ) ) { return 'list'; } - + if ( array_key_exists ( $moduleName, $this->mQueryMetaModules ) ) { return 'meta'; } - + return null; } @@ -232,9 +234,15 @@ class ApiQuery extends ApiBase { $this->instantiateModules( $modules, 'list', $this->mQueryListModules ); $this->instantiateModules( $modules, 'meta', $this->mQueryMetaModules ); + $cacheMode = 'public'; + // If given, execute generator to substitute user supplied data with generated data. if ( isset( $this->params['generator'] ) ) { - $this->executeGeneratorModule( $this->params['generator'], $modules ); + $generator = $this->newGenerator( $this->params['generator'] ); + $params = $generator->extractRequestParams(); + $cacheMode = $this->mergeCacheMode( $cacheMode, + $generator->getCacheMode( $params ) ); + $this->executeGeneratorModule( $generator, $modules ); } else { // Append custom fields and populate page/revision information $this->addCustomFldsToPageSet( $modules, $this->mPageSet ); @@ -246,11 +254,35 @@ class ApiQuery extends ApiBase { // Execute all requested modules. foreach ( $modules as $module ) { + $params = $module->extractRequestParams(); + $cacheMode = $this->mergeCacheMode( + $cacheMode, $module->getCacheMode( $params ) ); $module->profileIn(); $module->execute(); wfRunHooks( 'APIQueryAfterExecute', array( &$module ) ); $module->profileOut(); } + + // Set the cache mode + $this->getMain()->setCacheMode( $cacheMode ); + } + + /** + * Update a cache mode string, applying the cache mode of a new module to it. + * The cache mode may increase in the level of privacy, but public modules + * added to private data do not decrease the level of privacy. + */ + protected function mergeCacheMode( $cacheMode, $modCacheMode ) { + if ( $modCacheMode === 'anon-public-user-private' ) { + if ( $cacheMode !== 'private' ) { + $cacheMode = 'anon-public-user-private'; + } + } elseif ( $modCacheMode === 'public' ) { + // do nothing, if it's public already it will stay public + } else { // private + $cacheMode = 'private'; + } + return $cacheMode; } /** @@ -308,7 +340,7 @@ class ApiQuery extends ApiBase { $result->setIndexedTagName( $normValues, 'n' ); $result->addValue( 'query', 'normalized', $normValues ); } - + // Title conversions $convValues = array(); foreach ( $pageSet->getConvertedTitles() as $rawTitleStr => $titleStr ) { @@ -321,7 +353,7 @@ class ApiQuery extends ApiBase { if ( count( $convValues ) ) { $result->setIndexedTagName( $convValues, 'c' ); $result->addValue( 'query', 'converted', $convValues ); - } + } // Interwiki titles $intrwValues = array(); @@ -394,9 +426,12 @@ class ApiQuery extends ApiBase { $vals = array(); ApiQueryBase::addTitleInfo( $vals, $title ); $vals['special'] = ''; - if ( $title->getNamespace() == NS_SPECIAL && + if ( $title->getNamespace() == NS_SPECIAL && !SpecialPage::exists( $title->getText() ) ) { - $vals['missing'] = ''; + $vals['missing'] = ''; + } elseif ( $title->getNamespace() == NS_MEDIA && + !wfFindFile( $title ) ) { + $vals['missing'] = ''; } $pages[$fakeId] = $vals; } @@ -455,12 +490,10 @@ class ApiQuery extends ApiBase { } /** - * For generator mode, execute generator, and use its output as new - * ApiPageSet + * Create a generator object of the given type and return it * @param $generatorName string Module name - * @param $modules array of module objects */ - protected function executeGeneratorModule( $generatorName, $modules ) { + public function newGenerator( $generatorName ) { // Find class that implements requested generator if ( isset( $this->mQueryListModules[$generatorName] ) ) { $className = $this->mQueryListModules[$generatorName]; @@ -469,17 +502,23 @@ class ApiQuery extends ApiBase { } else { ApiBase::dieDebug( __METHOD__, "Unknown generator=$generatorName" ); } - - // Generator results - $resultPageSet = new ApiPageSet( $this, $this->redirects, $this->convertTitles ); - - // Create and execute the generator $generator = new $className ( $this, $generatorName ); if ( !$generator instanceof ApiQueryGeneratorBase ) { $this->dieUsage( "Module $generatorName cannot be used as a generator", 'badgenerator' ); } - $generator->setGeneratorMode(); + return $generator; + } + + /** + * For generator mode, execute generator, and use its output as new + * ApiPageSet + * @param $generator string Module name + * @param $modules array of module objects + */ + protected function executeGeneratorModule( $generator, $modules ) { + // Generator results + $resultPageSet = new ApiPageSet( $this, $this->redirects, $this->convertTitles ); // Add any additional fields modules may need $generator->requestExtraData( $this->mPageSet );