|
|
|
@ -35,37 +35,25 @@ class Storage { |
|
|
|
|
'step' => 604800), |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
private static function getUidAndFilename($filename) |
|
|
|
|
{ |
|
|
|
|
if (\OCP\App::isEnabled('files_sharing') |
|
|
|
|
&& substr($filename, 0, 7) == '/Shared' |
|
|
|
|
&& $source = \OCP\Share::getItemSharedWith('file', |
|
|
|
|
substr($filename, 7), |
|
|
|
|
\OC_Share_Backend_File::FORMAT_SHARED_STORAGE)) { |
|
|
|
|
$filename = $source['path']; |
|
|
|
|
$pos = strpos($filename, '/files', 1); |
|
|
|
|
$uid = substr($filename, 1, $pos - 1); |
|
|
|
|
$filename = substr($filename, $pos + 6); |
|
|
|
|
} else { |
|
|
|
|
$uid = \OCP\User::getUser(); |
|
|
|
|
private static function getUidAndFilename($filename) { |
|
|
|
|
$uid = \OC\Files\Filesystem::getOwner($filename); |
|
|
|
|
if ( $uid != \OCP\User::getUser() ) { |
|
|
|
|
$info = \OC\Files\Filesystem::getFileInfo($filename); |
|
|
|
|
$ownerView = new \OC\Files\View('/'.$uid.'/files'); |
|
|
|
|
$filename = $ownerView->getPath($info['fileid']); |
|
|
|
|
} |
|
|
|
|
return array($uid, $filename); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* store a new version of a file. |
|
|
|
|
*/ |
|
|
|
|
public function store($filename) { |
|
|
|
|
public static function store($filename) { |
|
|
|
|
if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { |
|
|
|
|
list($uid, $filename) = self::getUidAndFilename($filename); |
|
|
|
|
$files_view = new \OC\Files\View('/'.\OCP\User::getUser() .'/files'); |
|
|
|
|
$users_view = new \OC\Files\View('/'.\OCP\User::getUser()); |
|
|
|
|
|
|
|
|
|
//check if source file already exist as version to avoid recursions. |
|
|
|
|
// todo does this check work? |
|
|
|
|
if ($users_view->file_exists($filename)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$files_view = new \OC\Files\View('/'.$uid .'/files'); |
|
|
|
|
$users_view = new \OC\Files\View('/'.$uid); |
|
|
|
|
|
|
|
|
|
// check if filename is a directory |
|
|
|
|
if($files_view->is_dir($filename)) { |
|
|
|
@ -106,10 +94,10 @@ class Storage { |
|
|
|
|
*/ |
|
|
|
|
public static function delete($filename) { |
|
|
|
|
list($uid, $filename) = self::getUidAndFilename($filename); |
|
|
|
|
$versions_fileview = new \OC_FilesystemView('/'.$uid .'/files_versions'); |
|
|
|
|
$versions_fileview = new \OC\Files\View('/'.$uid .'/files_versions'); |
|
|
|
|
|
|
|
|
|
$abs_path = \OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath('').$filename.'.v'; |
|
|
|
|
if( ($versions = self::getVersions($filename)) ) { |
|
|
|
|
if( ($versions = self::getVersions($uid, $filename)) ) { |
|
|
|
|
if ( ($versionsSize = \OCP\Config::getAppValue('files_versions', 'size')) === null ) { |
|
|
|
|
$versionsSize = self::calculateSize($uid); |
|
|
|
|
} |
|
|
|
@ -127,16 +115,15 @@ class Storage { |
|
|
|
|
public static function rename($oldpath, $newpath) { |
|
|
|
|
list($uid, $oldpath) = self::getUidAndFilename($oldpath); |
|
|
|
|
list($uidn, $newpath) = self::getUidAndFilename($newpath); |
|
|
|
|
$versions_view = new \OC_FilesystemView('/'.$uid .'/files_versions'); |
|
|
|
|
$files_view = new \OC_FilesystemView('/'.$uid .'/files'); |
|
|
|
|
$versions_view = new \OC\Files\View('/'.$uid .'/files_versions'); |
|
|
|
|
$files_view = new \OC\Files\View('/'.$uid .'/files'); |
|
|
|
|
$abs_newpath = \OCP\Config::getSystemValue('datadirectory').$versions_view->getAbsolutePath('').$newpath; |
|
|
|
|
|
|
|
|
|
if ( $files_view->is_dir($oldpath) && $versions_view->is_dir($oldpath) ) { |
|
|
|
|
$versions_view->rename($oldpath, $newpath); |
|
|
|
|
} else if ( ($versions = Storage::getVersions($oldpath)) ) { |
|
|
|
|
} else if ( ($versions = Storage::getVersions($uid, $oldpath)) ) { |
|
|
|
|
$info=pathinfo($abs_newpath); |
|
|
|
|
if(!file_exists($info['dirname'])) mkdir($info['dirname'], 0750, true); |
|
|
|
|
$versions = Storage::getVersions($oldpath); |
|
|
|
|
foreach ($versions as $v) { |
|
|
|
|
$versions_view->rename($oldpath.'.v'.$v['version'], $newpath.'.v'.$v['version']); |
|
|
|
|
} |
|
|
|
@ -177,14 +164,14 @@ class Storage { |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @brief get a list of all available versions of a file in descending chronological order |
|
|
|
|
* @param $uid user id from the owner of the file |
|
|
|
|
* @param $filename file to find versions of, relative to the user files dir |
|
|
|
|
* @param $count number of versions to return |
|
|
|
|
* @returns array |
|
|
|
|
*/ |
|
|
|
|
public static function getVersions( $filename, $count = 0 ) { |
|
|
|
|
public static function getVersions($uid, $filename, $count = 0 ) { |
|
|
|
|
if( \OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true' ) { |
|
|
|
|
list($uid, $filename) = self::getUidAndFilename($filename); |
|
|
|
|
$versions_fileview = new \OC\Files\View('/' . \OCP\User::getUser() . '/files_versions'); |
|
|
|
|
$versions_fileview = new \OC\Files\View('/' . $uid . '/files_versions'); |
|
|
|
|
|
|
|
|
|
$versionsName = \OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath($filename); |
|
|
|
|
$versions = array(); |
|
|
|
@ -197,7 +184,7 @@ class Storage { |
|
|
|
|
|
|
|
|
|
sort( $matches ); |
|
|
|
|
|
|
|
|
|
$files_view = new \OC_FilesystemView('/'.$uid.'/files'); |
|
|
|
|
$files_view = new \OC\Files\View('/'.$uid.'/files'); |
|
|
|
|
$local_file = $files_view->getLocalFile($filename); |
|
|
|
|
$local_file_md5 = \md5_file( $local_file ); |
|
|
|
|
|
|
|
|
@ -248,7 +235,7 @@ class Storage { |
|
|
|
|
*/ |
|
|
|
|
private static function calculateSize($uid) { |
|
|
|
|
if( \OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true' ) { |
|
|
|
|
$versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions'); |
|
|
|
|
$versions_fileview = new \OC\Files\View('/'.$uid.'/files_versions'); |
|
|
|
|
$versionsRoot = \OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath(''); |
|
|
|
|
|
|
|
|
|
$iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($versionsRoot), \RecursiveIteratorIterator::CHILD_FIRST); |
|
|
|
@ -273,7 +260,7 @@ class Storage { |
|
|
|
|
*/ |
|
|
|
|
private static function getAllVersions($uid) { |
|
|
|
|
if( \OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true' ) { |
|
|
|
|
$versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions'); |
|
|
|
|
$versions_fileview = new \OC\Files\View('/'.$uid.'/files_versions'); |
|
|
|
|
$versionsRoot = \OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath(''); |
|
|
|
|
|
|
|
|
|
$iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($versionsRoot), \RecursiveIteratorIterator::CHILD_FIRST); |
|
|
|
@ -319,7 +306,7 @@ class Storage { |
|
|
|
|
private static function expire($filename, $versionsSize = null) { |
|
|
|
|
if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { |
|
|
|
|
list($uid, $filename) = self::getUidAndFilename($filename); |
|
|
|
|
$versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions'); |
|
|
|
|
$versions_fileview = new \OC\Files\View('/'.$uid.'/files_versions'); |
|
|
|
|
|
|
|
|
|
// get available disk space for user |
|
|
|
|
$quota = \OCP\Util::computerFileSize(\OC_Preferences::getValue($uid, 'files', 'quota')); |
|
|
|
@ -338,7 +325,7 @@ class Storage { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// calculate available space for version history |
|
|
|
|
$files_view = new \OC_FilesystemView('/'.$uid.'/files'); |
|
|
|
|
$files_view = new \OC\Files\View('/'.$uid.'/files'); |
|
|
|
|
$rootInfo = $files_view->getFileInfo('/'); |
|
|
|
|
$free = $quota-$rootInfo['size']; // remaining free space for user |
|
|
|
|
if ( $free > 0 ) { |
|
|
|
@ -354,7 +341,7 @@ class Storage { |
|
|
|
|
$versions_by_file = $result['by_file']; |
|
|
|
|
$all_versions = $result['all']; |
|
|
|
|
} else { |
|
|
|
|
$all_versions = Storage::getVersions($filename); |
|
|
|
|
$all_versions = Storage::getVersions($uid, $filename); |
|
|
|
|
$versions_by_file[$filename] = $all_versions; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|