diff --git a/apps/webhook_listeners/lib/BackgroundJobs/WebhookCall.php b/apps/webhook_listeners/lib/BackgroundJobs/WebhookCall.php index d9a2cf532adce..0bd76670d929f 100644 --- a/apps/webhook_listeners/lib/BackgroundJobs/WebhookCall.php +++ b/apps/webhook_listeners/lib/BackgroundJobs/WebhookCall.php @@ -46,7 +46,7 @@ protected function run($argument): void { $client = $this->clientService->newClient(); // adding Ephemeral auth tokens to the call - $data['tokens'] = $this->tokenService->getTokens($webhookListener, $data['user']['uid'] ?? null); + $data['authentication'] = $this->tokenService->getTokens($webhookListener, $data['user']['uid'] ?? null); $options = [ 'verify' => $this->certificateManager->getAbsoluteBundlePath(), 'headers' => $webhookListener->getHeaders() ?? [], diff --git a/apps/webhook_listeners/lib/Service/TokenService.php b/apps/webhook_listeners/lib/Service/TokenService.php index e75d1b8f4e006..dce6a56f03f35 100644 --- a/apps/webhook_listeners/lib/Service/TokenService.php +++ b/apps/webhook_listeners/lib/Service/TokenService.php @@ -14,6 +14,7 @@ use OCA\WebhookListeners\Db\WebhookListener; use OCP\AppFramework\Utility\ITimeFactory; use OCP\Authentication\Token\IToken; +use OCP\IURLGenerator; use OCP\IUserManager; use OCP\L10N\IFactory; use OCP\Security\ISecureRandom; @@ -22,6 +23,7 @@ class TokenService { public function __construct( private IProvider $tokenProvider, + private IURLGenerator $urlGenerator, private ISecureRandom $random, private EphemeralTokenMapper $tokenMapper, private LoggerInterface $logger, @@ -35,7 +37,30 @@ public function __construct( * creates an array which includes two arrays of tokens: 'user_ids' and 'user_roles' * The array ['user_ids' => ['jane', 'bob'], 'user_roles' => ['owner', 'trigger']] * as requested tokens in the registered webhook produces a result like - * ['user_ids' => [['jane' => 'abcdtokenabcd1'], ['bob','=> 'abcdtokenabcd2']], 'user_roles' => ['owner' => ['admin' => 'abcdtokenabcd3'], 'trigger' => ['user1' => 'abcdtokenabcd4']]] + * [ + * ['user_ids' => [ + * ['jane' => [ + * 'userId' => 'jane', + * 'token' => 'abcdtokenabcd1' + * 'baseUrl' => 'https://nextcloud.example' + * ], + * ['bob'=> [ + * 'userId' => 'bob', + * 'token' => 'abcdtokenabcd2' + * 'baseUrl' => 'https://nextcloud.example' + * ], + * ], + * 'owner' => [ + * 'userId' => 'admin', + * 'token' => 'abcdtokenabcd3' + * 'baseUrl' => 'https://nextcloud.example' + * ], + * 'trigger' => [ + * 'userId' => 'user1', + * 'token' => 'abcdtokenabcd4' + * 'baseUrl' => 'https://nextcloud.example' + * ], + * ] * Created auth tokens are valid for 1 hour. * * @param WebhookListener $webhookListener @@ -43,15 +68,20 @@ public function __construct( * @return array{user_ids?:array,user_roles?:array{owner?:array,trigger?:array}} */ public function getTokens(WebhookListener $webhookListener, ?string $triggerUserId): array { - $tokens = [ - 'user_ids' => [], - 'user_roles' => [], - ]; + $tokens = []; + $tokenNeeded = $webhookListener->getTokenNeeded(); if (isset($tokenNeeded['user_ids'])) { + $tokens = [ + 'user_ids' => [], + ]; foreach ($tokenNeeded['user_ids'] as $userId) { try { - $tokens['user_ids'][$userId] = $this->createEphemeralToken($userId); + $tokens['user_ids'][$userId] = [ + 'userId' => $userId, + 'token' => $this->createEphemeralToken($userId), + 'baseUrl' => $this->urlGenerator->getBaseUrl() + ]; } catch (\Exception $e) { $this->logger->error('Webhook token creation for user ' . $userId . ' failed: ' . $e->getMessage(), ['exception' => $e]); } @@ -67,8 +97,10 @@ public function getTokens(WebhookListener $webhookListener, ?string $triggerUser if (is_null($ownerId)) { // no owner uid available break; } - $tokens['user_roles']['owner'] = [ - $ownerId => $this->createEphemeralToken($ownerId) + $tokens['owner'] = [ + 'userId' => $ownerId, + 'token' => $this->createEphemeralToken($ownerId), + 'baseUrl' => $this->urlGenerator->getBaseUrl() ]; break; case 'trigger': @@ -76,8 +108,10 @@ public function getTokens(WebhookListener $webhookListener, ?string $triggerUser if (is_null($triggerUserId)) { // no trigger uid available break; } - $tokens['user_roles']['trigger'] = [ - $triggerUserId => $this->createEphemeralToken($triggerUserId) + $tokens['trigger'] = [ + 'userId' => $triggerUserId, + 'token' => $this->createEphemeralToken($triggerUserId), + 'baseUrl' => $this->urlGenerator->getBaseUrl() ]; break; default: