MediaWiki REL1_31
SpecialRunJobs.php
Go to the documentation of this file.
1<?php
25
32 public function __construct() {
33 parent::__construct( 'RunJobs' );
34 }
35
36 public function doesWrites() {
37 return true;
38 }
39
40 public function execute( $par = '' ) {
41 $this->getOutput()->disable();
42
43 if ( wfReadOnly() ) {
44 wfHttpError( 423, 'Locked', 'Wiki is in read-only mode.' );
45 return;
46 }
47
48 // Validate request method
49 if ( !$this->getRequest()->wasPosted() ) {
50 wfHttpError( 400, 'Bad Request', 'Request must be POSTed.' );
51 return;
52 }
53
54 // Validate request parameters
55 $optional = [ 'maxjobs' => 0, 'maxtime' => 30, 'type' => false, 'async' => true ];
56 $required = array_flip( [ 'title', 'tasks', 'signature', 'sigexpiry' ] );
57 $params = array_intersect_key( $this->getRequest()->getValues(), $required + $optional );
58 $missing = array_diff_key( $required, $params );
59 if ( count( $missing ) ) {
60 wfHttpError( 400, 'Bad Request',
61 'Missing parameters: ' . implode( ', ', array_keys( $missing ) )
62 );
63 return;
64 }
65
66 // Validate request signature
67 $squery = $params;
68 unset( $squery['signature'] );
69 $correctSignature = self::getQuerySignature( $squery, $this->getConfig()->get( 'SecretKey' ) );
70 $providedSignature = $params['signature'];
71 $verified = is_string( $providedSignature )
72 && hash_equals( $correctSignature, $providedSignature );
73 if ( !$verified || $params['sigexpiry'] < time() ) {
74 wfHttpError( 400, 'Bad Request', 'Invalid or stale signature provided.' );
75 return;
76 }
77
78 // Apply any default parameter values
79 $params += $optional;
80
81 if ( $params['async'] ) {
82 // HTTP 202 Accepted
83 HttpStatus::header( 202 );
84 // Clients are meant to disconnect without waiting for the full response.
85 // Let the page output happen before the jobs start, so that clients know it's
86 // safe to disconnect. MediaWiki::preOutputCommit() calls ignore_user_abort()
87 // or similar to make sure we stay alive to run the deferred update.
88 DeferredUpdates::addUpdate(
90 function () use ( $params ) {
91 $this->doRun( $params );
92 },
93 __METHOD__
94 ),
95 DeferredUpdates::POSTSEND
96 );
97 } else {
98 $this->doRun( $params );
99 print "Done\n";
100 }
101 }
102
103 protected function doRun( array $params ) {
104 $runner = new JobRunner( LoggerFactory::getInstance( 'runJobs' ) );
105 $runner->run( [
106 'type' => $params['type'],
107 'maxJobs' => $params['maxjobs'] ?: 1,
108 'maxTime' => $params['maxtime'] ?: 30
109 ] );
110 }
111
117 public static function getQuerySignature( array $query, $secretKey ) {
118 ksort( $query ); // stable order
119 return hash_hmac( 'sha1', wfArrayToCgi( $query ), $secretKey );
120 }
121}
wfReadOnly()
Check whether the wiki is in read-only mode.
wfHttpError( $code, $label, $desc)
Provide a simple HTTP error.
wfArrayToCgi( $array1, $array2=null, $prefix='')
This function takes one or two arrays as input, and returns a CGI-style string, e....
static header( $code)
Output an HTTP status code header.
Job queue runner utility methods.
Definition JobRunner.php:40
PSR-3 logger instance factory.
getOutput()
Get the OutputPage being used for this instance.
getConfig()
Shortcut to get main config object.
getRequest()
Get the WebRequest being used for this instance.
Special page designed for running background tasks (internal use only)
execute( $par='')
Default execute method Checks user permissions.
doRun(array $params)
doesWrites()
Indicates whether this special page may perform database writes.
static getQuerySignature(array $query, $secretKey)
Deferrable update that must run outside of any explicit LBFactory transaction round.
Shortcut to construct a special page which is unlisted by default.
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped noclasses just before the function returns a value If you return true
Definition hooks.txt:2006
null for the local wiki Added should default to null in handler for backwards compatibility add a value to it if you want to add a cookie that have to vary cache options can modify $query
Definition hooks.txt:1620
while(( $__line=Maintenance::readconsole()) !==false) print
Definition eval.php:64
$params