From: Aaron Schulz Date: Thu, 10 Aug 2017 00:13:49 +0000 (-0700) Subject: Disallow job pushes from JobQueueGroup to bogus wikis X-Git-Tag: 1.31.0-rc.0~2404^2 X-Git-Url: https://git.cyclocoop.org/%242?a=commitdiff_plain;h=df7ec19a120ddcc9e2147808a2f0768a641e89ba;hp=749d64bbe7bb6d651257027c9dbad65051e57a80;p=lhc%2Fweb%2Fwiklou.git Disallow job pushes from JobQueueGroup to bogus wikis Bug: T171371 Change-Id: I03a5dbd18cf6b5bcacb3ec07cef9e0b051bc147c --- diff --git a/includes/jobqueue/JobQueueGroup.php b/includes/jobqueue/JobQueueGroup.php index ef0ecb3008..addc7fc2e1 100644 --- a/includes/jobqueue/JobQueueGroup.php +++ b/includes/jobqueue/JobQueueGroup.php @@ -37,6 +37,8 @@ class JobQueueGroup { protected $wiki; /** @var string|bool Read only rationale (or false if r/w) */ protected $readOnlyReason; + /** @var bool Whether the wiki is not recognized in configuration */ + protected $invalidWiki = false; /** @var array Map of (bucket => (queue => JobQueue, types => list of types) */ protected $coalescedQueues; @@ -68,9 +70,17 @@ class JobQueueGroup { * @return JobQueueGroup */ public static function singleton( $wiki = false ) { + global $wgLocalDatabases; + $wiki = ( $wiki === false ) ? wfWikiID() : $wiki; + if ( !isset( self::$instances[$wiki] ) ) { self::$instances[$wiki] = new self( $wiki, wfConfiguredReadOnlyReason() ); + // Make sure jobs are not getting pushed to bogus wikis. This can confuse + // the job runner system into spawning endless RPC requests that fail (T171371). + if ( $wiki !== wfWikiID() && !in_array( $wiki, $wgLocalDatabases ) ) { + self::$instances[$wiki]->invalidWiki = true; + } } return self::$instances[$wiki]; @@ -121,6 +131,13 @@ class JobQueueGroup { public function push( $jobs ) { global $wgJobTypesExcludedFromDefaultQueue; + if ( $this->invalidWiki ) { + // Do not enqueue job that cannot be run (T171371) + $e = new LogicException( "Domain '{$this->wiki}' is not recognized." ); + MWExceptionHandler::logException( $e ); + return; + } + $jobs = is_array( $jobs ) ? $jobs : [ $jobs ]; if ( !count( $jobs ) ) { return; @@ -171,6 +188,11 @@ class JobQueueGroup { * @since 1.26 */ public function lazyPush( $jobs ) { + if ( $this->invalidWiki ) { + // Do not enqueue job that cannot be run (T171371) + throw new LogicException( "Domain '{$this->wiki}' is not recognized." ); + } + if ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' ) { $this->push( $jobs ); return;