mDescription = "Upload stashed file into the local file repo"; $this->addOption( 'filename', "Desired file name", true, true ); $this->addOption( 'filekey', "Upload stash file key", true, true ); $this->addOption( 'userid', "Upload owner user ID", true, true ); $this->addOption( 'comment', "Upload comment", true, true ); $this->addOption( 'text', "Upload description", true, true ); $this->addOption( 'watch', "Whether the uploader should watch the page", true, true ); $this->addOption( 'sessionid', "Upload owner session ID", true, true ); } public function execute() { wfSetupSession( $this->getOption( 'sessionid' ) ); try { $user = User::newFromId( $this->getOption( 'userid' ) ); if ( !$user ) { throw new MWException( "No user with ID " . $this->getOption( 'userid' ) . "." ); } UploadBase::setSessionStatus( $this->getOption( 'filekey' ), array( 'result' => 'Poll', 'stage' => 'publish', 'status' => Status::newGood() ) ); $upload = new UploadFromStash( $user ); // @TODO: initialize() causes a GET, ideally we could frontload the antivirus // checks and anything else to the stash stage (which includes concatenation and // the local file is thus already there). That way, instead of GET+PUT, there could // just be a COPY operation from the stash to the public zone. $upload->initialize( $this->getOption( 'filekey' ), $this->getOption( 'filename' ) ); // Check if the local file checks out (this is generally a no-op) $verification = $upload->verifyUpload(); if ( $verification['status'] !== UploadBase::OK ) { $status = Status::newFatal( 'verification-error' ); $status->value = array( 'verification' => $verification ); UploadBase::setSessionStatus( $this->getOption( 'filekey' ), array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status ) ); $this->error( "Could not verify upload.\n", 1 ); // die } // Upload the stashed file to a permanent location $status = $upload->performUpload( $this->getOption( 'comment' ), $this->getOption( 'text' ), $this->getOption( 'watch' ), $user ); if ( !$status->isGood() ) { UploadBase::setSessionStatus( $this->getOption( 'filekey' ), array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status ) ); $this->error( $status->getWikiText() . "\n", 1 ); // die } // Build the image info array while we have the local reference handy $apiMain = new ApiMain(); // dummy object (XXX) $imageInfo = $upload->getImageInfo( $apiMain->getResult() ); // Cleanup any temporary local file $upload->cleanupTempFile(); // Cache the info so the user doesn't have to wait forever to get the final info UploadBase::setSessionStatus( $this->getOption( 'filekey' ), array( 'result' => 'Success', 'stage' => 'publish', 'filename' => $upload->getLocalFile()->getName(), 'imageinfo' => $imageInfo, 'status' => Status::newGood() ) ); } catch ( MWException $e ) { UploadBase::setSessionStatus( $this->getOption( 'filekey' ), array( 'result' => 'Failure', 'stage' => 'publish', 'status' => Status::newFatal( 'api-error-publishfailed' ) ) ); throw $e; } session_write_close(); } } $maintClass = "PublishStashedFile"; require_once( RUN_MAINTENANCE_IF_MAIN );