]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/OStatus/lib/magicenvelope.php
Fix for #2429 - move OStatus XML writing to XMLStringer
[quix0rs-gnu-social.git] / plugins / OStatus / lib / magicenvelope.php
index 4a9efe93d1c83f76132e4e2dc6c094ecad59b537..3bdf24b3178abc235303b29d036e4670a8d9a294 100644 (file)
@@ -50,20 +50,40 @@ class MagicEnvelope
 
     public function getKeyPair($signer_uri)
     {
-        return 'RSA.79_L2gq-TD72Nsb5yGS0r9stLLpJZF5AHXyxzWmQmlqKl276LEJEs8CppcerLcR90MbYQUwt-SX9slx40Yq3vA==.AQAB.AR-jo5KMfSISmDAT2iMs2_vNFgWRjl5rbJVvA0SpGIEWyPdCGxlPtCbTexp8-0ZEIe8a4SyjatBECH5hxgMTpw==';
+        $disco = new Discovery();
+
+        try {
+            $xrd = $disco->lookup($signer_uri);
+        } catch (Exception $e) {
+            return false;
+        }
+        if ($xrd->links) {
+            if ($link = Discovery::getService($xrd->links, Magicsig::PUBLICKEYREL)) {
+                $keypair = false;
+                $parts = explode(',', $link['href']);
+                if (count($parts) == 2) {
+                    $keypair = $parts[1];
+                } else {
+                    // Backwards compatibility check for separator bug in 0.9.0
+                    $parts = explode(';', $link['href']);
+                    if (count($parts) == 2) {
+                        $keypair = $parts[1];
+                    }
+                }
+                
+                if ($keypair) {
+                    return $keypair;
+                }
+            }
+        }
+        throw new Exception('Unable to locate signer public key');
     }
 
 
-    public function signMessage($text, $mimetype, $signer_uri)
+    public function signMessage($text, $mimetype, $keypair)
     {
-        $signer_uri = $this->normalizeUser($signer_uri);
-
-        if (!$this->checkAuthor($text, $signer_uri)) {
-            throw new Exception("Unable to determine entry author.");
-        }
-
-        $signature_alg = Magicsig::fromString($this->getKeyPair($signer_uri));
-        $armored_text = base64_encode($text);
+        $signature_alg = Magicsig::fromString($keypair);
+        $armored_text = Magicsig::base64_url_encode($text);
 
         return array(
             'data' => $armored_text,
@@ -76,10 +96,26 @@ class MagicEnvelope
             
     }
 
+    public function toXML($env) {
+        $xs = new XMLStringer();
+        $xs->startXML();
+        $xs->elementStart('me:env', array('xmlns:me' => MagicEnvelope::NS));
+        $xs->element('me:data', array('type' => $env['data_type']), $env['data']);
+        $xs->element('me:encoding', null, $env['encoding']);
+        $xs->element('me:alg', null, $env['alg']);
+        $xs->element('me:sig', null, $env['sig']);
+        $xs->elementEnd('me:env');
+        
+        $string =  $xs->getString();
+        common_debug($string);
+        return $string;
+    }
+
+    
     public function unfold($env)
     {
         $dom = new DOMDocument();
-        $dom->loadXML(base64_decode($env['data']));
+        $dom->loadXML(Magicsig::base64_url_decode($env['data']));
 
         if ($dom->documentElement->tagName != 'entry') {
             return false;
@@ -127,18 +163,32 @@ class MagicEnvelope
     public function verify($env)
     {
         if ($env['alg'] != 'RSA-SHA256') {
+            common_log(LOG_DEBUG, "Salmon error: bad algorithm");
             return false;
         }
 
         if ($env['encoding'] != MagicEnvelope::ENCODING) {
+            common_log(LOG_DEBUG, "Salmon error: bad encoding");
             return false;
         }
 
-        $text = base64_decode($env['data']);
+        $text = Magicsig::base64_url_decode($env['data']);
         $signer_uri = $this->getAuthor($text);
 
-        $verifier = Magicsig::fromString($this->getKeyPair($signer_uri));
+        try {
+            $keypair = $this->getKeyPair($signer_uri);
+        } catch (Exception $e) {
+            common_log(LOG_DEBUG, "Salmon error: ".$e->getMessage());
+            return false;
+        }
+        
+        $verifier = Magicsig::fromString($keypair);
 
+        if (!$verifier) {
+            common_log(LOG_DEBUG, "Salmon error: unable to parse keypair");
+            return false;
+        }
+        
         return $verifier->verify($env['data'], $env['sig']);
     }
 
@@ -150,11 +200,12 @@ class MagicEnvelope
 
     public function fromDom($dom)
     {
-        if ($dom->documentElement->tagName == 'entry') {
+        $env_element = $dom->getElementsByTagNameNS(MagicEnvelope::NS, 'env')->item(0);
+        if (!$env_element) {
             $env_element = $dom->getElementsByTagNameNS(MagicEnvelope::NS, 'provenance')->item(0);
-        } else if ($dom->documentElement->tagName == 'me:env') {
-            $env_element = $dom->documentElement;
-        } else {
+        }
+
+        if (!$env_element) {
             return false;
         }