MediaWiki  1.23.8
PublishStashedFileJob.php
Go to the documentation of this file.
1 <?php
29 class PublishStashedFileJob extends Job {
30  public function __construct( $title, $params ) {
31  parent::__construct( 'PublishStashedFile', $title, $params );
32  $this->removeDuplicates = true;
33  }
34 
35  public function run() {
36  $scope = RequestContext::importScopedSession( $this->params['session'] );
37  $context = RequestContext::getMain();
38  try {
39  $user = $context->getUser();
40  if ( !$user->isLoggedIn() ) {
41  $this->setLastError( "Could not load the author user from session." );
42 
43  return false;
44  }
45 
46  if ( count( $_SESSION ) === 0 ) {
47  // Empty session probably indicates that we didn't associate
48  // with the session correctly. Note that being able to load
49  // the user does not necessarily mean the session was loaded.
50  // Most likely cause by suhosin.session.encrypt = On.
51  $this->setLastError( "Error associating with user session. " .
52  "Try setting suhosin.session.encrypt = Off" );
53 
54  return false;
55  }
56 
58  $this->params['filekey'],
59  array( 'result' => 'Poll', 'stage' => 'publish', 'status' => Status::newGood() )
60  );
61 
62  $upload = new UploadFromStash( $user );
63  // @todo initialize() causes a GET, ideally we could frontload the antivirus
64  // checks and anything else to the stash stage (which includes concatenation and
65  // the local file is thus already there). That way, instead of GET+PUT, there could
66  // just be a COPY operation from the stash to the public zone.
67  $upload->initialize( $this->params['filekey'], $this->params['filename'] );
68 
69  // Check if the local file checks out (this is generally a no-op)
70  $verification = $upload->verifyUpload();
71  if ( $verification['status'] !== UploadBase::OK ) {
72  $status = Status::newFatal( 'verification-error' );
73  $status->value = array( 'verification' => $verification );
75  $this->params['filekey'],
76  array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
77  );
78  $this->setLastError( "Could not verify upload." );
79 
80  return false;
81  }
82 
83  // Upload the stashed file to a permanent location
84  $status = $upload->performUpload(
85  $this->params['comment'],
86  $this->params['text'],
87  $this->params['watch'],
88  $user
89  );
90  if ( !$status->isGood() ) {
92  $this->params['filekey'],
93  array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
94  );
95  $this->setLastError( $status->getWikiText() );
96 
97  return false;
98  }
99 
100  // Build the image info array while we have the local reference handy
101  $apiMain = new ApiMain(); // dummy object (XXX)
102  $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
103 
104  // Cleanup any temporary local file
105  $upload->cleanupTempFile();
106 
107  // Cache the info so the user doesn't have to wait forever to get the final info
109  $this->params['filekey'],
110  array(
111  'result' => 'Success',
112  'stage' => 'publish',
113  'filename' => $upload->getLocalFile()->getName(),
114  'imageinfo' => $imageInfo,
115  'status' => Status::newGood()
116  )
117  );
118  } catch ( MWException $e ) {
120  $this->params['filekey'],
121  array(
122  'result' => 'Failure',
123  'stage' => 'publish',
124  'status' => Status::newFatal( 'api-error-publishfailed' )
125  )
126  );
127  $this->setLastError( get_class( $e ) . ": " . $e->getText() );
128  // To prevent potential database referential integrity issues.
129  // See bug 32551.
131 
132  return false;
133  }
134 
135  return true;
136  }
137 
138  public function getDeduplicationInfo() {
139  $info = parent::getDeduplicationInfo();
140  if ( is_array( $info['params'] ) ) {
141  $info['params'] = array( 'filekey' => $info['params']['filekey'] );
142  }
143 
144  return $info;
145  }
146 
147  public function allowRetries() {
148  return false;
149  }
150 }
ApiMain
This is the main API class, used for both external and internal processing.
Definition: ApiMain.php:41
php
skin txt MediaWiki includes four core it has been set as the default in MediaWiki since the replacing Monobook it had been been the default skin since before being replaced by Vector largely rewritten in while keeping its appearance Several legacy skins were removed in the as the burden of supporting them became too heavy to bear Those in etc for skin dependent CSS etc for skin dependent JavaScript These can also be customised on a per user by etc This feature has led to a wide variety of user styles becoming that gallery is a good place to ending in php
Definition: skin.txt:62
Job\$title
Title $title
Definition: Job.php:38
Status\newGood
static newGood( $value=null)
Factory function for good results.
Definition: Status.php:77
UploadFromStash
Implements uploading from previously stored file.
Definition: UploadFromStash.php:30
UploadBase\OK
const OK
Definition: UploadBase.php:50
Job\setLastError
setLastError( $error)
Definition: Job.php:317
PublishStashedFileJob
Upload a file from the upload stash into the local file repo.
Definition: PublishStashedFileJob.php:29
Job
Class to both describe a background job and handle jobs.
Definition: Job.php:31
MWException
MediaWiki exception.
Definition: MWException.php:26
PublishStashedFileJob\allowRetries
allowRetries()
Definition: PublishStashedFileJob.php:147
array
the array() calling protocol came about after MediaWiki 1.4rc1.
List of Api Query prop modules.
PublishStashedFileJob\getDeduplicationInfo
getDeduplicationInfo()
Subclasses may need to override this to make duplication detection work.
Definition: PublishStashedFileJob.php:138
Job\$params
array bool $params
Array of job parameters or false if none *.
Definition: Job.php:34
$upload
usually copyright or history_copyright This message must be in HTML not wikitext $subpages will be ignored and the rest of subPageSubtitle() will run. 'SkinTemplateBuildNavUrlsNav_urlsAfterPermalink' whether MediaWiki currently thinks this is a CSS JS page Hooks may change this value to override the return value of Title::isCssOrJsPage(). 'TitleIsAlwaysKnown' whether MediaWiki currently thinks this page is known isMovable() always returns false. $title whether MediaWiki currently thinks this page is movable Hooks may change this value to override the return value of Title::isMovable(). 'TitleIsWikitextPage' whether MediaWiki currently thinks this is a wikitext page Hooks may change this value to override the return value of Title::isWikitextPage() 'TitleMove' use UploadVerification and UploadVerifyFile instead where the first element is the message key and the remaining elements are used as parameters to the message based on mime etc Preferred in most cases over UploadVerification object $upload
Definition: hooks.txt:2573
RequestContext\getMain
static getMain()
Static methods.
Definition: RequestContext.php:420
$user
please add to it if you re going to add events to the MediaWiki code where normally authentication against an external auth plugin would be creating a account $user
Definition: hooks.txt:237
RequestContext\importScopedSession
static importScopedSession(array $params)
Import the resolved user IP, HTTP headers, user ID, and session ID.
Definition: RequestContext.php:461
UploadBase\setSessionStatus
static setSessionStatus( $statusKey, $value)
Set the current status of a chunked upload (used for polling).
Definition: UploadBase.php:1834
MWExceptionHandler\rollbackMasterChangesAndLog
static rollbackMasterChangesAndLog(Exception $e)
If there are any open database transactions, roll them back and log the stack trace of the exception ...
Definition: MWExceptionHandler.php:111
$e
if( $useReadline) $e
Definition: eval.php:66
PublishStashedFileJob\__construct
__construct( $title, $params)
Definition: PublishStashedFileJob.php:30
Status\newFatal
static newFatal( $message)
Factory function for fatal errors.
Definition: Status.php:63
PublishStashedFileJob\run
run()
Run the job.
Definition: PublishStashedFileJob.php:35