2011-06-12 00:14:24 +04:00
< ? php
/**
* ownCloud
*
2014-04-02 14:04:51 +04:00
* @ author Bjoern Schiessle , Michael Gapczynski
* @ copyright 2011 Michael Gapczynski < mtgap @ owncloud . com >
* 2014 Bjoern Schiessle < schiessle @ owncloud . com >
2011-06-12 00:14:24 +04:00
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation ; either
* version 3 of the License , or any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details .
*
* You should have received a copy of the GNU Affero General Public
* License along with this library . If not , see < http :// www . gnu . org / licenses />.
*
*/
2012-09-07 20:30:48 +04:00
namespace OC\Files\Storage ;
2011-06-16 22:40:21 +04:00
/**
* Convert target path to source path and pass the function call to the correct storage provider
*/
2012-09-07 20:30:48 +04:00
class Shared extends \OC\Files\Storage\Common {
2012-08-29 10:42:49 +04:00
2014-04-14 13:33:10 +04:00
private $share ; // the shared resource
2012-07-24 04:08:05 +04:00
private $files = array ();
2012-08-29 10:42:49 +04:00
2011-07-12 21:10:29 +04:00
public function __construct ( $arguments ) {
2014-04-14 13:33:10 +04:00
$this -> share = $arguments [ 'share' ];
2011-06-16 22:40:21 +04:00
}
2012-06-23 01:43:04 +04:00
2014-04-04 20:32:49 +04:00
/**
2014-05-19 19:50:53 +04:00
* get id of the mount point
2014-04-04 20:32:49 +04:00
* @ return string
*/
2013-11-11 20:58:20 +04:00
public function getId () {
2014-04-14 13:33:10 +04:00
return 'shared::' . $this -> getMountPoint ();
2011-06-27 19:47:36 +04:00
}
2012-06-23 01:43:04 +04:00
2014-04-04 20:32:49 +04:00
/**
2014-05-19 19:50:53 +04:00
* get file cache of the shared item source
2014-04-04 20:32:49 +04:00
* @ return string
*/
public function getSourceId () {
2014-04-14 13:33:10 +04:00
return $this -> share [ 'file_source' ];
2014-04-04 20:32:49 +04:00
}
2012-07-24 04:08:05 +04:00
/**
2014-05-19 19:50:53 +04:00
* Get the source file path , permissions , and owner for a shared file
2014-05-15 16:19:32 +04:00
* @ param string $target Shared target file path
2013-11-11 20:58:20 +04:00
* @ return Returns array with the keys path , permissions , and owner or false if not found
*/
2013-11-05 16:58:14 +04:00
public function getFile ( $target ) {
2012-12-16 04:44:46 +04:00
if ( ! isset ( $this -> files [ $target ])) {
2013-02-24 00:32:59 +04:00
// Check for partial files
if ( pathinfo ( $target , PATHINFO_EXTENSION ) === 'part' ) {
2014-04-14 13:33:10 +04:00
$source = \OC_Share_Backend_File :: getSource ( substr ( $target , 0 , - 5 ), $this -> getMountPoint (), $this -> getItemType ());
2013-02-24 00:32:59 +04:00
if ( $source ) {
2013-03-08 02:14:34 +04:00
$source [ 'path' ] .= '.part' ;
2013-02-24 00:32:59 +04:00
// All partial files have delete permission
$source [ 'permissions' ] |= \OCP\PERMISSION_DELETE ;
}
} else {
2014-04-14 13:33:10 +04:00
$source = \OC_Share_Backend_File :: getSource ( $target , $this -> getMountPoint (), $this -> getItemType ());
2012-12-29 20:09:57 +04:00
}
2012-12-16 04:44:46 +04:00
$this -> files [ $target ] = $source ;
2012-12-29 20:09:57 +04:00
}
return $this -> files [ $target ];
}
/**
2014-05-19 19:50:53 +04:00
* Get the source file path for a shared file
2014-05-15 16:19:32 +04:00
* @ param string $target Shared target file path
2013-11-11 20:58:20 +04:00
* @ return string source file path or false if not found
*/
2013-11-05 16:58:14 +04:00
public function getSourcePath ( $target ) {
2012-12-29 20:09:57 +04:00
$source = $this -> getFile ( $target );
if ( $source ) {
2013-03-07 20:12:59 +04:00
if ( ! isset ( $source [ 'fullPath' ])) {
\OC\Files\Filesystem :: initMountPoints ( $source [ 'fileOwner' ]);
2013-04-26 02:01:36 +04:00
$mount = \OC\Files\Filesystem :: getMountByNumericId ( $source [ 'storage' ]);
2014-04-21 14:35:52 +04:00
if ( is_array ( $mount ) && ! empty ( $mount )) {
2013-11-11 20:58:20 +04:00
$this -> files [ $target ][ 'fullPath' ] = $mount [ key ( $mount )] -> getMountPoint () . $source [ 'path' ];
2013-03-07 20:12:59 +04:00
} else {
$this -> files [ $target ][ 'fullPath' ] = false ;
2014-04-21 14:35:52 +04:00
\OCP\Util :: writeLog ( 'files_sharing' , " Unable to get mount for shared storage ' " . $source [ 'storage' ] . " ' user ' " . $source [ 'fileOwner' ] . " ' " , \OCP\Util :: ERROR );
2013-03-07 20:12:59 +04:00
}
}
return $this -> files [ $target ][ 'fullPath' ];
2012-07-24 04:08:05 +04:00
}
2012-12-29 20:09:57 +04:00
return false ;
2012-07-24 04:08:05 +04:00
}
/**
2014-05-19 19:50:53 +04:00
* Get the permissions granted for a shared file
2014-05-15 16:19:32 +04:00
* @ param string $target Shared target file path
2014-05-07 18:49:07 +04:00
* @ return int CRUDS permissions granted
2013-11-11 20:58:20 +04:00
*/
2012-09-23 03:51:00 +04:00
public function getPermissions ( $target ) {
2014-05-07 18:49:07 +04:00
$permissions = $this -> share [ 'permissions' ];
// part file are always have delete permissions
if ( pathinfo ( $target , PATHINFO_EXTENSION ) === 'part' ) {
$permissions |= \OCP\PERMISSION_DELETE ;
2012-07-24 04:08:05 +04:00
}
2014-05-13 17:22:18 +04:00
if ( \OC_Util :: isSharingDisabledForUser ()) {
$permissions &= ~ \OCP\PERMISSION_SHARE ;
}
2014-05-07 18:49:07 +04:00
return $permissions ;
2012-07-06 14:22:21 +04:00
}
2011-06-16 22:40:21 +04:00
public function mkdir ( $path ) {
2012-07-25 01:42:07 +04:00
if ( $path == '' || $path == '/' || ! $this -> isCreatable ( dirname ( $path ))) {
2012-08-29 10:42:49 +04:00
return false ;
2012-07-24 04:08:05 +04:00
} else if ( $source = $this -> getSourcePath ( $path )) {
2012-12-16 04:44:46 +04:00
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
2012-10-10 19:46:29 +04:00
return $storage -> mkdir ( $internalPath );
2011-06-16 22:40:21 +04:00
}
2012-07-24 04:08:05 +04:00
return false ;
2011-06-16 22:40:21 +04:00
}
2012-08-29 10:42:49 +04:00
2011-06-16 22:40:21 +04:00
public function rmdir ( $path ) {
2012-07-25 01:42:07 +04:00
if (( $source = $this -> getSourcePath ( $path )) && $this -> isDeletable ( $path )) {
2012-12-16 04:44:46 +04:00
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
2012-10-10 19:46:29 +04:00
return $storage -> rmdir ( $internalPath );
2012-07-24 04:08:05 +04:00
}
return false ;
2011-06-16 22:40:21 +04:00
}
2012-08-29 10:42:49 +04:00
2011-06-16 22:40:21 +04:00
public function opendir ( $path ) {
2014-04-08 21:57:07 +04:00
$source = $this -> getSourcePath ( $path );
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
return $storage -> opendir ( $internalPath );
2011-06-16 22:40:21 +04:00
}
2012-07-11 02:56:22 +04:00
2011-06-16 22:40:21 +04:00
public function is_dir ( $path ) {
2014-04-09 20:00:00 +04:00
$source = $this -> getSourcePath ( $path );
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
return $storage -> is_dir ( $internalPath );
2011-06-16 22:40:21 +04:00
}
2012-07-11 02:56:22 +04:00
2011-06-16 22:40:21 +04:00
public function is_file ( $path ) {
2012-07-11 02:56:22 +04:00
if ( $source = $this -> getSourcePath ( $path )) {
2012-12-16 04:44:46 +04:00
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
2012-10-10 19:46:29 +04:00
return $storage -> is_file ( $internalPath );
2011-06-16 22:40:21 +04:00
}
2012-07-24 04:08:05 +04:00
return false ;
2011-06-16 22:40:21 +04:00
}
2012-07-11 02:56:22 +04:00
2011-06-16 22:40:21 +04:00
public function stat ( $path ) {
2012-07-11 02:56:22 +04:00
if ( $path == '' || $path == '/' ) {
$stat [ 'size' ] = $this -> filesize ( $path );
$stat [ 'mtime' ] = $this -> filemtime ( $path );
2011-06-18 21:29:16 +04:00
return $stat ;
2012-07-24 04:08:05 +04:00
} else if ( $source = $this -> getSourcePath ( $path )) {
2012-12-16 04:44:46 +04:00
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
2012-10-10 19:46:29 +04:00
return $storage -> stat ( $internalPath );
2011-06-16 22:40:21 +04:00
}
2012-07-24 04:08:05 +04:00
return false ;
2011-06-16 22:40:21 +04:00
}
2012-07-11 02:56:22 +04:00
2011-06-16 22:40:21 +04:00
public function filetype ( $path ) {
2012-07-24 04:08:05 +04:00
if ( $path == '' || $path == '/' ) {
return 'dir' ;
} else if ( $source = $this -> getSourcePath ( $path )) {
2012-12-16 04:44:46 +04:00
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
2012-10-10 19:46:29 +04:00
return $storage -> filetype ( $internalPath );
2011-06-16 22:40:21 +04:00
}
2012-07-24 04:08:05 +04:00
return false ;
2011-06-16 22:40:21 +04:00
}
2012-07-11 02:56:22 +04:00
2011-06-16 22:40:21 +04:00
public function filesize ( $path ) {
2014-05-26 14:37:43 +04:00
$source = $this -> getSourcePath ( $path );
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
return $storage -> filesize ( $internalPath );
2011-06-16 22:40:21 +04:00
}
2011-08-20 23:43:18 +04:00
2012-07-25 01:42:07 +04:00
public function isCreatable ( $path ) {
2012-12-16 04:44:46 +04:00
return ( $this -> getPermissions ( $path ) & \OCP\PERMISSION_CREATE );
2012-07-25 01:42:07 +04:00
}
public function isReadable ( $path ) {
2012-07-24 04:08:05 +04:00
return $this -> file_exists ( $path );
2011-06-16 22:40:21 +04:00
}
2012-07-25 01:42:07 +04:00
public function isUpdatable ( $path ) {
2012-12-16 04:44:46 +04:00
return ( $this -> getPermissions ( $path ) & \OCP\PERMISSION_UPDATE );
2011-06-16 22:40:21 +04:00
}
2012-07-25 01:42:07 +04:00
public function isDeletable ( $path ) {
2012-12-16 04:44:46 +04:00
return ( $this -> getPermissions ( $path ) & \OCP\PERMISSION_DELETE );
2012-07-25 01:42:07 +04:00
}
public function isSharable ( $path ) {
2014-05-13 17:22:18 +04:00
if ( \OCP\Util :: isSharingDisabledForUser ()) {
return false ;
}
2012-12-16 04:44:46 +04:00
return ( $this -> getPermissions ( $path ) & \OCP\PERMISSION_SHARE );
2012-07-25 01:42:07 +04:00
}
2011-06-16 22:40:21 +04:00
public function file_exists ( $path ) {
2012-07-24 04:08:05 +04:00
if ( $path == '' || $path == '/' ) {
2011-06-18 21:29:16 +04:00
return true ;
2012-07-24 04:08:05 +04:00
} else if ( $source = $this -> getSourcePath ( $path )) {
2012-12-16 04:44:46 +04:00
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
2012-10-10 19:46:29 +04:00
return $storage -> file_exists ( $internalPath );
2011-06-16 22:40:21 +04:00
}
2012-07-24 04:08:05 +04:00
return false ;
2011-06-16 22:40:21 +04:00
}
2012-08-29 10:42:49 +04:00
2011-06-16 22:40:21 +04:00
public function filemtime ( $path ) {
2014-04-08 21:57:07 +04:00
$source = $this -> getSourcePath ( $path );
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
return $storage -> filemtime ( $internalPath );
2011-06-16 22:40:21 +04:00
}
2012-08-29 10:42:49 +04:00
2011-06-16 22:40:21 +04:00
public function file_get_contents ( $path ) {
2012-06-23 01:43:04 +04:00
$source = $this -> getSourcePath ( $path );
2011-06-16 22:40:21 +04:00
if ( $source ) {
2012-05-30 19:46:49 +04:00
$info = array (
2014-04-14 13:33:10 +04:00
'target' => $this -> getMountPoint () . $path ,
2012-05-30 19:46:49 +04:00
'source' => $source ,
);
2012-10-10 15:18:36 +04:00
\OCP\Util :: emitHook ( '\OC\Files\Storage\Shared' , 'file_get_contents' , $info );
2012-12-16 04:44:46 +04:00
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
2012-10-10 19:46:29 +04:00
return $storage -> file_get_contents ( $internalPath );
2011-06-16 22:40:21 +04:00
}
}
2012-08-29 10:42:49 +04:00
2011-06-16 22:40:21 +04:00
public function file_put_contents ( $path , $data ) {
2012-08-16 20:20:14 +04:00
if ( $source = $this -> getSourcePath ( $path )) {
// Check if permission is granted
2013-02-15 01:37:49 +04:00
if (( $this -> file_exists ( $path ) && ! $this -> isUpdatable ( $path ))
2013-11-11 20:58:20 +04:00
|| ( $this -> is_dir ( $path ) && ! $this -> isCreatable ( $path ))
) {
2012-08-16 20:20:14 +04:00
return false ;
2011-07-31 00:03:32 +04:00
}
2012-08-16 20:20:14 +04:00
$info = array (
2014-04-14 13:33:10 +04:00
'target' => $this -> getMountPoint () . '/' . $path ,
2013-11-11 20:58:20 +04:00
'source' => $source ,
);
2012-10-10 15:18:36 +04:00
\OCP\Util :: emitHook ( '\OC\Files\Storage\Shared' , 'file_put_contents' , $info );
2012-12-16 04:44:46 +04:00
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
2012-10-10 19:46:29 +04:00
$result = $storage -> file_put_contents ( $internalPath , $data );
2012-08-16 20:20:14 +04:00
return $result ;
2011-06-16 22:40:21 +04:00
}
2012-08-16 20:20:14 +04:00
return false ;
2011-06-16 22:40:21 +04:00
}
2012-08-29 10:42:49 +04:00
2011-06-16 22:40:21 +04:00
public function unlink ( $path ) {
2012-07-24 22:22:07 +04:00
// Delete the file if DELETE permission is granted
2014-04-11 13:18:50 +04:00
$path = ( $path === false ) ? '' : $path ;
2012-09-07 08:01:52 +04:00
if ( $source = $this -> getSourcePath ( $path )) {
if ( $this -> isDeletable ( $path )) {
2012-12-16 04:44:46 +04:00
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
2012-10-10 19:46:29 +04:00
return $storage -> unlink ( $internalPath );
2012-09-07 08:01:52 +04:00
}
2012-07-24 22:22:07 +04:00
}
return false ;
2011-06-16 22:40:21 +04:00
}
2012-08-29 10:42:49 +04:00
2014-04-04 20:32:49 +04:00
/**
2014-05-19 19:50:53 +04:00
* Format a path to be relative to the / user / files / directory
2014-04-04 20:32:49 +04:00
* @ param string $path the absolute path
* @ return string e . g . turns '/admin/files/test.txt' into '/test.txt'
*/
private static function stripUserFilesPath ( $path ) {
$trimmed = ltrim ( $path , '/' );
$split = explode ( '/' , $trimmed );
// it is not a file relative to data/user/files
if ( count ( $split ) < 3 || $split [ 1 ] !== 'files' ) {
\OCP\Util :: writeLog ( 'file sharing' ,
'Can not strip userid and "files/" from path: ' . $path ,
\OCP\Util :: DEBUG );
return false ;
}
// skip 'user' and 'files'
$sliced = array_slice ( $split , 2 );
$relPath = implode ( '/' , $sliced );
return '/' . $relPath ;
}
/**
2014-05-19 19:50:53 +04:00
* rename a shared folder / file
2014-04-04 20:32:49 +04:00
* @ param string $sourcePath
* @ param string $targetPath
* @ return bool
*/
private function renameMountPoint ( $sourcePath , $targetPath ) {
2014-04-15 22:26:04 +04:00
// it shouldn't be possible to move a Shared storage into another one
2014-04-04 20:32:49 +04:00
list ( $targetStorage , ) = \OC\Files\Filesystem :: resolvePath ( $targetPath );
2014-05-29 15:52:58 +04:00
if ( $targetStorage -> instanceOfStorage ( '\OC\Files\Storage\Shared' )) {
2014-04-04 20:32:49 +04:00
\OCP\Util :: writeLog ( 'file sharing' ,
'It is not allowed to move one mount point into another one' ,
\OCP\Util :: DEBUG );
return false ;
}
$relTargetPath = $this -> stripUserFilesPath ( $targetPath );
2014-04-30 18:56:09 +04:00
if ( $relTargetPath === false ) {
\OCP\Util :: writeLog ( 'file sharing' , 'Wrong target path given: ' . $targetPath , \OCP\Util :: ERROR );
return false ;
2014-04-14 14:04:12 +04:00
}
2014-04-30 18:56:09 +04:00
$result = self :: updateFileTarget ( $relTargetPath , $this -> share );
2014-04-04 20:32:49 +04:00
if ( $result ) {
// update the mount manager with the new paths
$mountManager = \OC\Files\Filesystem :: getMountManager ();
$mount = $mountManager -> find ( $sourcePath );
$mount -> setMountPoint ( $targetPath . '/' );
$mountManager -> addMount ( $mount );
$mountManager -> removeMount ( $sourcePath . '/' );
2014-04-14 14:04:12 +04:00
$this -> setUniqueName ();
2014-04-15 13:19:31 +04:00
$this -> setMountPoint ( $relTargetPath );
2014-04-04 20:32:49 +04:00
} else {
\OCP\Util :: writeLog ( 'file sharing' ,
'Could not rename mount point for shared folder "' . $sourcePath . '" to "' . $targetPath . '"' ,
\OCP\Util :: ERROR );
}
2014-04-30 18:56:09 +04:00
return ( bool ) $result ;
2014-04-04 20:32:49 +04:00
}
2014-04-30 18:56:09 +04:00
/**
* @ update fileTarget in the database if the mount point changed
* @ param string $newPath
* @ param array $share reference to the share which should be modified
* @ return type
*/
private static function updateFileTarget ( $newPath , & $share ) {
// if the user renames a mount point from a group share we need to create a new db entry
// for the unique name
if ( $share [ 'share_type' ] === \OCP\Share :: SHARE_TYPE_GROUP &&
( isset ( $share [ 'unique_name' ]) && $share [ 'unique_name' ])) {
$query = \OC_DB :: prepare ( 'INSERT INTO `*PREFIX*share` (`item_type`, `item_source`, `item_target`,'
. ' `share_type`, `share_with`, `uid_owner`, `permissions`, `stime`, `file_source`,'
. ' `file_target`, `token`, `parent`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)' );
$arguments = array ( $share [ 'item_type' ], $share [ 'item_source' ], $share [ 'item_target' ],
2 , \OCP\User :: getUser (), $share [ 'uid_owner' ], $share [ 'permissions' ], $share [ 'stime' ], $share [ 'file_source' ],
$newPath , $share [ 'token' ], $share [ 'id' ]);
} else {
// rename mount point
$query = \OC_DB :: prepare (
' Update `*PREFIX*share`
SET `file_target` = ?
WHERE `id` = ? '
);
$arguments = array ( $newPath , $share [ 'id' ]);
}
return $query -> execute ( $arguments );
}
2014-04-04 20:32:49 +04:00
2011-06-16 22:40:21 +04:00
public function rename ( $path1 , $path2 ) {
2014-04-04 20:32:49 +04:00
$sourceMountPoint = \OC\Files\Filesystem :: getMountPoint ( $path1 );
2014-04-16 18:41:23 +04:00
$targetMountPoint = \OC\Files\Filesystem :: getMountPoint ( $path2 );
$relPath1 = \OCA\Files_Sharing\Helper :: stripUserFilesPath ( $path1 );
$relPath2 = \OCA\Files_Sharing\Helper :: stripUserFilesPath ( $path2 );
2014-04-04 20:32:49 +04:00
// if we renamed the mount point we need to adjust the file_target in the
// database
2014-04-14 13:33:10 +04:00
if ( \OC\Files\Filesystem :: normalizePath ( $sourceMountPoint ) === \OC\Files\Filesystem :: normalizePath ( $path1 )) {
2014-04-04 20:32:49 +04:00
return $this -> renameMountPoint ( $path1 , $path2 );
}
2014-04-16 18:41:23 +04:00
if ( // Within the same mount point, we only need UPDATE permissions
( $sourceMountPoint === $targetMountPoint && $this -> isUpdatable ( $sourceMountPoint )) ||
2014-01-08 21:43:20 +04:00
// otherwise DELETE and CREATE permissions required
2014-04-16 18:41:23 +04:00
( $this -> isDeletable ( $path1 ) && $this -> isCreatable ( dirname ( $path2 )))) {
2014-04-30 14:49:16 +04:00
$pathinfo = pathinfo ( $relPath1 );
// for part files we need to ask for the owner and path from the parent directory because
// the file cache doesn't return any results for part files
if ( $pathinfo [ 'extension' ] === 'part' ) {
list ( $user1 , $path1 ) = \OCA\Files_Sharing\Helper :: getUidAndFilename ( $pathinfo [ 'dirname' ]);
$path1 = $path1 . '/' . $pathinfo [ 'basename' ];
} else {
list ( $user1 , $path1 ) = \OCA\Files_Sharing\Helper :: getUidAndFilename ( $relPath1 );
}
2014-04-16 18:41:23 +04:00
$targetFilename = basename ( $relPath2 );
list ( $user2 , $path2 ) = \OCA\Files_Sharing\Helper :: getUidAndFilename ( dirname ( $relPath2 ));
$rootView = new \OC\Files\View ( '' );
return $rootView -> rename ( '/' . $user1 . '/files/' . $path1 , '/' . $user2 . '/files/' . $path2 . '/' . $targetFilename );
2012-07-24 22:22:07 +04:00
}
2014-04-16 18:41:23 +04:00
2012-07-24 22:22:07 +04:00
return false ;
2011-06-16 22:40:21 +04:00
}
2012-08-29 10:42:49 +04:00
2011-06-16 22:40:21 +04:00
public function copy ( $path1 , $path2 ) {
2012-07-24 22:22:07 +04:00
// Copy the file if CREATE permission is granted
2012-08-23 04:48:16 +04:00
if ( $this -> isCreatable ( dirname ( $path2 ))) {
2013-11-11 20:58:20 +04:00
$oldSource = $this -> getSourcePath ( $path1 );
$newSource = $this -> getSourcePath ( dirname ( $path2 )) . '/' . basename ( $path2 );
$rootView = new \OC\Files\View ( '' );
return $rootView -> copy ( $oldSource , $newSource );
2012-07-24 22:22:07 +04:00
}
2012-08-23 04:48:16 +04:00
return false ;
2011-06-16 22:40:21 +04:00
}
2012-07-26 01:08:18 +04:00
2011-06-16 22:40:21 +04:00
public function fopen ( $path , $mode ) {
2012-07-24 04:08:05 +04:00
if ( $source = $this -> getSourcePath ( $path )) {
2012-08-08 19:25:24 +04:00
switch ( $mode ) {
case 'r+' :
case 'rb+' :
case 'w+' :
case 'wb+' :
case 'x+' :
case 'xb+' :
case 'a+' :
case 'ab+' :
case 'w' :
case 'wb' :
case 'x' :
case 'xb' :
case 'a' :
case 'ab' :
2013-11-11 20:58:20 +04:00
$exists = $this -> file_exists ( $path );
if ( $exists && ! $this -> isUpdatable ( $path )) {
return false ;
}
if ( ! $exists && ! $this -> isCreatable ( dirname ( $path ))) {
return false ;
}
2012-08-08 19:25:24 +04:00
}
2012-05-30 19:46:49 +04:00
$info = array (
2014-04-14 13:33:10 +04:00
'target' => $this -> getMountPoint () . $path ,
2012-05-30 19:46:49 +04:00
'source' => $source ,
'mode' => $mode ,
);
2012-10-10 15:18:36 +04:00
\OCP\Util :: emitHook ( '\OC\Files\Storage\Shared' , 'fopen' , $info );
2012-12-16 04:44:46 +04:00
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
2012-10-10 19:46:29 +04:00
return $storage -> fopen ( $internalPath , $mode );
2011-06-16 22:40:21 +04:00
}
2012-07-24 04:08:05 +04:00
return false ;
2011-06-16 22:40:21 +04:00
}
2012-07-24 22:50:43 +04:00
2011-06-16 22:40:21 +04:00
public function getMimeType ( $path ) {
2012-07-24 04:08:05 +04:00
if ( $source = $this -> getSourcePath ( $path )) {
2012-12-16 04:44:46 +04:00
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
2012-10-10 19:46:29 +04:00
return $storage -> getMimeType ( $internalPath );
2011-06-16 22:40:21 +04:00
}
2012-07-24 04:08:05 +04:00
return false ;
2011-06-16 22:40:21 +04:00
}
2012-07-26 01:13:48 +04:00
2011-06-16 22:40:21 +04:00
public function free_space ( $path ) {
2012-06-23 01:43:04 +04:00
$source = $this -> getSourcePath ( $path );
2011-06-16 22:40:21 +04:00
if ( $source ) {
2012-12-16 04:44:46 +04:00
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
2012-10-10 19:46:29 +04:00
return $storage -> free_space ( $internalPath );
2011-06-16 22:40:21 +04:00
}
2014-04-15 22:26:04 +04:00
return \OC\Files\SPACE_UNKNOWN ;
2011-06-16 22:40:21 +04:00
}
2011-08-20 04:05:57 +04:00
public function getLocalFile ( $path ) {
2012-07-24 04:08:05 +04:00
if ( $source = $this -> getSourcePath ( $path )) {
2012-12-16 04:44:46 +04:00
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
2012-10-10 19:46:29 +04:00
return $storage -> getLocalFile ( $internalPath );
2011-08-20 04:05:57 +04:00
}
2012-07-24 04:08:05 +04:00
return false ;
2011-08-20 04:05:57 +04:00
}
2013-11-11 20:58:20 +04:00
2012-07-24 04:08:05 +04:00
public function touch ( $path , $mtime = null ) {
if ( $source = $this -> getSourcePath ( $path )) {
2012-12-16 04:44:46 +04:00
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
2012-10-10 19:46:29 +04:00
return $storage -> touch ( $internalPath , $mtime );
2012-03-01 02:42:40 +04:00
}
2012-07-24 04:08:05 +04:00
return false ;
2012-03-01 02:42:40 +04:00
}
2012-05-11 03:56:25 +04:00
2012-06-19 19:38:04 +04:00
public static function setup ( $options ) {
2014-04-02 14:04:51 +04:00
$shares = \OCP\Share :: getItemsSharedWith ( 'file' );
2013-02-15 01:37:49 +04:00
if ( ! \OCP\User :: isLoggedIn () || \OCP\User :: getUser () != $options [ 'user' ]
2014-04-02 14:04:51 +04:00
|| $shares
2013-11-11 20:58:20 +04:00
) {
2014-04-02 14:04:51 +04:00
foreach ( $shares as $share ) {
2014-04-30 18:56:09 +04:00
self :: verifyMountPoint ( $share );
2014-04-02 14:04:51 +04:00
\OC\Files\Filesystem :: mount ( '\OC\Files\Storage\Shared' ,
array (
2014-04-14 13:33:10 +04:00
'share' => $share ,
2014-04-02 14:04:51 +04:00
),
$options [ 'user_dir' ] . '/' . $share [ 'file_target' ]);
}
2013-01-03 04:20:34 +04:00
}
2012-05-11 03:56:25 +04:00
}
2014-04-02 14:04:51 +04:00
/**
2014-04-30 18:56:09 +04:00
* check if the parent folder exists otherwise move the mount point up
*
* @ param array $share reference to the share we want to check
2014-04-02 14:04:51 +04:00
*/
2014-04-30 18:56:09 +04:00
private static function verifyMountPoint ( & $share ) {
$mountPoint = basename ( $share [ 'file_target' ]);
$parent = dirname ( $share [ 'file_target' ]);
while ( ! \OC\Files\Filesystem :: is_dir ( $parent )) {
$parent = dirname ( $parent );
}
2014-05-22 16:29:23 +04:00
$newMountPoint = \OCA\Files_Sharing\Helper :: generateUniqueTarget (
\OC\Files\Filesystem :: normalizePath ( $parent . '/' . $mountPoint ),
array (),
new \OC\Files\View ( '/' . \OCP\User :: getUser () . '/files' )
);
2014-04-30 18:56:09 +04:00
if ( $newMountPoint !== $share [ 'file_target' ]) {
2014-05-22 16:29:23 +04:00
2014-04-30 18:56:09 +04:00
self :: updateFileTarget ( $newMountPoint , $share );
$share [ 'file_target' ] = $newMountPoint ;
}
2014-04-14 13:33:10 +04:00
}
/**
2014-04-30 18:56:09 +04:00
* return mount point of share , relative to data / user / files
*
* @ return string
2014-04-14 13:33:10 +04:00
*/
2014-04-30 18:56:09 +04:00
public function getMountPoint () {
return $this -> share [ 'file_target' ];
2014-04-14 13:33:10 +04:00
}
2014-04-15 13:19:31 +04:00
private function setMountPoint ( $path ) {
$this -> share [ 'file_target' ] = $path ;
}
2014-04-14 14:04:12 +04:00
/**
2014-05-19 19:50:53 +04:00
* the share now uses a unique name of this user
2014-04-30 18:56:09 +04:00
*
* @ brief the share now uses a unique name of this user
2014-04-14 14:04:12 +04:00
*/
private function setUniqueName () {
$this -> share [ 'unique_name' ] = true ;
}
2014-04-14 13:33:10 +04:00
/**
2014-04-30 18:56:09 +04:00
* @ brief get the user who shared the file
*
2014-04-08 18:37:34 +04:00
* @ return string
*/
public function getSharedFrom () {
2014-04-14 13:33:10 +04:00
return $this -> share [ 'uid_owner' ];
2014-04-08 18:37:34 +04:00
}
2014-04-02 14:04:51 +04:00
/**
2014-05-19 19:50:53 +04:00
* return share type , can be " file " or " folder "
2014-04-02 14:04:51 +04:00
* @ return string
*/
2014-04-14 13:33:10 +04:00
public function getItemType () {
return $this -> share [ 'item_type' ];
2014-04-02 14:04:51 +04:00
}
2013-01-01 20:19:33 +04:00
public function hasUpdated ( $path , $time ) {
return $this -> filemtime ( $path ) > $time ;
}
2013-01-01 23:47:25 +04:00
public function getCache ( $path = '' ) {
2012-12-16 04:44:46 +04:00
return new \OC\Files\Cache\Shared_Cache ( $this );
2012-06-15 18:43:24 +04:00
}
2012-09-23 03:51:00 +04:00
2013-01-01 23:47:25 +04:00
public function getScanner ( $path = '' ) {
return new \OC\Files\Cache\Scanner ( $this );
}
public function getPermissionsCache ( $path = '' ) {
2012-12-16 04:44:46 +04:00
return new \OC\Files\Cache\Shared_Permissions ( $this );
}
2013-01-01 23:47:25 +04:00
public function getWatcher ( $path = '' ) {
2013-01-01 21:43:38 +04:00
return new \OC\Files\Cache\Shared_Watcher ( $this );
}
2012-12-16 04:44:46 +04:00
public function getOwner ( $path ) {
2013-01-01 20:19:33 +04:00
if ( $path == '' ) {
2014-04-14 13:33:10 +04:00
$path = $this -> getMountPoint ();
2013-01-01 20:19:33 +04:00
}
2012-12-29 20:09:57 +04:00
$source = $this -> getFile ( $path );
if ( $source ) {
2013-03-07 20:12:59 +04:00
return $source [ 'fileOwner' ];
2012-12-16 04:44:46 +04:00
}
2012-12-29 20:09:57 +04:00
return false ;
2012-12-16 04:44:46 +04:00
}
public function getETag ( $path ) {
2013-01-19 09:02:40 +04:00
if ( $path == '' ) {
2014-04-14 13:33:10 +04:00
$path = $this -> getMountPoint ();
2013-01-19 09:02:40 +04:00
}
if ( $source = $this -> getSourcePath ( $path )) {
list ( $storage , $internalPath ) = \OC\Files\Filesystem :: resolvePath ( $source );
return $storage -> getETag ( $internalPath );
}
return null ;
2012-12-16 04:44:46 +04:00
}
2012-05-11 03:56:25 +04:00
}