diff --git a/lib/DAV/LockPlugin.php b/lib/DAV/LockPlugin.php index 21008bed..37313e66 100644 --- a/lib/DAV/LockPlugin.php +++ b/lib/DAV/LockPlugin.php @@ -103,13 +103,13 @@ public function customProperties(PropFind $propFind, INode $node) { $nodeId = $node->getId(); - $propFind->handle(Application::DAV_PROPERTY_LOCK, function () use ($nodeId) { - $lock = $this->lockService->getLockForNodeId($nodeId); + $propFind->handle(Application::DAV_PROPERTY_LOCK, function () use ($nodeId, $node) { + $lock = $this->lockService->getLockForNodeId($nodeId, $node->getNode()); return $lock instanceof FileLock; }); - $propFind->handle(Application::DAV_PROPERTY_LOCK_OWNER, function () use ($nodeId) { - $lock = $this->lockService->getLockForNodeId($nodeId); + $propFind->handle(Application::DAV_PROPERTY_LOCK_OWNER, function () use ($nodeId, $node) { + $lock = $this->lockService->getLockForNodeId($nodeId, $node->getNode()); if ($lock === false) { return null; @@ -122,8 +122,8 @@ public function customProperties(PropFind $propFind, INode $node) { return $lock->getOwner(); }); - $propFind->handle(Application::DAV_PROPERTY_LOCK_TIME, function () use ($nodeId) { - $lock = $this->lockService->getLockForNodeId($nodeId); + $propFind->handle(Application::DAV_PROPERTY_LOCK_TIME, function () use ($nodeId, $node) { + $lock = $this->lockService->getLockForNodeId($nodeId, $node->getNode()); if ($lock === false) { return null; @@ -132,8 +132,8 @@ public function customProperties(PropFind $propFind, INode $node) { return $lock->getCreatedAt(); }); - $propFind->handle(Application::DAV_PROPERTY_LOCK_TIMEOUT, function () use ($nodeId) { - $lock = $this->lockService->getLockForNodeId($nodeId); + $propFind->handle(Application::DAV_PROPERTY_LOCK_TIMEOUT, function () use ($nodeId, $node) { + $lock = $this->lockService->getLockForNodeId($nodeId, $node->getNode()); if ($lock === false) { return null; @@ -142,8 +142,8 @@ public function customProperties(PropFind $propFind, INode $node) { return $lock->getTimeout(); }); - $propFind->handle(Application::DAV_PROPERTY_LOCK_OWNER_DISPLAYNAME, function () use ($nodeId) { - $lock = $this->lockService->getLockForNodeId($nodeId); + $propFind->handle(Application::DAV_PROPERTY_LOCK_OWNER_DISPLAYNAME, function () use ($nodeId, $node) { + $lock = $this->lockService->getLockForNodeId($nodeId, $node->getNode()); if ($lock === false) { return null; @@ -154,8 +154,8 @@ public function customProperties(PropFind $propFind, INode $node) { return $lock->getDisplayName(); }); - $propFind->handle(Application::DAV_PROPERTY_LOCK_OWNER_TYPE, function () use ($nodeId) { - $lock = $this->lockService->getLockForNodeId($nodeId); + $propFind->handle(Application::DAV_PROPERTY_LOCK_OWNER_TYPE, function () use ($nodeId, $node) { + $lock = $this->lockService->getLockForNodeId($nodeId, $node->getNode()); if ($lock === false) { return null; @@ -164,8 +164,8 @@ public function customProperties(PropFind $propFind, INode $node) { return $lock->getType(); }); - $propFind->handle(Application::DAV_PROPERTY_LOCK_EDITOR, function () use ($nodeId) { - $lock = $this->lockService->getLockForNodeId($nodeId); + $propFind->handle(Application::DAV_PROPERTY_LOCK_EDITOR, function () use ($nodeId, $node) { + $lock = $this->lockService->getLockForNodeId($nodeId, $node->getNode()); if ($lock === false || $lock->getType() !== ILock::TYPE_APP) { return null; } @@ -173,8 +173,8 @@ public function customProperties(PropFind $propFind, INode $node) { return $lock->getOwner(); }); - $propFind->handle(Application::DAV_PROPERTY_LOCK_TOKEN, function () use ($nodeId) { - $lock = $this->lockService->getLockForNodeId($nodeId); + $propFind->handle(Application::DAV_PROPERTY_LOCK_TOKEN, function () use ($nodeId, $node) { + $lock = $this->lockService->getLockForNodeId($nodeId, $node->getNode()); if ($lock === false) { return null; } diff --git a/lib/Service/LockService.php b/lib/Service/LockService.php index 7d3f9935..549a1f24 100644 --- a/lib/Service/LockService.php +++ b/lib/Service/LockService.php @@ -26,6 +26,7 @@ use OCP\Files\Lock\ILock; use OCP\Files\Lock\LockContext; use OCP\Files\Lock\OwnerLockedException; +use OCP\Files\Node; use OCP\Files\NotFoundException; use OCP\IL10N; use OCP\IRequest; @@ -88,7 +89,7 @@ public function __construct( * * @return FileLock|bool */ - public function getLockForNodeId(int $nodeId) { + public function getLockForNodeId(int $nodeId, ?Node $node = null) { if (array_key_exists($nodeId, $this->lockCache) && $this->lockCache[$nodeId] !== null) { return $this->lockCache[$nodeId]; } @@ -96,7 +97,7 @@ public function getLockForNodeId(int $nodeId) { try { $this->lockCache[$nodeId] = $this->getLockFromFileId($nodeId); } catch (LockNotFoundException) { - $remoteLock = $this->getRemoteLockFromDav($nodeId); + $remoteLock = $this->getRemoteLockFromDav($nodeId, $node); $this->lockCache[$nodeId] = $remoteLock ?: false; } @@ -399,15 +400,17 @@ function (FileLock $lock) { $this->locksRequest->removeIds($ids); } - public function getRemoteLockFromDav(int $nodeId): ?FileLock { + public function getRemoteLockFromDav(int $nodeId, ?Node $node = null): ?FileLock { try { $user = $this->userSession->getUser(); if (!$user) { return null; } - $userFolder = $this->rootFolder->getUserFolder($user->getUID()); - $node = $userFolder->getFirstNodeById($nodeId); + if (!$node) { + $userFolder = $this->rootFolder->getUserFolder($user->getUID()); + $node = $userFolder->getFirstNodeById($nodeId); + } if (empty($node)) { return null; }