diff options
Diffstat (limited to 'plugins/OStatus/lib/salmon.php')
-rw-r--r-- | plugins/OStatus/lib/salmon.php | 60 |
1 files changed, 53 insertions, 7 deletions
diff --git a/plugins/OStatus/lib/salmon.php b/plugins/OStatus/lib/salmon.php index 8c77222a6..3d3341bc6 100644 --- a/plugins/OStatus/lib/salmon.php +++ b/plugins/OStatus/lib/salmon.php @@ -28,37 +28,83 @@ */ class Salmon { - public function post($endpoint_uri, $xml) + + const NS_REPLIES = "http://salmon-protocol.org/ns/salmon-replies"; + + const NS_MENTIONS = "http://salmon-protocol.org/ns/salmon-mention"; + + /** + * Sign and post the given Atom entry as a Salmon message. + * + * @fixme pass through the actor for signing? + * + * @param string $endpoint_uri + * @param string $xml + * @return boolean success + */ + public function post($endpoint_uri, $xml, $actor) { if (empty($endpoint_uri)) { - return FALSE; + return false; + } + + try { + $xml = $this->createMagicEnv($xml, $actor); + } catch (Exception $e) { + common_log(LOG_ERR, "Salmon unable to sign: " . $e->getMessage()); + return false; } - $headers = array('Content-type: application/atom+xml'); + $headers = array('Content-Type: application/magic-envelope+xml'); try { $client = new HTTPClient(); $client->setBody($xml); $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() != 200) { + common_log(LOG_ERR, "Salmon at $endpoint_uri returned status " . + $response->getStatus() . ': ' . $response->getBody()); return false; } - + return true; } - public function createMagicEnv($text, $userid) + public function createMagicEnv($text, $actor) { + $magic_env = new MagicEnvelope(); + $user = User::staticGet('id', $actor->id); + if ($user->id) { + // Use local key + $magickey = Magicsig::staticGet('user_id', $user->id); + if (!$magickey) { + // No keypair yet, let's generate one. + $magickey = new Magicsig(); + $magickey->generate($user->id); + } + } else { + throw new Exception("Salmon invalid actor for signing"); + } + try { + $env = $magic_env->signMessage($text, 'application/atom+xml', $magickey->toString()); + } catch (Exception $e) { + return $text; + } + return $magic_env->toXML($env); } - public function verifyMagicEnv($env) + public function verifyMagicEnv($text) { + $magic_env = new MagicEnvelope(); + + $env = $magic_env->parse($text); - + return $magic_env->verify($env); } } |