Beispiel #1
0
 /**
  * @medium
  */
 function testCopyBetweenStorages()
 {
     $storage1 = $this->getTestStorage();
     $storage2 = $this->getTestStorage();
     \OC\Files\Filesystem::mount($storage1, array(), '/');
     \OC\Files\Filesystem::mount($storage2, array(), '/substorage');
     $rootView = new \OC\Files\View('');
     $rootView->mkdir('substorage/emptyfolder');
     $rootView->copy('substorage', 'anotherfolder');
     $this->assertTrue($rootView->is_dir('/anotherfolder'));
     $this->assertTrue($rootView->is_dir('/substorage'));
     $this->assertTrue($rootView->is_dir('/anotherfolder/emptyfolder'));
     $this->assertTrue($rootView->is_dir('/substorage/emptyfolder'));
     $this->assertTrue($rootView->file_exists('/anotherfolder/foo.txt'));
     $this->assertTrue($rootView->file_exists('/anotherfolder/foo.png'));
     $this->assertTrue($rootView->file_exists('/anotherfolder/folder/bar.txt'));
     $this->assertTrue($rootView->file_exists('/substorage/foo.txt'));
     $this->assertTrue($rootView->file_exists('/substorage/foo.png'));
     $this->assertTrue($rootView->file_exists('/substorage/folder/bar.txt'));
 }
Beispiel #2
0
 /**
  * rollback to an old version of a file.
  */
 public static function rollback($file, $revision)
 {
     if (\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED) == 'true') {
         list($uid, $filename) = self::getUidAndFilename($file);
         $users_view = new \OC\Files\View('/' . $uid);
         $files_view = new \OC\Files\View('/' . \OCP\User::getUser() . '/files');
         $versionCreated = false;
         //first create a new version
         $version = 'files_versions' . $filename . '.v' . $users_view->filemtime('files' . $filename);
         if (!$users_view->file_exists($version)) {
             // disable proxy to prevent multiple fopen calls
             $proxyStatus = \OC_FileProxy::$enabled;
             \OC_FileProxy::$enabled = false;
             $users_view->copy('files' . $filename, 'files_versions' . $filename . '.v' . $users_view->filemtime('files' . $filename));
             // reset proxy state
             \OC_FileProxy::$enabled = $proxyStatus;
             $versionCreated = true;
         }
         // rollback
         if (@$users_view->rename('files_versions' . $filename . '.v' . $revision, 'files' . $filename)) {
             $files_view->touch($file, $revision);
             Storage::expire($file);
             return true;
         } else {
             if ($versionCreated) {
                 $users_view->unlink($version);
             }
         }
     }
     return false;
 }
 public function copy($path1, $path2)
 {
     // Copy the file if CREATE permission is granted
     if ($this->isCreatable(dirname($path2))) {
         $oldSource = $this->getSourcePath($path1);
         $newSource = $this->getSourcePath(dirname($path2)) . '/' . basename($path2);
         $rootView = new \OC\Files\View('');
         return $rootView->copy($oldSource, $newSource);
     }
     return false;
 }
Beispiel #4
0
 /**
  * Rollback to an old version of a file.
  *
  * @param string $file file name
  * @param int $revision revision timestamp
  */
 public static function rollback($file, $revision)
 {
     if (\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED) == 'true') {
         // add expected leading slash
         $file = '/' . ltrim($file, '/');
         list($uid, $filename) = self::getUidAndFilename($file);
         $users_view = new \OC\Files\View('/' . $uid);
         $files_view = new \OC\Files\View('/' . \OCP\User::getUser() . '/files');
         $versionCreated = false;
         //first create a new version
         $version = 'files_versions' . $filename . '.v' . $users_view->filemtime('files' . $filename);
         if (!$users_view->file_exists($version)) {
             $users_view->copy('files' . $filename, 'files_versions' . $filename . '.v' . $users_view->filemtime('files' . $filename));
             $versionCreated = true;
         }
         // rollback
         if (self::copyFileContents($users_view, 'files_versions' . $filename . '.v' . $revision, 'files' . $filename)) {
             $files_view->touch($file, $revision);
             Storage::scheduleExpire($uid, $file);
             \OC_Hook::emit('\\OCP\\Versions', 'rollback', array('path' => $filename));
             return true;
         } else {
             if ($versionCreated) {
                 self::deleteVersion($users_view, $version);
             }
         }
     }
     return false;
 }
Beispiel #5
0
 /**
  * rollback to an old version of a file.
  */
 public static function rollback($file, $revision)
 {
     if (\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED) == 'true') {
         list($uid, $filename) = self::getUidAndFilename($file);
         $users_view = new \OC\Files\View('/' . $uid);
         $files_view = new \OC\Files\View('/' . \OCP\User::getUser() . '/files');
         $versionCreated = false;
         //first create a new version
         $version = 'files_versions' . $filename . '.v' . $users_view->filemtime('files' . $filename);
         if (!$users_view->file_exists($version)) {
             $users_view->copy('files' . $filename, 'files_versions' . $filename . '.v' . $users_view->filemtime('files' . $filename));
             $versionCreated = true;
         }
         // rollback
         if (@$users_view->rename('files_versions' . $filename . '.v' . $revision, 'files' . $filename)) {
             $files_view->touch($file, $revision);
             Storage::scheduleExpire($file);
             return true;
         } else {
             if ($versionCreated) {
                 self::deleteVersion($users_view, $version);
             }
         }
     }
     return false;
 }
 /**
  * Move encryption keys to trash so that they can be restored later
  *
  * @param $file_path path to original file
  * @param $filename of deleted file
  * @param $timestamp when the file was deleted
  *
  * @return size of encryption keys
  */
 private static function retainEncryptionKeys($file_path, $filename, $timestamp)
 {
     $size = 0;
     if (\OCP\App::isEnabled('files_encryption')) {
         $user = \OCP\User::getUser();
         $rootView = new \OC\Files\View('/');
         list($owner, $ownerPath) = self::getUidAndFilename($file_path);
         $util = new \OCA\Encryption\Util(new \OC_FilesystemView('/'), $user);
         // disable proxy to prevent recursive calls
         $proxyStatus = \OC_FileProxy::$enabled;
         \OC_FileProxy::$enabled = false;
         if ($util->isSystemWideMountPoint($ownerPath)) {
             $baseDir = '/files_encryption/';
         } else {
             $baseDir = $owner . '/files_encryption/';
         }
         $keyfile = \OC\Files\Filesystem::normalizePath($baseDir . '/keyfiles/' . $ownerPath);
         if ($rootView->is_dir($keyfile) || $rootView->file_exists($keyfile . '.key')) {
             // move keyfiles
             if ($rootView->is_dir($keyfile)) {
                 $size += self::calculateSize(new \OC\Files\View($keyfile));
                 if ($owner !== $user) {
                     $rootView->copy($keyfile, $owner . '/files_trashbin/keyfiles/' . basename($ownerPath) . '.d' . $timestamp);
                 }
                 $rootView->rename($keyfile, $user . '/files_trashbin/keyfiles/' . $filename . '.d' . $timestamp);
             } else {
                 $size += $rootView->filesize($keyfile . '.key');
                 if ($owner !== $user) {
                     $rootView->copy($keyfile . '.key', $owner . '/files_trashbin/keyfiles/' . basename($ownerPath) . '.key.d' . $timestamp);
                 }
                 $rootView->rename($keyfile . '.key', $user . '/files_trashbin/keyfiles/' . $filename . '.key.d' . $timestamp);
             }
         }
         // retain share keys
         $sharekeys = \OC\Files\Filesystem::normalizePath($baseDir . '/share-keys/' . $ownerPath);
         if ($rootView->is_dir($sharekeys)) {
             $size += self::calculateSize(new \OC\Files\View($sharekeys));
             if ($owner !== $user) {
                 $rootView->copy($sharekeys, $owner . '/files_trashbin/share-keys/' . basename($ownerPath) . '.d' . $timestamp);
             }
             $rootView->rename($sharekeys, $user . '/files_trashbin/share-keys/' . $filename . '.d' . $timestamp);
         } else {
             // get local path to share-keys
             $localShareKeysPath = $rootView->getLocalFile($sharekeys);
             $escapedLocalShareKeysPath = preg_replace('/(\\*|\\?|\\[)/', '[$1]', $localShareKeysPath);
             // handle share-keys
             $matches = glob($escapedLocalShareKeysPath . '*.shareKey');
             foreach ($matches as $src) {
                 // get source file parts
                 $pathinfo = pathinfo($src);
                 // we only want to keep the users key so we can access the private key
                 $userShareKey = $filename . '.' . $user . '.shareKey';
                 // if we found the share-key for the owner, we need to move it to files_trashbin
                 if ($pathinfo['basename'] == $userShareKey) {
                     // calculate size
                     $size += $rootView->filesize($sharekeys . '.' . $user . '.shareKey');
                     // move file
                     $rootView->rename($sharekeys . '.' . $user . '.shareKey', $user . '/files_trashbin/share-keys/' . $userShareKey . '.d' . $timestamp);
                 } elseif ($owner !== $user) {
                     $ownerShareKey = basename($ownerPath) . '.' . $owner . '.shareKey';
                     if ($pathinfo['basename'] == $ownerShareKey) {
                         $rootView->rename($sharekeys . '.' . $owner . '.shareKey', $owner . '/files_trashbin/share-keys/' . $ownerShareKey . '.d' . $timestamp);
                     }
                 } else {
                     // don't keep other share-keys
                     unlink($src);
                 }
             }
         }
         // enable proxy
         \OC_FileProxy::$enabled = $proxyStatus;
     }
     return $size;
 }