Also check for updated permissions for webdav storages
This commit is contained in:
parent
5b8c2ac750
commit
6f5d5b9a30
2 changed files with 54 additions and 17 deletions
18
apps/files_sharing/lib/external/storage.php
vendored
18
apps/files_sharing/lib/external/storage.php
vendored
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)) {
|
||||
|
@ -450,6 +436,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
|
||||
*
|
||||
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue