]> git.mxchange.org Git - friendica.git/blobdiff - include/diaspora.php
Merge pull request #1518 from tugelbend/develop
[friendica.git] / include / diaspora.php
index 3f9d9b1197b5a3b2f7d8f0e7011f6a63e8ee4b34..6b42e3c555dbdc6f2b51ec217ee3b15f923bcd4b 100755 (executable)
@@ -6,6 +6,8 @@ require_once('include/bb2diaspora.php');
 require_once('include/contact_selectors.php');
 require_once('include/queue_fn.php');
 require_once('include/lock.php');
+require_once('include/threads.php');
+require_once('mod/share.php');
 
 function diaspora_dispatch_public($msg) {
 
@@ -589,7 +591,7 @@ function diaspora_request($importer,$xml) {
                        intval($importer['uid'])
                );
 
-               if((count($r)) && (! $r[0]['hide-friends']) && (! $contact['hidden'])) {
+               if((count($r)) && (!$r[0]['hide-friends']) && (!$contact['hidden']) && intval(get_pconfig($importer['uid'],'system','post_newfriend'))) {
                        require_once('include/items.php');
 
                        $self = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
@@ -777,6 +779,18 @@ function diaspora_post_allow($importer,$contact) {
        return false;
 }
 
+function diaspora_plink($addr, $guid) {
+       $r = q("SELECT `url`, `nick` FROM `fcontact` WHERE `addr`='%s' LIMIT 1", $addr);
+
+       // Fallback
+       if (!$r)
+               return 'https://'.substr($addr,strpos($addr,'@')+1).'/posts/'.$guid;
+
+       if (strstr($r[0]["url"], "/channel/"))
+               return $r[0]["url"]."/?f=&mid=".$guid;
+
+       return 'https://'.substr($addr,strpos($addr,'@')+1).'/posts/'.$guid;
+}
 
 function diaspora_post($importer,$xml,$msg) {
 
@@ -833,31 +847,6 @@ function diaspora_post($importer,$xml,$msg) {
 
        $str_tags = '';
 
-       $tags = get_tags($body);
-
-       if(count($tags)) {
-               foreach($tags as $tag) {
-                       if(strpos($tag,'#') === 0) {
-                               if(strpos($tag,'[url='))
-                                       continue;
-
-                               // don't link tags that are already embedded in links
-
-                               if(preg_match('/\[(.*?)' . preg_quote($tag,'/') . '(.*?)\]/',$body))
-                                       continue;
-                               if(preg_match('/\[(.*?)\]\((.*?)' . preg_quote($tag,'/') . '(.*?)\)/',$body))
-                                       continue;
-
-                               $basetag = str_replace('_',' ',substr($tag,1));
-                               $body = str_replace($tag,'#[url=' . $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/url]',$body);
-                               if(strlen($str_tags))
-                                       $str_tags .= ',';
-                               $str_tags .= '#[url=' . $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
-                               continue;
-                       }
-               }
-       }
-
        $cnt = preg_match_all('/@\[url=(.*?)\[\/url\]/ism',$body,$matches,PREG_SET_ORDER);
        if($cnt) {
                foreach($matches as $mtch) {
@@ -867,7 +856,7 @@ function diaspora_post($importer,$xml,$msg) {
                }
        }
 
-       $plink = 'https://'.substr($diaspora_handle,strpos($diaspora_handle,'@')+1).'/posts/'.$guid;
+       $plink = diaspora_plink($diaspora_handle, $guid);
 
        $datarray['uid'] = $importer['uid'];
        $datarray['contact-id'] = $contact['id'];
@@ -895,15 +884,38 @@ function diaspora_post($importer,$xml,$msg) {
 
        $datarray['visible'] = ((strlen($body)) ? 1 : 0);
 
+       DiasporaFetchGuid($datarray);
        $message_id = item_store($datarray);
 
        return;
 
 }
 
+function DiasporaFetchGuid($item) {
+       preg_replace_callback("&\[url=/posts/([^\[\]]*)\](.*)\[\/url\]&Usi",
+               function ($match) use ($item){
+                       return(DiasporaFetchGuidSub($match, $item));
+               },$item["body"]);
+}
+
+function DiasporaFetchGuidSub($match, $item) {
+       $a = get_app();
+
+       $author = parse_url($item["author-link"]);
+       $authorserver = $author["scheme"]."://".$author["host"];
+
+       $owner = parse_url($item["owner-link"]);
+       $ownerserver = $owner["scheme"]."://".$owner["host"];
+
+       if (!diaspora_store_by_guid($match[1], $authorserver))
+               diaspora_store_by_guid($match[1], $ownerserver);
+}
+
 function diaspora_store_by_guid($guid, $server) {
        require_once("include/Contact.php");
 
+       logger("fetching item ".$guid." from ".$server, LOGGER_DEBUG);
+
        $item = diaspora_fetch_message($guid, $server);
 
        if (!$item)
@@ -923,12 +935,11 @@ function diaspora_store_by_guid($guid, $server) {
                dbesc($guid)
        );
        if(count($r))
-                return true;
+               return $r[0]["id"];
 
        $person = find_diaspora_person_by_handle($author);
 
         $datarray = array();
-
        $datarray['uid'] = 0;
        $datarray['contact-id'] = get_contact($person['url'], 0);
        $datarray['wall'] = 0;
@@ -938,7 +949,7 @@ function diaspora_store_by_guid($guid, $server) {
        $datarray['changed'] = $datarray['created'] = $datarray['edited'] = datetime_convert('UTC','UTC',$created);
        $datarray['private'] = $private;
        $datarray['parent'] = 0;
-       $datarray['plink'] = 'https://'.substr($author,strpos($author,'@')+1).'/posts/'.$guid;
+       $datarray['plink'] = diaspora_plink($author, $guid);
        $datarray['author-name'] = $person['name'];
        $datarray['author-link'] = $person['url'];
        $datarray['author-avatar'] = ((x($person,'thumb')) ? $person['thumb'] : $person['photo']);
@@ -950,8 +961,12 @@ function diaspora_store_by_guid($guid, $server) {
        $datarray['app']  = $app;
        $datarray['visible'] = ((strlen($body)) ? 1 : 0);
 
+       DiasporaFetchGuid($datarray);
        $message_id = item_store($datarray);
 
+       // To-Do:
+       // Looking if there is some subscribe mechanism in Diaspora to get all comments for this post
+
        return $message_id;
 }
 
@@ -1028,34 +1043,8 @@ function diaspora_fetch_message($guid, $server, $level = 0) {
                return false;
 
        $item["tag"] = '';
-
-       $tags = get_tags($body);
-
-       if(count($tags)) {
-               foreach($tags as $tag) {
-                       if(strpos($tag,'#') === 0) {
-                               if(strpos($tag,'[url='))
-                                       continue;
-
-                               // don't link tags that are already embedded in links
-
-                               if(preg_match('/\[(.*?)' . preg_quote($tag,'/') . '(.*?)\]/',$body))
-                                       continue;
-                               if(preg_match('/\[(.*?)\]\((.*?)' . preg_quote($tag,'/') . '(.*?)\)/',$body))
-                                       continue;
-
-
-                               $basetag = str_replace('_',' ',substr($tag,1));
-                               $body = str_replace($tag,'#[url=' . $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/url]',$body);
-                               if(strlen($item["tag"]))
-                                       $item["tag"] .= ',';
-                               $item["tag"] .= '#[url=' . $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
-                               continue;
-                       }
-               }
-       }
-
        $item["body"] = $body;
+
        return $item;
 }
 
@@ -1173,7 +1162,7 @@ function diaspora_reshare($importer,$xml,$msg) {
 
        $datarray = array();
 
-       $plink = 'https://'.substr($diaspora_handle,strpos($diaspora_handle,'@')+1).'/posts/'.$guid;
+       $plink = diaspora_plink($diaspora_handle, $guid);
 
        $datarray['uid'] = $importer['uid'];
        $datarray['contact-id'] = $contact['id'];
@@ -1189,10 +1178,8 @@ function diaspora_reshare($importer,$xml,$msg) {
        $datarray['owner-link'] = $contact['url'];
        $datarray['owner-avatar'] = ((x($contact,'thumb')) ? $contact['thumb'] : $contact['photo']);
        if (!intval(get_config('system','wall-to-wall_share'))) {
-               $prefix = "[share author='".str_replace(array("'", "[", "]"), array("'", "[", "]"),$person['name']).
-                               "' profile='".$person['url'].
-                               "' avatar='".((x($person,'thumb')) ? $person['thumb'] : $person['photo']).
-                               "' link='".str_replace(array("'", "[", "]"), array("'", "[", "]"),$orig_url)."']";
+               $prefix = share_header($person['name'], $person['url'], ((x($person,'thumb')) ? $person['thumb'] : $person['photo']), $orig_guid, $orig_created, $orig_url);
+
                $datarray['author-name'] = $contact['name'];
                $datarray['author-link'] = $contact['url'];
                $datarray['author-avatar'] = $contact['thumb'];
@@ -1221,8 +1208,8 @@ function diaspora_reshare($importer,$xml,$msg) {
                $datarray2['contact-id'] = get_contact($person['url'], 0);
                $datarray2['guid'] = $orig_guid;
                $datarray2['uri'] = $datarray2['parent-uri'] = $orig_author.':'.$orig_guid;
-               $datarray2['changed'] = $datarray2['created'] = $datarray2['edited'] = datetime_convert('UTC','UTC',$orig_created);
-               $datarray2['plink'] = 'https://'.substr($orig_author,strpos($orig_author,'@')+1).'/posts/'.$orig_guid;
+               $datarray2['changed'] = $datarray2['created'] = $datarray2['edited'] = $datarray2['commented'] = $datarray2['received'] = datetime_convert('UTC','UTC',$orig_created);
+               $datarray2['plink'] = diaspora_plink($orig_author, $orig_guid);
 
                $datarray2['author-name'] = $person['name'];
                $datarray2['author-link'] = $person['url'];
@@ -1232,11 +1219,13 @@ function diaspora_reshare($importer,$xml,$msg) {
                $datarray2['owner-avatar'] = $datarray2['author-avatar'];
                $datarray2['body'] = $body;
 
+               DiasporaFetchGuid($datarray2);
                $message_id = item_store($datarray2);
 
                logger("Store original item ".$orig_guid." under message id ".$message_id);
        }
 
+       DiasporaFetchGuid($datarray);
        $message_id = item_store($datarray);
 
        return;
@@ -1304,7 +1293,7 @@ function diaspora_asphoto($importer,$xml,$msg) {
                return;
        }
 
-       $plink = 'https://'.substr($diaspora_handle,strpos($diaspora_handle,'@')+1).'/posts/'.$guid;
+       $plink = diaspora_plink($diaspora_handle, $guid);
 
        $datarray = array();
 
@@ -1329,6 +1318,7 @@ function diaspora_asphoto($importer,$xml,$msg) {
 
        $datarray['app']  = 'Diaspora/Cubbi.es';
 
+       DiasporaFetchGuid($datarray);
        $message_id = item_store($datarray);
 
        //if($message_id) {
@@ -1452,34 +1442,6 @@ function diaspora_comment($importer,$xml,$msg) {
 
        $datarray = array();
 
-       $str_tags = '';
-
-       $tags = get_tags($body);
-
-       if(count($tags)) {
-               foreach($tags as $tag) {
-                       if(strpos($tag,'#') === 0) {
-                               if(strpos($tag,'[url='))
-                                       continue;
-
-                               // don't link tags that are already embedded in links
-
-                               if(preg_match('/\[(.*?)' . preg_quote($tag,'/') . '(.*?)\]/',$body))
-                                       continue;
-                               if(preg_match('/\[(.*?)\]\((.*?)' . preg_quote($tag,'/') . '(.*?)\)/',$body))
-                                       continue;
-
-
-                               $basetag = str_replace('_',' ',substr($tag,1));
-                               $body = str_replace($tag,'#[url=' . $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/url]',$body);
-                               if(strlen($str_tags))
-                                       $str_tags .= ',';
-                               $str_tags .= '#[url=' . $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
-                               continue;
-                       }
-               }
-       }
-
        $datarray['uid'] = $importer['uid'];
        $datarray['contact-id'] = $contact['id'];
        $datarray['type'] = 'remote-comment';
@@ -1503,12 +1465,12 @@ function diaspora_comment($importer,$xml,$msg) {
        $datarray['author-link'] = $person['url'];
        $datarray['author-avatar'] = ((x($person,'thumb')) ? $person['thumb'] : $person['photo']);
        $datarray['body'] = $body;
-       $datarray['tag'] = $str_tags;
 
        // We can't be certain what the original app is if the message is relayed.
        if(($parent_item['origin']) && (! $parent_author_signature))
                $datarray['app']  = 'Diaspora';
 
+       DiasporaFetchGuid($datarray);
        $message_id = item_store($datarray);
 
        //if($message_id) {
@@ -1903,11 +1865,12 @@ function diaspora_photo($importer,$xml,$msg,$attempt=1) {
                                           array($remote_photo_name, 'scaled_full_' . $remote_photo_name));
 
        if(strpos($parent_item['body'],$link_text) === false) {
-               $r = q("update item set `body` = '%s', `visible` = 1 where `id` = %d and `uid` = %d",
+               $r = q("UPDATE `item` SET `body` = '%s', `visible` = 1 WHERE `id` = %d AND `uid` = %d",
                        dbesc($link_text . $parent_item['body']),
                        intval($parent_item['id']),
                        intval($parent_item['uid'])
                );
+               update_thread($parent_item['id']);
        }
 
        return;
@@ -1982,7 +1945,7 @@ function diaspora_like($importer,$xml,$msg) {
        if($positive === 'false') {
                logger('diaspora_like: received a like with positive set to "false"');
                logger('diaspora_like: unlike received with no corresponding like...ignoring');
-               return; 
+               return;
        }
 
 
@@ -1998,26 +1961,28 @@ function diaspora_like($importer,$xml,$msg) {
             who sent the salmon
        */
 
-       $signed_data = $guid . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $diaspora_handle;
+       // Diaspora has changed the way they are signing the likes.
+       // Just to make sure that we don't miss any likes we will check the old and the current way.
+       $old_signed_data = $guid . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $diaspora_handle;
+
+       $signed_data = $positive . ';' . $guid . ';' . $target_type . ';' . $parent_guid . ';' . $diaspora_handle;
+
        $key = $msg['key'];
 
-       if($parent_author_signature) {
+       if ($parent_author_signature) {
                // If a parent_author_signature exists, then we've received the like
                // relayed from the top-level post owner. There's no need to check the
                // author_signature if the parent_author_signature is valid
 
                $parent_author_signature = base64_decode($parent_author_signature);
 
-               if(! rsa_verify($signed_data,$parent_author_signature,$key,'sha256')) {
-                       if (intval(get_config('system','ignore_diaspora_like_signature')))
-                               logger('diaspora_like: top-level owner verification failed. Proceeding anyway.');
-                       else {
-                               logger('diaspora_like: top-level owner verification failed.');
-                               return;
-                       }
+               if (!rsa_verify($signed_data,$parent_author_signature,$key,'sha256') AND
+                       !rsa_verify($old_signed_data,$parent_author_signature,$key,'sha256')) {
+
+                       logger('diaspora_like: top-level owner verification failed.');
+                       return;
                }
-       }
-       else {
+       } else {
                // If there's no parent_author_signature, then we've received the like
                // from the like creator. In that case, the person is "like"ing
                // our post, so he/she must be a contact of ours and his/her public key
@@ -2025,13 +1990,11 @@ function diaspora_like($importer,$xml,$msg) {
 
                $author_signature = base64_decode($author_signature);
 
-               if(! rsa_verify($signed_data,$author_signature,$key,'sha256')) {
-                       if (intval(get_config('system','ignore_diaspora_like_signature')))
-                               logger('diaspora_like: like creator verification failed. Proceeding anyway');
-                       else {
-                               logger('diaspora_like: like creator verification failed.');
-                               return;
-                       }
+               if (!rsa_verify($signed_data,$author_signature,$key,'sha256') AND
+                       !rsa_verify($old_signed_data,$author_signature,$key,'sha256')) {
+
+                       logger('diaspora_like: like creator verification failed.');
+                       return;
                }
        }
 
@@ -2368,7 +2331,7 @@ function diaspora_profile($importer,$xml,$msg) {
        if (unxmlify($xml->searchable) == "true") {
                require_once('include/socgraph.php');
                poco_check($contact['url'], $name, NETWORK_DIASPORA, $images[0], $about, $location, $gender, $keywords, "",
-                       datetime_convert(), $contact['id'], $importer['uid']);
+                       datetime_convert(), 2, $contact['id'], $importer['uid']);
        }
 
        $profileurl = "";
@@ -2558,6 +2521,26 @@ function diaspora_is_reshare($body) {
         if ($body == $attributes)
                 return(false);
 
+        $guid = "";
+        preg_match("/guid='(.*?)'/ism", $attributes, $matches);
+        if ($matches[1] != "")
+                $guid = $matches[1];
+
+        preg_match('/guid="(.*?)"/ism', $attributes, $matches);
+        if ($matches[1] != "")
+                $guid = $matches[1];
+
+       if ($guid != "") {
+               $r = q("SELECT `contact-id` FROM `item` WHERE `guid` = '%s' AND `network` IN ('%s', '%s') LIMIT 1",
+                       dbesc($guid), NETWORK_DFRN, NETWORK_DIASPORA);
+               if ($r) {
+                       $ret= array();
+                       $ret["root_handle"] = diaspora_handle_from_contact($r[0]["contact-id"]);
+                       $ret["root_guid"] = $guid;
+                       return($ret);
+               }
+       }
+
         $profile = "";
         preg_match("/profile='(.*?)'/ism", $attributes, $matches);
         if ($matches[1] != "")