X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fdiaspora.php;h=c97abc28cdec81b8049f5cf401cc39bee7b2b3b7;hb=50c004aa5ff14a4d65fd57e4ca8231de3546b569;hp=294690a48e6143774e5cee0ae045e79d2b87efb8;hpb=d4a172c1421921cc03b4f85e3fd0d4c5c8b9cfa4;p=friendica.git diff --git a/include/diaspora.php b/include/diaspora.php old mode 100755 new mode 100644 index 294690a48e..c97abc28cd --- a/include/diaspora.php +++ b/include/diaspora.php @@ -1,5 +1,10 @@ 0, "page-flags" => PAGE_FREELOVE); + $result = diaspora_dispatch($importer,$msg); + logger("Dispatcher reported ".$result, LOGGER_DEBUG); + + // Now distribute it to the followers $r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN - ( SELECT `contact`.`uid` FROM `contact` WHERE `contact`.`network` = '%s' AND `contact`.`addr` = '%s' ) - AND `account_expired` = 0 AND `account_removed` = 0 ", + ( SELECT `contact`.`uid` FROM `contact` WHERE `contact`.`network` = '%s' AND `contact`.`addr` = '%s' ) + AND `account_expired` = 0 AND `account_removed` = 0 ", dbesc(NETWORK_DIASPORA), dbesc($msg['author']) ); @@ -30,7 +41,7 @@ function diaspora_dispatch_public($msg) { } } else - logger('diaspora_public: no subscribers'); + logger('diaspora_public: no subscribers for '.$msg["author"].' '.print_r($msg, true)); } @@ -99,6 +110,9 @@ function diaspora_dispatch($importer,$msg,$attempt=1) { elseif($xmlbase->message) { $ret = diaspora_message($importer,$xmlbase->message,$msg); } + elseif($xmlbase->participation) { + $ret = diaspora_participation($importer,$xmlbase->participation); + } else { logger('diaspora_dispatch: unknown message type: ' . print_r($xmlbase,true)); } @@ -540,7 +554,7 @@ function diaspora_decode($importer,$xml) { // This will also convert diaspora public key from pkcs#1 to pkcs#8 logger('mod-diaspora: Fetching key for ' . $author_link ); - $key = get_diaspora_key($author_link); + $key = get_diaspora_key($author_link); if(! $key) { logger('mod-diaspora: Could not retrieve author key.'); @@ -578,7 +592,7 @@ function diaspora_request($importer,$xml) { // perhaps we were already sharing with this person. Now they're sharing with us. // That makes us friends. - if($contact['rel'] == CONTACT_IS_FOLLOWER && $importer['page-flags'] != PAGE_COMMUNITY) { + 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']), @@ -635,7 +649,7 @@ function diaspora_request($importer,$xml) { $i = item_store($arr); if($i) - proc_run('php',"include/notifier.php","activity","$i"); + proc_run('php',"include/notifier.php","activity","$i"); } @@ -724,16 +738,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]), @@ -754,12 +769,12 @@ function diaspora_request($importer,$xml) { return; } -function diaspora_post_allow($importer,$contact) { +function diaspora_post_allow($importer,$contact, $is_comment = false) { // perhaps we were already sharing with this person. Now they're sharing with us. // That makes us friends. // Normally this should have handled by getting a request - but this could get lost - if($contact['rel'] == CONTACT_IS_FOLLOWER && $importer['page-flags'] != PAGE_COMMUNITY) { + 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']), @@ -774,8 +789,13 @@ function diaspora_post_allow($importer,$contact) { if($contact['rel'] == CONTACT_IS_SHARING || $contact['rel'] == CONTACT_IS_FRIEND) return true; if($contact['rel'] == CONTACT_IS_FOLLOWER) - if($importer['page-flags'] == PAGE_COMMUNITY) + if(($importer['page-flags'] == PAGE_COMMUNITY) OR $is_comment) return true; + + // Messages for the global users are always accepted + if ($importer['uid'] == 0) + return true; + return false; } @@ -784,12 +804,21 @@ function diaspora_is_redmatrix($url) { } function diaspora_plink($addr, $guid) { - $r = q("SELECT `url`, `nick` FROM `fcontact` WHERE `addr`='%s' LIMIT 1", $addr); + $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; @@ -808,23 +837,24 @@ function diaspora_post($importer,$xml,$msg) { } $contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle); - if(! $contact) - return; + if(! $contact) { + logger('diaspora_post: A Contact for handle '.$diaspora_handle.' and user '.$importer['uid'].' was not found'); + return 203; + } - if(! diaspora_post_allow($importer,$contact)) { + if(! diaspora_post_allow($importer,$contact, false)) { logger('diaspora_post: Ignoring this author.'); return 202; } $message_id = $diaspora_handle . ':' . $guid; - $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1", + $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1", intval($importer['uid']), - dbesc($message_id), dbesc($guid) ); if(count($r)) { logger('diaspora_post: message exists: ' . $guid); - return; + return 208; } $created = unxmlify($xml->created_at); @@ -832,12 +862,19 @@ function diaspora_post($importer,$xml,$msg) { $body = diaspora2bb($xml->raw_message); - // Add OEmbed and other information to the body - if (!diaspora_is_redmatrix($contact['url'])) - $body = add_page_info_to_body($body, false, true); - $datarray = array(); + $datarray["object"] = json_encode($xml); + + 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); @@ -871,7 +908,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. @@ -880,7 +920,9 @@ function diaspora_post($importer,$xml,$msg) { DiasporaFetchGuid($datarray); $message_id = item_store($datarray); - return; + logger("Stored item with message id ".$message_id, LOGGER_DEBUG); + + return 201; } @@ -894,26 +936,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"]; @@ -921,10 +962,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", - dbesc($message_id), + $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1", + intval($uid), dbesc($guid) ); if(count($r)) @@ -932,9 +975,21 @@ 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); + $contact_id = get_contact($person['url'], $uid); + + $contacts = q("SELECT * FROM `contact` WHERE `id` = %d", intval($contact_id)); + $importers = q("SELECT * FROM `user` WHERE `uid` = %d", intval($uid)); + + if ($contacts AND $importers) + if(!diaspora_post_allow($importers[0],$contacts[0], false)) { + logger('Ignoring author '.$person['url'].' for uid '.$uid); + return false; + } else + logger('Author '.$person['url'].' is allowed for uid '.$uid); + + $datarray = array(); + $datarray['uid'] = $uid; + $datarray['contact-id'] = $contact_id; $datarray['wall'] = 0; $datarray['network'] = NETWORK_DIASPORA; $datarray['guid'] = $guid; @@ -953,6 +1008,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); @@ -997,11 +1057,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) { @@ -1011,18 +1074,25 @@ 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); @@ -1059,15 +1129,14 @@ function diaspora_reshare($importer,$xml,$msg) { if(! $contact) return; - if(! diaspora_post_allow($importer,$contact)) { + if(! diaspora_post_allow($importer,$contact, false)) { logger('diaspora_reshare: Ignoring this author: ' . $diaspora_handle . ' ' . print_r($xml,true)); return 202; } $message_id = $diaspora_handle . ':' . $guid; - $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1", + $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1", intval($importer['uid']), - dbesc($message_id), dbesc($guid) ); if(count($r)) { @@ -1077,24 +1146,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)) { @@ -1102,8 +1180,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); @@ -1131,11 +1207,16 @@ 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"]; } } + $plink = diaspora_plink($diaspora_handle, $guid); + $person = find_diaspora_person_by_handle($orig_author); $created = unxmlify($xml->created_at); @@ -1143,8 +1224,6 @@ function diaspora_reshare($importer,$xml,$msg) { $datarray = array(); - $plink = diaspora_plink($diaspora_handle, $guid); - $datarray['uid'] = $importer['uid']; $datarray['contact-id'] = $contact['id']; $datarray['wall'] = 0; @@ -1173,6 +1252,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; @@ -1188,9 +1270,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['uri'] = $datarray2['parent-uri'] = $orig_uri; $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['parent'] = 0; + $datarray2['plink'] = $orig_plink; $datarray2['author-name'] = $person['name']; $datarray2['author-link'] = $person['url']; @@ -1199,6 +1282,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); @@ -1230,15 +1314,14 @@ function diaspora_asphoto($importer,$xml,$msg) { if(! $contact) return; - if(! diaspora_post_allow($importer,$contact)) { + if(! diaspora_post_allow($importer,$contact, false)) { logger('diaspora_asphoto: Ignoring this author.'); return 202; } $message_id = $diaspora_handle . ':' . $guid; - $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1", + $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1", intval($importer['uid']), - dbesc($message_id), dbesc($guid) ); if(count($r)) { @@ -1284,6 +1367,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'; @@ -1324,7 +1409,7 @@ function diaspora_comment($importer,$xml,$msg) { return; } - if(! diaspora_post_allow($importer,$contact)) { + if(! diaspora_post_allow($importer,$contact, true)) { logger('diaspora_comment: Ignoring this author.'); return 202; } @@ -1342,6 +1427,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; @@ -1434,6 +1538,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["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)) @@ -1525,7 +1631,7 @@ function diaspora_conversation($importer,$xml,$msg) { $created_at = datetime_convert('UTC','UTC',notags(unxmlify($xml->created_at))); $parent_uri = $diaspora_handle . ':' . $guid; - + $messages = $xml->message; if(! count($messages)) { @@ -1539,7 +1645,7 @@ function diaspora_conversation($importer,$xml,$msg) { return; } - if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { + if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { logger('diaspora_conversation: Ignoring this author.'); return 202; } @@ -1564,11 +1670,11 @@ function diaspora_conversation($importer,$xml,$msg) { ); if($r) $c = q("select * from conv where uid = %d and guid = '%s' limit 1", - intval($importer['uid']), - dbesc($guid) - ); + intval($importer['uid']), + dbesc($guid) + ); if(count($c)) - $conversation = $c[0]; + $conversation = $c[0]; } if(! $conversation) { logger('diaspora_conversation: unable to create conversation.'); @@ -1695,15 +1801,15 @@ function diaspora_message($importer,$xml,$msg) { $msg_diaspora_handle = notags(unxmlify($xml->diaspora_handle)); $msg_conversation_guid = notags(unxmlify($xml->conversation_guid)); - $parent_uri = $diaspora_handle . ':' . $msg_parent_guid; - + $parent_uri = $msg_diaspora_handle . ':' . $msg_parent_guid; + $contact = diaspora_get_contact_by_handle($importer['uid'],$msg_diaspora_handle); if(! $contact) { logger('diaspora_message: cannot find contact: ' . $msg_diaspora_handle); return; } - if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { + if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { logger('diaspora_message: Ignoring this author.'); return 202; } @@ -1731,7 +1837,7 @@ function diaspora_message($importer,$xml,$msg) { $author_signature = base64_decode($msg_author_signature); - $person = find_diaspora_person_by_handle($msg_diaspora_handle); + $person = find_diaspora_person_by_handle($msg_diaspora_handle); if(is_array($person) && x($person,'pubkey')) $key = $person['pubkey']; else { @@ -1760,7 +1866,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, @@ -1778,6 +1884,9 @@ function diaspora_message($importer,$xml,$msg) { return; } +function diaspora_participation($importer,$xml) { + logger("Unsupported message type 'participation' ".print_r($xml, true)); +} function diaspora_photo($importer,$xml,$msg,$attempt=1) { @@ -1807,7 +1916,7 @@ function diaspora_photo($importer,$xml,$msg,$attempt=1) { return; } - if(! diaspora_post_allow($importer,$contact)) { + if(! diaspora_post_allow($importer,$contact, false)) { logger('diaspora_photo: Ignoring this author.'); return 202; } @@ -1816,6 +1925,26 @@ function diaspora_photo($importer,$xml,$msg,$attempt=1) { intval($importer['uid']), dbesc($status_message_guid) ); + +/* 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)", @@ -1825,19 +1954,6 @@ function diaspora_photo($importer,$xml,$msg,$attempt=1) { ); } - $r = q("SELECT `id` FROM `item` WHERE `uid` = 0 AND `guid` = '%s' LIMIT 1", dbesc($status_message_guid)); - if(!count($r)) { - // Fetching the missing item as a public shadow - // To-Do: Doing it for every post that is missing - $item = array(); - $item["author-link"] = $contact['url']; - $item["owner-link"] = $contact['url']; - - DiasporaFetchGuidSub($status_message_guid, $item); - - logger("Storing missing item ".$status_message_guid." as public shadow", LOGGER_DEBUG); - } - logger('diaspora_photo: attempt = ' . $attempt . '; status message not found: ' . $status_message_guid . ' for photo: ' . $guid); return; } @@ -1847,7 +1963,7 @@ function diaspora_photo($importer,$xml,$msg,$attempt=1) { $link_text = '[img]' . $remote_photo_path . $remote_photo_name . '[/img]' . "\n"; $link_text = scale_external_images($link_text, true, - array($remote_photo_name, 'scaled_full_' . $remote_photo_name)); + 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", @@ -1887,7 +2003,7 @@ function diaspora_like($importer,$xml,$msg) { return; } - if(! diaspora_post_allow($importer,$contact)) { + if(! diaspora_post_allow($importer,$contact, false)) { logger('diaspora_like: Ignoring this author.'); return 202; } @@ -1896,6 +2012,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; @@ -2003,7 +2138,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('' . "\n") ; $body = $parent_item['body']; @@ -2286,7 +2421,8 @@ function diaspora_profile($importer,$xml,$msg) { $birthday = str_replace('1000','1901',$birthday); - $birthday = datetime_convert('UTC','UTC',$birthday,'Y-m-d'); + if ($birthday != "") + $birthday = datetime_convert('UTC','UTC',$birthday,'Y-m-d'); // this is to prevent multiple birthday notifications in a single year // if we already have a stored birthday and the 'm-d' part hasn't changed, preserve the entry, which will preserve the notify year @@ -2492,28 +2628,28 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) { function diaspora_is_reshare($body) { $body = trim($body); - // Skip if it isn't a pure repeated messages - // Does it start with a share? - if (strpos($body, "[share") > 0) - return(false); + // Skip if it isn't a pure repeated messages + // Does it start with a share? + if (strpos($body, "[share") > 0) + return(false); - // Does it end with a share? - if (strlen($body) > (strrpos($body, "[/share]") + 8)) - return(false); + // Does it end with a share? + if (strlen($body) > (strrpos($body, "[/share]") + 8)) + return(false); - $attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism","$1",$body); - // Skip if there is no shared message in there - if ($body == $attributes) - return(false); + $attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism","$1",$body); + // Skip if there is no shared message in there + if ($body == $attributes) + return(false); - $guid = ""; - preg_match("/guid='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") - $guid = $matches[1]; + $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]; + 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", @@ -2526,35 +2662,35 @@ function diaspora_is_reshare($body) { } } - $profile = ""; - preg_match("/profile='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") - $profile = $matches[1]; + $profile = ""; + preg_match("/profile='(.*?)'/ism", $attributes, $matches); + if ($matches[1] != "") + $profile = $matches[1]; - preg_match('/profile="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") - $profile = $matches[1]; + preg_match('/profile="(.*?)"/ism', $attributes, $matches); + if ($matches[1] != "") + $profile = $matches[1]; - $ret= array(); + $ret= array(); - $ret["root_handle"] = preg_replace("=https?://(.*)/u/(.*)=ism", "$2@$1", $profile); - if (($ret["root_handle"] == $profile) OR ($ret["root_handle"] == "")) - return(false); + $ret["root_handle"] = preg_replace("=https?://(.*)/u/(.*)=ism", "$2@$1", $profile); + if (($ret["root_handle"] == $profile) OR ($ret["root_handle"] == "")) + return(false); - $link = ""; - preg_match("/link='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") - $link = $matches[1]; + $link = ""; + preg_match("/link='(.*?)'/ism", $attributes, $matches); + if ($matches[1] != "") + $link = $matches[1]; - preg_match('/link="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") - $link = $matches[1]; + preg_match('/link="(.*?)"/ism', $attributes, $matches); + if ($matches[1] != "") + $link = $matches[1]; - $ret["root_guid"] = preg_replace("=https?://(.*)/posts/(.*)=ism", "$2", $link); - if (($ret["root_guid"] == $link) OR ($ret["root_guid"] == "")) - return(false); + $ret["root_guid"] = preg_replace("=https?://(.*)/posts/(.*)=ism", "$2", $link); + if (($ret["root_guid"] == $link) OR ($ret["root_guid"] == "")) + return(false); - return($ret); + return($ret); } function diaspora_send_images($item,$owner,$contact,$images,$public_batch = false) { @@ -2608,7 +2744,7 @@ function diaspora_send_followup($item,$owner,$contact,$public_batch = false) { // likes on comments if($item['verb'] === ACTIVITY_LIKE && $item['thr-parent']) { $p = q("select guid, type, uri, `parent-uri` from item where uri = '%s' limit 1", - dbesc($item['thr-parent']) + dbesc($item['thr-parent']) ); } else { @@ -2686,7 +2822,7 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) { // likes on comments if($item['verb'] === ACTIVITY_LIKE && $item['thr-parent']) { $p = q("select guid, type, uri, `parent-uri` from item where uri = '%s' limit 1", - dbesc($item['thr-parent']) + dbesc($item['thr-parent']) ); } else { @@ -2822,7 +2958,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'; } @@ -2868,8 +3004,8 @@ 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 . ';' + + $signed_text = $item['guid'] . ';' . $cnv['guid'] . ';' . $body . ';' . $created . ';' . $myaddr . ';' . $cnv['guid']; $sig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256')); @@ -2877,7 +3013,7 @@ function diaspora_send_mail($item,$owner,$contact) { $msg = array( 'guid' => xmlify($item['guid']), 'parent_guid' => xmlify($cnv['guid']), - 'parent_author_signature' => (($item['reply']) ? null : xmlify($sig)), + 'parent_author_signature' => xmlify($sig), 'author_signature' => xmlify($sig), 'text' => xmlify($body), 'created_at' => xmlify($created), @@ -2959,4 +3095,46 @@ function diaspora_transmit($owner,$contact,$slap,$public_batch,$queue_run=false) return(($return_code) ? $return_code : (-1)); } +function diaspora_fetch_relay() { + + $serverdata = get_config("system", "relay_server"); + if ($serverdata == "") + return array(); + + $relay = array(); + + $servers = explode(",", $serverdata); + + foreach($servers AS $server) { + $server = trim($server); + $batch = $server."/receive/public"; + + $relais = q("SELECT `batch`, `id`, `name`,`network` FROM `contact` WHERE `uid` = 0 AND `batch` = '%s' LIMIT 1", dbesc($batch)); + if (!$relais) { + $addr = "relay@".str_replace("http://", "", normalise_link($server)); + + $r = q("INSERT INTO `contact` (`uid`, `created`, `name`, `nick`, `addr`, `url`, `nurl`, `batch`, `network`, `rel`, `blocked`, `pending`, `writable`, `name-date`, `uri-date`, `avatar-date`) + VALUES (0, '%s', '%s', 'relay', '%s', '%s', '%s', '%s', '%s', %d, 0, 0, 1, '%s', '%s', '%s')", + datetime_convert(), + dbesc($addr), + dbesc($addr), + dbesc($server), + dbesc(normalise_link($server)), + dbesc($batch), + dbesc(NETWORK_DIASPORA), + intval(CONTACT_IS_FOLLOWER), + dbesc(datetime_convert()), + dbesc(datetime_convert()), + dbesc(datetime_convert()) + ); + + $relais = q("SELECT `batch`, `id`, `name`,`network` FROM `contact` WHERE `uid` = 0 AND `batch` = '%s' LIMIT 1", dbesc($batch)); + if ($relais) + $relay[] = $relais[0]; + } else + $relay[] = $relais[0]; + } + + return $relay; +}