[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/includes/jobqueue/jobs/ -> PublishStashedFileJob.php (source)

   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  }


Generated: Fri Nov 28 14:03:12 2014 Cross-referenced by PHPXref 0.7.1