*/
protected $pathDisclosureProtection = 'simple';
- /** @var bool Public zone URL. */
+ /** @var string|false Public zone URL. */
protected $url;
/** @var string The base thumbnail URL. Defaults to "<url>/thumb". */
* @return bool Whether non-ASCII path characters are allowed
*/
public function backendSupportsUnicodePaths() {
- return ( $this->getBackend()->getFeatures() & FileBackend::ATTR_UNICODE_PATHS );
+ return (bool)( $this->getBackend()->getFeatures() & FileBackend::ATTR_UNICODE_PATHS );
}
/**
if ( $this->oldFileFactory ) {
return call_user_func( $this->oldFileFactory, $title, $this, $time );
} else {
- return false;
+ return null;
}
} else {
return call_user_func( $this->fileFactory, $title, $this );
* constructor, whereas local repositories use the local Title functions.
*
* @param string $name
- * @return string
+ * @return string|false
*/
public function getDescriptionUrl( $name ) {
$encName = wfUrlencode( $name );
*
* @param string $name Name of image to fetch
* @param string $lang Language to fetch it in, if any.
- * @return string
+ * @return string|false
*/
public function getDescriptionRenderUrl( $name, $lang = null ) {
$query = 'action=render';
if ( !is_null( $lang ) ) {
- $query .= '&uselang=' . $lang;
+ $query .= '&uselang=' . urlencode( $lang );
}
if ( isset( $this->scriptDirUrl ) ) {
return $this->makeUrl(
* self::OVERWRITE_SAME Overwrite the file if the destination exists and has the
* same contents as the source
* self::SKIP_LOCKING Skip any file locking when doing the store
- * @return FileRepoStatus
+ * @return Status
*/
public function store( $srcPath, $dstZone, $dstRel, $flags = 0 ) {
$this->assertWritableRepo(); // fail out if read-only
* same contents as the source
* self::SKIP_LOCKING Skip any file locking when doing the store
* @throws MWException
- * @return FileRepoStatus
+ * @return Status
*/
public function storeBatch( array $triplets, $flags = 0 ) {
$this->assertWritableRepo(); // fail out if read-only
* @param array $files List of files to delete
* @param int $flags Bitwise combination of the following flags:
* self::SKIP_LOCKING Skip any file locking when doing the deletions
- * @return FileRepoStatus
+ * @return Status
*/
public function cleanupBatch( array $files, $flags = 0 ) {
$this->assertWritableRepo(); // fail out if read-only
* @param array|string|null $options An array consisting of a key named headers
* listing extra headers. If a string, taken as content-disposition header.
* (Support for array of options new in 1.23)
- * @return FileRepoStatus
+ * @return Status
*/
final public function quickImport( $src, $dst, $options = null ) {
return $this->quickImportBatch( [ [ $src, $dst, $options ] ] );
* This is intended for purging thumbnails.
*
* @param string $path Virtual URL or storage path
- * @return FileRepoStatus
+ * @return Status
*/
final public function quickPurge( $path ) {
return $this->quickPurgeBatch( [ $path ] );
* When "headers" are given they are used as HTTP headers if supported.
*
* @param array $triples List of (source path or FSFile, destination path, disposition)
- * @return FileRepoStatus
+ * @return Status
*/
public function quickImportBatch( array $triples ) {
$status = $this->newGood();
* This does no locking nor journaling and is intended for purging thumbnails.
*
* @param array $paths List of virtual URLs or storage paths
- * @return FileRepoStatus
+ * @return Status
*/
public function quickPurgeBatch( array $paths ) {
$status = $this->newGood();
/**
* Pick a random name in the temp zone and store a file to it.
- * Returns a FileRepoStatus object with the file Virtual URL in the value,
+ * Returns a Status object with the file Virtual URL in the value,
* file can later be disposed using FileRepo::freeTemp().
*
* @param string $originalName The base name of the file as specified
* by the user. The file extension will be maintained.
* @param string $srcPath The current location of the file.
- * @return FileRepoStatus Object with the URL in the value.
+ * @return Status Object with the URL in the value.
*/
public function storeTemp( $originalName, $srcPath ) {
$this->assertWritableRepo(); // fail out if read-only
* @param string $dstPath Target file system path
* @param int $flags Bitwise combination of the following flags:
* self::DELETE_SOURCE Delete the source files on success
- * @return FileRepoStatus
+ * @return Status
*/
public function concatenate( array $srcPaths, $dstPath, $flags = 0 ) {
$this->assertWritableRepo(); // fail out if read-only
* Copy or move a file either from a storage path, virtual URL,
* or file system path, into this repository at the specified destination location.
*
- * Returns a FileRepoStatus object. On success, the value contains "new" or
+ * Returns a Status object. On success, the value contains "new" or
* "archived", to indicate whether the file was new with that name.
*
* Options to $options include:
* @param int $flags Bitfield, may be FileRepo::DELETE_SOURCE to indicate
* that the source file should be deleted if possible
* @param array $options Optional additional parameters
- * @return FileRepoStatus
+ * @return Status
*/
public function publish(
$src, $dstRel, $archiveRel, $flags = 0, array $options = []
* @param int $flags Bitfield, may be FileRepo::DELETE_SOURCE to indicate
* that the source files should be deleted if possible
* @throws MWException
- * @return FileRepoStatus
+ * @return Status
*/
public function publishBatch( array $ntuples, $flags = 0 ) {
$this->assertWritableRepo(); // fail out if read-only
$params = [ 'noAccess' => true, 'noListing' => true ] + $params;
}
- return $this->backend->prepare( $params );
+ $status = $this->newGood();
+ $status->merge( $this->backend->prepare( $params ) );
+
+ return $status;
}
/**
* @param mixed $srcRel Relative path for the file to be deleted
* @param mixed $archiveRel Relative path for the archive location.
* Relative to a private archive directory.
- * @return FileRepoStatus
+ * @return Status
*/
public function delete( $srcRel, $archiveRel ) {
$this->assertWritableRepo(); // fail out if read-only
* public root in the first element, and the archive file path relative
* to the deleted zone root in the second element.
* @throws MWException
- * @return FileRepoStatus
+ * @return Status
*/
public function deleteBatch( array $sourceDestPairs ) {
$this->assertWritableRepo(); // fail out if read-only
'dst' => $archivePath,
// We may have 2+ identical files being deleted,
// all of which will map to the same destination file
- 'overwriteSame' => true // also see bug 31792
+ 'overwriteSame' => true // also see T33792
];
}
$path = $this->resolveToStoragePath( $virtualUrl );
$params = [ 'src' => $path, 'headers' => $headers, 'options' => $optHeaders ];
- return $this->backend->streamFile( $params );
+ // T172851: HHVM does not flush the output properly, causing OOM
+ ob_start( null, 1048576 );
+ ob_implicit_flush( true );
+
+ $status = $this->newGood();
+ $status->merge( $this->backend->streamFile( $params ) );
+
+ ob_end_flush();
+
+ return $status;
}
/**
return $this->supportsSha1URLs;
}
}
-
-/**
- * FileRepo for temporary files created via FileRepo::getTempRepo()
- */
-class TempFileRepo extends FileRepo {
- public function getTempRepo() {
- throw new MWException( "Cannot get a temp repo from a temp repo." );
- }
-}