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.

29 lines
1.1 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. response = HTTP.headers(user_agent: 'Mastodon/PubSubHubbub')
  11. .timeout(:per_operation, write: 20, connect: 20, read: 50)
  12. .get(subscription.callback_url, params: {
  13. 'hub.topic' => account_url(subscription.account, format: :atom),
  14. 'hub.mode' => mode,
  15. 'hub.challenge' => challenge,
  16. 'hub.lease_seconds' => subscription.lease_seconds,
  17. })
  18. if mode == 'subscribe' && response.body.to_s == challenge
  19. subscription.save!
  20. elsif (mode == 'unsubscribe' && response.body.to_s == challenge) || !subscription.confirmed?
  21. subscription.destroy!
  22. end
  23. end
  24. end