]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
SubMirror now works again against old PuSH
authorMikael Nordfeldth <mmn@hethane.se>
Sun, 2 Mar 2014 23:01:13 +0000 (00:01 +0100)
committerMikael Nordfeldth <mmn@hethane.se>
Sun, 2 Mar 2014 23:01:13 +0000 (00:01 +0100)
There was a problem with (specifically at least) PuSHpress for
Wordpress. A previous attempt to perform a DB transaction backfired
because the remote side could connect to the callback before our
commit had gone through.

I take full responsibility for introducing the bug in the first place :)

plugins/OStatus/actions/pushcallback.php
plugins/OStatus/classes/FeedSub.php

index f68ef7693ed4c7b5513ad8e3293b2eaf31f9166e..1dab72b2e0fc95d941dc6c3f8bdcaf38094911dd 100644 (file)
@@ -52,7 +52,7 @@ class PushCallbackAction extends Action
         }
 
         $feedsub = FeedSub::getKV('id', $feedid);
-        if (!$feedsub) {
+        if (!$feedsub instanceof FeedSub) {
             // TRANS: Server exception. %s is a feed ID.
             throw new ServerException(sprintf(_m('Unknown PuSH feed id %s'),$feedid), 400);
         }
index 2e62c512d13996d32ed5915d3f433138c3349b86..dc0f4ea1e2d617faeb7b06d48867c8f5311d00b0 100644 (file)
@@ -261,11 +261,16 @@ class FeedSub extends Managed_DataObject
     }
 
     /**
+     * Setting to subscribe means it is _waiting_ to become active. This
+     * cannot be done in a transaction because there is a chance that the
+     * remote script we're calling (as in the case of PuSHpress) performs
+     * the lookup _while_ we're POSTing data, which means the transaction
+     * never completes (PushcallbackAction gets an 'inactive' state).
+     *
      * @return boolean  true on successful sub/unsub, false on failure
      */
     protected function doSubscribe($mode)
     {
-        $this->query('BEGIN');
         $orig = clone($this);
         if ($mode == 'subscribe') {
             $this->secret = common_random_hexstr(32);
@@ -302,7 +307,6 @@ class FeedSub extends Managed_DataObject
             $response = $client->post($hub, $headers, $post);
             $status = $response->getStatus();
             if ($status == 202) {
-                $this->query('COMMIT');
                 common_log(LOG_INFO, __METHOD__ . ': sub req ok, awaiting verification callback');
                 return true;
             } else if ($status >= 200 && $status < 300) {
@@ -310,9 +314,7 @@ class FeedSub extends Managed_DataObject
             } else {
                 common_log(LOG_ERR, __METHOD__ . ": sub req failed with HTTP $status: " . $response->getBody());
             }
-            $this->query('ROLLBACK');
         } catch (Exception $e) {
-            $this->query('ROLLBACK');
             // wtf!
             common_log(LOG_ERR, __METHOD__ . ": error \"{$e->getMessage()}\" hitting hub $this->huburi subscribing to $this->uri");