Diaspora: Support for reading the /fetch/post/ functionality

This commit is contained in:
Michael Vogel 2016-06-30 22:18:48 +02:00
parent b2e21ca7b8
commit 97abbe83f4

View File

@ -100,6 +100,59 @@ class diaspora {
return($signature); return($signature);
} }
/**
* @brief verify the envelope and return the verified data
*
* @param string $envelope The magic envelope
*
* @return string verified data
*/
private function verify_magic_envelope($envelope) {
$basedom = parse_xml_string($envelope, false);
if (!is_object($basedom)) {
logger("Envelope is no XML file");
return false;
}
$children = $basedom->children('http://salmon-protocol.org/ns/magic-env');
if (sizeof($children) == 0) {
logger("XML has no children");
return false;
}
$handle = "";
$data = base64url_decode($children->data);
$type = $children->data->attributes()->type[0];
$encoding = $children->encoding;
$alg = $children->alg;
$sig = base64url_decode($children->sig);
$key_id = $children->sig->attributes()->key_id[0];
if ($key_id != "")
$handle = base64url_decode($key_id);
$b64url_data = base64url_encode($data);
$msg = str_replace(array("\n", "\r", " ", "\t"), array("", "", "", ""), $b64url_data);
$signable_data = $msg.".".base64url_encode($type).".".base64url_encode($encoding).".".base64url_encode($alg);
$key = self::key($handle);
$verify = rsa_verify($signable_data, $sig, $key);
if (!$verify) {
logger('Message did not verify. Discarding.');
return false;
}
return $data;
}
/** /**
* @brief: Decodes incoming Diaspora message * @brief: Decodes incoming Diaspora message
* *
@ -233,7 +286,6 @@ class diaspora {
return array('message' => (string)$inner_decrypted, return array('message' => (string)$inner_decrypted,
'author' => unxmlify($author_link), 'author' => unxmlify($author_link),
'key' => (string)$key); 'key' => (string)$key);
} }
@ -816,11 +868,28 @@ class diaspora {
if ($level > 5) if ($level > 5)
return false; return false;
// This will work for Diaspora and newer Friendica servers // This will work for new Diaspora servers and Friendica servers from 3.5
$source_url = $server."/fetch/post/".$guid;
logger("Fetch post from ".$source_url, LOGGER_DEBUG);
$envelope = fetch_url($source_url);
if($envelope) {
logger("Envelope was fetched.", LOGGER_DEBUG);
$x = self::verify_magic_envelope($envelope);
if (!$x) {
logger("Envelope could not be verified.", LOGGER_DEBUG);
return false;
}
logger("Envelope was verified.", LOGGER_DEBUG);
} else {
// This will work for older Diaspora and Friendica servers
$source_url = $server."/p/".$guid.".xml"; $source_url = $server."/p/".$guid.".xml";
logger("Fetch post from ".$source_url, LOGGER_DEBUG);
$x = fetch_url($source_url); $x = fetch_url($source_url);
if(!$x) if(!$x)
return false; return false;
}
$source_xml = parse_xml_string($x, false); $source_xml = parse_xml_string($x, false);
@ -2265,7 +2334,7 @@ class diaspora {
* @return string The envelope * @return string The envelope
*/ */
function build_magic_envelope($msg, $user) { public static function build_magic_envelope($msg, $user) {
$b64url_data = base64url_encode($msg); $b64url_data = base64url_encode($msg);
$data = str_replace(array("\n", "\r", " ", "\t"), array("", "", "", ""), $b64url_data); $data = str_replace(array("\n", "\r", " ", "\t"), array("", "", "", ""), $b64url_data);