public function execute() { // Check whether upload is enabled if (!UploadBase::isEnabled()) { $this->dieUsageMsg('uploaddisabled'); } $user = $this->getUser(); // Parameter handling $this->mParams = $this->extractRequestParams(); $request = $this->getMain()->getRequest(); // Check if async mode is actually supported (jobs done in cli mode) $this->mParams['async'] = $this->mParams['async'] && $this->getConfig()->get('EnableAsyncUploads'); // Add the uploaded file to the params array $this->mParams['file'] = $request->getFileName('file'); $this->mParams['chunk'] = $request->getFileName('chunk'); // Copy the session key to the file key, for backward compatibility. if (!$this->mParams['filekey'] && $this->mParams['sessionkey']) { $this->mParams['filekey'] = $this->mParams['sessionkey']; } // Select an upload module try { if (!$this->selectUploadModule()) { return; // not a true upload, but a status request or similar } elseif (!isset($this->mUpload)) { $this->dieUsage('No upload module set', 'nomodule'); } } catch (UploadStashException $e) { // XXX: don't spam exception log $this->handleStashException($e); } // First check permission to upload $this->checkPermissions($user); // Fetch the file (usually a no-op) /** @var $status Status */ $status = $this->mUpload->fetchFile(); if (!$status->isGood()) { $errors = $status->getErrorsArray(); $error = array_shift($errors[0]); $this->dieUsage('Error fetching file from remote source', $error, 0, $errors[0]); } // Check if the uploaded file is sane if ($this->mParams['chunk']) { $maxSize = UploadBase::getMaxUploadSize(); if ($this->mParams['filesize'] > $maxSize) { $this->dieUsage('The file you submitted was too large', 'file-too-large'); } if (!$this->mUpload->getTitle()) { $this->dieUsage('Invalid file title supplied', 'internal-error'); } } elseif ($this->mParams['async'] && $this->mParams['filekey']) { // defer verification to background process } else { wfDebug(__METHOD__ . " about to verify\n"); $this->verifyUpload(); } // Check if the user has the rights to modify or overwrite the requested title // (This check is irrelevant if stashing is already requested, since the errors // can always be fixed by changing the title) if (!$this->mParams['stash']) { $permErrors = $this->mUpload->verifyTitlePermissions($user); if ($permErrors !== true) { $this->dieRecoverableError($permErrors[0], 'filename'); } } // Get the result based on the current upload context: try { $result = $this->getContextResult(); if ($result['result'] === 'Success') { $result['imageinfo'] = $this->mUpload->getImageInfo($this->getResult()); } } catch (UploadStashException $e) { // XXX: don't spam exception log $this->handleStashException($e); } $this->getResult()->addValue(null, $this->getModuleName(), $result); // Cleanup any temporary mess $this->mUpload->cleanupTempFile(); }