From eb0a7015905a898bbdd0cbf865c29496a537d85c Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 7 May 2017 15:58:32 +0000 Subject: [PATCH] Just some more fixes to the protocol and the avatar stuff --- include/Probe.php | 41 ++++++++++++++++++++++++++++++++++-- include/diaspora.php | 50 ++++---------------------------------------- include/ostatus.php | 42 +++---------------------------------- 3 files changed, 46 insertions(+), 87 deletions(-) diff --git a/include/Probe.php b/include/Probe.php index 2f924266cc..bed13fdf3d 100644 --- a/include/Probe.php +++ b/include/Probe.php @@ -793,7 +793,7 @@ class Probe { if (sizeof($avatar)) { ksort($avatar); - $data["photo"] = array_pop($avatar); + $data["photo"] = self::fix_avatar(array_pop($avatar), $data["baseurl"]); } if ($dfrn) { @@ -964,7 +964,7 @@ class Probe { $data["nick"] = $feed_data["header"]["author-nick"]; } if ($feed_data["header"]["author-avatar"] != "") { - $data["photo"] = ostatus::fix_avatar($feed_data["header"]["author-avatar"], $data["url"]); + $data["photo"] = self::fix_avatar($feed_data["header"]["author-avatar"], $data["url"]); } if ($feed_data["header"]["author-id"] != "") { $data["alias"] = $feed_data["header"]["author-id"]; @@ -1223,5 +1223,42 @@ class Probe { return $data; } + + /** + * @brief Mix two paths together to possibly fix missing parts + * + * @param string $avatar Path to the avatar + * @param string $base Another path that is hopefully complete + * + * @return string fixed avatar path + */ + public static function fix_avatar($avatar, $base) { + $base_parts = parse_url($base); + + // Remove all parts that could create a problem + unset($base_parts['path']); + unset($base_parts['query']); + unset($base_parts['fragment']); + + $avatar_parts = parse_url($avatar); + + // Now we mix them + $parts = array_merge($base_parts, $avatar_parts); + + // And put them together again + $scheme = isset($parts['scheme']) ? $parts['scheme'] . '://' : ''; + $host = isset($parts['host']) ? $parts['host'] : ''; + $port = isset($parts['port']) ? ':' . $parts['port'] : ''; + $path = isset($parts['path']) ? $parts['path'] : ''; + $query = isset($parts['query']) ? '?' . $parts['query'] : ''; + $fragment = isset($parts['fragment']) ? '#' . $parts['fragment'] : ''; + + $fixed = $scheme.$host.$port.$path.$query.$fragment; + + logger('Base: '.$base.' - Avatar: '.$avatar.' - Fixed: '.$fixed, LOGGER_DATA); + + return $fixed; + } + } ?> diff --git a/include/diaspora.php b/include/diaspora.php index 36aa75930d..0c3ff68da4 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -636,7 +636,7 @@ class Diaspora { } // Only some message types have signatures. So we quit here for the other types. - if (!in_array($type, array("comment", "message", "like"))) { + if (!in_array($type, array("comment", "like"))) { return array("fields" => $fields, "relayed" => false); } // No author_signature? This is a must, so we quit. @@ -694,7 +694,7 @@ class Diaspora { * * @return array the queried data */ - private static function person_by_handle($handle) { + public static function person_by_handle($handle) { $r = q("SELECT * FROM `fcontact` WHERE `network` = '%s' AND `addr` = '%s' LIMIT 1", dbesc(NETWORK_DIASPORA), @@ -1506,11 +1506,6 @@ class Diaspora { $msg_text = unxmlify($mesg->text); $msg_created_at = datetime_convert("UTC", "UTC", notags(unxmlify($mesg->created_at))); - /// @todo these fields doesn't seem to be supported by the new protocol - $msg_parent_guid = notags(unxmlify($mesg->parent_guid)); - $msg_parent_author_signature = notags(unxmlify($mesg->parent_author_signature)); - $msg_author_signature = notags(unxmlify($mesg->author_signature)); - if ($msg_conversation_guid != $guid) { logger("message conversation guid does not belong to the current conversation."); return false; @@ -1519,41 +1514,7 @@ class Diaspora { $body = diaspora2bb($msg_text); $message_uri = $msg_author.":".$msg_guid; - $author_signed_data = $msg_guid.";".$msg_parent_guid.";".$msg_text.";".unxmlify($mesg->created_at).";".$msg_author.";".$msg_conversation_guid; - - $author_signature = base64_decode($msg_author_signature); - - if (strcasecmp($msg_author,$msg["author"]) == 0) { - $person = $contact; - $key = $msg["key"]; - } else { - $person = self::person_by_handle($msg_author); - - if (is_array($person) && x($person, "pubkey")) { - $key = $person["pubkey"]; - } else { - logger("unable to find author details"); - return false; - } - } - - if (!rsa_verify($author_signed_data, $author_signature, $key, "sha256")) { - logger("verification failed."); - return false; - } - - if ($msg_parent_author_signature) { - $owner_signed_data = $msg_guid.";".$msg_parent_guid.";".$msg_text.";".unxmlify($mesg->created_at).";".$msg_author.";".$msg_conversation_guid; - - $parent_author_signature = base64_decode($msg_parent_author_signature); - - $key = $msg["key"]; - - if (!rsa_verify($owner_signed_data, $parent_author_signature, $key, "sha256")) { - logger("owner verification failed."); - return false; - } - } + $person = self::person_by_handle($msg_author); $r = q("SELECT `id` FROM `mail` WHERE `uri` = '%s' LIMIT 1", dbesc($message_uri) @@ -1826,9 +1787,6 @@ class Diaspora { $text = unxmlify($data->text); $created_at = datetime_convert("UTC", "UTC", notags(unxmlify($data->created_at))); - /// @todo "parent_guid" doesn't seem to be part of the new protocol - $parent_guid = notags(unxmlify($data->parent_guid)); - $contact = self::allowed_contact_by_handle($importer, $author, true); if (!$contact) { return false; @@ -1882,7 +1840,7 @@ class Diaspora { 0, 1, dbesc($message_uri), - dbesc($author.":".$parent_guid), + dbesc($author.":".$conversation["guid"]), dbesc($created_at) ); diff --git a/include/ostatus.php b/include/ostatus.php index 5bd1865bd0..7644eacc09 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -29,42 +29,6 @@ class ostatus { const OSTATUS_DEFAULT_POLL_TIMEFRAME = 1440; // given in minutes const OSTATUS_DEFAULT_POLL_TIMEFRAME_MENTIONS = 14400; // given in minutes - /** - * @brief Mix two paths together to possibly fix missing parts - * - * @param string $avatar Path to the avatar - * @param string $base Another path that is hopefully complete - * - * @return string fixed avatar path - */ - public static function fix_avatar($avatar, $base) { - $base_parts = parse_url($base); - - // Remove all parts that could create a problem - unset($base_parts['path']); - unset($base_parts['query']); - unset($base_parts['fragment']); - - $avatar_parts = parse_url($avatar); - - // Now we mix them - $parts = array_merge($base_parts, $avatar_parts); - - // And put them together again - $scheme = isset($parts['scheme']) ? $parts['scheme'] . '://' : ''; - $host = isset($parts['host']) ? $parts['host'] : ''; - $port = isset($parts['port']) ? ':' . $parts['port'] : ''; - $path = isset($parts['path']) ? $parts['path'] : ''; - $query = isset($parts['query']) ? '?' . $parts['query'] : ''; - $fragment = isset($parts['fragment']) ? '#' . $parts['fragment'] : ''; - - $fixed = $scheme.$host.$port.$path.$query.$fragment; - - logger('Base: '.$base.' - Avatar: '.$avatar.' - Fixed: '.$fixed, LOGGER_DATA); - - return $fixed; - } - /** * @brief Fetches author data * @@ -135,7 +99,7 @@ class ostatus { } if (count($avatarlist) > 0) { krsort($avatarlist); - $author["author-avatar"] = self::fix_avatar(current($avatarlist), $author["author-link"]); + $author["author-avatar"] = Probe::fix_avatar(current($avatarlist), $author["author-link"]); } $displayname = $xpath->evaluate('atom:author/poco:displayName/text()', $context)->item(0)->nodeValue; @@ -1196,7 +1160,7 @@ class ostatus { $arr["owner-name"] = $single_conv->actor->portablecontacts_net->displayName; $arr["owner-link"] = $actor; - $arr["owner-avatar"] = self::fix_avatar($single_conv->actor->image->url, $arr["owner-link"]); + $arr["owner-avatar"] = Probe::fix_avatar($single_conv->actor->image->url, $arr["owner-link"]); $arr["author-name"] = $arr["owner-name"]; $arr["author-link"] = $arr["owner-link"]; @@ -1261,7 +1225,7 @@ class ostatus { $arr["author-name"] = $single_conv->object->actor->contact->displayName; } $arr["author-link"] = $single_conv->object->actor->url; - $arr["author-avatar"] = self::fix_avatar($single_conv->object->actor->image->url, $arr["author-link"]); + $arr["author-avatar"] = Probe::fix_avatar($single_conv->object->actor->image->url, $arr["author-link"]); $arr["app"] = $single_conv->object->provider->displayName."#"; //$arr["verb"] = $single_conv->object->verb;