From 3a68d0311410def0cebb952e6ce1933265677fe5 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 27 Jul 2026 00:50:43 -0400 Subject: [PATCH] refactor: migrate to scoped execution contexts Signed-off-by: Sebastian --- lib/Auth/DavAuthBackend.php | 10 +++++----- lib/Backends/CalDavBackend.php | 30 +++++++++++++++--------------- lib/Backends/CardDavBackend.php | 30 +++++++++++++++--------------- lib/Backends/FilesRootNode.php | 10 +++++----- lib/Backends/PrincipalBackend.php | 20 ++++++++++---------- lib/DavServer.php | 20 ++++++++++---------- 6 files changed, 60 insertions(+), 60 deletions(-) diff --git a/lib/Auth/DavAuthBackend.php b/lib/Auth/DavAuthBackend.php index 7077538..9e6a827 100644 --- a/lib/Auth/DavAuthBackend.php +++ b/lib/Auth/DavAuthBackend.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace KTXM\ServiceDav\Auth; use KTXC\Service\SecurityService; -use KTXC\SessionIdentity; +use KTXC\Context\IdentityContext; use Sabre\DAV\Auth\Backend\AbstractBasic; use Sabre\HTTP\RequestInterface; use Sabre\HTTP\ResponseInterface; @@ -15,7 +15,7 @@ class DavAuthBackend extends AbstractBasic public const PRINCIPAL_PREFIX = 'principals/'; public function __construct( - private readonly SessionIdentity $identity, + private readonly IdentityContext $identityContext, private readonly SecurityService $securityService, string $realm = 'KTXC DAV', ) { @@ -24,8 +24,8 @@ class DavAuthBackend extends AbstractBasic public function check(RequestInterface $request, ResponseInterface $response): array { - if ($this->identity->identity() !== null) { - $userId = $this->identity->identifier(); + if ($this->identityContext->identity() !== null) { + $userId = $this->identityContext->identifier(); return [true, self::PRINCIPAL_PREFIX . $userId]; } @@ -39,7 +39,7 @@ class DavAuthBackend extends AbstractBasic return false; } - $this->identity->initialize($user, false); + $this->identityContext->initialize($user); return true; } } diff --git a/lib/Backends/CalDavBackend.php b/lib/Backends/CalDavBackend.php index 710add3..be2a387 100644 --- a/lib/Backends/CalDavBackend.php +++ b/lib/Backends/CalDavBackend.php @@ -4,8 +4,8 @@ declare(strict_types=1); namespace KTXM\ServiceDav\Backends; -use KTXC\SessionIdentity; -use KTXC\SessionTenant; +use KTXC\Context\IdentityContextInterface; +use KTXC\Context\TenantContextInterface; use KTXF\Chrono\Entity\JournalObject; use KTXF\Chrono\Entity\TaskObject; use KTXM\ChronoManager\Conversion\IcalDecoder; @@ -39,8 +39,8 @@ class CalDavBackend extends AbstractBackend public function __construct( private readonly ChronoManager $manager, - private readonly SessionIdentity $identity, - private readonly SessionTenant $tenant, + private readonly IdentityContextInterface $identityContext, + private readonly TenantContextInterface $tenantContext, private readonly DavUriMap $uriMap, private readonly IcalEncoder $encoder, private readonly IcalDecoder $decoder, @@ -50,7 +50,7 @@ class CalDavBackend extends AbstractBackend { $result = []; - $allCollections = $this->manager->collectionList($this->tenant->identifier(), $this->identity->identifier()); + $allCollections = $this->manager->collectionList($this->tenantContext->identifier(), $this->identityContext->identifier()); foreach ($allCollections as $providerId => $providerServices) { foreach ($providerServices as $serviceId => $collections) { @@ -93,8 +93,8 @@ class CalDavBackend extends AbstractBackend public function getCalendarObjects($calendarId): array { [$providerId, $serviceId, $collectionId] = $this->parseId($calendarId); - $tenantId = $this->tenant->identifier(); - $userId = $this->identity->identifier(); + $tenantId = $this->tenantContext->identifier(); + $userId = $this->identityContext->identifier(); $targets = ResourceIdentifiers::fromArray([$calendarId]); $all = $this->manager->entityListBulk($tenantId, $userId, $targets); @@ -127,8 +127,8 @@ class CalDavBackend extends AbstractBackend public function getCalendarObject($calendarId, $objectUri): ?array { [$providerId, $serviceId, $collectionId] = $this->parseId($calendarId); - $tenantId = $this->tenant->identifier(); - $userId = $this->identity->identifier(); + $tenantId = $this->tenantContext->identifier(); + $userId = $this->identityContext->identifier(); $mapId = $this->mapId($tenantId, $userId, $calendarId); // Resolve URI => entityId via the map; fall back to treating stripped URI as entityId @@ -167,8 +167,8 @@ class CalDavBackend extends AbstractBackend public function createCalendarObject($calendarId, $objectUri, $calendarData): ?string { [$providerId, $serviceId, $collectionId] = $this->parseId($calendarId); - $tenantId = $this->tenant->identifier(); - $userId = $this->identity->identifier(); + $tenantId = $this->tenantContext->identifier(); + $userId = $this->identityContext->identifier(); $vcal = Reader::read($calendarData); $props = $this->icalToEntityProps($vcal); @@ -190,8 +190,8 @@ class CalDavBackend extends AbstractBackend public function updateCalendarObject($calendarId, $objectUri, $calendarData): ?string { [$providerId, $serviceId, $collectionId] = $this->parseId($calendarId); - $tenantId = $this->tenant->identifier(); - $userId = $this->identity->identifier(); + $tenantId = $this->tenantContext->identifier(); + $userId = $this->identityContext->identifier(); $mapId = $this->mapId($tenantId, $userId, $calendarId); $entityId = $this->uriMap->getEntityId($mapId, $objectUri) @@ -210,8 +210,8 @@ class CalDavBackend extends AbstractBackend public function deleteCalendarObject($calendarId, $objectUri): void { [$providerId, $serviceId, $collectionId] = $this->parseId($calendarId); - $tenantId = $this->tenant->identifier(); - $userId = $this->identity->identifier(); + $tenantId = $this->tenantContext->identifier(); + $userId = $this->identityContext->identifier(); $mapId = $this->mapId($tenantId, $userId, $calendarId); $entityId = $this->uriMap->getEntityId($mapId, $objectUri) diff --git a/lib/Backends/CardDavBackend.php b/lib/Backends/CardDavBackend.php index c34fec7..c3b6ded 100644 --- a/lib/Backends/CardDavBackend.php +++ b/lib/Backends/CardDavBackend.php @@ -4,8 +4,8 @@ declare(strict_types=1); namespace KTXM\ServiceDav\Backends; -use KTXC\SessionIdentity; -use KTXC\SessionTenant; +use KTXC\Context\IdentityContextInterface; +use KTXC\Context\TenantContextInterface; use KTXF\Resource\Identifier\CollectionIdentifier; use KTXF\Resource\Identifier\EntityIdentifier; use KTXF\Resource\Identifier\ResourceIdentifiers; @@ -32,8 +32,8 @@ class CardDavBackend extends AbstractBackend public function __construct( private readonly PeopleManager $manager, - private readonly SessionIdentity $identity, - private readonly SessionTenant $tenant, + private readonly IdentityContextInterface $identityContext, + private readonly TenantContextInterface $tenantContext, private readonly DavUriMap $uriMap, ) {} @@ -46,7 +46,7 @@ class CardDavBackend extends AbstractBackend $result = []; // collectionList returns [providerId][serviceId][collectionId] => CollectionBaseInterface - $allCollections = $this->manager->collectionList($this->tenant->identifier(), $this->identity->identifier()); + $allCollections = $this->manager->collectionList($this->tenantContext->identifier(), $this->identityContext->identifier()); foreach ($allCollections as $providerId => $providerServices) { foreach ($providerServices as $serviceId => $collections) { @@ -94,8 +94,8 @@ class CardDavBackend extends AbstractBackend public function getCards($addressBookId): array { - $tenantId = $this->tenant->identifier(); - $userId = $this->identity->identifier(); + $tenantId = $this->tenantContext->identifier(); + $userId = $this->identityContext->identifier(); $targets = ResourceIdentifiers::fromArray([$addressBookId]); @@ -134,8 +134,8 @@ class CardDavBackend extends AbstractBackend public function getCard($addressBookId, $cardUri): ?array { [$providerId, $serviceId, $collectionId] = $this->parseId($addressBookId); - $tenantId = $this->tenant->identifier(); - $userId = $this->identity->identifier(); + $tenantId = $this->tenantContext->identifier(); + $userId = $this->identityContext->identifier(); $mapId = $this->mapId($tenantId, $userId, $addressBookId); $entityId = $this->uriMap->getEntityId($mapId, $cardUri) @@ -172,8 +172,8 @@ class CardDavBackend extends AbstractBackend public function createCard($addressBookId, $cardUri, $cardData): ?string { [$providerId, $serviceId, $collectionId] = $this->parseId($addressBookId); - $tenantId = $this->tenant->identifier(); - $userId = $this->identity->identifier(); + $tenantId = $this->tenantContext->identifier(); + $userId = $this->identityContext->identifier(); $vcard = Reader::read($cardData); $props = $this->vcardToEntityProps($vcard); @@ -192,8 +192,8 @@ class CardDavBackend extends AbstractBackend public function updateCard($addressBookId, $cardUri, $cardData): ?string { [$providerId, $serviceId, $collectionId] = $this->parseId($addressBookId); - $tenantId = $this->tenant->identifier(); - $userId = $this->identity->identifier(); + $tenantId = $this->tenantContext->identifier(); + $userId = $this->identityContext->identifier(); $mapId = $this->mapId($tenantId, $userId, $addressBookId); $entityId = $this->uriMap->getEntityId($mapId, $cardUri) @@ -210,8 +210,8 @@ class CardDavBackend extends AbstractBackend public function deleteCard($addressBookId, $cardUri): bool { [$providerId, $serviceId, $collectionId] = $this->parseId($addressBookId); - $tenantId = $this->tenant->identifier(); - $userId = $this->identity->identifier(); + $tenantId = $this->tenantContext->identifier(); + $userId = $this->identityContext->identifier(); $mapId = $this->mapId($tenantId, $userId, $addressBookId); $entityId = $this->uriMap->getEntityId($mapId, $cardUri) diff --git a/lib/Backends/FilesRootNode.php b/lib/Backends/FilesRootNode.php index 49215f7..020c559 100644 --- a/lib/Backends/FilesRootNode.php +++ b/lib/Backends/FilesRootNode.php @@ -4,8 +4,8 @@ declare(strict_types=1); namespace KTXM\ServiceDav\Backends; -use KTXC\SessionIdentity; -use KTXC\SessionTenant; +use KTXC\Context\IdentityContextInterface; +use KTXC\Context\TenantContextInterface; use KTXM\DocumentsManager\Manager as DocumentsManager; use Sabre\DAV\Collection; use Sabre\DAV\Exception\Forbidden; @@ -23,8 +23,8 @@ class FilesRootNode extends Collection { public function __construct( private readonly DocumentsManager $manager, - private readonly SessionIdentity $identity, - private readonly SessionTenant $tenant, + private readonly IdentityContextInterface $identityContext, + private readonly TenantContextInterface $tenantContext, ) {} public function getName(): string @@ -36,7 +36,7 @@ class FilesRootNode extends Collection public function getChildren(): array { $nodes = []; - $services = $this->manager->serviceList($this->tenant->identifier(), $this->identity->identifier()); + $services = $this->manager->serviceList($this->tenantContext->identifier(), $this->identityContext->identifier()); foreach ($services as $providerId => $providerServices) { foreach ($providerServices as $serviceId => $service) { diff --git a/lib/Backends/PrincipalBackend.php b/lib/Backends/PrincipalBackend.php index 15e89de..0821082 100644 --- a/lib/Backends/PrincipalBackend.php +++ b/lib/Backends/PrincipalBackend.php @@ -4,8 +4,8 @@ declare(strict_types=1); namespace KTXM\ServiceDav\Backends; -use KTXC\SessionIdentity; -use KTXC\SessionTenant; +use KTXC\Context\IdentityContextInterface; +use KTXC\Context\TenantContextInterface; use KTXM\ServiceDav\DavProperties; use Sabre\DAVACL\PrincipalBackend\BackendInterface; @@ -17,8 +17,8 @@ class PrincipalBackend implements BackendInterface public const PRINCIPAL_PREFIX = 'principals'; public function __construct( - private readonly SessionIdentity $identity, - private readonly SessionTenant $tenant, + private readonly IdentityContextInterface $identityContext, + private readonly TenantContextInterface $tenantContext, ) {} // ------------------------------------------------------------------------- @@ -27,7 +27,7 @@ class PrincipalBackend implements BackendInterface public function getPrincipalsByPrefix($prefixPath): array { - if ($prefixPath !== self::PRINCIPAL_PREFIX || $this->identity->identity() === null) { + if ($prefixPath !== self::PRINCIPAL_PREFIX || $this->identityContext->identity() === null) { return []; } @@ -36,11 +36,11 @@ class PrincipalBackend implements BackendInterface public function getPrincipalByPath($path): ?array { - if ($this->identity->identity() === null) { + if ($this->identityContext->identity() === null) { return null; } - $expected = self::PRINCIPAL_PREFIX . '/' . $this->identity->identifier(); + $expected = self::PRINCIPAL_PREFIX . '/' . $this->identityContext->identifier(); if ($path !== $expected) { return null; } @@ -84,9 +84,9 @@ class PrincipalBackend implements BackendInterface private function buildPrincipal(): array { - $userId = $this->identity->identifier(); - $label = $this->identity->label() ?? $userId; - $email = $this->identity->mailAddress() ?? ''; + $userId = $this->identityContext->identifier(); + $label = $this->identityContext->label() ?? $userId; + $email = $this->identityContext->mailAddress() ?? ''; return [ DavProperties::URI => self::PRINCIPAL_PREFIX . '/' . $userId, diff --git a/lib/DavServer.php b/lib/DavServer.php index 7715969..ad20892 100644 --- a/lib/DavServer.php +++ b/lib/DavServer.php @@ -9,8 +9,8 @@ use KTXC\Http\Request\Request; use KTXC\Http\Response\Response; use KTXC\Http\Response\StreamedResponse; use KTXC\Service\SecurityService; -use KTXC\SessionIdentity; -use KTXC\SessionTenant; +use KTXC\Context\IdentityContextInterface; +use KTXC\Context\TenantContextInterface; use KTXM\ChronoManager\Conversion\IcalDecoder; use KTXM\ChronoManager\Conversion\IcalEncoder; use KTXM\ChronoManager\Manager as ChronoManager; @@ -41,8 +41,8 @@ class DavServer private const BASE_URI = '/dav/'; public function __construct( - private readonly SessionTenant $tenant, - private readonly SessionIdentity $identity, + private readonly TenantContextInterface $tenantContext, + private readonly IdentityContextInterface $identityContext, private readonly SecurityService $securityService, private readonly DocumentsManager $documentsManager, private readonly ChronoManager $chronoManager, @@ -99,26 +99,26 @@ class DavServer private function buildServer(): Server { - $principalBackend = new PrincipalBackend($this->identity, $this->tenant); - $calDavBackend = new CalDavBackend($this->chronoManager, $this->identity, $this->tenant, $this->uriMap, new IcalEncoder(), new IcalDecoder()); - $cardDavBackend = new CardDavBackend($this->peopleManager, $this->identity, $this->tenant, $this->uriMap); + $principalBackend = new PrincipalBackend($this->identityContext, $this->tenantContext); + $calDavBackend = new CalDavBackend($this->chronoManager, $this->identityContext, $this->tenantContext, $this->uriMap, new IcalEncoder(), new IcalDecoder()); + $cardDavBackend = new CardDavBackend($this->peopleManager, $this->identityContext, $this->tenantContext, $this->uriMap); $server = new Server([ new PrincipalCollection($principalBackend, PrincipalBackend::PRINCIPAL_PREFIX), new CalendarRoot($principalBackend, $calDavBackend), new AddressBookRoot($principalBackend, $cardDavBackend), - new FilesRootNode($this->documentsManager, $this->identity, $this->tenant), + new FilesRootNode($this->documentsManager, $this->identityContext, $this->tenantContext), ]); $server->setBaseUri(self::BASE_URI); $server->debugExceptions = $this->debug; // Authentication plugin — short-circuits when JWT/Bearer already populated - $authBackend = new DavAuthBackend($this->identity, $this->securityService); + $authBackend = new DavAuthBackend($this->identityContext, $this->securityService); $server->addPlugin(new AuthPlugin($authBackend)); // DAVACL — required for CalDAV / CardDAV principal resolution $aclPlugin = new DavACLPlugin(); - $userId = (string) ($this->identity->identifier() ?? 'anonymous'); + $userId = (string) ($this->identityContext->identifier() ?? 'anonymous'); $aclPlugin->adminPrincipals = [PrincipalBackend::PRINCIPAL_PREFIX . '/' . $userId]; $server->addPlugin($aclPlugin);