Add cli tool to unsubscribe from a topic
authorChristian Weiske <cweiske@cweiske.de>
Fri, 6 Mar 2020 17:37:30 +0000 (18:37 +0100)
committerChristian Weiske <cweiske@cweiske.de>
Fri, 6 Mar 2020 17:37:30 +0000 (18:37 +0100)
bin/unsubscribe.php [new file with mode: 0755]
src/phinde/Subscriptions.php

diff --git a/bin/unsubscribe.php b/bin/unsubscribe.php
new file mode 100755 (executable)
index 0000000..f7eee9a
--- /dev/null
@@ -0,0 +1,66 @@
+#!/usr/bin/env php
+<?php
+namespace phinde;
+/**
+ * Unsubscribe from a WebSub subscription
+ */
+require_once __DIR__ . '/../src/init.php';
+
+$cc = new \Console_CommandLine();
+$cc->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());
+?>
index 454d191266e114d813718d105e69504169ca8dd7..403f5d420e9bc3d7954316b2e93d043c398055dd 100644 (file)
@@ -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
      *