X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fdiaspora.php;h=cfb624fdf2a075a62803649aa982658ec85f4f19;hb=6c0c9d542abaabd8000a10eb47b0921426fcd25d;hp=5836589110aa3f2f6718c45a65e61faf4ebcefbf;hpb=26098fa263f8d4e216fe5566aeb495c5b518b78a;p=friendica.git diff --git a/include/diaspora.php b/include/diaspora.php index 5836589110..cfb624fdf2 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -2,6 +2,10 @@ /** * @file include/diaspora.php * @brief The implementation of the diaspora protocol + * + * The new protocol is described here: http://diaspora.github.io/diaspora_federation/index.html + * Currently this implementation here interprets the old and the new protocol and sends the old one. + * This will change in the future. */ require_once("include/items.php"); @@ -315,8 +319,8 @@ class diaspora { dbesc(NETWORK_DIASPORA), dbesc($msg["author"]) ); - if($r) { - foreach($r as $rr) { + if ($r) { + foreach ($r as $rr) { logger("delivering to: ".$rr["username"]); self::dispatch($rr,$msg); } @@ -619,7 +623,7 @@ class diaspora { dbesc($arr["photo"]), dbesc($arr["request"]), dbesc($arr["nick"]), - dbesc($arr["addr"]), + dbesc(strtolower($arr["addr"])), dbesc($arr["guid"]), dbesc($arr["batch"]), dbesc($arr["notify"]), @@ -634,7 +638,7 @@ class diaspora { } else { $r = q("INSERT INTO `fcontact` (`url`,`name`,`photo`,`request`,`nick`,`addr`, `guid`, `batch`, `notify`,`poll`,`confirm`,`network`,`alias`,`pubkey`,`updated`) - VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')", + VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')", dbesc($arr["url"]), dbesc($arr["name"]), dbesc($arr["photo"]), @@ -673,7 +677,7 @@ class diaspora { $r = q("SELECT `addr` FROM `gcontact` WHERE `id` = %d AND `addr` != ''", intval($gcontact_id)); if ($r) - return $r[0]["addr"]; + return strtolower($r[0]["addr"]); } $r = q("SELECT `network`, `addr`, `self`, `url`, `nick` FROM `contact` WHERE `id` = %d", @@ -693,7 +697,7 @@ class diaspora { } } - return $handle; + return strtolower($handle); } /** @@ -802,7 +806,7 @@ class diaspora { dbesc($guid) ); - if($r) { + if ($r) { logger("message ".$guid." already exists for user ".$uid); return $r[0]["id"]; } @@ -995,17 +999,21 @@ class diaspora { */ private function author_contact_by_url($contact, $person, $uid) { - $r = q("SELECT `id`, `network` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1", + $r = q("SELECT `id`, `network`, `url` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1", dbesc(normalise_link($person["url"])), intval($uid)); if ($r) { $cid = $r[0]["id"]; $network = $r[0]["network"]; + + // We are receiving content from a user that is about to be terminated + // This means the user is vital, so we remove a possible termination date. + unmark_for_death($contact); } else { $cid = $contact["id"]; $network = NETWORK_DIASPORA; } - return (array("cid" => $cid, "network" => $network)); + return array("cid" => $cid, "network" => $network); } /** @@ -1107,6 +1115,11 @@ class diaspora { $text = unxmlify($data->text); $author = notags(unxmlify($data->author)); + if (isset($data->created_at)) + $created_at = datetime_convert("UTC", "UTC", notags(unxmlify($data->created_at))); + else + $created_at = datetime_convert(); + $contact = self::allowed_contact_by_handle($importer, $sender, true); if (!$contact) return false; @@ -1153,6 +1166,8 @@ class diaspora { $datarray["object-type"] = ACTIVITY_OBJ_COMMENT; $datarray["object"] = $xml; + $datarray["changed"] = $datarray["created"] = $datarray["edited"] = $created_at; + $datarray["body"] = diaspora2bb($text); self::fetch_guid($datarray); @@ -1173,7 +1188,7 @@ class diaspora { ); // notify others - proc_run("php", "include/notifier.php", "comment-import", $message_id); + proc_run(PRIORITY_HIGH, "include/notifier.php", "comment-import", $message_id); } return $message_id; @@ -1263,7 +1278,7 @@ class diaspora { $r = q("SELECT `id` FROM `mail` WHERE `uri` = '%s' LIMIT 1", dbesc($message_uri) ); - if($r) { + if (dbm::is_result($r)) { logger("duplicate message already delivered.", LOGGER_DEBUG); return false; } @@ -1349,7 +1364,7 @@ class diaspora { intval($importer["uid"]), dbesc($guid), dbesc($author), - dbesc(datetime_convert("UTC", "UTC", $created_at)), + dbesc($created_at), dbesc(datetime_convert()), dbesc($subject), dbesc($participants) @@ -1508,7 +1523,7 @@ class diaspora { ); // notify others - proc_run("php", "include/notifier.php", "comment-import", $message_id); + proc_run(PRIORITY_HIGH, "include/notifier.php", "comment-import", $message_id); } return $message_id; @@ -1562,7 +1577,7 @@ class diaspora { dbesc($message_uri), intval($importer["uid"]) ); - if($r) { + if ($r) { logger("duplicate message already delivered.", LOGGER_DEBUG); return false; } @@ -1641,7 +1656,7 @@ class diaspora { * @return bool Success */ private function receive_profile($importer, $data) { - $author = notags(unxmlify($data->author)); + $author = strtolower(notags(unxmlify($data->author))); $contact = self::contact_by_handle($importer["uid"], $author); if (!$contact) @@ -1788,7 +1803,7 @@ class diaspora { $i = item_store($arr); if($i) - proc_run("php", "include/notifier.php", "activity", $i); + proc_run(PRIORITY_HIGH, "include/notifier.php", "activity", $i); } } } @@ -2007,7 +2022,7 @@ class diaspora { FROM `item` WHERE `guid` = '%s' AND `visible` AND NOT `deleted` AND `body` != '' LIMIT 1", dbesc($guid)); - if($r) { + if ($r) { logger("reshared message ".$guid." already exists on system."); // Maybe it is already a reshared item? @@ -2071,7 +2086,7 @@ class diaspora { $guid = notags(unxmlify($data->guid)); $author = notags(unxmlify($data->author)); $public = notags(unxmlify($data->public)); - $created_at = notags(unxmlify($data->created_at)); + $created_at = datetime_convert("UTC", "UTC", notags(unxmlify($data->created_at))); $contact = self::allowed_contact_by_handle($importer, $author, false); if (!$contact) @@ -2118,7 +2133,7 @@ class diaspora { $datarray["plink"] = self::plink($author, $guid); $datarray["private"] = (($public == "false") ? 1 : 0); - $datarray["changed"] = $datarray["created"] = $datarray["edited"] = datetime_convert("UTC", "UTC", $created_at); + $datarray["changed"] = $datarray["created"] = $datarray["edited"] = $created_at; $datarray["object-type"] = $original_item["object-type"]; @@ -2181,7 +2196,7 @@ class diaspora { // Now check if the retraction needs to be relayed by us if($p[0]["origin"]) { // notify others - proc_run("php", "include/notifier.php", "drop", $r[0]["id"]); + proc_run(PRIORITY_HIGH, "include/notifier.php", "drop", $r[0]["id"]); } return true; @@ -2239,12 +2254,11 @@ class diaspora { * @return int The message id of the newly created item */ private function receive_status_message($importer, $data, $xml) { - $raw_message = unxmlify($data->raw_message); $guid = notags(unxmlify($data->guid)); $author = notags(unxmlify($data->author)); $public = notags(unxmlify($data->public)); - $created_at = notags(unxmlify($data->created_at)); + $created_at = datetime_convert("UTC", "UTC", notags(unxmlify($data->created_at))); $provider_display_name = notags(unxmlify($data->provider_display_name)); /// @todo enable support for polls @@ -2276,7 +2290,7 @@ class diaspora { $body = "[img]".unxmlify($photo->remote_photo_path). unxmlify($photo->remote_photo_name)."[/img]\n".$body; - $datarray["object-type"] = ACTIVITY_OBJ_PHOTO; + $datarray["object-type"] = ACTIVITY_OBJ_IMAGE; } else { $datarray["object-type"] = ACTIVITY_OBJ_NOTE; @@ -2312,7 +2326,7 @@ class diaspora { $datarray["plink"] = self::plink($author, $guid); $datarray["private"] = (($public == "false") ? 1 : 0); - $datarray["changed"] = $datarray["created"] = $datarray["edited"] = datetime_convert("UTC", "UTC", $created_at); + $datarray["changed"] = $datarray["created"] = $datarray["edited"] = $created_at; if (isset($address["address"])) $datarray["location"] = $address["address"]; @@ -2609,7 +2623,7 @@ class diaspora { logger("transmit: ".$logid."-".$guid." returns: ".$return_code); - if(!$return_code || (($return_code == 503) && (stristr($a->get_curl_headers(), "retry-after")))) { + if (!$return_code || (($return_code == 503) && (stristr($a->get_curl_headers(), "retry-after")))) { logger("queue message"); $r = q("SELECT `id` FROM `queue` WHERE `cid` = %d AND `network` = '%s' AND `content` = '%s' AND `batch` = %d LIMIT 1", @@ -2618,12 +2632,18 @@ class diaspora { dbesc($slap), intval($public_batch) ); - if($r) { + if ($r) { logger("add_to_queue ignored - identical item already in queue"); } else { // queue message for redelivery add_to_queue($contact["id"], NETWORK_DIASPORA, $slap, $public_batch); + + // The message could not be delivered. We mark the contact as "dead" + mark_for_death($contact); } + } elseif (($return_code >= 200) AND ($return_code <= 299)) { + // We successfully delivered a message, the contact is alive + unmark_for_death($contact); } return(($return_code) ? $return_code : (-1)); @@ -2866,8 +2886,10 @@ class diaspora { "created_at" => $created, "provider_display_name" => $item["app"]); - if (count($location) == 0) + // Diaspora rejects messages when they contain a location without "lat" or "lng" + if (!isset($location["lat"]) OR !isset($location["lng"])) { unset($message["location"]); + } $type = "status_message"; } @@ -2903,7 +2925,7 @@ class diaspora { $p = q("SELECT `guid`, `uri`, `parent-uri` FROM `item` WHERE `uri` = '%s' LIMIT 1", dbesc($item["thr-parent"])); - if(!$p) + if (!dbm::is_result($p)) return false; $parent = $p[0]; @@ -2934,7 +2956,7 @@ class diaspora { intval($item["parent"]) ); - if (!$p) + if (!dbm::is_result($p)) return false; $parent = $p[0]; @@ -3148,7 +3170,7 @@ class diaspora { intval($item["uid"]) ); - if (!$r) { + if (!dbm::is_result($r)) { logger("conversation not found."); return; }