- if(count($ret)) {
- for($x = 0; $x < count($ret); $x ++) {
- if(substr($ret[$x],0,5) === 'data:') {
- if(strstr($ret[$x],','))
- $ret[$x] = substr($ret[$x],strpos($ret[$x],',')+1);
- else
- $ret[$x] = substr($ret[$x],5);
- }
- else
- $ret[$x] = fetch_url($ret[$x]);
- }
+ // create a magic envelope
+
+ $data = base64url_encode($slap);
+ $data_type = 'application/atom+xml';
+ $encoding = 'base64url';
+ $algorithm = 'RSA-SHA256';
+ $keyhash = base64url_encode(hash('sha256', salmon_key($owner['spubkey'])), true);
+
+ $precomputed = '.' . base64url_encode($data_type) . '.' . base64url_encode($encoding) . '.' . base64url_encode($algorithm);
+
+ // GNU Social format
+ $signature = base64url_encode(rsa_sign($data . $precomputed, $owner['sprvkey']));
+
+ // Compliant format
+ $signature2 = base64url_encode(rsa_sign(str_replace('=', '', $data . $precomputed), $owner['sprvkey']));
+
+ // Old Status.net format
+ $signature3 = base64url_encode(rsa_sign($data, $owner['sprvkey']));
+
+ // At first try the non compliant method that works for GNU Social
+ $xmldata = array("me:env" => array("me:data" => $data,
+ "@attributes" => array("type" => $data_type),
+ "me:encoding" => $encoding,
+ "me:alg" => $algorithm,
+ "me:sig" => $signature,
+ "@attributes2" => array("key_id" => $keyhash)));
+
+ $namespaces = array("me" => "http://salmon-protocol.org/ns/magic-env");
+
+ $salmon = xml::from_array($xmldata, $xml, false, $namespaces);
+
+ // slap them
+ post_url($url, $salmon, array(
+ 'Content-type: application/magic-envelope+xml',
+ 'Content-length: ' . strlen($salmon)
+ ));
+
+ $a = get_app();
+ $return_code = $a->get_curl_code();
+
+ // check for success, e.g. 2xx
+
+ if ($return_code > 299) {
+
+ logger('GNU Social salmon failed. Falling back to compliant mode');
+
+ // Now try the compliant mode that normally isn't used for GNU Social
+ $xmldata = array("me:env" => array("me:data" => $data,
+ "@attributes" => array("type" => $data_type),
+ "me:encoding" => $encoding,
+ "me:alg" => $algorithm,
+ "me:sig" => $signature2,
+ "@attributes2" => array("key_id" => $keyhash)));
+
+ $namespaces = array("me" => "http://salmon-protocol.org/ns/magic-env");
+
+ $salmon = xml::from_array($xmldata, $xml, false, $namespaces);
+
+ // slap them
+ post_url($url, $salmon, array(
+ 'Content-type: application/magic-envelope+xml',
+ 'Content-length: ' . strlen($salmon)
+ ));
+ $return_code = $a->get_curl_code();