From 184293c6346c8ef0d73d9eb944c90a1799093dfa Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Sun, 4 Oct 2015 00:17:07 +0200 Subject: [PATCH] Break out MagicEnvelope->toXML() functionality to allow for plugin flexibility --- plugins/OStatus/OStatusPlugin.php | 31 +++++++++++++++++++ plugins/OStatus/lib/magicenvelope.php | 44 ++++++++++++++++++++------- plugins/OStatus/lib/salmon.php | 32 ++----------------- 3 files changed, 66 insertions(+), 41 deletions(-) diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 0dace39db0..24e877e262 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -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; + } } diff --git a/plugins/OStatus/lib/magicenvelope.php b/plugins/OStatus/lib/magicenvelope.php index 533cd7d201..2c54e3679b 100644 --- a/plugins/OStatus/lib/magicenvelope.php +++ b/plugins/OStatus/lib/magicenvelope.php @@ -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'); + 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'); - $string = $xs->getString(); - return $string; + $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. * diff --git a/plugins/OStatus/lib/salmon.php b/plugins/OStatus/lib/salmon.php index f81c9bdc22..15ed123eed 100644 --- a/plugins/OStatus/lib/salmon.php +++ b/plugins/OStatus/lib/salmon.php @@ -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()); + if (Event::handle('SalmonSlap', array($magic_env))) { return false; + //throw new ServerException('Could not distribute salmon slap as no plugin completed the event.'); } - // 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())); - return false; - } - - // Success! return true; } }