From: Lucas Werkmeister Date: Mon, 17 Dec 2018 13:02:39 +0000 (+0100) Subject: SECURITY: Fix cache mode for (un)patrolled recent changes query X-Git-Tag: 1.31.2~5 X-Git-Url: http://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=commitdiff_plain;h=ea0f1b5f004a9dc1cdf5568259c337d45f15ce9b;ds=sidebyside SECURITY: Fix cache mode for (un)patrolled recent changes query Restricting the list of recent changes to patrolled, not patrolled, autopatrolled, not autopatrolled, or unpatrolled recent changes requires special permissions (as does displaying that status in the properties of returned entries), but we only set the cache mode to private in the first two cases. Bug: T212118 Change-Id: I4c3fe6e47f80ebf97fa37875c704328d08772d26 --- diff --git a/includes/api/ApiQueryRecentChanges.php b/includes/api/ApiQueryRecentChanges.php index 326debc0e0..864b182891 100644 --- a/includes/api/ApiQueryRecentChanges.php +++ b/includes/api/ApiQueryRecentChanges.php @@ -200,12 +200,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase { } // Check permissions - if ( isset( $show['patrolled'] ) - || isset( $show['!patrolled'] ) - || isset( $show['unpatrolled'] ) - || isset( $show['autopatrolled'] ) - || isset( $show['!autopatrolled'] ) - ) { + if ( $this->includesPatrollingFlags( $show ) ) { if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) { $this->dieWithError( 'apierror-permissiondenied-patrolflag', 'permissiondenied' ); } @@ -620,13 +615,23 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase { return $vals; } + /** + * @param array $flagsArray flipped array (string flags are keys) + * @return bool + */ + private function includesPatrollingFlags( array $flagsArray ) { + return isset( $flagsArray['patrolled'] ) || + isset( $flagsArray['!patrolled'] ) || + isset( $flagsArray['unpatrolled'] ) || + isset( $flagsArray['autopatrolled'] ) || + isset( $flagsArray['!autopatrolled'] ); + } + public function getCacheMode( $params ) { - if ( isset( $params['show'] ) ) { - foreach ( $params['show'] as $show ) { - if ( $show === 'patrolled' || $show === '!patrolled' ) { - return 'private'; - } - } + if ( isset( $params['show'] ) && + $this->includesPatrollingFlags( array_flip( $params['show'] ) ) + ) { + return 'private'; } if ( isset( $params['token'] ) ) { return 'private';