X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/includes/upload/UploadFromStash.php diff --git a/includes/upload/UploadFromStash.php b/includes/upload/UploadFromStash.php index 156781e9..a9f399b7 100644 --- a/includes/upload/UploadFromStash.php +++ b/includes/upload/UploadFromStash.php @@ -1,83 +1,161 @@ user = $user; + + if ( $repo ) { + $this->repo = $repo; + } else { + $this->repo = RepoGroup::singleton()->getLocalRepo(); + } + + if ( $stash ) { + $this->stash = $stash; + } else { + if ( $user ) { + wfDebug( __METHOD__ . " creating new UploadStash instance for " . $user->getId() . "\n" ); + } else { + wfDebug( __METHOD__ . " creating new UploadStash instance with no user\n" ); + } + + $this->stash = new UploadStash( $this->repo, $this->user ); + } } + /** + * @param string $key + * @return bool + */ + public static function isValidKey( $key ) { + // this is checked in more detail in UploadStash + return (bool)preg_match( UploadStash::KEY_FORMAT_REGEX, $key ); + } + + /** + * @param WebRequest $request + * @return bool + */ public static function isValidRequest( $request ) { - $sessionData = $request->getSessionData( UploadBase::SESSION_KEYNAME ); - return self::isValidSessionKey( - $request->getText( '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' ) ) ); } - public function initialize( $name, $sessionKey, $sessionData ) { - /** - * 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. - */ - - $this->initializePathInfo( $name, - $this->getRealPath ( $sessionData['mTempPath'] ), - $sessionData['mFileSize'], - false - ); - - $this->mSessionKey = $sessionKey; - $this->mVirtualTempPath = $sessionData['mTempPath']; - $this->mFileProps = $sessionData['mFileProps']; + /** + * @param string $key + * @param string $name + * @param bool $initTempFile + */ + public function initialize( $key, $name = 'upload_file', $initTempFile = true ) { + /** + * 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, + $initTempFile ? $this->getRealPath( $metadata['us_path'] ) : false, + $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 WebRequest &$request + */ public function initializeFromRequest( &$request ) { - $sessionKey = $request->getText( 'wpSessionKey' ); - $sessionData = $request->getSessionData( UploadBase::SESSION_KEYNAME ); + // 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, $sessionKey, $sessionData[$sessionKey] ); + $this->initialize( $fileKey, $desiredDestName ); } /** - * File has been previously verified so no need to do so again. + * @return string */ - protected function verifyFile() { - return true; + public function getSourceType() { + return $this->mSourceType; } - /** - * There is no need to stash the image twice + * Get the base 36 SHA1 of the file + * @return string */ - public function stashSession( $key = null ) { - if ( !empty( $this->mSessionKey ) ) - return $this->mSessionKey; - return parent::stashSession(); + public function getTempFileSha1Base36() { + return $this->mFileProps['sha1']; } /** * Remove a temporarily kept file stashed by saveTempUploadedFile(). - * @return success + * @return bool 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 + /** + * Remove the database record after a successful upload. + */ + public function postProcessUpload() { + parent::postProcessUpload(); + $this->unsaveUploadedFile(); + } +}