X-Git-Url: https://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2Fupload%2FUploadFromStash.php;h=a2f9be59c6b6126b559c0af7e444183b7103d502;hb=53f3c48a954ce36c892f85b3f92e03afeaa4c1ae;hp=38d99f7d78645bf1afc7c70745ce004a9fc2fa1f;hpb=c824e30197e40d473e36da488287ae05fa19e646;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/upload/UploadFromStash.php b/includes/upload/UploadFromStash.php index 38d99f7d78..a2f9be59c6 100644 --- a/includes/upload/UploadFromStash.php +++ b/includes/upload/UploadFromStash.php @@ -1,75 +1,119 @@ user = $user; + + if( $repo ) { + $this->repo = $repo; + } else { + $this->repo = RepoGroup::singleton()->getLocalRepo(); + } + + if( $stash ) { + $this->stash = $stash; + } else { + wfDebug( __METHOD__ . " creating new UploadStash instance for " . $user->getId() . "\n" ); + $this->stash = new UploadStash( $this->repo, $this->user ); + } + + return true; + } + + public static function isValidKey( $key ) { + // this is checked in more detail in UploadStash + return preg_match( UploadStash::KEY_FORMAT_REGEX, $key ) ? true : false; } + /** + * @param $request WebRequest + * + * @return Boolean + */ public static function isValidRequest( $request ) { - $sessionData = $request->getSessionData( 'wsUploadData' ); - return self::isValidSessionKey( - $request->getInt( 'wpSessionKey' ), - $sessionData - ); + // this passes wpSessionKey to getText() as a default when wpFileKey isn't set. + // wpSessionKey has no default which guarantees failure if both are missing + // (though that should have been caught earlier) + return self::isValidKey( $request->getText( 'wpFileKey', $request->getText( 'wpSessionKey' ) ) ); } - /* - * some $na vars for uploadBase method compatibility. - */ - public function initialize( $name, $sessionData, $na, $na2=false ) { - /** - * Confirming a temporarily stashed upload. - * We don't want path names to be forged, so we keep - * them in the session on the server and just give - * an opaque key to the user agent. - */ - - parent::initialize( $name, - $this->getRealPath ( $sessionData['mTempPath'] ), - $sessionData['mFileSize'], - false - ); - - $this->mVirtualTempPath = $sessionData['mTempPath']; - $this->mFileProps = $sessionData['mFileProps']; + + public function initialize( $key, $name = 'upload_file' ) { + /** + * Confirming a temporarily stashed upload. + * We don't want path names to be forged, so we keep + * them in the session on the server and just give + * an opaque key to the user agent. + */ + $metadata = $this->stash->getMetadata( $key ); + $this->initializePathInfo( $name, + $this->getRealPath ( $metadata['us_path'] ), + $metadata['us_size'], + false + ); + + $this->mFileKey = $key; + $this->mVirtualTempPath = $metadata['us_path']; + $this->mFileProps = $this->stash->getFileProps( $key ); + $this->mSourceType = $metadata['us_source_type']; } + /** + * @param $request WebRequest + */ public function initializeFromRequest( &$request ) { - $this->mSessionKey = $request->getInt( 'wpSessionKey' ); - $sessionData = $request->getSessionData('wsUploadData'); + // sends wpSessionKey as a default when wpFileKey is missing + $fileKey = $request->getText( 'wpFileKey', $request->getText( 'wpSessionKey' ) ); + + // chooses one of wpDestFile, wpUploadFile, filename in that order. + $desiredDestName = $request->getText( 'wpDestFile', $request->getText( 'wpUploadFile', $request->getText( 'filename' ) ) ); - $desiredDestName = $request->getText( 'wpDestFile' ); - if( !$desiredDestName ) - $desiredDestName = $request->getText( 'wpUploadFile' ); - return $this->initialize( $desiredDestName, $sessionData[$this->mSessionKey], false ); + return $this->initialize( $fileKey, $desiredDestName ); + } + + public function getSourceType() { + return $this->mSourceType; } /** * File has been previously verified so no need to do so again. + * + * @return bool */ protected function verifyFile() { return true; } - /** * There is no need to stash the image twice */ + public function stashFile() { + if ( $this->mLocalFile ) { + return $this->mLocalFile; + } + return parent::stashFile(); + } + + /** + * Alias for stashFile + */ public function stashSession() { - if ( !empty( $this->mSessionKey ) ) - return $this->mSessionKey; - return parent::stashSession(); + return $this->stashFile(); } /** @@ -77,9 +121,48 @@ class UploadFromStash extends UploadBase { * @return success */ public function unsaveUploadedFile() { - $repo = RepoGroup::singleton()->getLocalRepo(); - $success = $repo->freeTemp( $this->mVirtualTempPath ); - return $success; + return $this->stash->removeFile( $this->mFileKey ); } -} \ No newline at end of file + /** + * Perform the upload, then remove the database record afterward. + */ + public function performUpload( $comment, $pageText, $watch, $user ) { + $rv = parent::performUpload( $comment, $pageText, $watch, $user ); + $this->unsaveUploadedFile(); + return $rv; + } + + /** + * Append a chunk to the temporary file. + * + * @return void + */ + public function appendChunk($chunk, $chunkSize, $offset) { + //to use $this->getFileSize() here, db needs to be updated + //in appendToUploadFile for that + $fileSize = $this->stash->getFile( $this->mFileKey )->getSize(); + if ( $fileSize + $chunkSize > $this->getMaxUploadSize()) { + $status = Status::newFatal( 'file-too-large' ); + } else { + //append chunk + if ( $fileSize == $offset ) { + $status = $this->appendToUploadFile( $chunk, + $this->mVirtualTempPath ); + } else { + $status = Status::newFatal( 'invalid-chunk-offset' ); + } + } + return $status; + } + + /** + * Append the final chunk and ready file for parent::performUpload() + * @return void + */ + public function finalizeFile() { + $this->appendFinish ( $this->mVirtualTempPath ); + $this->cleanupTempFile(); + $this->mTempPath = $this->getRealPath( $this->mVirtualTempPath ); + } +}