From 1c40a0520403f84ec72b5925d9218c54987dc37b Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 8 Feb 2017 18:18:38 +0100 Subject: [PATCH] Restrict proppatch to the proper nodes Need to fetch the node earlier because cancelling from within the handler is not possible. Well, it is but it prevents other node types using the same property names to run because the failure marks the property with status 403. --- apps/dav/lib/Connector/Sabre/FilesPlugin.php | 17 +++++++---------- apps/dav/lib/Connector/Sabre/TagsPlugin.php | 17 +++++++---------- apps/dav/lib/SystemTag/SystemTagPlugin.php | 12 ++++++------ 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/apps/dav/lib/Connector/Sabre/FilesPlugin.php b/apps/dav/lib/Connector/Sabre/FilesPlugin.php index 5a08e37a15..1b1f43df9e 100644 --- a/apps/dav/lib/Connector/Sabre/FilesPlugin.php +++ b/apps/dav/lib/Connector/Sabre/FilesPlugin.php @@ -386,25 +386,22 @@ class FilesPlugin extends ServerPlugin { * @return void */ public function handleUpdateProperties($path, PropPatch $propPatch) { - $propPatch->handle(self::LASTMODIFIED_PROPERTYNAME, function($time) use ($path) { + $node = $this->tree->getNodeForPath($path); + if (!($node instanceof \OCA\DAV\Connector\Sabre\Node)) { + return; + } + + $propPatch->handle(self::LASTMODIFIED_PROPERTYNAME, function($time) use ($node) { if (empty($time)) { return false; } - $node = $this->tree->getNodeForPath($path); - if (is_null($node)) { - return 404; - } $node->touch($time); return true; }); - $propPatch->handle(self::GETETAG_PROPERTYNAME, function($etag) use ($path) { + $propPatch->handle(self::GETETAG_PROPERTYNAME, function($etag) use ($node) { if (empty($etag)) { return false; } - $node = $this->tree->getNodeForPath($path); - if (is_null($node)) { - return 404; - } if ($node->setEtag($etag) !== -1) { return true; } diff --git a/apps/dav/lib/Connector/Sabre/TagsPlugin.php b/apps/dav/lib/Connector/Sabre/TagsPlugin.php index 59e4ab4546..490501a001 100644 --- a/apps/dav/lib/Connector/Sabre/TagsPlugin.php +++ b/apps/dav/lib/Connector/Sabre/TagsPlugin.php @@ -267,20 +267,17 @@ class TagsPlugin extends \Sabre\DAV\ServerPlugin * @return void */ public function handleUpdateProperties($path, PropPatch $propPatch) { - $propPatch->handle(self::TAGS_PROPERTYNAME, function($tagList) use ($path) { - $node = $this->tree->getNodeForPath($path); - if (is_null($node)) { - return 404; - } + $node = $this->tree->getNodeForPath($path); + if (!($node instanceof \OCA\DAV\Connector\Sabre\Node)) { + return; + } + + $propPatch->handle(self::TAGS_PROPERTYNAME, function($tagList) use ($node) { $this->updateTags($node->getId(), $tagList->getTags()); return true; }); - $propPatch->handle(self::FAVORITE_PROPERTYNAME, function($favState) use ($path) { - $node = $this->tree->getNodeForPath($path); - if (is_null($node)) { - return 404; - } + $propPatch->handle(self::FAVORITE_PROPERTYNAME, function($favState) use ($node) { if ((int)$favState === 1 || $favState === 'true') { $this->getTagger()->tagAs($node->getId(), self::TAG_FAVORITE); } else { diff --git a/apps/dav/lib/SystemTag/SystemTagPlugin.php b/apps/dav/lib/SystemTag/SystemTagPlugin.php index d76bf2e689..98c730906c 100644 --- a/apps/dav/lib/SystemTag/SystemTagPlugin.php +++ b/apps/dav/lib/SystemTag/SystemTagPlugin.php @@ -268,17 +268,17 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin { * @return void */ public function handleUpdateProperties($path, PropPatch $propPatch) { + $node = $this->server->tree->getNodeForPath($path); + if (!($node instanceof SystemTagNode)) { + return; + } + $propPatch->handle([ self::DISPLAYNAME_PROPERTYNAME, self::USERVISIBLE_PROPERTYNAME, self::USERASSIGNABLE_PROPERTYNAME, self::GROUPS_PROPERTYNAME, - ], function($props) use ($path) { - $node = $this->server->tree->getNodeForPath($path); - if (!($node instanceof SystemTagNode)) { - return; - } - + ], function($props) use ($node) { $tag = $node->getSystemTag(); $name = $tag->getName(); $userVisible = $tag->isUserVisible();