X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fdiaspora.php;h=80825273fd88333058be23fc6167855b6d3ac8bd;hb=aeb6e53d02fdbc3208851a9a4dc8323db29c62c5;hp=762018b170c4f1f9ec35ff498b143f319427b051;hpb=ea88e15a8cc10f99621720ca0e5a9598d0e64e0f;p=friendica.git diff --git a/include/diaspora.php b/include/diaspora.php index 762018b170..80825273fd 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -9,6 +9,7 @@ */ use Friendica\App; +use Friendica\Core\System; use Friendica\Core\Config; require_once 'include/items.php'; @@ -928,11 +929,9 @@ class Diaspora { * Normally this should have handled by getting a request - but this could get lost */ if ($contact["rel"] == CONTACT_IS_FOLLOWER && in_array($importer["page-flags"], array(PAGE_FREELOVE))) { - q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d", - intval(CONTACT_IS_FRIEND), - intval($contact["id"]), - intval($importer["uid"]) - ); + dba::update('contact', array('rel' => CONTACT_IS_FRIEND, 'writable' => true), + array('id' => $contact["id"], 'uid' => $contact["uid"])); + $contact["rel"] = CONTACT_IS_FRIEND; logger("defining user ".$contact["nick"]." as friend"); } @@ -1014,10 +1013,16 @@ class Diaspora { * @param array $item The item array */ private static function fetch_guid($item) { + $expression = "=diaspora://.*?/post/([0-9A-Za-z\-_@.:]{15,254}[0-9A-Za-z])=ism"; + preg_replace_callback($expression, + function ($match) use ($item) { + return self::fetch_guid_sub($match, $item); + }, $item["body"]); + preg_replace_callback("&\[url=/posts/([^\[\]]*)\](.*)\[\/url\]&Usi", - function ($match) use ($item){ - return(self::fetch_guid_sub($match, $item)); - },$item["body"]); + function ($match) use ($item) { + return self::fetch_guid_sub($match, $item); + }, $item["body"]); } /** @@ -1029,7 +1034,7 @@ class Diaspora { * * @return the replaced string */ - public function replace_people_guid($body, $author_link) { + public static function replace_people_guid($body, $author_link) { $return = preg_replace_callback("&\[url=/people/([^\[\]]*)\](.*)\[\/url\]&Usi", function ($match) use ($author_link) { // $match @@ -1178,7 +1183,7 @@ class Diaspora { * @return array the item record */ private static function parent_item($uid, $guid, $author, $contact) { - $r = q("SELECT `id`, `body`, `wall`, `uri`, `private`, `origin`, + $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", @@ -1261,26 +1266,38 @@ class Diaspora { * * @return string the post link */ - private static function plink($addr, $guid) { + private static function plink($addr, $guid, $parent_guid = '') { $r = q("SELECT `url`, `nick`, `network` FROM `fcontact` WHERE `addr`='%s' LIMIT 1", dbesc($addr)); // Fallback - if (!$r) - return "https://".substr($addr,strpos($addr,"@")+1)."/posts/".$guid; + if (!dbm::is_result($r)) { + if ($parent_guid != '') { + return "https://".substr($addr,strpos($addr,"@") + 1)."/posts/".$parent_guid."#".$guid; + } else { + return "https://".substr($addr,strpos($addr,"@") + 1)."/posts/".$guid; + } + } // Friendica contacts are often detected as Diaspora contacts in the "fcontact" table // So we try another way as well. $s = q("SELECT `network` FROM `gcontact` WHERE `nurl`='%s' LIMIT 1", dbesc(normalise_link($r[0]["url"]))); - if ($s) + if (dbm::is_result($s)) { $r[0]["network"] = $s[0]["network"]; + } - if ($r[0]["network"] == NETWORK_DFRN) - return(str_replace("/profile/".$r[0]["nick"]."/", "/display/".$guid, $r[0]["url"]."/")); + if ($r[0]["network"] == NETWORK_DFRN) { + return str_replace("/profile/".$r[0]["nick"]."/", "/display/".$guid, $r[0]["url"]."/"); + } - if (self::is_redmatrix($r[0]["url"])) + if (self::is_redmatrix($r[0]["url"])) { return $r[0]["url"]."/?f=&mid=".$guid; + } - return "https://".substr($addr,strpos($addr,"@")+1)."/posts/".$guid; + if ($parent_guid != '') { + return "https://".substr($addr,strpos($addr,"@")+1)."/posts/".$parent_guid."#".$guid; + } else { + return "https://".substr($addr,strpos($addr,"@")+1)."/posts/".$guid; + } } /** @@ -1454,6 +1471,8 @@ class Diaspora { $datarray["changed"] = $datarray["created"] = $datarray["edited"] = $created_at; + $datarray["plink"] = self::plink($author, $guid, $parent_item['guid']); + $body = diaspora2bb($text); $datarray["body"] = self::replace_people_guid($body, $person["url"]); @@ -1475,10 +1494,7 @@ class Diaspora { // Formerly we stored the signed text, the signature and the author in different fields. // We now store the raw data so that we are more flexible. - q("INSERT INTO `sign` (`iid`,`signed_text`) VALUES (%d,'%s')", - intval($message_id), - dbesc(json_encode($data)) - ); + dba::insert('sign', array('iid' => $message_id, 'signed_text' => json_encode($data))); // notify others proc_run(PRIORITY_HIGH, "include/notifier.php", "comment-import", $message_id); @@ -1529,6 +1545,8 @@ class Diaspora { $person = self::person_by_handle($msg_author); + dba::lock('mail'); + $r = q("SELECT `id` FROM `mail` WHERE `guid` = '%s' AND `uid` = %d LIMIT 1", dbesc($msg_guid), intval($importer["uid"]) @@ -1556,10 +1574,9 @@ class Diaspora { dbesc($msg_created_at) ); - q("UPDATE `conv` SET `updated` = '%s' WHERE `id` = %d", - dbesc(datetime_convert()), - intval($conversation["id"]) - ); + dba::unlock(); + + dba::update('conv', array('updated' => datetime_convert()), array('id' => $conversation["id"])); notification(array( "type" => NOTIFY_MAIL, @@ -1658,7 +1675,7 @@ class Diaspora { $ulink = "[url=".$contact["url"]."]".$contact["name"]."[/url]"; $alink = "[url=".$parent_item["author-link"]."]".$parent_item["author-name"]."[/url]"; - $plink = "[url=".App::get_baseurl()."/display/".urlencode($guid)."]".t("status")."[/url]"; + $plink = "[url=".System::baseUrl()."/display/".urlencode($guid)."]".t("status")."[/url]"; return sprintf($bodyverb, $ulink, $alink, $plink); } @@ -1673,7 +1690,7 @@ class Diaspora { */ private static function construct_like_object($importer, $parent_item) { $objtype = ACTIVITY_OBJ_NOTE; - $link = ''; + $link = ''; $parent_body = $parent_item["body"]; $xmldata = array("object" => array("type" => $objtype, @@ -1774,15 +1791,20 @@ class Diaspora { logger("Stored like ".$datarray["guid"]." with message id ".$message_id, LOGGER_DEBUG); } + // 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::select('item', array('origin'), array('id' => $parent_item["parent"]), array('limit' => 1)); + $origin = $toplevel["origin"]; + } else { + $origin = $parent_item["origin"]; + } + // If we are the origin of the parent we store the original data and notify our followers - if ($message_id && $parent_item["origin"]) { + if ($message_id && $origin) { // Formerly we stored the signed text, the signature and the author in different fields. // We now store the raw data so that we are more flexible. - q("INSERT INTO `sign` (`iid`,`signed_text`) VALUES (%d,'%s')", - intval($message_id), - dbesc(json_encode($data)) - ); + dba::insert('sign', array('iid' => $message_id, 'signed_text' => json_encode($data))); // notify others proc_run(PRIORITY_HIGH, "include/notifier.php", "comment-import", $message_id); @@ -1832,6 +1854,12 @@ class Diaspora { return false; } + $body = diaspora2bb($text); + + $body = self::replace_people_guid($body, $person["url"]); + + dba::lock('mail'); + $r = q("SELECT `id` FROM `mail` WHERE `guid` = '%s' AND `uid` = %d LIMIT 1", dbesc($guid), intval($importer["uid"]) @@ -1841,10 +1869,6 @@ class Diaspora { return false; } - $body = diaspora2bb($text); - - $body = self::replace_people_guid($body, $person["url"]); - q("INSERT INTO `mail` (`uid`, `guid`, `convid`, `from-name`,`from-photo`,`from-url`,`contact-id`,`title`,`body`,`seen`,`reply`,`uri`,`parent-uri`,`created`) VALUES ( %d, '%s', %d, '%s', '%s', '%s', %d, '%s', '%s', %d, %d, '%s','%s','%s')", intval($importer["uid"]), @@ -1863,11 +1887,9 @@ class Diaspora { dbesc($created_at) ); - q("UPDATE `conv` SET `updated` = '%s' WHERE `id` = %d", - dbesc(datetime_convert()), - intval($conversation["id"]) - ); + dba::unlock(); + dba::update('conv', array('updated' => datetime_convert()), array('id' => $conversation["id"])); return true; } @@ -2010,12 +2032,9 @@ class Diaspora { $a = get_app(); - if ($contact["rel"] == CONTACT_IS_FOLLOWER && in_array($importer["page-flags"], array(PAGE_FREELOVE))) { - q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d", - intval(CONTACT_IS_FRIEND), - intval($contact["id"]), - intval($importer["uid"]) - ); + if ($contact["rel"] == CONTACT_IS_SHARING) { + dba::update('contact', array('rel' => CONTACT_IS_FRIEND, 'writable' => true), + array('id' => $contact["id"], 'uid' => $importer["uid"])); } // send notification @@ -2124,8 +2143,8 @@ class Diaspora { // perhaps we were already sharing with this person. Now they're sharing with us. // That makes us friends. if ($contact) { - if ($following && $sharing) { - logger("Author ".$author." (Contact ".$contact["id"].") wants to have a bidirectional conection.", LOGGER_DEBUG); + if ($following) { + logger("Author ".$author." (Contact ".$contact["id"].") wants to follow us.", LOGGER_DEBUG); self::receive_request_make_friend($importer, $contact); // refetch the contact array @@ -2133,7 +2152,7 @@ class Diaspora { // If we are now friends, we are sending a share message. // Normally we needn't to do so, but the first message could have been vanished. - if (in_array($contact["rel"], array(CONTACT_IS_FRIEND, CONTACT_IS_FOLLOWER))) { + if (in_array($contact["rel"], array(CONTACT_IS_FRIEND))) { $u = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($importer["uid"])); if ($u) { logger("Sending share message to author ".$author." - Contact: ".$contact["id"]." - User: ".$importer["uid"], LOGGER_DEBUG); @@ -2141,9 +2160,10 @@ class Diaspora { } } return true; - } else { /// @todo Handle all possible variations of adding and retracting of permissions - logger("Author ".$author." (Contact ".$contact["id"].") wants to change the relationship: Following: ".$following." - sharing: ".$sharing. "(By now unsupported)", LOGGER_DEBUG); - return false; + } else { + logger("Author ".$author." doesn't want to follow us anymore.", LOGGER_DEBUG); + lose_follower($importer, $contact); + return true; } } @@ -2373,7 +2393,7 @@ class Diaspora { return false; } - $orig_url = App::get_baseurl()."/display/".$original_item["guid"]; + $orig_url = System::baseUrl()."/display/".$original_item["guid"]; $datarray = array(); @@ -2466,11 +2486,10 @@ class Diaspora { } // Currently we don't have a central deletion function that we could use in this case. The function "item_drop" doesn't work for that case - q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s', `body` = '' , `title` = '' WHERE `id` = %d", - dbesc(datetime_convert()), - dbesc(datetime_convert()), - intval($r[0]["id"]) - ); + dba::update('item', array('deleted' => true, 'title' => '', 'body' => '', + 'edited' => datetime_convert(), 'changed' => datetime_convert()), + array('id' => $r[0]["id"])); + delete_thread($r[0]["id"], $r[0]["parent-uri"]); logger("Deleted target ".$target_guid." (".$r[0]["id"].") from user ".$importer["uid"]." parent: ".$p[0]["id"], LOGGER_DEBUG); @@ -2664,7 +2683,7 @@ class Diaspora { $nick = $contact["nick"]; } - return $nick."@".substr(App::get_baseurl(), strpos(App::get_baseurl(),"://") + 3); + return $nick."@".substr(System::baseUrl(), strpos(System::baseUrl(),"://") + 3); } @@ -3522,7 +3541,14 @@ class Diaspora { $itemaddr = self::handle_from_contact($item["contact-id"], $item["gcontact-id"]); $msg_type = "retraction"; - $target_type = "Post"; + + if ($item['id'] == $item['parent']) { + $target_type = "Post"; + } elseif ($item["verb"] == ACTIVITY_LIKE) { + $target_type = "Like"; + } else { + $target_type = "Comment"; + } $message = array("author" => $itemaddr, "target_guid" => $item['guid'], @@ -3631,9 +3657,9 @@ class Diaspora { $first = ((strpos($profile['name'],' ') ? trim(substr($profile['name'],0,strpos($profile['name'],' '))) : $profile['name'])); $last = (($first === $profile['name']) ? '' : trim(substr($profile['name'], strlen($first)))); - $large = App::get_baseurl().'/photo/custom/300/'.$profile['uid'].'.jpg'; - $medium = App::get_baseurl().'/photo/custom/100/'.$profile['uid'].'.jpg'; - $small = App::get_baseurl().'/photo/custom/50/' .$profile['uid'].'.jpg'; + $large = System::baseUrl().'/photo/custom/300/'.$profile['uid'].'.jpg'; + $medium = System::baseUrl().'/photo/custom/100/'.$profile['uid'].'.jpg'; + $small = System::baseUrl().'/photo/custom/50/' .$profile['uid'].'.jpg'; $searchable = (($profile['publish'] && $profile['net-publish']) ? 'true' : 'false'); if ($searchable === 'true') { @@ -3720,10 +3746,7 @@ class Diaspora { * Now store the signature more flexible to dynamically support new fields. * This will break Diaspora compatibility with Friendica versions prior to 3.5. */ - q("INSERT INTO `sign` (`iid`,`signed_text`) VALUES (%d,'%s')", - intval($message_id), - dbesc(json_encode($message)) - ); + dba::insert('sign', array('iid' => $post_id, 'signed_text' => json_encode($message))); logger('Stored diaspora like signature'); return true; @@ -3755,10 +3778,7 @@ class Diaspora { * Now store the signature more flexible to dynamically support new fields. * This will break Diaspora compatibility with Friendica versions prior to 3.5. */ - q("INSERT INTO `sign` (`iid`, `signed_text`) VALUES (%d, '%s')", - intval($message_id), - dbesc(json_encode($message)) - ); + dba::insert('sign', array('iid' => $message_id, 'signed_text' => json_encode($message))); logger('Stored diaspora comment signature'); return true;