Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMorris Jobke <morris.jobke@gmail.com>2013-11-29 00:59:24 +0400
committerMorris Jobke <morris.jobke@gmail.com>2013-11-29 00:59:24 +0400
commit41a1a32e5ad19c041e22b20873e769ecfa6aa8c8 (patch)
treebe848f8b35efa329a81d1fa22a3258fb2071edbc /apps/files_versions
parent0cbe9d79baec7aa3a38dfc9b5db8b5a1eee7b930 (diff)
parent348706854cd47f3fd104fbc8f5af7595980f5084 (diff)
Merge pull request #6099 from owncloud/fix_source_not_found_warnings
make sure that we don't try to access an already deleted files
Diffstat (limited to 'apps/files_versions')
-rw-r--r--apps/files_versions/appinfo/app.php1
-rw-r--r--apps/files_versions/lib/hooks.php15
-rw-r--r--apps/files_versions/lib/versions.php51
3 files changed, 51 insertions, 16 deletions
diff --git a/apps/files_versions/appinfo/app.php b/apps/files_versions/appinfo/app.php
index 5b1e464ba6c..8f2071dd7b6 100644
--- a/apps/files_versions/appinfo/app.php
+++ b/apps/files_versions/appinfo/app.php
@@ -12,6 +12,7 @@ OCP\Util::addStyle('files_versions', 'versions');
OCP\Util::connectHook('OC_Filesystem', 'write', "OCA\Files_Versions\Hooks", "write_hook");
// Listen to delete and rename signals
OCP\Util::connectHook('OC_Filesystem', 'post_delete', "OCA\Files_Versions\Hooks", "remove_hook");
+OCP\Util::connectHook('OC_Filesystem', 'delete', "OCA\Files_Versions\Hooks", "pre_remove_hook");
OCP\Util::connectHook('OC_Filesystem', 'rename', "OCA\Files_Versions\Hooks", "rename_hook");
//Listen to delete user signal
OCP\Util::connectHook('OC_User', 'pre_deleteUser', "OCA\Files_Versions\Hooks", "deleteUser_hook");
diff --git a/apps/files_versions/lib/hooks.php b/apps/files_versions/lib/hooks.php
index 81ee3c8b3c6..5d3882cc3e3 100644
--- a/apps/files_versions/lib/hooks.php
+++ b/apps/files_versions/lib/hooks.php
@@ -46,6 +46,17 @@ class Hooks {
}
/**
+ * @brief mark file as "deleted" so that we can clean up the versions if the file is gone
+ * @param array $params
+ */
+ public static function pre_remove_hook($params) {
+ $path = $params[\OC\Files\Filesystem::signal_param_path];
+ if($path<>'') {
+ Storage::markDeletedFile($path);
+ }
+ }
+
+ /**
* @brief rename/move versions of renamed/moved files
* @param array with oldpath and newpath
*
@@ -53,7 +64,7 @@ class Hooks {
* of the stored versions along the actual file
*/
public static function rename_hook($params) {
-
+
if (\OCP\App::isEnabled('files_versions')) {
$oldpath = $params['oldpath'];
$newpath = $params['newpath'];
@@ -71,7 +82,7 @@ class Hooks {
* to remove the used space for versions stored in the database
*/
public static function deleteUser_hook($params) {
-
+
if (\OCP\App::isEnabled('files_versions')) {
$uid = $params['uid'];
Storage::deleteUser($uid);
diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php
index 3ad73284ef2..42a15612d67 100644
--- a/apps/files_versions/lib/versions.php
+++ b/apps/files_versions/lib/versions.php
@@ -21,6 +21,9 @@ class Storage {
const DEFAULTMAXSIZE=50; // unit: percentage; 50% of available disk space/quota
const VERSIONS_ROOT = 'files_versions/';
+ // files for which we can remove the versions after the delete operation was successful
+ private static $deletedFiles = array();
+
private static $max_versions_per_interval = array(
//first 10sec, one version every 2sec
1 => array('intervalEndsAfter' => 10, 'step' => 2),
@@ -142,25 +145,45 @@ class Storage {
/**
+ * @brief mark file as deleted so that we can remove the versions if the file is gone
+ * @param string $path
+ */
+ public static function markDeletedFile($path) {
+ list($uid, $filename) = self::getUidAndFilename($path);
+ self::$deletedFiles[$path] = array(
+ 'uid' => $uid,
+ 'filename' => $filename);
+ }
+
+ /**
* Delete versions of a file
*/
- public static function delete($filename) {
- list($uid, $filename) = self::getUidAndFilename($filename);
- $versions_fileview = new \OC\Files\View('/'.$uid .'/files_versions');
+ public static function delete($path) {
- $abs_path = $versions_fileview->getLocalFile($filename.'.v');
- if( ($versions = self::getVersions($uid, $filename)) ) {
- $versionsSize = self::getVersionsSize($uid);
- if ( $versionsSize === false || $versionsSize < 0 ) {
- $versionsSize = self::calculateSize($uid);
- }
- foreach ($versions as $v) {
- unlink($abs_path . $v['version']);
- \OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $abs_path . $v['version']));
- $versionsSize -= $v['size'];
+ $deletedFile = self::$deletedFiles[$path];
+ $uid = $deletedFile['uid'];
+ $filename = $deletedFile['filename'];
+
+ if (!\OC\Files\Filesystem::file_exists($path)) {
+
+ $versions_fileview = new \OC\Files\View('/' . $uid . '/files_versions');
+
+ $abs_path = $versions_fileview->getLocalFile($filename . '.v');
+ $versions = self::getVersions($uid, $filename);
+ if (!empty($versions)) {
+ $versionsSize = self::getVersionsSize($uid);
+ if ($versionsSize === false || $versionsSize < 0) {
+ $versionsSize = self::calculateSize($uid);
+ }
+ foreach ($versions as $v) {
+ unlink($abs_path . $v['version']);
+ \OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $abs_path . $v['version']));
+ $versionsSize -= $v['size'];
+ }
+ self::setVersionsSize($uid, $versionsSize);
}
- self::setVersionsSize($uid, $versionsSize);
}
+ unset(self::$deletedFiles[$path]);
}
/**