From c32d1b6ffe81afb36fdcaebe0254ad191b72bff6 Mon Sep 17 00:00:00 2001 From: Christian Weiske Date: Fri, 6 Mar 2020 18:37:30 +0100 Subject: [PATCH] Add cli tool to unsubscribe from a topic --- bin/unsubscribe.php | 66 ++++++++++++++++++++++++++++++++++++ src/phinde/Subscriptions.php | 20 +++++++++-- 2 files changed, 83 insertions(+), 3 deletions(-) create mode 100755 bin/unsubscribe.php diff --git a/bin/unsubscribe.php b/bin/unsubscribe.php new file mode 100755 index 0000000..f7eee9a --- /dev/null +++ b/bin/unsubscribe.php @@ -0,0 +1,66 @@ +#!/usr/bin/env php +description = 'Unsubscribe from a WebSub subscription'; +$cc->version = '0.0.1'; +$cc->addArgument( + 'url', + array( + 'description' => 'URL to process', + 'multiple' => false + ) +); +try { + $res = $cc->parse(); +} catch (\Exception $e) { + $cc->displayError($e->getMessage()); +} + +$subDb = new Subscriptions(); + +$url = $res->args['url']; +$url = Helper::addSchema($url); +$urlObj = new \Net_URL2($url); +$topic = $urlObj->getNormalizedURL(); + + +$sub = $subDb->get($topic); +if ($sub === false) { + Log::error("No existing subscription for URL"); + exit(2); +} +if ($sub->sub_status === 'unsubscribed') { + Log::info('Already unsubscribed'); + exit(0); +} + +$subDb->unsubscribing($sub->sub_id); + +$callbackUrl = $GLOBALS['phinde']['baseurl'] . 'push-subscription.php' + . '?hub.topic=' . urlencode($topic) + . '&capkey=' . urlencode($sub->sub_capkey); +$req = new HttpRequest($sub->sub_hub, 'POST'); +$req->addPostParameter('hub.callback', $callbackUrl); +$req->addPostParameter('hub.mode', 'unsubscribe'); +$req->addPostParameter('hub.topic', $topic); +$req->addPostParameter('hub.lease_seconds', $sub->sub_lease_seconds); +$req->addPostParameter('hub.secret', $sub->sub_secret); +$res = $req->send(); + +if (intval($res->getStatus()) == 202) { + Log::info('Unsubscription initiated'); + exit(0); +} + +Log::error( + 'Error: Unsubscription response status code was not 202 but ' + . $res->getStatus() +); +Log::error($res->getBody()); +?> diff --git a/src/phinde/Subscriptions.php b/src/phinde/Subscriptions.php index 454d191..403f5d4 100644 --- a/src/phinde/Subscriptions.php +++ b/src/phinde/Subscriptions.php @@ -181,22 +181,36 @@ class Subscriptions } /** - * Mark a subscription as "unsubscribed" + * Begin removal of a a subscription: Set its status to "unsubscribing" * * @param integer $subId Subscription ID * * @return void */ - public function unsubscribed($subId) + public function unsubscribing($subId) { $this->db->prepare( 'UPDATE subscriptions' - . ' SET sub_status = "unsubscribed"' + . ' SET sub_status = "unsubscribing"' . ' , sub_updated = NOW()' . ' WHERE sub_id = :id' )->execute([':id' => $subId]); } + /** + * Mark a subscription as "unsubscribed" - delete it + * + * @param integer $subId Subscription ID + * + * @return void + */ + public function unsubscribed($subId) + { + $this->db + ->prepare('DELETE FROM subscriptions WHERE sub_id = :id') + ->execute([':id' => $subId]); + } + /** * Subscription has been cancelled/denied for some reason * -- 2.30.2