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.

68 lines
2.2 KiB

  1. <?php
  2. use BarnabyWalters\Mf2;
  3. class PushTask {
  4. public static function verify_subscription($subscription_id, $mode) {
  5. $subscription = db\get_by_id('subscriptions', $subscription_id);
  6. if($subscription) {
  7. $feed = db\get_by_id('feeds', $subscription->feed_id);
  8. // Choose the expiration for the subscription
  9. $lease_seconds = 86400*3;
  10. $exp_ts = time() + $lease_seconds;
  11. $exp_date = date('Y-m-d H:i:s', $exp_ts);
  12. $push_params = [
  13. 'hub.mode' => ($mode == 'subscribe' ? 'subscribe' : 'unsubscribe'),
  14. 'hub.topic' => $feed->feed_url,
  15. 'hub.challenge' => $subscription->challenge
  16. ];
  17. if($mode == 'subscribe') {
  18. $push_params['hub.lease_seconds'] = $lease_seconds;
  19. }
  20. $url = parse_url($subscription->callback_url);
  21. if($q=k($url, 'query')) {
  22. parse_str($q, $existing_params);
  23. $push_params = array_merge($push_params, $existing_params);
  24. }
  25. $url['query'] = http_build_query($push_params);
  26. $url = build_url($url);
  27. $response = request\get_url($url, true);
  28. $subscription->challenge_response = $response['headers']."\n\n".$response['body'];
  29. if(request\response_is($response['status'], 2) && $response['body'] == $subscription->challenge) {
  30. // The subscriber replied with a 2xx status code and confirmed the challenge string.
  31. if($mode == 'subscribe') {
  32. // The subscription is confirmed and active.
  33. $subscription->date_confirmed = db\now();
  34. $subscription->lease_seconds = $lease_seconds;
  35. $subscription->date_expires = $exp_date;
  36. $subscription->active = 1;
  37. echo "Subscriber verified the request and is now subscribed\n";
  38. } else {
  39. $subscription->date_unsubscribed = db\now();
  40. $subscription->active = 0;
  41. echo "Subscriber verified the request and is now unsubscribed\n";
  42. }
  43. } else {
  44. // The subscriber did not confirm the subscription, so reject the request
  45. echo "Subscriber did not echo the challenge\n";
  46. }
  47. db\set_updated($subscription);
  48. $subscription->save();
  49. print_r($response);
  50. }
  51. }
  52. }