From f83d8ec0c9b49a66443f3e87b11a542d9b4fe139 Mon Sep 17 00:00:00 2001 From: Micke Nordin Date: Wed, 12 Aug 2026 11:05:54 +0200 Subject: [PATCH] feat(OCM): Implement ISigneCloudFederationProvider for deck When an app recieves OCM notifications, core needs to be able to resolve the remote seerver that sent the notification so that it can verify the signature of the notification. This patch implements the ISignedCloudFederationProvider interface for the deck app, so that this can happen. Signed-off-by: Micke Nordin --- lib/Db/BoardMapper.php | 16 ++++++++++++++++ lib/Federation/DeckFederationProvider.php | 15 +++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/lib/Db/BoardMapper.php b/lib/Db/BoardMapper.php index 9c734ac46e..d9d7d2c4b8 100644 --- a/lib/Db/BoardMapper.php +++ b/lib/Db/BoardMapper.php @@ -145,6 +145,22 @@ public function findByExternalId(int $externalId): array { return $this->findEntities($qb); } + /** + * Used by ISignedCloudFederationProvider to resolve a board from a share token. + * + * @param string $shareToken + * @return Board + * @throws DoesNotExistException + * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException + */ + public function findByShareToken(string $shareToken): Board { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from('deck_boards') + ->where($qb->expr()->eq('share_token', $qb->createNamedParameter($shareToken, IQueryBuilder::PARAM_STR))); + return $this->findEntity($qb); + } + public function findAllForUser(string $userId, ?int $since = null, bool $includeArchived = true, ?int $before = null, ?string $term = null): array { $useCache = ($since === -1 && $includeArchived === true && $before === null && $term === null); diff --git a/lib/Federation/DeckFederationProvider.php b/lib/Federation/DeckFederationProvider.php index d6e37486c5..558b0d38cb 100644 --- a/lib/Federation/DeckFederationProvider.php +++ b/lib/Federation/DeckFederationProvider.php @@ -14,13 +14,15 @@ use OCA\Deck\Db\BoardMapper; use OCA\Deck\Db\ChangeHelper; use OCA\Deck\Service\ConfigService; +use OCP\AppFramework\Db\DoesNotExistException; +use OCP\AppFramework\Db\MultipleObjectsReturnedException; use OCP\Common\Exception\NotFoundException; -use OCP\Federation\ICloudFederationProvider; use OCP\Federation\ICloudFederationShare; use OCP\Federation\ICloudIdManager; +use OCP\Federation\ISignedCloudFederationProvider; use OCP\Notification\IManager as INotificationManager; -class DeckFederationProvider implements ICloudFederationProvider { +class DeckFederationProvider implements ISignedCloudFederationProvider { public const PROVIDER_ID = 'deck'; public function __construct( @@ -106,4 +108,13 @@ public function notificationReceived($notificationType, $providerId, $notificati public function getSupportedShareTypes(): array { return ['user']; } + + #[\Override] + public function getFederationIdFromSharedSecret(#[\SensitiveParameter] string $sharedSecret, array $payload): string { + try { + return $this->boardMapper->findByShareToken($sharedSecret)->getOwner(); + } catch (DoesNotExistException|MultipleObjectsReturnedException) { + return ''; + } + } }