]> git.mxchange.org Git - friendica.git/blobdiff - include/diaspora.php
Merge pull request #1703 from rabuzarus/readable_bytes
[friendica.git] / include / diaspora.php
index a0d1fcd751ea114895e87f39d39e01f8c5ed310c..b70cffdc39efebd8cf0073887301a8891653a387 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) {
 
@@ -601,7 +603,7 @@ function diaspora_request($importer,$xml) {
                        if(count($self) && $contact['rel'] == CONTACT_IS_FOLLOWER) {
 
                                $arr = array();
-                               $arr['uri'] = $arr['parent-uri'] = item_new_uri($a->get_hostname(), $importer['uid']); 
+                               $arr['uri'] = $arr['parent-uri'] = item_new_uri($a->get_hostname(), $importer['uid']);
                                $arr['uid'] = $importer['uid'];
                                $arr['contact-id'] = $self[0]['id'];
                                $arr['wall'] = 1;
@@ -722,16 +724,17 @@ function diaspora_request($importer,$xml) {
                else
                        $new_relation = CONTACT_IS_FOLLOWER;
 
-               $r = q("UPDATE `contact` SET 
-                       `photo` = '%s', 
+               $r = q("UPDATE `contact` SET
+                       `photo` = '%s',
                        `thumb` = '%s',
-                       `micro` = '%s', 
-                       `rel` = %d, 
-                       `name-date` = '%s', 
-                       `uri-date` = '%s', 
-                       `avatar-date` = '%s', 
-                       `blocked` = 0, 
-                       `pending` = 0
+                       `micro` = '%s',
+                       `rel` = %d,
+                       `name-date` = '%s',
+                       `uri-date` = '%s',
+                       `avatar-date` = '%s',
+                       `blocked` = 0,
+                       `pending` = 0,
+                       `writable` = 1
                        WHERE `id` = %d
                        ",
                        dbesc($photos[0]),
@@ -777,6 +780,31 @@ function diaspora_post_allow($importer,$contact) {
        return false;
 }
 
+function diaspora_is_redmatrix($url) {
+       return(strstr($url, "/channel/"));
+}
+
+function diaspora_plink($addr, $guid) {
+       $r = q("SELECT `url`, `nick`, `network` FROM `fcontact` WHERE `addr`='%s' LIMIT 1", $addr);
+
+       // Fallback
+       if (!$r)
+               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)
+               $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 (diaspora_is_redmatrix($r[0]["url"]))
+               return $r[0]["url"]."/?f=&mid=".$guid;
+
+       return 'https://'.substr($addr,strpos($addr,'@')+1).'/posts/'.$guid;
+}
 
 function diaspora_post($importer,$xml,$msg) {
 
@@ -809,55 +837,26 @@ function diaspora_post($importer,$xml,$msg) {
                return;
        }
 
-       // allocate a guid on our system - we aren't fixing any collisions.
-       // we're ignoring them
-
-       $g = q("select * from guid where guid = '%s' limit 1",
-               dbesc($guid)
-       );
-       if(! count($g)) {
-               q("insert into guid ( guid ) values ( '%s' )",
-                       dbesc($guid)
-               );
-       }
-
        $created = unxmlify($xml->created_at);
        $private = ((unxmlify($xml->public) == 'false') ? 1 : 0);
 
        $body = diaspora2bb($xml->raw_message);
 
-       // Add OEmbed and other information to the body
-       $body = add_page_info_to_body($body, false, true);
-
        $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
+       $datarray["object"] = json_encode($xml);
 
-                               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;
-                       }
-               }
+       if($xml->photo->remote_photo_path AND $xml->photo->remote_photo_name)
+               $datarray["object-type"] = ACTIVITY_OBJ_PHOTO;
+       else {
+               $datarray['object-type'] = ACTIVITY_OBJ_NOTE;
+               // Add OEmbed and other information to the body
+               if (!diaspora_is_redmatrix($contact['url']))
+                       $body = add_page_info_to_body($body, false, true);
        }
 
+       $str_tags = '';
+
        $cnt = preg_match_all('/@\[url=(.*?)\[\/url\]/ism',$body,$matches,PREG_SET_ORDER);
        if($cnt) {
                foreach($matches as $mtch) {
@@ -867,7 +866,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'];
@@ -889,7 +888,10 @@ function diaspora_post($importer,$xml,$msg) {
        $datarray['author-avatar'] = $contact['thumb'];
        $datarray['body'] = $body;
        $datarray['tag'] = $str_tags;
-       $datarray['app']  = 'Diaspora';
+       if ($xml->provider_display_name)
+                $datarray["app"] = unxmlify($xml->provider_display_name);
+       else
+               $datarray['app']  = 'Diaspora';
 
        // if empty content it might be a photo that hasn't arrived yet. If a photo arrives, we'll make it visible.
 
@@ -912,26 +914,25 @@ function DiasporaFetchGuid($item) {
 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);
+       if (!diaspora_store_by_guid($match[1], $item["author-link"]))
+               diaspora_store_by_guid($match[1], $item["owner-link"]);
 }
 
-function diaspora_store_by_guid($guid, $server) {
+function diaspora_store_by_guid($guid, $server, $uid = 0) {
        require_once("include/Contact.php");
 
-       logger("fetching item ".$guid." from ".$server, LOGGER_DEBUG);
+        $serverparts = parse_url($server);
+        $server = $serverparts["scheme"]."://".$serverparts["host"];
+
+       logger("Trying to fetch item ".$guid." from ".$server, LOGGER_DEBUG);
 
        $item = diaspora_fetch_message($guid, $server);
 
        if (!$item)
                return false;
 
+       logger("Successfully fetched item ".$guid." from ".$server, LOGGER_DEBUG);
+
        $body = $item["body"];
        $str_tags = $item["tag"];
        $app = $item["app"];
@@ -939,9 +940,12 @@ function diaspora_store_by_guid($guid, $server) {
        $author = $item["author"];
        $guid = $item["guid"];
        $private = $item["private"];
+       $object = $item["object"];
+       $objecttype = $item["object-type"];
 
        $message_id = $author.':'.$guid;
-       $r = q("SELECT `id` FROM `item` WHERE `uid` = 0 AND `uri` = '%s' AND `guid` = '%s' LIMIT 1",
+       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1",
+               intval($uid),
                dbesc($message_id),
                dbesc($guid)
        );
@@ -951,8 +955,8 @@ function diaspora_store_by_guid($guid, $server) {
        $person = find_diaspora_person_by_handle($author);
 
         $datarray = array();
-       $datarray['uid'] = 0;
-       $datarray['contact-id'] = get_contact($person['url'], 0);
+       $datarray['uid'] = $uid;
+       $datarray['contact-id'] = get_contact($person['url'], $uid);
        $datarray['wall'] = 0;
        $datarray['network']  = NETWORK_DIASPORA;
        $datarray['guid'] = $guid;
@@ -960,7 +964,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']);
@@ -971,6 +975,11 @@ function diaspora_store_by_guid($guid, $server) {
        $datarray['tag'] = $str_tags;
        $datarray['app']  = $app;
        $datarray['visible'] = ((strlen($body)) ? 1 : 0);
+       $datarray['object'] = $object;
+       $datarray['object-type'] = $objecttype;
+
+       if ($datarray['contact-id'] == 0)
+               return false;
 
        DiasporaFetchGuid($datarray);
        $message_id = item_store($datarray);
@@ -1015,11 +1024,14 @@ function diaspora_fetch_message($guid, $server, $level = 0) {
                $item["guid"] = unxmlify($source_xml->post->status_message->guid);
 
        $item["private"] = (unxmlify($source_xml->post->status_message->public) == 'false');
+       $item["object"] = json_encode($source_xml->post);
 
        if(strlen($source_xml->post->asphoto->objectId) && ($source_xml->post->asphoto->objectId != 0) && ($source_xml->post->asphoto->image_url)) {
+               $item["object-type"] = ACTIVITY_OBJ_PHOTO;
                $body = '[url=' . notags(unxmlify($source_xml->post->asphoto->image_url)) . '][img]' . notags(unxmlify($source_xml->post->asphoto->objectId)) . '[/img][/url]' . "\n";
                $body = scale_external_images($body,false);
        } elseif($source_xml->post->asphoto->image_url) {
+               $item["object-type"] = ACTIVITY_OBJ_PHOTO;
                $body = '[img]' . notags(unxmlify($source_xml->post->asphoto->image_url)) . '[/img]' . "\n";
                $body = scale_external_images($body);
        } elseif($source_xml->post->status_message) {
@@ -1029,59 +1041,40 @@ function diaspora_fetch_message($guid, $server, $level = 0) {
                if($source_xml->post->status_message->photo->remote_photo_path AND
                        $source_xml->post->status_message->photo->remote_photo_name) {
 
+                       $item["object-type"] = ACTIVITY_OBJ_PHOTO;
+
                        $remote_photo_path = notags(unxmlify($source_xml->post->status_message->photo->remote_photo_path));
                        $remote_photo_name = notags(unxmlify($source_xml->post->status_message->photo->remote_photo_name));
 
                        $body = '[img]'.$remote_photo_path.$remote_photo_name.'[/img]'."\n".$body;
 
                        logger('embedded picture link found: '.$body, LOGGER_DEBUG);
-               }
+               } else
+                       $item["object-type"] = ACTIVITY_OBJ_NOTE;
 
                $body = scale_external_images($body);
 
                // Add OEmbed and other information to the body
-               $body = add_page_info_to_body($body, false, true);
+               // To-Do: It could be a repeated redmatrix item
+               // Then we shouldn't add further data to it
+               if ($item["object-type"] == ACTIVITY_OBJ_NOTE)
+                       $body = add_page_info_to_body($body, false, true);
+
        } elseif($source_xml->post->reshare) {
                // Reshare of a reshare
                return diaspora_fetch_message($source_xml->post->reshare->root_guid, $server, ++$level);
        } else {
                // Maybe it is a reshare of a photo that will be delivered at a later time (testing)
                logger('no content found: '.print_r($source_xml,true));
-               $body = "";
+               return false;
        }
 
-       if ($body == "")
+       if (trim($body) == "")
                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;
 }
 
@@ -1121,24 +1114,33 @@ function diaspora_reshare($importer,$xml,$msg) {
 
        $orig_author = notags(unxmlify($xml->root_diaspora_id));
        $orig_guid = notags(unxmlify($xml->root_guid));
+       $orig_url = $a->get_baseurl()."/display/".$orig_guid;
 
        $create_original_post = false;
 
        // Do we already have this item?
-       $r = q("SELECT `body`, `tag`, `app`, `author-link`, `plink` FROM `item` WHERE `guid` = '%s' AND `visible` AND NOT `deleted` AND `body` != '' LIMIT 1",
+       $r = q("SELECT `body`, `tag`, `app`, `created`, `plink`, `object`, `object-type`, `uri` FROM `item` WHERE `guid` = '%s' AND `visible` AND NOT `deleted` AND `body` != '' LIMIT 1",
                dbesc($orig_guid),
                dbesc(NETWORK_DIASPORA)
        );
        if(count($r)) {
-               logger('reshared message '.orig_guid." reshared by ".$guid.' already exists on system: '.$orig_url);
+               logger('reshared message '.$orig_guid." reshared by ".$guid.' already exists on system.');
 
                // Maybe it is already a reshared item?
                // Then refetch the content, since there can be many side effects with reshared posts from other networks or reshares from reshares
                require_once('include/api.php');
                if (api_share_as_retweet($r[0]))
                        $r = array();
-               else
-                       $orig_url = $a->get_baseurl().'/display/'.$orig_guid;
+               else {
+                       $body = $r[0]["body"];
+                       $str_tags = $r[0]["tag"];
+                       $app = $r[0]["app"];
+                       $orig_created = $r[0]["created"];
+                       $orig_plink = $r[0]["plink"];
+                       $orig_uri = $r[0]["uri"];
+                       $object = $r[0]["object"];
+                       $objecttype = $r[0]["object-type"];
+               }
        }
 
        if (!count($r)) {
@@ -1146,8 +1148,6 @@ function diaspora_reshare($importer,$xml,$msg) {
                $str_tags = "";
                $app = "";
 
-               $orig_url = 'https://'.substr($orig_author,strpos($orig_author,'@')+1).'/posts/'.$orig_guid;
-
                $server = 'https://'.substr($orig_author,strpos($orig_author,'@')+1);
                logger('1st try: reshared message '.$orig_guid." reshared by ".$guid.' will be fetched from original server: '.$server);
                $item = diaspora_fetch_message($orig_guid, $server);
@@ -1175,32 +1175,23 @@ function diaspora_reshare($importer,$xml,$msg) {
                        $orig_created = $item["created"];
                        $orig_author = $item["author"];
                        $orig_guid = $item["guid"];
+                       $orig_plink = diaspora_plink($orig_author, $orig_guid);
+                       $orig_uri = $orig_author.':'.$orig_guid;
                        $create_original_post = ($body != "");
-                       $orig_url = $a->get_baseurl()."/display/".$orig_guid;
+                       $object = $item["object"];
+                       $objecttype = $item["object-type"];
                }
        }
 
-       $person = find_diaspora_person_by_handle($orig_author);
+       $plink = diaspora_plink($diaspora_handle, $guid);
 
-       // allocate a guid on our system - we aren't fixing any collisions.
-       // we're ignoring them
-
-       $g = q("select * from guid where guid = '%s' limit 1",
-               dbesc($guid)
-       );
-       if(! count($g)) {
-               q("insert into guid ( guid ) values ( '%s' )",
-                       dbesc($guid)
-               );
-       }
+       $person = find_diaspora_person_by_handle($orig_author);
 
        $created = unxmlify($xml->created_at);
        $private = ((unxmlify($xml->public) == 'false') ? 1 : 0);
 
        $datarray = array();
 
-       $plink = 'https://'.substr($diaspora_handle,strpos($diaspora_handle,'@')+1).'/posts/'.$guid;
-
        $datarray['uid'] = $importer['uid'];
        $datarray['contact-id'] = $contact['id'];
        $datarray['wall'] = 0;
@@ -1215,10 +1206,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'];
@@ -1231,6 +1220,9 @@ function diaspora_reshare($importer,$xml,$msg) {
                $datarray['body'] = $body;
        }
 
+       $datarray["object"] = json_encode($xml);
+       $datarray['object-type'] = $objecttype;
+
        $datarray['tag'] = $str_tags;
        $datarray['app']  = $app;
 
@@ -1246,9 +1238,10 @@ function diaspora_reshare($importer,$xml,$msg) {
                $datarray2['uid'] = 0;
                $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['uri'] = $datarray2['parent-uri'] = $orig_uri;
+               $datarray2['changed'] = $datarray2['created'] = $datarray2['edited'] = $datarray2['commented'] = $datarray2['received'] = datetime_convert('UTC','UTC',$orig_created);
+               $datarray2['parent'] = 0;
+               $datarray2['plink'] = $orig_plink;
 
                $datarray2['author-name'] = $person['name'];
                $datarray2['author-link'] = $person['url'];
@@ -1257,6 +1250,7 @@ function diaspora_reshare($importer,$xml,$msg) {
                $datarray2['owner-link'] = $datarray2['author-link'];
                $datarray2['owner-avatar'] = $datarray2['author-avatar'];
                $datarray2['body'] = $body;
+               $datarray2["object"] = $object;
 
                DiasporaFetchGuid($datarray2);
                $message_id = item_store($datarray2);
@@ -1304,18 +1298,6 @@ function diaspora_asphoto($importer,$xml,$msg) {
                return;
        }
 
-       // allocate a guid on our system - we aren't fixing any collisions.
-       // we're ignoring them
-
-       $g = q("select * from guid where guid = '%s' limit 1",
-               dbesc($guid)
-       );
-       if(! count($g)) {
-               q("insert into guid ( guid ) values ( '%s' )",
-                       dbesc($guid)
-               );
-       }
-
        $created = unxmlify($xml->created_at);
        $private = ((unxmlify($xml->public) == 'false') ? 1 : 0);
 
@@ -1332,7 +1314,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();
 
@@ -1354,6 +1336,8 @@ function diaspora_asphoto($importer,$xml,$msg) {
        $datarray['author-link'] = $contact['url'];
        $datarray['author-avatar'] = $contact['thumb'];
        $datarray['body'] = $body;
+       $datarray["object"] = json_encode($xml);
+       $datarray['object-type'] = ACTIVITY_OBJ_PHOTO;
 
        $datarray['app']  = 'Diaspora/Cubbi.es';
 
@@ -1412,6 +1396,25 @@ function diaspora_comment($importer,$xml,$msg) {
                intval($importer['uid']),
                dbesc($parent_guid)
        );
+
+       if(!count($r)) {
+               $result = diaspora_store_by_guid($parent_guid, $contact['url'], $importer['uid']);
+
+               if (!$result) {
+                       $person = find_diaspora_person_by_handle($diaspora_handle);
+                       $result = diaspora_store_by_guid($parent_guid, $person['url'], $importer['uid']);
+               }
+
+               if ($result) {
+                       logger("Fetched missing item ".$parent_guid." - result: ".$result, LOGGER_DEBUG);
+
+                       $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
+                               intval($importer['uid']),
+                               dbesc($parent_guid)
+                       );
+               }
+       }
+
        if(! count($r)) {
                logger('diaspora_comment: parent item not found: parent: ' . $parent_guid . ' item: ' . $guid);
                return;
@@ -1481,34 +1484,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';
@@ -1532,7 +1507,8 @@ 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;
+       $datarray["object"] = json_encode($xml);
+       $datarray["object-type"] = ACTIVITY_OBJ_COMMENT;
 
        // We can't be certain what the original app is if the message is relayed.
        if(($parent_item['origin']) && (! $parent_author_signature))
@@ -1541,6 +1517,8 @@ function diaspora_comment($importer,$xml,$msg) {
        DiasporaFetchGuid($datarray);
        $message_id = item_store($datarray);
 
+       $datarray['id'] = $message_id;
+
        //if($message_id) {
                //q("update item set plink = '%s' where id = %d",
                //      //dbesc($a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $message_id),
@@ -1744,7 +1722,7 @@ function diaspora_conversation($importer,$xml,$msg) {
                        dbesc($person['name']),
                        dbesc($person['photo']),
                        dbesc($person['url']),
-                       intval($contact['id']),  
+                       intval($contact['id']),
                        dbesc($subject),
                        dbesc($body),
                        0,
@@ -1766,7 +1744,7 @@ function diaspora_conversation($importer,$xml,$msg) {
                        'language' => $importer['language'],
                        'to_name' => $importer['username'],
                        'to_email' => $importer['email'],
-                       'uid' =>$importer['importer_uid'],
+                       'uid' =>$importer['uid'],
                        'item' => array('subject' => $subject, 'body' => $body),
                        'source_name' => $person['name'],
                        'source_link' => $person['url'],
@@ -1857,7 +1835,7 @@ function diaspora_message($importer,$xml,$msg) {
                dbesc($person['name']),
                dbesc($person['photo']),
                dbesc($person['url']),
-               intval($contact['id']),  
+               intval($contact['id']),
                dbesc($conversation['subject']),
                dbesc($body),
                0,
@@ -1913,7 +1891,27 @@ function diaspora_photo($importer,$xml,$msg,$attempt=1) {
                intval($importer['uid']),
                dbesc($status_message_guid)
        );
-       if(! count($r)) {
+
+/*     deactivated by now since it can lead to multiplicated pictures in posts.
+       if(!count($r)) {
+               $result = diaspora_store_by_guid($status_message_guid, $contact['url'], $importer['uid']);
+
+               if (!$result) {
+                       $person = find_diaspora_person_by_handle($diaspora_handle);
+                       $result = diaspora_store_by_guid($status_message_guid, $person['url'], $importer['uid']);
+               }
+
+               if ($result) {
+                       logger("Fetched missing item ".$status_message_guid." - result: ".$result, LOGGER_DEBUG);
+
+                       $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
+                               intval($importer['uid']),
+                               dbesc($status_message_guid)
+                       );
+               }
+       }
+*/
+       if(!count($r)) {
                if($attempt <= 3) {
                        q("INSERT INTO dsprphotoq (uid, msg, attempt) VALUES (%d, '%s', %d)",
                           intval($importer['uid']),
@@ -1921,6 +1919,7 @@ function diaspora_photo($importer,$xml,$msg,$attempt=1) {
                           intval($attempt + 1)
                        );
                }
+
                logger('diaspora_photo: attempt = ' . $attempt . '; status message not found: ' . $status_message_guid . ' for photo: ' . $guid);
                return;
        }
@@ -1933,11 +1932,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;
@@ -1978,6 +1978,25 @@ function diaspora_like($importer,$xml,$msg) {
                intval($importer['uid']),
                dbesc($parent_guid)
        );
+
+       if(!count($r)) {
+               $result = diaspora_store_by_guid($parent_guid, $contact['url'], $importer['uid']);
+
+               if (!$result) {
+                       $person = find_diaspora_person_by_handle($diaspora_handle);
+                       $result = diaspora_store_by_guid($parent_guid, $person['url'], $importer['uid']);
+               }
+
+               if ($result) {
+                       logger("Fetched missing item ".$parent_guid." - result: ".$result, LOGGER_DEBUG);
+
+                       $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
+                               intval($importer['uid']),
+                               dbesc($parent_guid)
+                       );
+               }
+       }
+
        if(! count($r)) {
                logger('diaspora_like: parent item not found: ' . $guid);
                return;
@@ -2012,7 +2031,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;
        }
 
 
@@ -2028,26 +2047,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
@@ -2055,13 +2076,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;
                }
        }
 
@@ -2085,7 +2104,7 @@ function diaspora_like($importer,$xml,$msg) {
 
        $activity = ACTIVITY_LIKE;
        $post_type = (($parent_item['resource-id']) ? t('photo') : t('status'));
-       $objtype = (($parent_item['resource-id']) ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE ); 
+       $objtype = (($parent_item['resource-id']) ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
        $link = xmlify('<link rel="alternate" type="text/html" href="' . $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $parent_item['id'] . '" />' . "\n") ;
        $body = $parent_item['body'];
 
@@ -2588,6 +2607,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] != "")
@@ -2884,7 +2923,7 @@ function diaspora_send_retraction($item,$owner,$contact,$public_batch = false) {
                $target_type = (($item['verb'] === ACTIVITY_LIKE) ? 'Like' : 'Comment');
        }
        else {
-               
+
                $tpl = get_markup_template('diaspora_signed_retract.tpl');
                $target_type = 'StatusMessage';
        }
@@ -2930,7 +2969,7 @@ function diaspora_send_mail($item,$owner,$contact) {
 
        $body = bb2diaspora($item['body']);
        $created = datetime_convert('UTC','UTC',$item['created'],'Y-m-d H:i:s \U\T\C');
+
        $signed_text =  $item['guid'] . ';' . $cnv['guid'] . ';' . $body .  ';' 
                . $created . ';' . $myaddr . ';' . $cnv['guid'];
 
@@ -3020,5 +3059,3 @@ function diaspora_transmit($owner,$contact,$slap,$public_batch,$queue_run=false)
 
        return(($return_code) ? $return_code : (-1));
 }
-
-