You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

34 lines
1.3 KiB

  1. # frozen_string_literal: true
  2. class Pubsubhubbub::ConfirmationWorker
  3. include Sidekiq::Worker
  4. include RoutingHelper
  5. def perform(subscription_id, mode, secret = nil, lease_seconds = nil)
  6. subscription = Subscription.find(subscription_id)
  7. challenge = SecureRandom.hex
  8. subscription.secret = secret
  9. subscription.lease_seconds = lease_seconds
  10. subscription.confirmed = true
  11. response = HTTP.headers(user_agent: 'Mastodon/PubSubHubbub')
  12. .timeout(:per_operation, write: 20, connect: 20, read: 50)
  13. .get(subscription.callback_url, params: {
  14. 'hub.topic' => account_url(subscription.account, format: :atom),
  15. 'hub.mode' => mode,
  16. 'hub.challenge' => challenge,
  17. 'hub.lease_seconds' => subscription.lease_seconds,
  18. })
  19. body = response.body.to_s
  20. Rails.logger.debug "Confirming PuSH subscription for #{subscription.callback_url} with challenge #{challenge}: #{body}"
  21. if mode == 'subscribe' && body == challenge
  22. subscription.save!
  23. elsif (mode == 'unsubscribe' && body == challenge) || !subscription.confirmed?
  24. subscription.destroy!
  25. end
  26. end
  27. end