X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fdiaspora.php;h=3a211302460a866f483ac5e26f4331f7e5acc455;hb=683cdcc19ef261f5fe632838a1e14567fc874ba2;hp=308a799118a819416e509066d7b89a4755a6c0d1;hpb=ac35f8c756a85cd36c8c2c2df7b7306056443f49;p=friendica.git diff --git a/include/diaspora.php b/include/diaspora.php index 308a799118..3a21130246 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -2,43 +2,11 @@ /** * @file include/diaspora.php * @brief The implementation of the diaspora protocol - * - * Checklist: - * - * Checked: - * - send status - * - send comment - * - send like - * - send mail - * - send status retraction - * - send comment retraction on own post - * - send like retraction on own post - * - send comment retraction on diaspora post - * - send like retraction on diaspora post - * - receive status - * - receive reshare - * - receive comment - * - receive like - * - receive connect request - * - receive profile data - * - receive mail - * - receive comment retraction - * - receive like retraction - * - relay comment - * - relay like - * - relay comment retraction from diaspora - * - relay comment retraction from friendica - * - relay like retraction from diaspora - * - relay like retraction from friendica - * - send share - * - * Should work: - * - receive account deletion - * - send unshare - * - * Unchecked: */ +/// @todo reshare of some reshare doesn't work well, see guid c1d534b0ed19013358694860008dbc6c +// 14f571c0f244013358694860008dbc6c + require_once("include/items.php"); require_once("include/bb2diaspora.php"); require_once("include/Scrape.php"); @@ -118,7 +86,7 @@ class diaspora { * * @return string the repaired signature */ - function repair_signature($signature, $handle = "", $level = 1) { + private function repair_signature($signature, $handle = "", $level = 1) { if ($signature == "") return ($signature); @@ -146,7 +114,7 @@ class diaspora { * 'author' -> author diaspora handle * 'key' -> author public key (converted to pkcs#8) */ - function decode($importer, $xml) { + public static function decode($importer, $xml) { $public = false; $basedom = parse_xml_string($xml); @@ -277,7 +245,7 @@ class diaspora { * * @param array $msg The post that will be dispatched * - * @return bool Was the message accepted? + * @return int The message id of the generated message, "true" or "false" if there was an error */ public static function dispatch_public($msg) { @@ -289,7 +257,7 @@ class diaspora { // Use a dummy importer to import the data for the public copy $importer = array("uid" => 0, "page-flags" => PAGE_FREELOVE); - $item_id = self::dispatch($importer,$msg); + $message_id = self::dispatch($importer,$msg); // Now distribute it to the followers $r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN @@ -306,7 +274,7 @@ class diaspora { } else logger("No subscribers for ".$msg["author"]." ".print_r($msg, true)); - return $item_id; + return $message_id; } /** @@ -315,7 +283,7 @@ class diaspora { * @param array $importer Array of the importer user * @param array $msg The post that will be dispatched * - * @return bool Was the message accepted? + * @return int The message id of the generated message, "true" or "false" if there was an error */ public static function dispatch($importer, $msg) { @@ -339,6 +307,9 @@ class diaspora { case "comment": return self::receive_comment($importer, $sender, $fields, $msg["message"]); + case "contact": + return self::receive_contact_request($importer, $fields); + case "conversation": return self::receive_conversation($importer, $msg, $fields); @@ -360,9 +331,6 @@ class diaspora { case "profile": return self::receive_profile($importer, $fields); - case "request": - return self::receive_request($importer, $fields); - case "reshare": return self::receive_reshare($importer, $fields, $msg["message"]); @@ -418,6 +386,9 @@ class diaspora { if (in_array($type, array("signed_retraction", "relayable_retraction"))) $type = "retraction"; + if ($type == "request") + $type = "contact"; + $fields = new SimpleXMLElement("<".$type."/>"); $signed_data = ""; @@ -734,7 +705,7 @@ class diaspora { * @param string $handle The checked handle in the format user@domain.tld * @param bool $is_comment Is the check for a comment? * - * @return bool is posting allowed? + * @return array The contact data */ private function allowed_contact_by_handle($importer, $handle, $is_comment = false) { $contact = self::contact_by_handle($importer["uid"], $handle); @@ -755,7 +726,7 @@ class diaspora { * * @param int $uid The user id * @param string $guid The guid of the message -y * + * * @return int|bool message id if the message already was stored into the system - or false. */ private function message_exists($uid, $guid) { @@ -928,7 +899,9 @@ y * * @param array $person The record of the person * @param int $uid The user id * - * @return array of contact id and network type + * @return array + * 'cid' => contact id + * 'network' => network type */ private function author_contact_by_url($contact, $person, $uid) { @@ -995,6 +968,9 @@ y * * @return bool Success */ private function receive_account_deletion($importer, $data) { + + /// @todo Account deletion should remove the contact from the global contacts as well + $author = notags(unxmlify($data->author)); $contact = self::contact_by_handle($importer["uid"], $author); @@ -1377,7 +1353,7 @@ y * // "positive" = "false" would be a Dislike - wich isn't currently supported by Diaspora // We would accept this anyhow. - if ($positive === "true") + if ($positive == "true") $verb = ACTIVITY_LIKE; else $verb = ACTIVITY_DISLIKE; @@ -1694,11 +1670,8 @@ y * $BPhoto = "[url=".$contact["url"]."][img]".$contact["thumb"]."[/img][/url]"; $arr["body"] = sprintf(t("%1$s is now friends with %2$s"), $A, $B)."\n\n\n".$Bphoto; - $arr["object"] = "".ACTIVITY_OBJ_PERSON."".$contact["name"]."" - ."".$contact["url"]."/".$contact["name"].""; - $arr["object"] .= "".xmlify(''."\n"); - $arr["object"] .= xmlify(''."\n"); - $arr["object"] .= "\n"; + $arr["object"] = self::construct_new_friend_object($contact); + $arr["last-child"] = 1; $arr["allow_cid"] = $user[0]["allow_cid"]; @@ -1713,6 +1686,26 @@ y * } } + /** + * @brief Creates a XML object for a "new friend" message + * + * @param array $contact Array of the contact + * + * @return string The XML + */ + private function construct_new_friend_object($contact) { + $objtype = ACTIVITY_OBJ_PERSON; + $link = ''."\n". + ''."\n"; + + $xmldata = array("object" => array("type" => $objtype, + "title" => $contact["name"], + "id" => $contact["url"]."/".$contact["name"], + "link" => $link)); + + return xml::from_array($xmldata, $xml, true); + } + /** * @brief Processes incoming sharing notification * @@ -1721,22 +1714,43 @@ y * * * @return bool Success */ - private function receive_request($importer, $data) { + private function receive_contact_request($importer, $data) { $author = unxmlify($data->author); $recipient = unxmlify($data->recipient); if (!$author || !$recipient) return false; - $contact = self::contact_by_handle($importer["uid"],$author); + // the current protocol version doesn't know these fields + // That means that we will assume their existance + if (isset($data->following)) + $following = (unxmlify($data->following) == "true"); + else + $following = true; - if($contact) { + if (isset($data->sharing)) + $sharing = (unxmlify($data->sharing) == "true"); + else + $sharing = true; - // perhaps we were already sharing with this person. Now they're sharing with us. - // That makes us friends. + $contact = self::contact_by_handle($importer["uid"],$author); - self::receive_request_make_friend($importer, $contact); - return true; + // perhaps we were already sharing with this person. Now they're sharing with us. + // That makes us friends. + if ($contact) { + if ($following AND $sharing) { + self::receive_request_make_friend($importer, $contact); + return true; + } else /// @todo Handle all possible variations of adding and retracting of permissions + return false; + } + + if (!$following AND $sharing AND in_array($importer["page-flags"], array(PAGE_SOAPBOX, PAGE_NORMAL))) { + logger("Author ".$author." wants to share with us - but doesn't want to listen. Request is ignored.", LOGGER_DEBUG); + return false; + } elseif (!$following AND !$sharing) { + logger("Author ".$author." doesn't want anything - and we don't know the author. Request is ignored.", LOGGER_DEBUG); + return false; } $ret = self::person_by_handle($author); @@ -1776,12 +1790,10 @@ y * return; } - $g = q("SELECT `def_gid` FROM `user` WHERE `uid` = %d LIMIT 1", - intval($importer["uid"]) - ); + $def_gid = get_default_group($importer['uid'], $ret["network"]); - if($g && intval($g[0]["def_gid"])) - group_add_member($importer["uid"], "", $contact_record["id"], $g[0]["def_gid"]); + if(intval($def_gid)) + group_add_member($importer["uid"], "", $contact_record["id"], $def_gid); if($importer["page-flags"] == PAGE_NORMAL) { @@ -1807,8 +1819,10 @@ y * // but if our page-type is PAGE_COMMUNITY or PAGE_SOAPBOX // we are going to change the relationship and make them a follower. - if($importer["page-flags"] == PAGE_FREELOVE) + if (($importer["page-flags"] == PAGE_FREELOVE) AND $sharing AND $following) $new_relation = CONTACT_IS_FRIEND; + elseif (($importer["page-flags"] == PAGE_FREELOVE) AND $sharing) + $new_relation = CONTACT_IS_SHARING; else $new_relation = CONTACT_IS_FOLLOWER; @@ -2072,10 +2086,11 @@ y * case "StatusMessage": return self::item_retraction($importer, $contact, $data);; + case "Contact": case "Person": /// @todo What should we do with an "unshare"? // Removing the contact isn't correct since we still can read the public items - //contact_remove($contact["id"]); + contact_remove($contact["id"]); return true; default: @@ -2126,6 +2141,7 @@ y * $datarray = array(); + // Attach embedded pictures to the body if ($data->photo) { foreach ($data->photo AS $photo) $body = "[img]".unxmlify($photo->remote_photo_path). @@ -2184,9 +2200,9 @@ y * return $message_id; } - /****************************************************************************************** + /* ************************************************************************************** * * Here are all the functions that are needed to transmit data with the Diaspora protocol * - ******************************************************************************************/ + * ************************************************************************************** */ /** * @brief returnes the handle of a contact @@ -2593,8 +2609,9 @@ y * $link = $matches[1]; $ret["root_guid"] = preg_replace("=https?://(.*)/posts/(.*)=ism", "$2", $link); - if (($ret["root_guid"] == $link) OR ($ret["root_guid"] == "")) + if (($ret["root_guid"] == $link) OR (trim($ret["root_guid"]) == "")) return(false); + return($ret); } @@ -3071,13 +3088,7 @@ y * * * @return bool Success */ - function store_like_signature($contact, $post_id) { - - $enabled = intval(get_config('system','diaspora_enabled')); - if (!$enabled) { - logger('Diaspora support disabled, not storing like signature', LOGGER_DEBUG); - return false; - } + public static function store_like_signature($contact, $post_id) { // Is the contact the owner? Then fetch the private key if (!$contact['self'] OR ($contact['uid'] == 0)) { @@ -3135,19 +3146,13 @@ y * * * @return bool Success */ - function store_comment_signature($item, $contact, $uprvkey, $message_id) { + public static function store_comment_signature($item, $contact, $uprvkey, $message_id) { if ($uprvkey == "") { logger('No private key, so not storing comment signature', LOGGER_DEBUG); return false; } - $enabled = intval(get_config('system','diaspora_enabled')); - if (!$enabled) { - logger('Diaspora support disabled, not storing comment signature', LOGGER_DEBUG); - return false; - } - $contact["uprvkey"] = $uprvkey; $message = self::construct_comment($item, $contact);