2012-10-10 05:54:44 -04:00
< ? php
2024-05-23 03:26:56 -04:00
2012-10-10 05:54:44 -04:00
/**
2024-05-23 03:26:56 -04:00
* SPDX - FileCopyrightText : 2016 - 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX - FileCopyrightText : 2016 ownCloud , Inc .
* SPDX - License - Identifier : AGPL - 3.0 - only
2015-02-26 05:37:37 -05:00
*/
2012-10-10 05:54:44 -04:00
namespace OC\Files ;
2025-07-15 06:56:51 -04:00
use OC\Files\Storage\StorageFactory ;
2022-03-03 10:36:58 -05:00
use OC\User\NoUserException ;
2022-02-23 12:11:46 -05:00
use OCP\EventDispatcher\IEventDispatcher ;
2022-02-23 12:29:08 -05:00
use OCP\Files\Events\Node\FilesystemTornDownEvent ;
2023-03-13 13:33:12 -04:00
use OCP\Files\Mount\IMountManager ;
2015-06-15 08:10:10 -04:00
use OCP\Files\NotFoundException ;
2018-09-19 13:02:15 -04:00
use OCP\Files\Storage\IStorageFactory ;
2022-02-01 07:49:43 -05:00
use OCP\IUser ;
2015-05-07 08:07:02 -04:00
use OCP\IUserManager ;
2022-03-08 11:13:06 -05:00
use OCP\IUserSession ;
2024-02-08 09:47:39 -05:00
use Psr\Log\LoggerInterface ;
2013-02-15 21:27:50 -05:00
2012-10-10 05:54:44 -04:00
class Filesystem {
2023-03-13 13:33:12 -04:00
private static ? Mount\Manager $mounts = null ;
2012-10-10 05:54:44 -04:00
2023-03-13 13:33:12 -04:00
public static bool $loaded = false ;
2012-10-10 05:54:44 -04:00
2023-03-13 13:33:12 -04:00
private static ? View $defaultInstance = null ;
2015-01-10 04:48:28 -05:00
2025-09-02 12:59:33 -04:00
private static ? FilenameValidator $validator = null ;
2022-03-17 11:05:52 -04:00
2012-10-10 05:54:44 -04:00
/**
* classname which used for hooks handling
* used as signalclass in OC_Hooks :: emit ()
*/
2020-04-10 10:54:27 -04:00
public const CLASSNAME = 'OC_Filesystem' ;
2012-10-10 05:54:44 -04:00
/**
2012-10-10 06:25:46 -04:00
* signalname emitted before file renaming
2012-10-10 05:54:44 -04:00
*
2012-10-10 06:25:46 -04:00
* @ param string $oldpath
* @ param string $newpath
2012-10-10 05:54:44 -04:00
*/
2020-04-10 10:54:27 -04:00
public const signal_rename = 'rename' ;
2012-10-10 05:54:44 -04:00
/**
2012-10-10 06:25:46 -04:00
* signal emitted after file renaming
2012-10-10 05:54:44 -04:00
*
2012-10-10 06:25:46 -04:00
* @ param string $oldpath
* @ param string $newpath
2012-10-10 05:54:44 -04:00
*/
2020-04-10 10:54:27 -04:00
public const signal_post_rename = 'post_rename' ;
2012-10-10 05:54:44 -04:00
/**
2012-10-10 06:25:46 -04:00
* signal emitted before file / dir creation
2012-10-10 05:54:44 -04:00
*
2012-10-10 06:25:46 -04:00
* @ param string $path
* @ param bool $run changing this flag to false in hook handler will cancel event
2012-10-10 05:54:44 -04:00
*/
2020-04-10 10:54:27 -04:00
public const signal_create = 'create' ;
2012-10-10 05:54:44 -04:00
/**
2012-10-10 06:25:46 -04:00
* signal emitted after file / dir creation
2012-10-10 05:54:44 -04:00
*
2012-10-10 06:25:46 -04:00
* @ param string $path
* @ param bool $run changing this flag to false in hook handler will cancel event
2012-10-10 05:54:44 -04:00
*/
2020-04-10 10:54:27 -04:00
public const signal_post_create = 'post_create' ;
2012-10-10 05:54:44 -04:00
/**
* signal emits before file / dir copy
*
2012-10-10 06:25:46 -04:00
* @ param string $oldpath
* @ param string $newpath
* @ param bool $run changing this flag to false in hook handler will cancel event
2012-10-10 05:54:44 -04:00
*/
2020-04-10 10:54:27 -04:00
public const signal_copy = 'copy' ;
2012-10-10 05:54:44 -04:00
/**
* signal emits after file / dir copy
*
2012-10-10 06:25:46 -04:00
* @ param string $oldpath
* @ param string $newpath
2012-10-10 05:54:44 -04:00
*/
2020-04-10 10:54:27 -04:00
public const signal_post_copy = 'post_copy' ;
2012-10-10 05:54:44 -04:00
/**
* signal emits before file / dir save
*
2012-10-10 06:25:46 -04:00
* @ param string $path
* @ param bool $run changing this flag to false in hook handler will cancel event
2012-10-10 05:54:44 -04:00
*/
2020-04-10 10:54:27 -04:00
public const signal_write = 'write' ;
2012-10-10 05:54:44 -04:00
/**
* signal emits after file / dir save
*
2012-10-10 06:25:46 -04:00
* @ param string $path
2012-10-10 05:54:44 -04:00
*/
2020-04-10 10:54:27 -04:00
public const signal_post_write = 'post_write' ;
2012-10-10 05:54:44 -04:00
2014-04-09 10:42:10 -04:00
/**
* signal emitted before file / dir update
*
* @ param string $path
* @ param bool $run changing this flag to false in hook handler will cancel event
*/
2020-04-10 10:54:27 -04:00
public const signal_update = 'update' ;
2014-04-09 10:42:10 -04:00
/**
* signal emitted after file / dir update
*
* @ param string $path
* @ param bool $run changing this flag to false in hook handler will cancel event
*/
2020-04-10 10:54:27 -04:00
public const signal_post_update = 'post_update' ;
2014-04-09 10:42:10 -04:00
2012-10-10 05:54:44 -04:00
/**
* signal emits when reading file / dir
*
2012-10-10 06:25:46 -04:00
* @ param string $path
2012-10-10 05:54:44 -04:00
*/
2020-04-10 10:54:27 -04:00
public const signal_read = 'read' ;
2012-10-10 05:54:44 -04:00
/**
* signal emits when removing file / dir
*
2012-10-10 06:25:46 -04:00
* @ param string $path
2012-10-10 05:54:44 -04:00
*/
2020-04-10 10:54:27 -04:00
public const signal_delete = 'delete' ;
2012-10-10 05:54:44 -04:00
/**
* parameters definitions for signals
*/
2020-04-10 10:54:27 -04:00
public const signal_param_path = 'path' ;
public const signal_param_oldpath = 'oldpath' ;
public const signal_param_newpath = 'newpath' ;
2012-10-10 05:54:44 -04:00
/**
* run - changing this flag to false in hook handler will cancel event
*/
2020-04-10 10:54:27 -04:00
public const signal_param_run = 'run' ;
2012-10-10 05:54:44 -04:00
2020-04-10 10:54:27 -04:00
public const signal_create_mount = 'create_mount' ;
public const signal_delete_mount = 'delete_mount' ;
public const signal_param_mount_type = 'mounttype' ;
public const signal_param_users = 'users' ;
2014-09-26 06:51:25 -04:00
2023-03-13 13:33:12 -04:00
private static ? \OC\Files\Storage\StorageFactory $loader = null ;
2013-06-07 11:50:10 -04:00
2023-03-13 13:33:12 -04:00
private static bool $logWarningWhenAddingStorageWrapper = true ;
2016-04-29 03:08:40 -04:00
/**
* @ param bool $shouldLog
2016-11-02 05:22:36 -04:00
* @ return bool previous value
2016-04-29 03:08:40 -04:00
* @ internal
*/
2023-03-13 13:33:12 -04:00
public static function logWarningWhenAddingStorageWrapper ( bool $shouldLog ) : bool {
2016-11-02 05:22:36 -04:00
$previousValue = self :: $logWarningWhenAddingStorageWrapper ;
2023-03-13 13:33:12 -04:00
self :: $logWarningWhenAddingStorageWrapper = $shouldLog ;
2016-11-02 05:22:36 -04:00
return $previousValue ;
2016-04-29 03:08:40 -04:00
}
2013-07-25 10:01:05 -04:00
/**
2015-03-26 14:24:49 -04:00
* @ param string $wrapperName
2013-07-25 10:01:05 -04:00
* @ param callable $wrapper
2015-03-26 14:24:49 -04:00
* @ param int $priority
2013-07-25 10:01:05 -04:00
*/
2015-03-26 14:24:49 -04:00
public static function addStorageWrapper ( $wrapperName , $wrapper , $priority = 50 ) {
2016-11-14 10:13:05 -05:00
if ( self :: $logWarningWhenAddingStorageWrapper ) {
2024-02-08 09:47:39 -05:00
\OCP\Server :: get ( LoggerInterface :: class ) -> warning ( " Storage wrapper ' { wrapper}' was not registered via the 'OC_Filesystem - preSetup' hook which could cause potential problems. " , [
2016-04-29 03:08:40 -04:00
'wrapper' => $wrapperName ,
'app' => 'filesystem' ,
]);
}
2015-01-23 07:48:35 -05:00
$mounts = self :: getMountManager () -> getAll ();
2025-07-15 06:56:51 -04:00
/** @var StorageFactory $loader */
$loader = self :: getLoader ();
if ( ! $loader -> addStorageWrapper ( $wrapperName , $wrapper , $priority , $mounts )) {
2015-01-21 16:27:59 -05:00
// do not re-wrap if storage with this name already existed
return ;
}
2013-07-25 10:01:05 -04:00
}
2015-01-21 15:54:43 -05:00
/**
* Returns the storage factory
*
2018-09-19 13:02:15 -04:00
* @ return IStorageFactory
2015-01-21 15:54:43 -05:00
*/
2013-07-19 10:33:00 -04:00
public static function getLoader () {
2013-06-07 11:50:10 -04:00
if ( ! self :: $loader ) {
2023-03-13 13:33:12 -04:00
self :: $loader = \OC :: $server -> get ( IStorageFactory :: class );
2013-06-07 11:50:10 -04:00
}
return self :: $loader ;
}
2013-06-07 11:07:13 -04:00
2015-01-21 15:54:43 -05:00
/**
* Returns the mount manager
*/
2023-03-13 13:33:12 -04:00
public static function getMountManager () : Mount\Manager {
2022-01-31 09:53:28 -05:00
self :: initMountManager ();
2023-03-13 13:33:12 -04:00
assert ( self :: $mounts !== null );
2013-07-19 10:33:00 -04:00
return self :: $mounts ;
}
2012-10-10 05:54:44 -04:00
/**
* get the mountpoint of the storage object for a path
2013-02-11 11:44:02 -05:00
* ( note : because a storage is not always mounted inside the fakeroot , the
* returned mountpoint is relative to the absolute root of the filesystem
* and doesn ' t take the chroot into account )
2012-10-10 05:54:44 -04:00
*
2012-10-10 06:25:46 -04:00
* @ param string $path
2012-10-10 05:54:44 -04:00
* @ return string
*/
2020-04-10 10:51:06 -04:00
public static function getMountPoint ( $path ) {
2013-06-02 16:09:44 -04:00
if ( ! self :: $mounts ) {
\OC_Util :: setupFS ();
}
2013-04-25 18:01:36 -04:00
$mount = self :: $mounts -> find ( $path );
2022-03-03 11:15:02 -05:00
return $mount -> getMountPoint ();
2012-10-10 05:54:44 -04:00
}
2012-10-20 20:12:58 -04:00
/**
* get a list of all mount points in a directory
*
* @ param string $path
* @ return string []
*/
2020-04-10 10:51:06 -04:00
public static function getMountPoints ( $path ) {
2013-06-02 16:09:44 -04:00
if ( ! self :: $mounts ) {
\OC_Util :: setupFS ();
}
2020-03-26 04:30:18 -04:00
$result = [];
2013-04-25 18:01:36 -04:00
$mounts = self :: $mounts -> findIn ( $path );
2013-01-26 15:42:59 -05:00
foreach ( $mounts as $mount ) {
$result [] = $mount -> getMountPoint ();
2012-10-20 20:12:58 -04:00
}
return $result ;
}
/**
* get the storage mounted at $mountPoint
*
* @ param string $mountPoint
2021-03-24 09:56:40 -04:00
* @ return \OC\Files\Storage\Storage | null
2012-10-20 20:12:58 -04:00
*/
public static function getStorage ( $mountPoint ) {
2022-01-31 09:53:28 -05:00
$mount = self :: getMountManager () -> find ( $mountPoint );
2013-01-26 15:42:59 -05:00
return $mount -> getStorage ();
2012-10-20 20:12:58 -04:00
}
2013-04-25 18:01:36 -04:00
/**
2014-05-11 16:51:30 -04:00
* @ param string $id
2014-11-24 09:54:42 -05:00
* @ return Mount\MountPoint []
2013-04-25 18:01:36 -04:00
*/
public static function getMountByStorageId ( $id ) {
2022-01-31 09:53:28 -05:00
return self :: getMountManager () -> findByStorageId ( $id );
2013-04-25 18:01:36 -04:00
}
/**
2014-05-11 16:51:30 -04:00
* @ param int $id
2014-11-24 09:54:42 -05:00
* @ return Mount\MountPoint []
2013-04-25 18:01:36 -04:00
*/
public static function getMountByNumericId ( $id ) {
2022-01-31 09:53:28 -05:00
return self :: getMountManager () -> findByNumericId ( $id );
2013-04-25 18:01:36 -04:00
}
2012-10-10 05:54:44 -04:00
/**
* resolve a path to a storage and internal path
*
* @ param string $path
2023-03-13 13:33:12 -04:00
* @ return array { ? \OCP\Files\Storage\IStorage , string } an array consisting of the storage and the internal path
2012-10-10 05:54:44 -04:00
*/
2023-03-13 13:33:12 -04:00
public static function resolvePath ( $path ) : array {
2022-01-31 09:53:28 -05:00
$mount = self :: getMountManager () -> find ( $path );
2022-03-03 11:15:02 -05:00
return [ $mount -> getStorage (), rtrim ( $mount -> getInternalPath ( $path ), '/' )];
2012-10-10 05:54:44 -04:00
}
2023-03-13 13:33:12 -04:00
public static function init ( string | IUser | null $user , string $root ) : bool {
2022-03-08 11:13:06 -05:00
if ( self :: $defaultInstance ) {
return false ;
}
self :: initInternal ( $root );
//load custom mount config
self :: initMountPoints ( $user );
return true ;
}
2023-03-13 13:33:12 -04:00
public static function initInternal ( string $root ) : bool {
2012-10-10 05:54:44 -04:00
if ( self :: $defaultInstance ) {
return false ;
}
2013-06-07 11:50:10 -04:00
self :: getLoader ();
2012-10-10 06:25:46 -04:00
self :: $defaultInstance = new View ( $root );
2022-02-23 12:11:46 -05:00
/** @var IEventDispatcher $eventDispatcher */
$eventDispatcher = \OC :: $server -> get ( IEventDispatcher :: class );
2022-02-23 12:29:08 -05:00
$eventDispatcher -> addListener ( FilesystemTornDownEvent :: class , function () {
2022-02-23 12:11:46 -05:00
self :: $defaultInstance = null ;
self :: $loaded = false ;
});
2013-05-15 04:19:38 -04:00
2023-03-13 13:33:12 -04:00
self :: initMountManager ();
2012-10-10 05:54:44 -04:00
2012-11-22 00:44:48 -05:00
self :: $loaded = true ;
return true ;
}
2023-03-13 13:33:12 -04:00
public static function initMountManager () : void {
2013-06-02 16:09:44 -04:00
if ( ! self :: $mounts ) {
2023-03-13 13:33:12 -04:00
self :: $mounts = \OC :: $server -> get ( IMountManager :: class );
2013-05-19 19:57:16 -04:00
}
2013-04-25 18:01:36 -04:00
}
2012-11-22 00:44:48 -05:00
/**
2013-01-22 14:58:09 -05:00
* Initialize system and personal mount points for a user
*
2015-06-23 11:09:00 -04:00
* @ throws \OC\User\NoUserException if the user is not available
2013-01-22 14:58:09 -05:00
*/
2023-03-13 13:33:12 -04:00
public static function initMountPoints ( string | IUser | null $user = '' ) : void {
2022-03-03 10:36:58 -05:00
/** @var IUserManager $userManager */
$userManager = \OC :: $server -> get ( IUserManager :: class );
$userObject = ( $user instanceof IUser ) ? $user : $userManager -> get ( $user );
if ( $userObject ) {
/** @var SetupManager $setupManager */
$setupManager = \OC :: $server -> get ( SetupManager :: class );
$setupManager -> setupForUser ( $userObject );
2022-02-01 07:53:22 -05:00
} else {
2022-03-03 10:36:58 -05:00
throw new NoUserException ();
2015-05-07 08:07:02 -04:00
}
}
2012-10-10 05:54:44 -04:00
/**
2023-03-13 13:33:12 -04:00
* Get the default filesystem view
2012-10-10 05:54:44 -04:00
*/
2023-03-13 13:33:12 -04:00
public static function getView () : ? View {
2022-03-08 11:13:06 -05:00
if ( ! self :: $defaultInstance ) {
/** @var IUserSession $session */
$session = \OC :: $server -> get ( IUserSession :: class );
$user = $session -> getUser ();
if ( $user ) {
$userDir = '/' . $user -> getUID () . '/files' ;
self :: initInternal ( $userDir );
}
}
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance ;
}
/**
* tear down the filesystem , removing all storage providers
*/
2020-04-10 10:51:06 -04:00
public static function tearDown () {
2022-02-23 12:11:46 -05:00
\OC_Util :: tearDownFS ();
2012-10-10 05:54:44 -04:00
}
/**
2014-05-19 11:50:53 -04:00
* get the relative path of the root data directory for the current user
2015-05-07 08:07:02 -04:00
*
2023-02-28 10:51:44 -05:00
* @ return ? string
2012-10-10 05:54:44 -04:00
*
* Returns path like / admin / files
*/
2020-04-10 10:51:06 -04:00
public static function getRoot () {
2014-04-23 06:54:18 -04:00
if ( ! self :: $defaultInstance ) {
return null ;
}
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> getRoot ();
}
/**
* mount an \OC\Files\Storage\Storage in our virtual filesystem
*
2012-10-20 20:12:58 -04:00
* @ param \OC\Files\Storage\Storage | string $class
2012-10-10 06:25:46 -04:00
* @ param array $arguments
* @ param string $mountpoint
2012-10-10 05:54:44 -04:00
*/
2020-04-10 10:51:06 -04:00
public static function mount ( $class , $arguments , $mountpoint ) {
2013-06-02 16:09:44 -04:00
if ( ! self :: $mounts ) {
\OC_Util :: setupFS ();
}
2014-11-24 09:54:42 -05:00
$mount = new Mount\MountPoint ( $class , $mountpoint , $arguments , self :: getLoader ());
2013-04-25 18:01:36 -04:00
self :: $mounts -> addMount ( $mount );
2012-10-10 05:54:44 -04:00
}
/**
* check if the requested path is valid
*
2012-10-10 06:25:46 -04:00
* @ param string $path
2012-10-10 05:54:44 -04:00
* @ return bool
*/
2020-04-10 10:51:06 -04:00
public static function isValidPath ( $path ) {
2012-11-02 16:42:29 -04:00
$path = self :: normalizePath ( $path );
2012-10-10 05:54:44 -04:00
if ( ! $path || $path [ 0 ] !== '/' ) {
$path = '/' . $path ;
}
2023-05-15 07:47:19 -04:00
if ( str_contains ( $path , '/../' ) || strrchr ( $path , '/' ) === '/..' ) {
2012-10-10 05:54:44 -04:00
return false ;
}
return true ;
}
2013-02-22 10:13:08 -05:00
/**
* @ param string $filename
* @ return bool
2025-09-02 12:59:33 -04:00
*
* @ deprecated 30.0 . 0 - use \OC\Files\FilenameValidator :: isForbidden
2013-02-22 10:13:08 -05:00
*/
2020-04-10 10:51:06 -04:00
public static function isFileBlacklisted ( $filename ) {
2025-09-02 12:59:33 -04:00
if ( self :: $validator === null ) {
self :: $validator = \OCP\Server :: get ( FilenameValidator :: class );
2022-03-17 11:05:52 -04:00
}
2025-09-02 12:59:33 -04:00
$filename = self :: normalizePath ( $filename );
return self :: $validator -> isForbidden ( $filename );
2013-02-22 10:13:08 -05:00
}
2013-05-19 14:15:49 -04:00
/**
2014-05-19 11:50:53 -04:00
* check if the directory should be ignored when scanning
2013-05-19 14:15:49 -04:00
* NOTE : the special directories . and .. would cause never ending recursion
2015-05-07 08:07:02 -04:00
*
2018-11-15 05:51:28 -05:00
* @ param string $dir
2013-05-19 14:15:49 -04:00
* @ return boolean
*/
2020-04-10 10:51:06 -04:00
public static function isIgnoredDir ( $dir ) {
2013-05-19 14:15:49 -04:00
if ( $dir === '.' || $dir === '..' ) {
return true ;
}
return false ;
}
2012-10-10 05:54:44 -04:00
/**
* following functions are equivalent to their php builtin equivalents for arguments / return values .
*/
2020-04-10 10:51:06 -04:00
public static function mkdir ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> mkdir ( $path );
}
2020-04-10 10:51:06 -04:00
public static function rmdir ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> rmdir ( $path );
}
2020-04-10 10:51:06 -04:00
public static function is_dir ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> is_dir ( $path );
}
2020-04-10 10:51:06 -04:00
public static function is_file ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> is_file ( $path );
}
2020-04-10 10:51:06 -04:00
public static function stat ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> stat ( $path );
}
2020-04-10 10:51:06 -04:00
public static function filetype ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> filetype ( $path );
}
2020-04-10 10:51:06 -04:00
public static function filesize ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> filesize ( $path );
}
2020-04-10 10:51:06 -04:00
public static function readfile ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> readfile ( $path );
}
2020-04-10 10:51:06 -04:00
public static function isCreatable ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> isCreatable ( $path );
}
2020-04-10 10:51:06 -04:00
public static function isReadable ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> isReadable ( $path );
}
2020-04-10 10:51:06 -04:00
public static function isUpdatable ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> isUpdatable ( $path );
}
2020-04-10 10:51:06 -04:00
public static function isDeletable ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> isDeletable ( $path );
}
2020-04-10 10:51:06 -04:00
public static function isSharable ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> isSharable ( $path );
}
2020-04-10 10:51:06 -04:00
public static function file_exists ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> file_exists ( $path );
}
2020-04-10 10:51:06 -04:00
public static function filemtime ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> filemtime ( $path );
}
2020-04-10 10:51:06 -04:00
public static function touch ( $path , $mtime = null ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> touch ( $path , $mtime );
}
2014-02-06 10:30:58 -05:00
/**
2023-04-27 03:56:05 -04:00
* @ return string | false
2014-02-06 10:30:58 -05:00
*/
2020-04-10 10:51:06 -04:00
public static function file_get_contents ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> file_get_contents ( $path );
}
2020-04-10 10:51:06 -04:00
public static function file_put_contents ( $path , $data ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> file_put_contents ( $path , $data );
}
2020-04-10 10:51:06 -04:00
public static function unlink ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> unlink ( $path );
}
2022-10-18 06:49:34 -04:00
public static function rename ( $source , $target ) {
return self :: $defaultInstance -> rename ( $source , $target );
2012-10-10 05:54:44 -04:00
}
2022-10-18 06:49:34 -04:00
public static function copy ( $source , $target ) {
return self :: $defaultInstance -> copy ( $source , $target );
2012-10-10 05:54:44 -04:00
}
2020-04-10 10:51:06 -04:00
public static function fopen ( $path , $mode ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> fopen ( $path , $mode );
}
2014-02-06 10:30:58 -05:00
/**
2023-02-28 10:51:44 -05:00
* @ param string $path
* @ throws \OCP\Files\InvalidPathException
2014-02-06 10:30:58 -05:00
*/
2023-02-28 10:51:44 -05:00
public static function toTmpFile ( $path ) : string | false {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> toTmpFile ( $path );
}
2020-04-10 10:51:06 -04:00
public static function fromTmpFile ( $tmpFile , $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> fromTmpFile ( $tmpFile , $path );
}
2020-04-10 10:51:06 -04:00
public static function getMimeType ( $path ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> getMimeType ( $path );
}
2020-04-10 10:51:06 -04:00
public static function hash ( $type , $path , $raw = false ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> hash ( $type , $path , $raw );
}
2020-04-10 10:51:06 -04:00
public static function free_space ( $path = '/' ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> free_space ( $path );
}
2020-04-10 10:51:06 -04:00
public static function search ( $query ) {
2012-10-26 07:23:15 -04:00
return self :: $defaultInstance -> search ( $query );
2012-10-10 05:54:44 -04:00
}
2014-02-19 03:31:54 -05:00
/**
* @ param string $query
*/
2020-04-10 10:51:06 -04:00
public static function searchByMime ( $query ) {
2012-10-27 04:34:25 -04:00
return self :: $defaultInstance -> searchByMime ( $query );
}
2014-12-04 08:01:15 -05:00
/**
* @ param string | int $tag name or tag id
2014-12-12 05:18:35 -05:00
* @ param string $userId owner of the tags
2014-12-04 08:01:15 -05:00
* @ return FileInfo [] array or file info
*/
2020-04-10 10:51:06 -04:00
public static function searchByTag ( $tag , $userId ) {
2014-12-12 05:18:35 -05:00
return self :: $defaultInstance -> searchByTag ( $tag , $userId );
2014-12-04 08:01:15 -05:00
}
2012-10-10 05:54:44 -04:00
/**
* check if a file or folder has been updated since $time
*
2013-01-26 15:42:59 -05:00
* @ param string $path
2012-10-10 05:54:44 -04:00
* @ param int $time
* @ return bool
*/
2020-04-10 10:51:06 -04:00
public static function hasUpdated ( $path , $time ) {
2012-10-10 05:54:44 -04:00
return self :: $defaultInstance -> hasUpdated ( $path , $time );
}
/**
2014-05-19 11:50:53 -04:00
* Fix common problems with a file path
2015-05-07 08:07:02 -04:00
*
2012-10-10 06:25:46 -04:00
* @ param string $path
2016-04-29 05:19:00 -04:00
* @ param bool $stripTrailingSlash whether to strip the trailing slash
* @ param bool $isAbsolutePath whether the given path is absolute
* @ param bool $keepUnicode true to disable unicode normalization
2022-08-31 15:15:02 -04:00
* @ psalm - taint - escape file
2012-10-10 05:54:44 -04:00
* @ return string
*/
2016-04-29 05:19:00 -04:00
public static function normalizePath ( $path , $stripTrailingSlash = true , $isAbsolutePath = false , $keepUnicode = false ) {
2015-02-13 06:49:34 -05:00
/**
* FIXME : This is a workaround for existing classes and files which call
* this function with another type than a valid string . This
* conversion should get removed as soon as all existing
* function calls have been fixed .
*/
$path = ( string ) $path ;
2021-03-27 09:47:58 -04:00
if ( $path === '' ) {
return '/' ;
}
2015-02-06 09:03:29 -05:00
//normalize unicode if possible
2016-04-29 05:19:00 -04:00
if ( ! $keepUnicode ) {
$path = \OC_Util :: normalizeUnicode ( $path );
}
2015-02-06 09:03:29 -05:00
2018-10-08 16:51:40 -04:00
//add leading slash, if it is already there we strip it anyway
$path = '/' . $path ;
2013-11-14 07:15:03 -05:00
2018-10-08 16:51:40 -04:00
$patterns = [
2021-03-27 15:57:27 -04:00
'#\\\\#s' , // no windows style '\\' slashes
'#/\.(/\.)*/#s' , // remove '/./'
'#\//+#s' , // remove sequence of slashes
'#/\.$#s' , // remove trailing '/.'
2018-10-08 16:51:40 -04:00
];
2013-11-14 07:15:03 -05:00
2018-10-08 16:51:40 -04:00
do {
$count = 0 ;
$path = preg_replace ( $patterns , '/' , $path , - 1 , $count );
} while ( $count > 0 );
2013-11-14 07:15:03 -05:00
2013-02-05 10:37:40 -05:00
//remove trailing slash
2018-10-08 16:51:40 -04:00
if ( $stripTrailingSlash && strlen ( $path ) > 1 ) {
2018-01-25 16:26:47 -05:00
$path = rtrim ( $path , '/' );
2012-10-26 06:37:49 -04:00
}
2013-11-14 07:15:03 -05:00
2018-10-08 16:51:40 -04:00
return $path ;
2012-10-10 05:54:44 -04:00
}
2012-10-26 06:30:25 -04:00
/**
* get the filesystem info
*
* @ param string $path
2023-01-24 05:40:56 -05:00
* @ param bool | string $includeMountPoints whether to add mountpoint sizes ,
2024-08-23 09:10:27 -04:00
* defaults to true
2022-01-26 09:28:48 -05:00
* @ return \OC\Files\FileInfo | false False if file does not exist
2012-10-26 06:30:25 -04:00
*/
2013-11-18 11:29:30 -05:00
public static function getFileInfo ( $path , $includeMountPoints = true ) {
2022-03-08 11:13:06 -05:00
return self :: getView () -> getFileInfo ( $path , $includeMountPoints );
2012-10-26 06:30:25 -04:00
}
2012-10-26 17:05:02 -04:00
/**
* change file metadata
*
* @ param string $path
* @ param array $data
* @ return int
*
* returns the fileid of the updated file
*/
public static function putFileInfo ( $path , $data ) {
return self :: $defaultInstance -> putFileInfo ( $path , $data );
}
2012-10-26 06:30:25 -04:00
/**
* get the content of a directory
*
* @ param string $directory path under datadirectory
2013-04-08 16:40:03 -04:00
* @ param string $mimetype_filter limit returned content to this mimetype or mimepart
2014-02-27 08:04:19 -05:00
* @ return \OC\Files\FileInfo []
2012-10-26 06:30:25 -04:00
*/
2013-04-08 16:40:03 -04:00
public static function getDirectoryContent ( $directory , $mimetype_filter = '' ) {
return self :: $defaultInstance -> getDirectoryContent ( $directory , $mimetype_filter );
2012-10-26 06:30:25 -04:00
}
2012-11-08 11:47:00 -05:00
2013-01-26 18:18:15 -05:00
/**
* Get the path of a file by id
*
2013-07-15 23:56:52 -04:00
* Note that the resulting path is not guaranteed to be unique for the id , multiple paths can point to the same file
2013-01-26 18:18:15 -05:00
*
* @ param int $id
2015-06-15 08:10:10 -04:00
* @ throws NotFoundException
2013-01-26 18:18:15 -05:00
* @ return string
*/
public static function getPath ( $id ) {
return self :: $defaultInstance -> getPath ( $id );
}
2013-02-02 18:50:40 -05:00
/**
2013-02-15 19:30:44 -05:00
* Get the owner for a file or folder
*
* @ param string $path
* @ return string
*/
2013-02-02 18:50:40 -05:00
public static function getOwner ( $path ) {
return self :: $defaultInstance -> getOwner ( $path );
}
2012-11-08 11:47:00 -05:00
/**
* get the ETag for a file or folder
*/
2023-03-13 13:59:16 -04:00
public static function getETag ( string $path ) : string | false {
2012-11-08 11:47:00 -05:00
return self :: $defaultInstance -> getETag ( $path );
}
2012-10-10 05:54:44 -04:00
}