aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Appelman <icewind@owncloud.com>2014-06-27 17:27:47 +0200
committerRobin Appelman <icewind@owncloud.com>2014-06-27 17:27:47 +0200
commit6f5d5b9a307f0c3d4f751c5bd7b877757637b309 (patch)
treee889e2fa0bd6d9a3ebe9f7e2a3574b52e5b38729
parent5b8c2ac750e79e574b49e0ba7ac866f0d5002003 (diff)
downloadnextcloud-server-6f5d5b9a307f0c3d4f751c5bd7b877757637b309.tar.gz
nextcloud-server-6f5d5b9a307f0c3d4f751c5bd7b877757637b309.zip
Also check for updated permissions for webdav storages
-rw-r--r--apps/files_sharing/lib/external/storage.php18
-rw-r--r--lib/private/files/storage/dav.php53
2 files changed, 54 insertions, 17 deletions
diff --git a/apps/files_sharing/lib/external/storage.php b/apps/files_sharing/lib/external/storage.php
index 2771f974614..f3674155799 100644
--- a/apps/files_sharing/lib/external/storage.php
+++ b/apps/files_sharing/lib/external/storage.php
@@ -33,6 +33,8 @@ class Storage extends DAV implements ISharedStorage {
*/
private $token;
+ private $updateChecked = false;
+
public function __construct($options) {
$this->remote = $options['remote'];
$this->remoteUser = $options['owner'];
@@ -100,4 +102,20 @@ class Storage extends DAV implements ISharedStorage {
}
return $this->scanner;
}
+
+ /**
+ * check if a file or folder has been updated since $time
+ *
+ * @param string $path
+ * @param int $time
+ * @return bool
+ */
+ public function hasUpdated($path, $time) {
+ // since we check updates for the entire storage at once, we only need to check once per request
+ if ($this->updateChecked) {
+ return false;
+ }
+ $this->updateChecked = true;
+ return parent::hasUpdated('', $time);
+ }
}
diff --git a/lib/private/files/storage/dav.php b/lib/private/files/storage/dav.php
index 64c61873d07..788ae41e2bc 100644
--- a/lib/private/files/storage/dav.php
+++ b/lib/private/files/storage/dav.php
@@ -426,21 +426,7 @@ class DAV extends \OC\Files\Storage\Common {
$this->init();
$response = $this->client->propfind($this->encodePath($path), array('{http://owncloud.org/ns}permissions'));
if (isset($response['{http://owncloud.org/ns}permissions'])) {
- $permissions = \OCP\PERMISSION_READ;
- $permissionsString = $response['{http://owncloud.org/ns}permissions'];
- if (strpos($permissionsString, 'R') !== false) {
- $permissions |= \OCP\PERMISSION_SHARE;
- }
- if (strpos($permissionsString, 'D') !== false) {
- $permissions |= \OCP\PERMISSION_DELETE;
- }
- if (strpos($permissionsString, 'W') !== false) {
- $permissions |= \OCP\PERMISSION_UPDATE;
- }
- if (strpos($permissionsString, 'C') !== false) {
- $permissions |= \OCP\PERMISSION_CREATE;
- }
- return $permissions;
+ return $this->parsePermissions($response['{http://owncloud.org/ns}permissions']);
} else if ($this->is_dir($path)) {
return \OCP\PERMISSION_ALL;
} else if ($this->file_exists($path)) {
@@ -451,6 +437,27 @@ class DAV extends \OC\Files\Storage\Common {
}
/**
+ * @param string $permissionsString
+ * @return int
+ */
+ protected function parsePermissions($permissionsString) {
+ $permissions = \OCP\PERMISSION_READ;
+ if (strpos($permissionsString, 'R') !== false) {
+ $permissions |= \OCP\PERMISSION_SHARE;
+ }
+ if (strpos($permissionsString, 'D') !== false) {
+ $permissions |= \OCP\PERMISSION_DELETE;
+ }
+ if (strpos($permissionsString, 'W') !== false) {
+ $permissions |= \OCP\PERMISSION_UPDATE;
+ }
+ if (strpos($permissionsString, 'C') !== false) {
+ $permissions |= \OCP\PERMISSION_CREATE;
+ }
+ return $permissions;
+ }
+
+ /**
* check if a file or folder has been updated since $time
*
* @param string $path
@@ -459,10 +466,22 @@ class DAV extends \OC\Files\Storage\Common {
*/
public function hasUpdated($path, $time) {
$this->init();
- $response = $this->client->propfind($this->encodePath($path), array('{DAV:}getlastmodified', '{DAV:}getetag'));
+ $response = $this->client->propfind($this->encodePath($path), array(
+ '{DAV:}getlastmodified',
+ '{DAV:}getetag',
+ '{http://owncloud.org/ns}permissions'
+ ));
if (isset($response['{DAV:}getetag'])) {
$cachedData = $this->getCache()->get($path);
- return $cachedData['etag'] !== $response['{DAV:}getetag'];
+ $etag = trim($response['{DAV:}getetag'], '"');
+ if ($cachedData['etag'] !== $etag) {
+ return true;
+ } else if (isset($response['{http://owncloud.org/ns}permissions'])) {
+ $permissions = $this->parsePermissions($response['{http://owncloud.org/ns}permissions']);
+ return $permissions !== $cachedData['permissions'];
+ } else {
+ return false;
+ }
} else {
$remoteMtime = strtotime($response['{DAV:}getlastmodified']);
return $remoteMtime > $time;