<?php
/**
+ * @file
+ * @ingroup upload
+ *
+ * @author Michael Dale
+ *
* first destination checks are made (if ignorewarnings is not checked) errors / warning is returned.
*
* we return the uploadUrl
*/
class UploadFromChunks extends UploadBase {
- var $chunk_mode; //init, chunk, done
+ var $chunk_mode; // init, chunk, done
var $mSessionKey = false;
var $status = array();
const INIT = 1;
const CHUNK = 2;
const DONE = 3;
-
- function initializeFromParams( $param, &$request ) {
+ public function initializeFromRequest( &$request ){
+ //should merge initializeFromParams (but just needs to be working atm)
+ }
+ public function initializeFromParams( $param, &$request ) {
$this->initFromSessionKey( $param['chunksessionkey'], $request );
// set the chunk mode:
if( !$this->mSessionKey && !$param['done'] ){
return $this->status;
}
-
static function isValidRequest( $request ) {
$sessionData = $request->getSessionData( 'wsUploadData' );
if( !self::isValidSessionKey(
// check for the file:
return (bool)$request->getFileTempName( 'file' );
}
-
/* check warnings depending on chunk_mode */
function checkWarnings(){
- $warning = array();
- return $warning;
+ if( $this->chunk_mode == UploadFromChunks::DONE ){
+ return parent::checkWarnings();
+ }else{
+ return array();
+ }
}
-
function isEmptyFile(){
// does not apply to chunk init
if( $this->chunk_mode == UploadFromChunks::INIT ){
return parent::isEmptyFile();
}
}
-
/**
* Verify whether the upload is sane.
* Returns self::OK or else an array with error information
*/
function verifyUpload() {
- // no checks on chunk upload mode:
- if( $this->chunk_mode == UploadFromChunks::INIT )
- return self::OK;
-
- // verify on init and last chunk request
- if( $this->chunk_mode == UploadFromChunks::CHUNK ||
- $this->chunk_mode == UploadFromChunks::DONE )
+ // verify once DONE uploading chunks
+ if( $this->chunk_mode == UploadFromChunks::DONE ){
return parent::verifyUpload();
+ }else{
+ return array( 'status' => self::OK );
+ }
}
// only run verifyFile on completed uploaded chunks
- function verifyFile( $tmpFile ){
+ function verifyFile(){
if( $this->chunk_mode == UploadFromChunks::DONE ){
// first append last chunk (so we can do a real verifyFile check... (check file type etc)
$status = $this->doChunkAppend();
}
}
- function getRealPath( $srcPath ){
- $repo = RepoGroup::singleton()->getLocalRepo();
- if ( $repo->isVirtualUrl( $srcPath ) ) {
- return $repo->resolveVirtualUrl( $srcPath );
- }
- }
-
// pretty ugly inter-mixing of mParam and local vars
function setupChunkSession( $summary, $comment, $watch ) {
$this->mSessionKey = $this->getSessionKey();
$_SESSION['wsUploadData'][$this->mSessionKey] = array(
'mComment' => $comment,
- 'mSummary' => $summary,
+ 'mSummary' => $summary,
'mWatch' => $watch,
'mIgnorewarnings' => true, //ignore warning on chunk uploads (for now)
'mFilteredName' => $this->mFilteredName,
// Lets us return an api result (as flow for chunk uploads is kind of different than others.
function performUpload( $summary = '', $comment = '', $watch = '', $user ){
- global $wgServer, $wgScriptPath, $wgUser;
+ global $wgUser;
if( $this->chunk_mode == UploadFromChunks::INIT ){
// firefogg expects a specific result per:
// c) (we need the token to validate chunks are coming from a non-xss request)
$token = urlencode( $wgUser->editToken() );
ob_clean();
- echo ApiFormatJson::getJsonEncode( array(
- 'uploadUrl' => "{$wgServer}{$wgScriptPath}/api.php?action=upload&".
+ echo FormatJson::encode( array(
+ 'uploadUrl' => wfExpandUrl( wfScript( 'api' ) ) . "?action=upload&".
"token={$token}&format=json&enablechunks=true&chunksessionkey=".
- $this->setupChunkSession($summary, $comment, $watch ) ) );
+ $this->setupChunkSession( $summary, $comment, $watch ) ) );
exit( 0 );
} else if( $this->chunk_mode == UploadFromChunks::CHUNK ){
$status = $this->doChunkAppend();
// firefogg expects a specific result per:
// http://www.firefogg.org/dev/chunk_post.html
ob_clean();
- echo ApiFormatJson::getJsonEncode( array(
+ echo FormatJson::encode( array(
'result' => 1,
'filesize' => filesize( $this->getRealPath( $this->mTempAppendPath ) )
)
return $status;
}
} else if( $this->chunk_mode == UploadFromChunks::DONE ){
- // update the values from the local (session init) if not paseed again)
+ // update the values from the local (session init) if not passed again)
if( $summary == '' )
$summary = $this->mSummary;
if( $watch == '' )
$watch = $this->mWatch;
+
$status = parent::performUpload( $summary, $comment, $watch, $user );
+
if( !$status->isGood() ) {
return $status;
}
// firefogg expects a specific result per:
// http://www.firefogg.org/dev/chunk_post.html
ob_clean();
- echo ApiFormatJson::getJsonEncode( array(
+ echo FormatJson::encode( array(
'result' => 1,
'done' => 1,
'resultUrl' => $file->getDescriptionUrl()
)
);
exit( 0 );
-
}
}
// append the given chunk to the temporary uploaded file. (if no temporary uploaded file exists created it.
function doChunkAppend(){
+ global $wgMaxUploadSize;
// if we don't have a mTempAppendPath to generate a file from the chunk packaged var:
if( !$this->mTempAppendPath ){
// get temp name:
} else {
$status = Status::newFatal( 'filenotfound', $this->mTempAppendPath );
}
+ //check to make sure we have not expanded beyond $wgMaxUploadSize
+ if( filesize( $this->getRealPath( $this->mTempAppendPath ) ) > $wgMaxUploadSize )
+ $status = Status::newFatal( 'largefileserver' );
+
return $status;
}
}