diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2022-06-09 21:57:36 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-09 21:57:36 +0200 |
commit | a2871cd74719a7a5a104daaa3dcc0e2670b7c2df (patch) | |
tree | cfd30fe202cd5be1c2984f4031d825d950784da2 /app/workers/webhooks | |
parent | 17ba5e1e616c853a389b9c24a347d873747f2126 (diff) |
Add administrative webhooks (#18510)
* Add administrative webhooks * Fix error when webhook is deleted before delivery worker runs
Diffstat (limited to 'app/workers/webhooks')
-rw-r--r-- | app/workers/webhooks/delivery_worker.rb | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/app/workers/webhooks/delivery_worker.rb b/app/workers/webhooks/delivery_worker.rb new file mode 100644 index 000000000..b1e345c5e --- /dev/null +++ b/app/workers/webhooks/delivery_worker.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +class Webhooks::DeliveryWorker + include Sidekiq::Worker + include JsonLdHelper + + sidekiq_options queue: 'push', retry: 16, dead: false + + def perform(webhook_id, body) + @webhook = Webhook.find(webhook_id) + @body = body + @response = nil + + perform_request + rescue ActiveRecord::RecordNotFound + true + end + + private + + def perform_request + request = Request.new(:post, @webhook.url, body: @body) + + request.add_headers( + 'Content-Type' => 'application/json', + 'X-Hub-Signature' => "sha256=#{signature}" + ) + + request.perform do |response| + raise Mastodon::UnexpectedResponseError, response unless response_successful?(response) || response_error_unsalvageable?(response) + end + end + + def signature + OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), @webhook.secret, @body) + end +end |