Skip to content

Commit 5f507e7

Browse files
committed
feat: error handling
Signed-off-by: Jana Peper <[email protected]>
1 parent e9d0c05 commit 5f507e7

File tree

3 files changed

+38
-17
lines changed

3 files changed

+38
-17
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']);
49+
$data['tokens'] = $this->tokenService->getTokens($webhookListener, $data['user']['uid'] ?? null);
5050
$options = [
5151
'verify' => $this->certificateManager->getAbsoluteBundlePath(),
5252
'headers' => $webhookListener->getHeaders() ?? [],

apps/webhook_listeners/lib/Db/EphemeralTokenMapper.php

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public function getById(int $id): EphemeralToken {
5252
}
5353

5454
/**
55-
* @throws \Exception
55+
* @throws Exception
5656
* @return EphemeralToken[]
5757
*/
5858
public function getAll(): array {
@@ -64,6 +64,12 @@ public function getAll(): array {
6464
return $this->findEntities($qb);
6565
}
6666

67+
68+
/**
69+
* @param int $olderThan
70+
* @return EphemeralToken[]
71+
* @throws Exception
72+
*/
6773
public function getOlderThan($olderThan): array {
6874
$qb = $this->db->getQueryBuilder();
6975

@@ -106,12 +112,23 @@ public function deleteByTokenId(int $tokenId): bool {
106112

107113
public function invalidateOldTokens(int $token_lifetime = self::TOKEN_LIFETIME) {
108114
$olderThan = $this->time->getTime() - $token_lifetime;
109-
$tokensToDelete = $this->getOlderThan($olderThan);
115+
try {
116+
$tokensToDelete = $this->getOlderThan($olderThan);
117+
} catch (Exception $e) {
118+
$this->logger->error('Webhook token deletion failed: ' . $e->getMessage(), ['exception' => $e]);
119+
return;
120+
}
121+
110122

111123
$this->logger->debug('Invalidating ephemeral webhook tokens older than ' . date('c', $olderThan), ['app' => 'webhook_listeners']);
112124
foreach ($tokensToDelete as $token) {
113-
$this->tokenMapper->invalidate($this->tokenMapper->getTokenById($token->getTokenId())->getToken()); // delete token itself
114-
$this->deleteByTokenId($token->getTokenId()); // delete db row in webhook_tokens
125+
try {
126+
$this->tokenMapper->delete($this->tokenMapper->getTokenById($token->getTokenId())); // delete token itself
127+
$this->deleteByTokenId($token->getTokenId()); // delete db row in webhook_tokens
128+
} catch (Exception $e) {
129+
$this->logger->error('Webhook token deletion failed: ' . $e->getMessage(), ['exception' => $e]);
130+
}
131+
115132
}
116133
}
117134
}

apps/webhook_listeners/lib/Service/TokenService.php

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@
1818
use OCP\IUserManager;
1919
use OCP\L10N\IFactory;
2020
use OCP\Security\ISecureRandom;
21+
use Psr\Log\LoggerInterface;
2122

2223
class TokenService {
2324
public function __construct(
2425
private IProvider $tokenProvider,
2526
private ISecureRandom $random,
2627
private EphemeralTokenMapper $tokenMapper,
28+
private LoggerInterface $logger,
2729
private ITimeFactory $time,
2830
private IFactory $l10nFactory,
2931
private IUserManager $userManager,
@@ -49,20 +51,25 @@ public function getTokens(WebhookListener $webhookListener, ?string $triggerUser
4951
$tokenNeeded = $webhookListener->getTokenNeeded();
5052
if (isset($tokenNeeded['user_ids'])) {
5153
foreach ($tokenNeeded['user_ids'] as $userId) {
52-
$tokens['user_ids'][$userId] = $this->createEphemeralToken($userId);
54+
try {
55+
$tokens['user_ids'][$userId] = $this->createEphemeralToken($userId);
56+
} catch (\Exception $e) {
57+
$this->logger->error('Webhook token creation for user ' . $userId . ' failed: ' . $e->getMessage(), ['exception' => $e]);
58+
}
59+
5360
}
5461
}
5562
if (isset($tokenNeeded['user_roles'])) {
56-
foreach ($tokenNeeded['user_roles'] as $function) {
57-
switch ($function) {
63+
foreach ($tokenNeeded['user_roles'] as $user_role) {
64+
switch ($user_role) {
5865
case 'owner':
5966
// token for the person who created the flow
60-
$functionId = $webhookListener->getUserId();
61-
if (is_null($functionId)) { // no owner uid available
67+
$ownerId = $webhookListener->getUserId();
68+
if (is_null($ownerId)) { // no owner uid available
6269
break;
6370
}
6471
$tokens['user_roles']['owner'] = [
65-
$functionId => $this->createEphemeralToken($functionId)
72+
$ownerId => $this->createEphemeralToken($ownerId)
6673
];
6774
break;
6875
case 'trigger':
@@ -74,6 +81,9 @@ public function getTokens(WebhookListener $webhookListener, ?string $triggerUser
7481
$triggerUserId => $this->createEphemeralToken($triggerUserId)
7582
];
7683
break;
84+
default:
85+
$this->logger->error('Webhook token creation for user role ' . $user_role . ' not defined. ', ['Not defined' => $user_role]);
86+
7787
}
7888
}
7989
}
@@ -96,12 +106,6 @@ private function createEphemeralToken(string $userId): string {
96106
$name,
97107
IToken::PERMANENT_TOKEN);
98108

99-
// We need the getToken() method to be able to send the token out.
100-
// That method is only available in PublicKeyToken which is returned by generateToken
101-
// but not declared as such, so we have to check the type here
102-
if (!($deviceToken instanceof PublicKeyToken)) { // type needed for the getToken() function
103-
throw new \Exception('Unexpected token type');
104-
}
105109
$this->tokenMapper->addEphemeralToken(
106110
$deviceToken->getId(),
107111
$userId,

0 commit comments

Comments
 (0)