X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2Fupload%2FUploadStash.php;h=c171ded7da02abc554456fe4a9de6671c95b9b5a;hp=b971c00f356cd3ce74d320092666f1f9eeac74ee;hb=e3bd13db0c285f312e31bb1b7271af4628cca80c;hpb=27dfd0aff41243e35b31ecbfe4ed34cbbe6f57a6 diff --git a/includes/upload/UploadStash.php b/includes/upload/UploadStash.php index b971c00f35..c171ded7da 100644 --- a/includes/upload/UploadStash.php +++ b/includes/upload/UploadStash.php @@ -54,6 +54,7 @@ class UploadStash { // Format of the key for files -- has to be suitable as a filename itself (e.g. ab12cd34ef.jpg) const KEY_FORMAT_REGEX = '/^[\w-\.]+\.\w*$/'; + const MAX_US_PROPS_SIZE = 65535; /** * repository that this uses to store temp files @@ -64,13 +65,13 @@ class UploadStash { public $repo; // array of initialized repo objects - protected $files = array(); + protected $files = []; // cache of the file metadata that's stored in the database - protected $fileMetadata = array(); + protected $fileMetadata = []; // fileprops cache - protected $fileProps = array(); + protected $fileProps = []; // current user protected $user, $userId, $isLoggedIn; @@ -225,8 +226,8 @@ class UploadStash { // see: http://www.jwz.org/doc/mid.html list( $usec, $sec ) = explode( ' ', microtime() ); $usec = substr( $usec, 2 ); - $key = wfBaseConvert( $sec . $usec, 10, 36 ) . '.' . - wfBaseConvert( mt_rand(), 10, 36 ) . '.' . + $key = Wikimedia\base_convert( $sec . $usec, 10, 36 ) . '.' . + Wikimedia\base_convert( mt_rand(), 10, 36 ) . '.' . $this->userId . '.' . $extension; @@ -256,7 +257,7 @@ class UploadStash { $error = $storeStatus->getWarningsArray(); $error = reset( $error ); if ( !count( $error ) ) { - $error = array( 'unknown', 'no error recorded' ); + $error = [ 'unknown', 'no error recorded' ]; } } // At this point, $error should contain the single "most important" @@ -275,15 +276,24 @@ class UploadStash { // insert the file metadata into the db. wfDebug( __METHOD__ . " inserting $stashPath under $key\n" ); - $dbw = $this->repo->getMasterDb(); + $dbw = $this->repo->getMasterDB(); + + $serializedFileProps = serialize( $fileProps ); + if ( strlen( $serializedFileProps ) > self::MAX_US_PROPS_SIZE ) { + // Database is going to truncate this and make the field invalid. + // Prioritize important metadata over file handler metadata. + // File handler should be prepared to regenerate invalid metadata if needed. + $fileProps['metadata'] = false; + $serializedFileProps = serialize( $fileProps ); + } - $this->fileMetadata[$key] = array( + $this->fileMetadata[$key] = [ 'us_id' => $dbw->nextSequenceValue( 'uploadstash_us_id_seq' ), 'us_user' => $this->userId, 'us_key' => $key, 'us_orig_path' => $path, 'us_path' => $stashPath, // virtual URL - 'us_props' => $dbw->encodeBlob( serialize( $fileProps ) ), + 'us_props' => $dbw->encodeBlob( $serializedFileProps ), 'us_size' => $fileProps['size'], 'us_sha1' => $fileProps['sha1'], 'us_mime' => $fileProps['mime'], @@ -294,7 +304,7 @@ class UploadStash { 'us_source_type' => $sourceType, 'us_timestamp' => $dbw->timestamp(), 'us_status' => 'finished' - ); + ]; $dbw->insert( 'uploadstash', @@ -326,16 +336,16 @@ class UploadStash { } wfDebug( __METHOD__ . ' clearing all rows for user ' . $this->userId . "\n" ); - $dbw = $this->repo->getMasterDb(); + $dbw = $this->repo->getMasterDB(); $dbw->delete( 'uploadstash', - array( 'us_user' => $this->userId ), + [ 'us_user' => $this->userId ], __METHOD__ ); # destroy objects. - $this->files = array(); - $this->fileMetadata = array(); + $this->files = []; + $this->fileMetadata = []; return true; } @@ -354,14 +364,14 @@ class UploadStash { . ' No user is logged in, files must belong to users' ); } - $dbw = $this->repo->getMasterDb(); + $dbw = $this->repo->getMasterDB(); // this is a cheap query. it runs on the master so that this function // still works when there's lag. It won't be called all that often. $row = $dbw->selectRow( 'uploadstash', 'us_user', - array( 'us_key' => $key ), + [ 'us_key' => $key ], __METHOD__ ); @@ -389,11 +399,11 @@ class UploadStash { // Ensure we have the UploadStashFile loaded for this key $this->getFile( $key, true ); - $dbw = $this->repo->getMasterDb(); + $dbw = $this->repo->getMasterDB(); $dbw->delete( 'uploadstash', - array( 'us_key' => $key ), + [ 'us_key' => $key ], __METHOD__ ); @@ -420,11 +430,11 @@ class UploadStash { . ' No user is logged in, files must belong to users' ); } - $dbr = $this->repo->getSlaveDb(); + $dbr = $this->repo->getSlaveDB(); $res = $dbr->select( 'uploadstash', 'us_key', - array( 'us_user' => $this->userId ), + [ 'us_user' => $this->userId ], __METHOD__ ); @@ -434,7 +444,7 @@ class UploadStash { } // finish the read before starting writes. - $keys = array(); + $keys = []; foreach ( $res as $row ) { array_push( $keys, $row->us_key ); } @@ -497,15 +507,15 @@ class UploadStash { $dbr = null; if ( $readFromDB === DB_MASTER ) { // sometimes reading from the master is necessary, if there's replication lag. - $dbr = $this->repo->getMasterDb(); + $dbr = $this->repo->getMasterDB(); } else { - $dbr = $this->repo->getSlaveDb(); + $dbr = $this->repo->getSlaveDB(); } $row = $dbr->selectRow( 'uploadstash', '*', - array( 'us_key' => $key ), + [ 'us_key' => $key ], __METHOD__ );