X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FProtocol%2FDiaspora.php;h=282320ff6d3099d616578a524970c33e2571c99e;hb=7b8410f5efe604963ef825b8af0b41ec1fe6f92c;hp=2bb846134089e2d2ccaf8f01c0f3c4026c58680e;hpb=71ab86d0c31a81e989d83e0eb68e656783214c03;p=friendica.git diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index 2bb8461340..282320ff6d 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -69,7 +69,7 @@ class Diaspora if (Config::get("system", "relay_directly", false)) { // We distribute our stuff based on the parent to ensure that the thread will be complete - $parent = dba::selectFirst('item', ['parent'], ['id' => $item_id]); + $parent = Item::selectFirst(['parent'], ['id' => $item_id]); if (!DBM::is_result($parent)) { return; } @@ -1170,15 +1170,10 @@ class Diaspora */ private static function messageExists($uid, $guid) { - $r = q( - "SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1", - intval($uid), - dbesc($guid) - ); - - if (DBM::is_result($r)) { + $item = Item::selectFirst(['id'], ['uid' => $uid, 'guid' => $guid]); + if (DBM::is_result($item)) { logger("message ".$guid." already exists for user ".$uid); - return $r[0]["id"]; + return $item["id"]; } return false; @@ -1354,7 +1349,7 @@ class Diaspora $author = ""; // Fetch the author - for the old and the new Diaspora version - if ($source_xml->post->status_message->diaspora_handle) { + if ($source_xml->post->status_message && $source_xml->post->status_message->diaspora_handle) { $author = (string)$source_xml->post->status_message->diaspora_handle; } elseif ($source_xml->author && ($source_xml->getName() == "status_message")) { $author = (string)$source_xml->author; @@ -1385,16 +1380,13 @@ class Diaspora */ private static function parentItem($uid, $guid, $author, $contact) { - $r = q( - "SELECT `id`, `parent`, `body`, `wall`, `uri`, `guid`, `private`, `origin`, - `author-name`, `author-link`, `author-avatar`, - `owner-name`, `owner-link`, `owner-avatar` - FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1", - intval($uid), - dbesc($guid) - ); + $fields = ['id', 'parent', 'body', 'wall', 'uri', 'guid', 'private', 'origin', + 'author-name', 'author-link', 'author-avatar', + 'owner-name', 'owner-link', 'owner-avatar']; + $condition = ['uid' => $uid, 'guid' => $guid]; + $item = Item::selectFirst($fields, $condition); - if (!$r) { + if (!DBM::is_result($item)) { $result = self::storeByGuid($guid, $contact["url"], $uid); if (!$result) { @@ -1405,23 +1397,16 @@ class Diaspora if ($result) { logger("Fetched missing item ".$guid." - result: ".$result, LOGGER_DEBUG); - $r = q( - "SELECT `id`, `body`, `wall`, `uri`, `private`, `origin`, - `author-name`, `author-link`, `author-avatar`, - `owner-name`, `owner-link`, `owner-avatar` - FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1", - intval($uid), - dbesc($guid) - ); + $item = Item::selectFirst($fields, $condition); } } - if (!$r) { + if (!DBM::is_result($item)) { logger("parent item not found: parent: ".$guid." - user: ".$uid); return false; } else { logger("parent item found: parent: ".$guid." - user: ".$uid); - return $r[0]; + return $item; } } @@ -1558,13 +1543,6 @@ class Diaspora logger('Contacts are updated.'); - // update items - // This is an extreme performance killer - Item::update(['owner-link' => $data["url"]], ['owner-link' => $contact["url"], 'uid' => $importer["uid"]]); - Item::update(['author-link' => $data["url"]], ['author-link' => $contact["url"], 'uid' => $importer["uid"]]); - - logger('Items are updated.'); - return true; } @@ -1602,11 +1580,21 @@ class Diaspora */ private static function getUriFromGuid($author, $guid, $onlyfound = false) { - $r = q("SELECT `uri` FROM `item` WHERE `guid` = '%s' LIMIT 1", dbesc($guid)); - if (DBM::is_result($r)) { - return $r[0]["uri"]; + $item = Item::selectFirst(['uri'], ['guid' => $guid]); + if (DBM::is_result($item)) { + return $item["uri"]; } elseif (!$onlyfound) { - return $author.":".$guid; + $contact = Contact::getDetailsByAddr($author, 0); + if (!empty($contact['network'])) { + $prefix = 'urn:X-' . $contact['network'] . ':'; + } else { + // This fallback should happen most unlikely + $prefix = 'urn:X-dspr:'; + } + + $author_parts = explode('@', $author); + + return $prefix . $author_parts[1] . ':' . $author_parts[0] . ':'. $guid; } return ""; @@ -1622,9 +1610,9 @@ class Diaspora */ private static function getGuidFromUri($uri, $uid) { - $r = q("SELECT `guid` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", dbesc($uri), intval($uid)); - if (DBM::is_result($r)) { - return $r[0]["guid"]; + $item = Item::selectFirst(['guid'], ['uri' => $uri, 'uid' => $uid]); + if (DBM::is_result($item)) { + return $item["guid"]; } else { return false; } @@ -1639,11 +1627,10 @@ class Diaspora */ private static function importerForGuid($guid) { - $item = dba::fetch_first("SELECT `uid` FROM `item` WHERE `origin` AND `guid` = ? LIMIT 1", $guid); - + $item = Item::selectFirst(['uid'], ['origin' => true, 'guid' => $guid]); if (DBM::is_result($item)) { logger("Found user ".$item['uid']." as owner of item ".$guid, LOGGER_DEBUG); - $contact = dba::fetch_first("SELECT * FROM `contact` WHERE `self` AND `uid` = ?", $item['uid']); + $contact = dba::selectFirst('contact', [], ['self' => true, 'uid' => $item['uid']]); if (DBM::is_result($contact)) { return $contact; } @@ -1711,13 +1698,11 @@ class Diaspora $datarray["contact-id"] = $author_contact["cid"]; $datarray["network"] = $author_contact["network"]; - $datarray["author-name"] = $person["name"]; $datarray["author-link"] = $person["url"]; - $datarray["author-avatar"] = ((x($person, "thumb")) ? $person["thumb"] : $person["photo"]); + $datarray["author-id"] = Contact::getIdForURL($person["url"], 0); - $datarray["owner-name"] = $contact["name"]; $datarray["owner-link"] = $contact["url"]; - $datarray["owner-avatar"] = ((x($contact, "thumb")) ? $contact["thumb"] : $contact["photo"]); + $datarray["owner-id"] = Contact::getIdForURL($contact["url"], 0); $datarray["guid"] = $guid; $datarray["uri"] = self::getUriFromGuid($author, $guid); @@ -1939,50 +1924,6 @@ class Diaspora return true; } - /** - * @brief Creates the body for a "like" message - * - * @param array $contact The contact that send us the "like" - * @param array $parent_item The item array of the parent item - * @param string $guid message guid - * - * @return string the body - */ - private static function constructLikeBody($contact, $parent_item, $guid) - { - $bodyverb = L10n::t('%1$s likes %2$s\'s %3$s'); - - $ulink = "[url=".$contact["url"]."]".$contact["name"]."[/url]"; - $alink = "[url=".$parent_item["author-link"]."]".$parent_item["author-name"]."[/url]"; - $plink = "[url=".System::baseUrl()."/display/".urlencode($guid)."]".L10n::t("status")."[/url]"; - - return sprintf($bodyverb, $ulink, $alink, $plink); - } - - /** - * @brief Creates a XML object for a "like" - * - * @param array $importer Array of the importer user - * @param array $parent_item The item array of the parent item - * - * @return string The XML - */ - private static function constructLikeObject($importer, $parent_item) - { - $objtype = ACTIVITY_OBJ_NOTE; - $link = ''; - $parent_body = $parent_item["body"]; - - $xmldata = ["object" => ["type" => $objtype, - "local" => "1", - "id" => $parent_item["uri"], - "link" => $link, - "title" => "", - "content" => $parent_body]]; - - return XML::fromArray($xmldata, $xml, true); - } - /** * @brief Processes "like" messages * @@ -2046,30 +1987,30 @@ class Diaspora $datarray["contact-id"] = $author_contact["cid"]; $datarray["network"] = $author_contact["network"]; - $datarray["author-name"] = $person["name"]; $datarray["author-link"] = $person["url"]; - $datarray["author-avatar"] = ((x($person, "thumb")) ? $person["thumb"] : $person["photo"]); + $datarray["author-id"] = Contact::getIdForURL($person["url"], 0); - $datarray["owner-name"] = $contact["name"]; $datarray["owner-link"] = $contact["url"]; - $datarray["owner-avatar"] = ((x($contact, "thumb")) ? $contact["thumb"] : $contact["photo"]); + $datarray["owner-id"] = Contact::getIdForURL($contact["url"], 0); $datarray["guid"] = $guid; $datarray["uri"] = self::getUriFromGuid($author, $guid); $datarray["type"] = "activity"; $datarray["verb"] = $verb; - $datarray["gravity"] = GRAVITY_LIKE; + $datarray["gravity"] = GRAVITY_ACTIVITY; $datarray["parent-uri"] = $parent_item["uri"]; $datarray["object-type"] = ACTIVITY_OBJ_NOTE; - $datarray["object"] = self::constructLikeObject($importer, $parent_item); - $datarray["body"] = self::constructLikeBody($contact, $parent_item, $guid); + $datarray["body"] = $verb; + + // Diaspora doesn't provide a date for likes + $datarray["changed"] = $datarray["created"] = $datarray["edited"] = DateTimeFormat::utcNow(); // like on comments have the comment as parent. So we need to fetch the toplevel parent if ($parent_item["id"] != $parent_item["parent"]) { - $toplevel = dba::selectFirst('item', ['origin'], ['id' => $parent_item["parent"]]); + $toplevel = Item::selectFirst(['origin'], ['id' => $parent_item["parent"]]); $origin = $toplevel["origin"]; } else { $origin = $parent_item["origin"]; @@ -2206,7 +2147,7 @@ class Diaspora return false; } - $item = dba::selectFirst('item', ['id'], ['guid' => $parent_guid, 'origin' => true, 'private' => false]); + $item = Item::selectFirst(['id'], ['guid' => $parent_guid, 'origin' => true, 'private' => false]); if (!DBM::is_result($item)) { logger('Item not found, no origin or private: '.$parent_guid); return false; @@ -2227,11 +2168,11 @@ class Diaspora } // Send all existing comments and likes to the requesting server - $comments = dba::p("SELECT `item`.`id`, `item`.`verb`, `contact`.`self` - FROM `item` - INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id` - WHERE `item`.`parent` = ? AND `item`.`id` != `item`.`parent`", $item['id']); - while ($comment = dba::fetch($comments)) { + $comments = Item::select(['id', 'parent', 'verb', 'self'], ['parent' => $item['id']]); + while ($comment = Item::fetch($comments)) { + if ($comment['id'] == $comment['parent']) { + continue; + } if ($comment['verb'] == ACTIVITY_POST) { $cmd = $comment['self'] ? 'comment-new' : 'comment-import'; } else { @@ -2589,7 +2530,7 @@ class Diaspora $fields = ['body', 'tag', 'app', 'created', 'object-type', 'uri', 'guid', 'author-name', 'author-link', 'author-avatar']; $condition = ['guid' => $guid, 'visible' => true, 'deleted' => false, 'private' => false]; - $item = dba::selectfirst('item', $fields, $condition); + $item = Item::selectFirst($fields, $condition); if (DBM::is_result($item)) { logger("reshared message ".$guid." already exists on system."); @@ -2633,7 +2574,7 @@ class Diaspora $fields = ['body', 'tag', 'app', 'created', 'object-type', 'uri', 'guid', 'author-name', 'author-link', 'author-avatar']; $condition = ['guid' => $guid, 'visible' => true, 'deleted' => false, 'private' => false]; - $item = dba::selectfirst('item', $fields, $condition); + $item = Item::selectFirst($fields, $condition); if (DBM::is_result($item)) { // If it is a reshared post from another network then reformat to avoid display problems with two share elements @@ -2691,13 +2632,11 @@ class Diaspora $datarray["contact-id"] = $contact["id"]; $datarray["network"] = NETWORK_DIASPORA; - $datarray["author-name"] = $contact["name"]; $datarray["author-link"] = $contact["url"]; - $datarray["author-avatar"] = ((x($contact, "thumb")) ? $contact["thumb"] : $contact["photo"]); + $datarray["author-id"] = Contact::getIdForURL($contact["url"], 0); - $datarray["owner-name"] = $datarray["author-name"]; $datarray["owner-link"] = $datarray["author-link"]; - $datarray["owner-avatar"] = $datarray["author-avatar"]; + $datarray["owner-id"] = $datarray["author-id"]; $datarray["guid"] = $guid; $datarray["uri"] = $datarray["parent-uri"] = self::getUriFromGuid($author, $guid); @@ -2769,23 +2708,29 @@ class Diaspora } // Fetch items that are about to be deleted - $fields = ['uid', 'id', 'parent', 'parent-uri', 'author-link']; + $fields = ['uid', 'id', 'parent', 'parent-uri', 'author-link', 'file']; // When we receive a public retraction, we delete every item that we find. if ($importer['uid'] == 0) { - $condition = ["`guid` = ? AND NOT `file` LIKE '%%[%%' AND NOT `deleted`", $target_guid]; + $condition = ['guid' => $target_guid, 'deleted' => false]; } else { - $condition = ["`guid` = ? AND `uid` = ? AND NOT `file` LIKE '%%[%%' AND NOT `deleted`", $target_guid, $importer['uid']]; + $condition = ['guid' => $target_guid, 'deleted' => false, 'uid' => $importer['uid']]; } - $r = dba::select('item', $fields, $condition); + + $r = Item::select($fields, $condition); if (!DBM::is_result($r)) { logger("Target guid ".$target_guid." was not found on this system for user ".$importer['uid']."."); return false; } - while ($item = dba::fetch($r)) { + while ($item = Item::fetch($r)) { + if (strstr($item['file'], '[')) { + logger("Target guid " . $target_guid . " for user " . $item['uid'] . " is filed. So it won't be deleted.", LOGGER_DEBUG); + continue; + } + // Fetch the parent item - $parent = dba::selectFirst('item', ['author-link'], ['id' => $item["parent"]]); + $parent = Item::selectFirst(['author-link'], ['id' => $item["parent"]]); // Only delete it if the parent author really fits if (!link_compare($parent["author-link"], $contact["url"]) && !link_compare($item["author-link"], $contact["url"])) { @@ -2911,13 +2856,11 @@ class Diaspora $datarray["contact-id"] = $contact["id"]; $datarray["network"] = NETWORK_DIASPORA; - $datarray["author-name"] = $contact["name"]; $datarray["author-link"] = $contact["url"]; - $datarray["author-avatar"] = ((x($contact, "thumb")) ? $contact["thumb"] : $contact["photo"]); + $datarray["author-id"] = Contact::getIdForURL($contact["url"], 0); - $datarray["owner-name"] = $datarray["author-name"]; $datarray["owner-link"] = $datarray["author-link"]; - $datarray["owner-avatar"] = $datarray["author-avatar"]; + $datarray["owner-id"] = $datarray["author-id"]; $datarray["guid"] = $guid; $datarray["uri"] = $datarray["parent-uri"] = self::getUriFromGuid($author, $guid); @@ -3280,7 +3223,7 @@ class Diaspora $author = self::myHandle($owner); $message = ["author" => $author, - "guid" => get_guid(32), + "guid" => System::createGUID(32), "parent_type" => "Post", "parent_guid" => $item["guid"]]; @@ -3412,18 +3355,18 @@ class Diaspora $guid = ""; preg_match("/guid='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $guid = $matches[1]; } preg_match('/guid="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $guid = $matches[1]; } if (($guid != "") && $complete) { $condition = ['guid' => $guid, 'network' => [NETWORK_DFRN, NETWORK_DIASPORA]]; - $item = dba::selectFirst('item', ['contact-id'], $condition); + $item = Item::selectFirst(['contact-id'], $condition); if (DBM::is_result($item)) { $ret= []; $ret["root_handle"] = self::handleFromContact($item["contact-id"]); @@ -3442,12 +3385,12 @@ class Diaspora $profile = ""; preg_match("/profile='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $profile = $matches[1]; } preg_match('/profile="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $profile = $matches[1]; } @@ -3690,16 +3633,11 @@ class Diaspora */ private static function constructLike($item, $owner) { - $p = q( - "SELECT `guid`, `uri`, `parent-uri` FROM `item` WHERE `uri` = '%s' LIMIT 1", - dbesc($item["thr-parent"]) - ); - if (!DBM::is_result($p)) { + $parent = Item::selectFirst(['guid', 'uri', 'parent-uri'], ['uri' => $item["thr-parent"]]); + if (!DBM::is_result($parent)) { return false; } - $parent = $p[0]; - $target_type = ($parent["uri"] === $parent["parent-uri"] ? "Post" : "Comment"); $positive = null; if ($item['verb'] === ACTIVITY_LIKE) { @@ -3726,16 +3664,11 @@ class Diaspora */ private static function constructAttend($item, $owner) { - $p = q( - "SELECT `guid`, `uri`, `parent-uri` FROM `item` WHERE `uri` = '%s' LIMIT 1", - dbesc($item["thr-parent"]) - ); - if (!DBM::is_result($p)) { + $parent = Item::selectFirst(['guid', 'uri', 'parent-uri'], ['uri' => $item["thr-parent"]]); + if (!DBM::is_result($parent)) { return false; } - $parent = $p[0]; - switch ($item['verb']) { case ACTIVITY_ATTEND: $attend_answer = 'accepted'; @@ -3775,18 +3708,11 @@ class Diaspora return $result; } - $p = q( - "SELECT `guid` FROM `item` WHERE `parent` = %d AND `id` = %d LIMIT 1", - intval($item["parent"]), - intval($item["parent"]) - ); - - if (!DBM::is_result($p)) { + $parent = Item::selectFirst(['guid'], ['id' => $item["parent"], 'parent' => $item["parent"]]); + if (!DBM::is_result($parent)) { return false; } - $parent = $p[0]; - $text = html_entity_decode(BBCode::toMarkdown($item["body"])); $created = DateTimeFormat::utc($item["created"], DateTimeFormat::ATOM); @@ -4255,16 +4181,16 @@ class Diaspora $contact["uprvkey"] = $r[0]['prvkey']; - $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1", intval($post_id)); - if (!DBM::is_result($r)) { + $item = Item::selectFirst([], ['id' => $post_id]); + if (!DBM::is_result($item)) { return false; } - if (!in_array($r[0]["verb"], [ACTIVITY_LIKE, ACTIVITY_DISLIKE])) { + if (!in_array($item["verb"], [ACTIVITY_LIKE, ACTIVITY_DISLIKE])) { return false; } - $message = self::constructLike($r[0], $contact); + $message = self::constructLike($item, $contact); if ($message === false) { return false; }