]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Separate ensureHub into function in FeedSub
authorMikael Nordfeldth <mmn@hethane.se>
Thu, 27 Apr 2017 07:24:12 +0000 (09:24 +0200)
committerMikael Nordfeldth <mmn@hethane.se>
Thu, 27 Apr 2017 07:24:12 +0000 (09:24 +0200)
plugins/OStatus/classes/FeedSub.php

index f3ebb5e15deec7a4e3a389133f00d35ee4378fb0..75e109120afefae2266204e3a6b7c557d7744d07 100644 (file)
@@ -167,33 +167,79 @@ class FeedSub extends Managed_DataObject
      */
     public static function ensureFeed($feeduri)
     {
-        $current = self::getKV('uri', $feeduri);
-        if ($current instanceof FeedSub) {
-            return $current;
+        $feedsub = self::getKV('uri', $feeduri);
+        if ($feedsub instanceof FeedSub) {
+            if (!empty($feedsub->huburi)) {
+                // If there is already a huburi we don't
+                // rediscover it on ensureFeed, call
+                // ensureHub to do that (compare ->modified
+                // to see if it might be time to do it).
+                return $feedsub;
+            }
+            if ($feedsub->sub_state !== 'inactive') {
+                throw new ServerException('Can only ensure WebSub hub for inactive (unsubscribed) feeds.');
+            }
+            // If huburi is empty we continue with ensureHub
+        } else {
+            // If we don't have that local feed URI
+            // stored then we create a new DB object.
+            $feedsub = new FeedSub();
+            $feedsub->uri = $feeduri;
+            $feedsub->sub_state = 'inactive';
+        }
+
+        try {
+            // discover the hub uri
+            $feedsub->ensureHub();
+
+        } catch (FeedSubNoHubException $e) {
+            // Only throw this exception if we can't handle huburi-less feeds
+            // (i.e. we have a fallback hub or we can do feed polling (nohub)
+            if (!common_config('feedsub', 'fallback_hub') && !common_config('feedsub', 'nohub')) {
+                throw $e;
+            }
+        }
+
+        if (empty($feedsub->id)) {
+            // if $feedsub doesn't have an id we'll insert it into the db here
+            $feedsub->created = common_sql_now();
+            $feedsub->modified = common_sql_now();
+            $result = $feedsub->insert();
+            if ($result === false) {
+                throw new FeedDBException($feedsub);
+            }
+        }
+
+        return $feedsub;
+    }
+
+    /**
+     * ensureHub will only do $this->update if !empty($this->id)
+     * because otherwise the object has not been created yet.
+     */
+    public function ensureHub()
+    {
+        if ($this->sub_state !== 'inactive') {
+            throw new ServerException('Can only ensure WebSub hub for inactive (unsubscribed) feeds.');
         }
 
         $discover = new FeedDiscovery();
-        $discover->discoverFromFeedURL($feeduri);
+        $discover->discoverFromFeedURL($this->uri);
 
         $huburi = $discover->getHubLink();
-        if (!$huburi && !common_config('feedsub', 'fallback_hub') && !common_config('feedsub', 'nohub')) {
+        if (empty($huburi)) {
+            // Will be caught and treated with if statements in regards to
+            // fallback hub and feed polling (nohub) configuration.
             throw new FeedSubNoHubException();
         }
 
-        $feedsub = new FeedSub();
-        $feedsub->uri = $feeduri;
-        $feedsub->huburi = $huburi;
-        $feedsub->sub_state = 'inactive';
+        $orig = !empty($this->id) ? clone($this) : null;
 
-        $feedsub->created = common_sql_now();
-        $feedsub->modified = common_sql_now();
+        $this->huburi = $huburi;
 
-        $result = $feedsub->insert();
-        if ($result === false) {
-            throw new FeedDBException($feedsub);
+        if (!empty($this->id)) {
+            $this->update($orig);
         }
-
-        return $feedsub;
     }
 
     /**
@@ -250,18 +296,27 @@ class FeedSub extends Managed_DataObject
             return;
         }
 
-        if (empty($this->huburi)) {
-            if (common_config('feedsub', 'fallback_hub')) {
-                // No native hub on this feed?
-                // Use our fallback hub, which handles polling on our behalf.
-            } else if (common_config('feedsub', 'nohub')) {
-                // We need a feedpolling plugin (like FeedPoller) active so it will
-                // set the 'nohub' state to 'inactive' for us.
-                return;
-            } else {
+        if (empty($this->huburi) && !common_config('feedsub', 'fallback_hub')) {
+            /**
+             * If the huburi is empty and we don't have a fallback hub,
+             * there is nowhere we can send an unsubscribe to.
+             *
+             * A plugin should handle the FeedSub above and set the proper state
+             * if there is no hub. (instead of 'nohub' it should be 'inactive' if
+             * the instance has enabled feed polling for feeds that don't publish
+             * PuSH/WebSub hubs. FeedPoller is a plugin which enables polling.
+             *
+             * Secondly, if we don't have the setting "nohub" enabled (i.e.)
+             * we're ready to poll ourselves, there is something odd with the
+             * database, such as a polling plugin that has been disabled.
+             */
+
+            if (!common_config('feedsub', 'nohub')) {
                 // TRANS: Server exception.
                 throw new ServerException(_m('Attempting to end PuSH subscription for feed with no hub.'));
             }
+
+            return;
         }
 
         $this->doSubscribe('unsubscribe');