|
|
|
|
@ -35,48 +35,26 @@ 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 static function store($filename) {
|
|
|
|
|
if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
|
|
|
|
|
$owner = \OC\Files\Filesystem::getOwner($filename);
|
|
|
|
|
if ( $owner != \OCP\User::getUser() ) {
|
|
|
|
|
$datadir = \OC_Config::getValue( "datadirectory", \OC::$SERVERROOT."/data" );
|
|
|
|
|
\OC\Files\Filesystem::mount( '\OC\Files\Storage\Local', array('datadir'=>$datadir), '/'.$owner );
|
|
|
|
|
$info = \OC\Files\Filesystem::getFileInfo($filename);
|
|
|
|
|
$id = $info['fileid'];
|
|
|
|
|
error_log("id: $id");
|
|
|
|
|
$path = \OC\Files\Filesystem::getPath($id);
|
|
|
|
|
error_log("new path: $path");
|
|
|
|
|
}
|
|
|
|
|
list($uid, $filename) = self::getUidAndFilename($filename);
|
|
|
|
|
|
|
|
|
|
$files_view = new \OC\Files\View('/'.$uid .'/files');
|
|
|
|
|
$users_view = new \OC\Files\View('/'.$uid);
|
|
|
|
|
|
|
|
|
|
//check if source file already exist as version to avoid recursions.
|
|
|
|
|
// todo does this check work?
|
|
|
|
|
if ($users_view->file_exists($filename)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// check if filename is a directory
|
|
|
|
|
if($files_view->is_dir($filename)) {
|
|
|
|
|
return false;
|
|
|
|
|
@ -116,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);
|
|
|
|
|
}
|
|
|
|
|
@ -137,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']);
|
|
|
|
|
}
|
|
|
|
|
@ -187,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();
|
|
|
|
|
@ -203,7 +180,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 );
|
|
|
|
|
|
|
|
|
|
@ -254,7 +231,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);
|
|
|
|
|
@ -279,7 +256,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);
|
|
|
|
|
@ -325,7 +302,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'));
|
|
|
|
|
@ -344,7 +321,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 ) {
|
|
|
|
|
@ -360,7 +337,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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|