[ Index ] |
PHP Cross Reference of MediaWiki-1.24.0 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Upload a file from the upload stash into the local file repo. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 18 * http://www.gnu.org/copyleft/gpl.html 19 * 20 * @file 21 * @ingroup Upload 22 */ 23 24 /** 25 * Upload a file from the upload stash into the local file repo. 26 * 27 * @ingroup Upload 28 */ 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 57 UploadBase::setSessionStatus( 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 ); 74 UploadBase::setSessionStatus( 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() ) { 91 UploadBase::setSessionStatus( 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 108 UploadBase::setSessionStatus( 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 ) { 119 UploadBase::setSessionStatus( 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. 130 MWExceptionHandler::rollbackMasterChangesAndLog( $e ); 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 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 14:03:12 2014 | Cross-referenced by PHPXref 0.7.1 |