Skip to content

Commit fdfaf6b

Browse files
Merge pull request #57372 from nextcloud/feat/adapt-webhook
Feat(webhook_listeners): adapt webhook payload format
2 parents ad13a8a + 65d44b0 commit fdfaf6b

File tree

2 files changed

+45
-11
lines changed

2 files changed

+45
-11
lines changed

apps/webhook_listeners/lib/BackgroundJobs/WebhookCall.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ protected function run($argument): void {
4646
$client = $this->clientService->newClient();
4747

4848
// adding Ephemeral auth tokens to the call
49-
$data['tokens'] = $this->tokenService->getTokens($webhookListener, $data['user']['uid'] ?? null);
49+
$data['authentication'] = $this->tokenService->getTokens($webhookListener, $data['user']['uid'] ?? null);
5050
$options = [
5151
'verify' => $this->certificateManager->getAbsoluteBundlePath(),
5252
'headers' => $webhookListener->getHeaders() ?? [],

apps/webhook_listeners/lib/Service/TokenService.php

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use OCA\WebhookListeners\Db\WebhookListener;
1515
use OCP\AppFramework\Utility\ITimeFactory;
1616
use OCP\Authentication\Token\IToken;
17+
use OCP\IURLGenerator;
1718
use OCP\IUserManager;
1819
use OCP\L10N\IFactory;
1920
use OCP\Security\ISecureRandom;
@@ -22,6 +23,7 @@
2223
class TokenService {
2324
public function __construct(
2425
private IProvider $tokenProvider,
26+
private IURLGenerator $urlGenerator,
2527
private ISecureRandom $random,
2628
private EphemeralTokenMapper $tokenMapper,
2729
private LoggerInterface $logger,
@@ -35,23 +37,51 @@ public function __construct(
3537
* creates an array which includes two arrays of tokens: 'user_ids' and 'user_roles'
3638
* The array ['user_ids' => ['jane', 'bob'], 'user_roles' => ['owner', 'trigger']]
3739
* as requested tokens in the registered webhook produces a result like
38-
* ['user_ids' => [['jane' => 'abcdtokenabcd1'], ['bob','=> 'abcdtokenabcd2']], 'user_roles' => ['owner' => ['admin' => 'abcdtokenabcd3'], 'trigger' => ['user1' => 'abcdtokenabcd4']]]
40+
* [
41+
* ['user_ids' => [
42+
* ['jane' => [
43+
* 'userId' => 'jane',
44+
* 'token' => 'abcdtokenabcd1'
45+
* 'baseUrl' => 'https://nextcloud.example'
46+
* ],
47+
* ['bob'=> [
48+
* 'userId' => 'bob',
49+
* 'token' => 'abcdtokenabcd2'
50+
* 'baseUrl' => 'https://nextcloud.example'
51+
* ],
52+
* ],
53+
* 'owner' => [
54+
* 'userId' => 'admin',
55+
* 'token' => 'abcdtokenabcd3'
56+
* 'baseUrl' => 'https://nextcloud.example'
57+
* ],
58+
* 'trigger' => [
59+
* 'userId' => 'user1',
60+
* 'token' => 'abcdtokenabcd4'
61+
* 'baseUrl' => 'https://nextcloud.example'
62+
* ],
63+
* ]
3964
* Created auth tokens are valid for 1 hour.
4065
*
4166
* @param WebhookListener $webhookListener
4267
* @param ?string $triggerUserId the user that triggered the webhook call
4368
* @return array{user_ids?:array<string,string>,user_roles?:array{owner?:array<string,string>,trigger?:array<string,string>}}
4469
*/
4570
public function getTokens(WebhookListener $webhookListener, ?string $triggerUserId): array {
46-
$tokens = [
47-
'user_ids' => [],
48-
'user_roles' => [],
49-
];
71+
$tokens = [];
72+
5073
$tokenNeeded = $webhookListener->getTokenNeeded();
5174
if (isset($tokenNeeded['user_ids'])) {
75+
$tokens = [
76+
'user_ids' => [],
77+
];
5278
foreach ($tokenNeeded['user_ids'] as $userId) {
5379
try {
54-
$tokens['user_ids'][$userId] = $this->createEphemeralToken($userId);
80+
$tokens['user_ids'][$userId] = [
81+
'userId' => $userId,
82+
'token' => $this->createEphemeralToken($userId),
83+
'baseUrl' => $this->urlGenerator->getBaseUrl()
84+
];
5585
} catch (\Exception $e) {
5686
$this->logger->error('Webhook token creation for user ' . $userId . ' failed: ' . $e->getMessage(), ['exception' => $e]);
5787
}
@@ -67,17 +97,21 @@ public function getTokens(WebhookListener $webhookListener, ?string $triggerUser
6797
if (is_null($ownerId)) { // no owner uid available
6898
break;
6999
}
70-
$tokens['user_roles']['owner'] = [
71-
$ownerId => $this->createEphemeralToken($ownerId)
100+
$tokens['owner'] = [
101+
'userId' => $ownerId,
102+
'token' => $this->createEphemeralToken($ownerId),
103+
'baseUrl' => $this->urlGenerator->getBaseUrl()
72104
];
73105
break;
74106
case 'trigger':
75107
// token for the person who triggered the webhook
76108
if (is_null($triggerUserId)) { // no trigger uid available
77109
break;
78110
}
79-
$tokens['user_roles']['trigger'] = [
80-
$triggerUserId => $this->createEphemeralToken($triggerUserId)
111+
$tokens['trigger'] = [
112+
'userId' => $triggerUserId,
113+
'token' => $this->createEphemeralToken($triggerUserId),
114+
'baseUrl' => $this->urlGenerator->getBaseUrl()
81115
];
82116
break;
83117
default:

0 commit comments

Comments
 (0)