diff --git a/lib/Providers/DAV/Calendar/Hybrid/EventCollection.php b/lib/Providers/DAV/Calendar/Hybrid/EventCollection.php index 5cbfe8d..498c2d5 100644 --- a/lib/Providers/DAV/Calendar/Hybrid/EventCollection.php +++ b/lib/Providers/DAV/Calendar/Hybrid/EventCollection.php @@ -116,7 +116,7 @@ public function setName($id): void { public function getACL(): array { $permissions = $this->collection->permissions; if ($permissions === null || count($permissions) === 0) { - $permissions = ['{DAV:}read']; + $permissions = ['{DAV:}read', '{DAV:}write-properties']; } return array_map(function ($permission) { return [ diff --git a/lib/Providers/DAV/Contacts/Hybrid/ContactCollection.php b/lib/Providers/DAV/Contacts/Hybrid/ContactCollection.php index 1842ad8..4023008 100644 --- a/lib/Providers/DAV/Contacts/Hybrid/ContactCollection.php +++ b/lib/Providers/DAV/Contacts/Hybrid/ContactCollection.php @@ -106,7 +106,7 @@ public function setName($id): void { public function getACL(): array { $permissions = $this->collection->permissions; if ($permissions === null || count($permissions) === 0) { - $permissions = ['{DAV:}read']; + $permissions = ['{DAV:}read', '{DAV:}write-properties']; } return array_map(function ($permission) { return [ diff --git a/lib/Service/Remote/RemoteContactsService.php b/lib/Service/Remote/RemoteContactsService.php index a48bea7..2ffa6a2 100644 --- a/lib/Service/Remote/RemoteContactsService.php +++ b/lib/Service/Remote/RemoteContactsService.php @@ -346,7 +346,7 @@ private function toCollectionModel(string $id, array $so): Collection { if (is_array($acl)) { $permissions = RemoteConvert::extractPermissions($acl); $to->permissions = $permissions[$owner] ?? []; - } elseif ($owner !== null && $owner === $this->dataStore->getPrincipalUrl()) { + } elseif ($owner !== null && RemoteConvert::extractUrlPath($owner) === $this->dataStore->getPrincipalUrl()) { // Server did not return ACL entries; infer owner-level permission from the // {DAV:}all property when it matches the authenticated principal. $to->permissions = ['{DAV:}all']; diff --git a/lib/Service/Remote/RemoteConvert.php b/lib/Service/Remote/RemoteConvert.php index 08d4ab3..b67d674 100644 --- a/lib/Service/Remote/RemoteConvert.php +++ b/lib/Service/Remote/RemoteConvert.php @@ -11,6 +11,17 @@ class RemoteConvert { + public static function extractUrlPath(?string $url): ?string { + if ($url === null || $url === '') { + return null; + } + $parsed = parse_url($url); + if (isset($parsed['host'])) { + return $parsed['path'] ?? null; + } + return $url; + } + public static function extractPermissions(array $acl): array { $permissions = []; foreach ($acl as $entry) { diff --git a/lib/Service/Remote/RemoteEventsService.php b/lib/Service/Remote/RemoteEventsService.php index 8028147..2479e47 100644 --- a/lib/Service/Remote/RemoteEventsService.php +++ b/lib/Service/Remote/RemoteEventsService.php @@ -349,7 +349,7 @@ private function toCollectionModel(string $id, array $so): Collection { if (is_array($acl)) { $permissions = RemoteConvert::extractPermissions($acl); $to->permissions = $permissions[$owner] ?? []; - } elseif ($owner !== null && $owner === $this->dataStore->getPrincipalUrl()) { + } elseif ($owner !== null && RemoteConvert::extractUrlPath($owner) === $this->dataStore->getPrincipalUrl()) { // Server did not return ACL entries; infer owner-level permission from the // {DAV:}all property when it matches the authenticated principal. $to->permissions = ['{DAV:}all'];