Skip to content

Commit 6c855d0

Browse files
committed
feat: error handling
Signed-off-by: Jana Peper <[email protected]>
1 parent b364542 commit 6c855d0

File tree

3 files changed

+38
-18
lines changed

3 files changed

+38
-18
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 & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,21 @@
1010
namespace OCA\WebhookListeners\Service;
1111

1212
use OC\Authentication\Token\IProvider;
13-
use OC\Authentication\Token\PublicKeyToken;
1413
use OCA\WebhookListeners\Db\EphemeralTokenMapper;
1514
use OCA\WebhookListeners\Db\WebhookListener;
1615
use OCP\AppFramework\Utility\ITimeFactory;
1716
use OCP\Authentication\Token\IToken;
1817
use OCP\IUserManager;
1918
use OCP\L10N\IFactory;
2019
use OCP\Security\ISecureRandom;
20+
use Psr\Log\LoggerInterface;
2121

2222
class TokenService {
2323
public function __construct(
2424
private IProvider $tokenProvider,
2525
private ISecureRandom $random,
2626
private EphemeralTokenMapper $tokenMapper,
27+
private LoggerInterface $logger,
2728
private ITimeFactory $time,
2829
private IFactory $l10nFactory,
2930
private IUserManager $userManager,
@@ -49,20 +50,25 @@ public function getTokens(WebhookListener $webhookListener, ?string $triggerUser
4950
$tokenNeeded = $webhookListener->getTokenNeeded();
5051
if (isset($tokenNeeded['user_ids'])) {
5152
foreach ($tokenNeeded['user_ids'] as $userId) {
52-
$tokens['user_ids'][$userId] = $this->createEphemeralToken($userId);
53+
try {
54+
$tokens['user_ids'][$userId] = $this->createEphemeralToken($userId);
55+
} catch (\Exception $e) {
56+
$this->logger->error('Webhook token creation for user ' . $userId . ' failed: ' . $e->getMessage(), ['exception' => $e]);
57+
}
58+
5359
}
5460
}
5561
if (isset($tokenNeeded['user_roles'])) {
56-
foreach ($tokenNeeded['user_roles'] as $function) {
57-
switch ($function) {
62+
foreach ($tokenNeeded['user_roles'] as $user_role) {
63+
switch ($user_role) {
5864
case 'owner':
5965
// token for the person who created the flow
60-
$functionId = $webhookListener->getUserId();
61-
if (is_null($functionId)) { // no owner uid available
66+
$ownerId = $webhookListener->getUserId();
67+
if (is_null($ownerId)) { // no owner uid available
6268
break;
6369
}
6470
$tokens['user_roles']['owner'] = [
65-
$functionId => $this->createEphemeralToken($functionId)
71+
$ownerId => $this->createEphemeralToken($ownerId)
6672
];
6773
break;
6874
case 'trigger':
@@ -74,6 +80,9 @@ public function getTokens(WebhookListener $webhookListener, ?string $triggerUser
7480
$triggerUserId => $this->createEphemeralToken($triggerUserId)
7581
];
7682
break;
83+
default:
84+
$this->logger->error('Webhook token creation for user role ' . $user_role . ' not defined. ', ['Not defined' => $user_role]);
85+
7786
}
7887
}
7988
}
@@ -96,12 +105,6 @@ private function createEphemeralToken(string $userId): string {
96105
$name,
97106
IToken::PERMANENT_TOKEN);
98107

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-
}
105108
$this->tokenMapper->addEphemeralToken(
106109
$deviceToken->getId(),
107110
$userId,

0 commit comments

Comments
 (0)