X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiUpload.php;h=62d888289859ca7e92fe6bd64c52f26a53ad19bc;hb=c35284ce8069db6a4bf4813cf86b452d3186435e;hp=8cf53d79448324b6297c502a1d0bb34ac5ead6cd;hpb=509d2fa1b24cb2a4da077b033c8a486182dedb1d;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiUpload.php b/includes/api/ApiUpload.php index 8cf53d7944..62d8882898 100644 --- a/includes/api/ApiUpload.php +++ b/includes/api/ApiUpload.php @@ -64,7 +64,7 @@ class ApiUpload extends ApiBase { $this->dieUsage( 'No upload module set', 'nomodule' ); } } catch ( UploadStashException $e ) { // XXX: don't spam exception log - $this->dieUsage( get_class( $e ) . ": " . $e->getMessage(), 'stasherror' ); + $this->handleStashException( $e ); } // First check permission to upload @@ -112,7 +112,7 @@ class ApiUpload extends ApiBase { $result['imageinfo'] = $this->mUpload->getImageInfo( $this->getResult() ); } } catch ( UploadStashException $e ) { // XXX: don't spam exception log - $this->dieUsage( get_class( $e ) . ": " . $e->getMessage(), 'stasherror' ); + $this->handleStashException( $e ); } $this->getResult()->addValue( null, $this->getModuleName(), $result ); @@ -159,7 +159,9 @@ class ApiUpload extends ApiBase { if ( $warnings && count( $warnings ) > 0 ) { $result['warnings'] = $warnings; } - } catch ( MWException $e ) { + } catch ( UploadStashException $e ) { + $this->handleStashException( $e ); + } catch ( Exception $e ) { $this->dieUsage( $e->getMessage(), 'stashfailed' ); } @@ -180,7 +182,7 @@ class ApiUpload extends ApiBase { try { $result['filekey'] = $this->performStash(); $result['sessionkey'] = $result['filekey']; // backwards compatibility - } catch ( MWException $e ) { + } catch ( Exception $e ) { $result['warnings']['stashfailed'] = $e->getMessage(); } @@ -205,7 +207,9 @@ class ApiUpload extends ApiBase { if ( $this->mParams['offset'] == 0 ) { try { $filekey = $this->performStash(); - } catch ( MWException $e ) { + } catch ( UploadStashException $e ) { + $this->handleStashException( $e ); + } catch ( Exception $e ) { // FIXME: Error handling here is wrong/different from rest of this $this->dieUsage( $e->getMessage(), 'stashfailed' ); } @@ -273,16 +277,17 @@ class ApiUpload extends ApiBase { */ private function performStash() { try { - $stashFile = $this->mUpload->stashFile(); + $stashFile = $this->mUpload->stashFile( $this->getUser() ); if ( !$stashFile ) { throw new MWException( 'Invalid stashed file' ); } $fileKey = $stashFile->getFileKey(); - } catch ( MWException $e ) { + } catch ( Exception $e ) { $message = 'Stashing temporary file failed: ' . get_class( $e ) . ' ' . $e->getMessage(); wfDebug( __METHOD__ . ' ' . $message . "\n" ); - throw new MWException( $message ); + $className = get_class( $e ); + throw new $className( $message ); } return $fileKey; @@ -301,7 +306,7 @@ class ApiUpload extends ApiBase { try { $data['filekey'] = $this->performStash(); $data['sessionkey'] = $data['filekey']; - } catch ( MWException $e ) { + } catch ( Exception $e ) { $data['stashfailed'] = $e->getMessage(); } $data['invalidparameter'] = $parameter; @@ -576,6 +581,41 @@ class ApiUpload extends ApiBase { return $warnings; } + /** + * Handles a stash exception, giving a useful error to the user. + * @param Exception $e The exception we encountered. + */ + protected function handleStashException( $e ) { + $exceptionType = get_class( $e ); + + switch ( $exceptionType ) { + case 'UploadStashFileNotFoundException': + $this->dieUsage( 'Could not find the file in the stash: ' . $e->getMessage(), 'stashedfilenotfound' ); + break; + case 'UploadStashBadPathException': + $this->dieUsage( 'File key of improper format or otherwise invalid: ' . $e->getMessage(), 'stashpathinvalid' ); + break; + case 'UploadStashFileException': + $this->dieUsage( 'Could not store upload in the stash: ' . $e->getMessage(), 'stashfilestorage' ); + break; + case 'UploadStashZeroLengthFileException': + $this->dieUsage( 'File is of zero length, and could not be stored in the stash: ' . $e->getMessage(), 'stashzerolength' ); + break; + case 'UploadStashNotLoggedInException': + $this->dieUsage( 'Not logged in: ' . $e->getMessage(), 'stashnotloggedin' ); + break; + case 'UploadStashWrongOwnerException': + $this->dieUsage( 'Wrong owner: ' . $e->getMessage(), 'stashwrongowner' ); + break; + case 'UploadStashNoSuchKeyException': + $this->dieUsage( 'No such filekey: ' . $e->getMessage(), 'stashnosuchfilekey' ); + break; + default: + $this->dieUsage( $exceptionType . ": " . $e->getMessage(), 'stasherror' ); + break; + } + } + /** * Perform the actual upload. Returns a suitable result array on success; * dies on failure. @@ -736,7 +776,7 @@ class ApiUpload extends ApiBase { return 'csrf'; } - public function getExamplesMessages() { + protected function getExamplesMessages() { return array( 'action=upload&filename=Wiki.png' . '&url=http%3A//upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png&token=123ABC'