From 9c8b31fdbbf7ef02d7182c81cd8ec4e6d40323ed Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 19 Nov 2021 15:47:19 +0100 Subject: [PATCH] Add log messages and catch exception --- .../Webhook/Sha3SignatureGenerator.php | 9 ++++++++- app/Jobs/SendWebhookMessage.php | 2 ++ .../Webhook/StandardWebhookSender.php | 20 ++++++++++++++++++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/app/Helpers/Webhook/Sha3SignatureGenerator.php b/app/Helpers/Webhook/Sha3SignatureGenerator.php index 7ef80dedbd..33f2f4dbdf 100644 --- a/app/Helpers/Webhook/Sha3SignatureGenerator.php +++ b/app/Helpers/Webhook/Sha3SignatureGenerator.php @@ -38,9 +38,16 @@ class Sha3SignatureGenerator implements SignatureGeneratorInterface /** * @inheritDoc + * @throws FireflyException */ public function generate(WebhookMessage $message): string { + // webhook is deleted + if (null === $message->webhook) { + throw new FireflyException('Part of a deleted webhook.'); + } + + try { $json = json_encode($message->message, JSON_THROW_ON_ERROR); } catch (JsonException $e) { @@ -48,7 +55,7 @@ class Sha3SignatureGenerator implements SignatureGeneratorInterface Log::error(sprintf('JSON value: %s', $message->message)); Log::error($e->getMessage()); Log::error($e->getTraceAsString()); - throw new FireflyException('Could not generate JSON for SHA3 hash.', $e); + throw new FireflyException('Could not generate JSON for SHA3 hash.', 0, $e); } // signature v1 is generated using the following structure: diff --git a/app/Jobs/SendWebhookMessage.php b/app/Jobs/SendWebhookMessage.php index 408345a367..bcc9808f3f 100644 --- a/app/Jobs/SendWebhookMessage.php +++ b/app/Jobs/SendWebhookMessage.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\Jobs; +use Log; use FireflyIII\Models\WebhookMessage; use FireflyIII\Services\Webhook\WebhookSenderInterface; use Illuminate\Bus\Queueable; @@ -58,6 +59,7 @@ class SendWebhookMessage implements ShouldQueue */ public function handle(): void { + Log::debug(sprintf('Now handling webhook message #%d', $this->message->id)); // send job! $sender = app(WebhookSenderInterface::class); $sender->setMessage($this->message); diff --git a/app/Services/Webhook/StandardWebhookSender.php b/app/Services/Webhook/StandardWebhookSender.php index a877d4a355..673d299912 100644 --- a/app/Services/Webhook/StandardWebhookSender.php +++ b/app/Services/Webhook/StandardWebhookSender.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace FireflyIII\Services\Webhook; +use FireflyIII\Exceptions\FireflyException; use FireflyIII\Helpers\Webhook\SignatureGeneratorInterface; use FireflyIII\Models\WebhookAttempt; use FireflyIII\Models\WebhookMessage; @@ -55,7 +56,24 @@ class StandardWebhookSender implements WebhookSenderInterface // have the signature generator generate a signature. If it fails, the error thrown will // end up in send() to be caught. $signatureGenerator = app(SignatureGeneratorInterface::class); - $signature = $signatureGenerator->generate($this->message); + + try { + $signature = $signatureGenerator->generate($this->message); + } catch(FireflyException $e) { + Log::error('Did not send message because of a Firefly III Exception.'); + Log::error($e->getMessage()); + Log::error($e->getTraceAsString()); + $attempt = new WebhookAttempt; + $attempt->webhookMessage()->associate($this->message); + $attempt->status_code = 0; + $attempt->logs = sprintf('Exception: %s', $e->getMessage()); + $attempt->save(); + $this->message->errored = true; + $this->message->sent = false; + $this->message->save(); + + return; + } Log::debug(sprintf('Trying to send webhook message #%d', $this->message->id));