]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Break out MagicEnvelope->toXML() functionality to allow for plugin flexibility
authorMikael Nordfeldth <mmn@hethane.se>
Sat, 3 Oct 2015 22:17:07 +0000 (00:17 +0200)
committerMikael Nordfeldth <mmn@hethane.se>
Sat, 3 Oct 2015 22:17:07 +0000 (00:17 +0200)
plugins/OStatus/OStatusPlugin.php
plugins/OStatus/lib/magicenvelope.php
plugins/OStatus/lib/salmon.php

index 0dace39db0a542da1031df2f40de0abe0560ee61..24e877e262f82c4a782069dd262ae90202c0c8e3 100644 (file)
@@ -1351,4 +1351,35 @@ class OStatusPlugin extends Plugin
         }
         return true;
     }
+
+    public function onSalmonSlap($endpoint_uri, MagicEnvelope $magic_env)
+    {
+        $envxml = $magic_env->toXML();
+
+        $headers = array('Content-Type: application/magic-envelope+xml');
+
+        try {
+            $client = new HTTPClient();
+            $client->setBody($envxml);
+            $response = $client->post($endpoint_uri, $headers);
+        } catch (HTTP_Request2_Exception $e) {
+            common_log(LOG_ERR, "Salmon post to $endpoint_uri failed: " . $e->getMessage());
+            return false;
+        }
+        if ($response->getStatus() === 422) {
+            common_debug(sprintf('Salmon (from profile %d) endpoint %s returned status %s. We assume it is a Diaspora seed, will adapt and try again if that plugin is enabled!'));
+            return true;
+        }
+
+        // 200 OK is the best response
+        // 202 Accepted is what we get from Diaspora for example
+        if (!in_array($response->getStatus(), array(200, 202))) {
+            common_log(LOG_ERR, sprintf('Salmon (from profile %d) endpoint %s returned status %s: %s',
+                                $user->id, $endpoint_uri, $response->getStatus(), $response->getBody()));
+            return true;
+        }
+
+        // Since we completed the salmon slap, we discontinue the event
+        return false;
+    }
 }
index 533cd7d201560c3e00cea17b748f3d35dcaed822..2c54e3679b2e5605ce87584f091f231d5f6999e0 100644 (file)
@@ -205,18 +205,25 @@ class MagicEnvelope
      *
      * @return string representation of XML document
      */
-    public function toXML() {
-        $xs = new XMLStringer();
-        $xs->startXML();
-        $xs->elementStart('me:env', array('xmlns:me' => self::NS));
-        $xs->element('me:data', array('type' => $this->data_type), $this->data);
-        $xs->element('me:encoding', null, $this->encoding);
-        $xs->element('me:alg', null, $this->alg);
-        $xs->element('me:sig', null, $this->getSignature());
-        $xs->elementEnd('me:env');
-
-        $string =  $xs->getString();
-        return $string;
+    public function toXML($flavour=null) {
+        $xml = null;
+        if (Event::handle('MagicEnvelopeToXML', array($this, $flavour, &$xml))) {
+            // fall back to our default, normal Magic Envelope XML.
+            $xs = new XMLStringer();
+            $xs->startXML();
+            $xs->elementStart('me:env', array('xmlns:me' => self::NS));
+            $xs->element('me:data', array('type' => $this->data_type), $this->data);
+            $xs->element('me:encoding', null, $this->encoding);
+            $xs->element('me:alg', null, $this->alg);
+            $xs->element('me:sig', null, $this->getSignature());
+            $xs->elementEnd('me:env');
+
+            $xml = $xs->getString();
+        }
+        if (is_null($xml)) {
+            throw new ServerException('No Magic Envelope XML string was created.');
+        }
+        return $xml;
     }
 
     /*
@@ -265,6 +272,21 @@ class MagicEnvelope
         return $this->sig;
     }
 
+    public function getSignatureAlgorithm()
+    {
+        return $this->alg;
+    }
+
+    public function getDataType()
+    {
+        return $this->data_type;
+    }
+
+    public function getEncoding()
+    {
+        return $this->encoding;
+    }
+
     /**
      * Find the author URI referenced in the payload Atom entry.
      *
index f81c9bdc22d910620a57db40f5cad3378c7f5101..15ed123eed7e33e34b63ae4f4492a020b0e9d38e 100644 (file)
@@ -60,39 +60,11 @@ class Salmon
             return false;
         }
 
-        $envxml = $magic_env->toXML();
-
-        $headers = array('Content-Type: application/magic-envelope+xml');
-
-        try {
-            $client = new HTTPClient();
-            $client->setBody($envxml);
-            $response = $client->post($endpoint_uri, $headers);
-        } catch (HTTP_Request2_Exception $e) {
-            common_log(LOG_ERR, "Salmon post to $endpoint_uri failed: " . $e->getMessage());
-            return false;
-        }
-
-        // Diaspora wants a slightly different formatting on the POST (other Content-type, so body needs "xml=")
-        // This also gives us the opportunity to send the specially formatted Diaspora salmon slap, which
-        // encrypts the content of me:data
-        if ($response->getStatus() === 422) {
-            common_debug(sprintf('Salmon (from profile %d) endpoint %s returned status %s. We assume it is a Diaspora seed, will adapt and try again! Body: %s',
-                                $user->id, $endpoint_uri, $response->getStatus(), $response->getBody()));
-            $headers = array('Content-Type: application/x-www-form-urlencoded');
-            $client->setBody('xml=' . Magicsig::base64_url_encode($envxml));
-            $response = $client->post($endpoint_uri, $headers);
-        }
-
-        // 200 OK is the best response
-        // 202 Accepted is what we get from Diaspora for example
-        if (!in_array($response->getStatus(), array(200, 202))) {
-            common_log(LOG_ERR, sprintf('Salmon (from profile %d) endpoint %s returned status %s: %s',
-                                $user->id, $endpoint_uri, $response->getStatus(), $response->getBody()));
+        if (Event::handle('SalmonSlap', array($magic_env))) {
             return false;
+            //throw new ServerException('Could not distribute salmon slap as no plugin completed the event.');
         }
 
-        // Success!
         return true;
     }
 }