X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fdiaspora.php;h=75e4a7106bd064622c59401b60acf43d0ae9d2e2;hb=83e54f70d3204525ba16ea3faf5f17cd001fbc9e;hp=3640c74959a9ca49862cd98d50335d8b06858d69;hpb=8f5d2471ddcbf6b8bcdd51d9f1d9f7a0b3894cb4;p=friendica.git diff --git a/include/diaspora.php b/include/diaspora.php index 3640c74959..75e4a7106b 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -1,9 +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 ", @@ -34,15 +41,8 @@ function diaspora_dispatch_public($msg) { diaspora_dispatch($rr,$msg); } } - else { + else logger('diaspora_public: no subscribers for '.$msg["author"].' '.print_r($msg, true)); - - // Use a dummy importer - $importer = array("uid" => 0, "page-flags" => PAGE_FREELOVE); - $result = diaspora_dispatch($importer,$msg); - - logger("Dispatcher reported ".$result, LOGGER_DEBUG); - } } @@ -111,6 +111,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)); } @@ -590,7 +593,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']), @@ -767,12 +770,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']), @@ -787,7 +790,7 @@ 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 @@ -802,7 +805,7 @@ function diaspora_is_redmatrix($url) { } function diaspora_plink($addr, $guid) { - $r = q("SELECT `url`, `nick`, `network` FROM `fcontact` WHERE `addr`='%s' LIMIT 1", $addr); + $r = q("SELECT `url`, `nick`, `network` FROM `fcontact` WHERE `addr`='%s' LIMIT 1", dbesc($addr)); // Fallback if (!$r) @@ -840,15 +843,14 @@ function diaspora_post($importer,$xml,$msg) { 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)) { @@ -965,9 +967,8 @@ function diaspora_store_by_guid($guid, $server, $uid = 0) { $objecttype = $item["object-type"]; $message_id = $author.':'.$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($uid), - dbesc($message_id), dbesc($guid) ); if(count($r)) @@ -975,9 +976,21 @@ function diaspora_store_by_guid($guid, $server, $uid = 0) { $person = find_diaspora_person_by_handle($author); + $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'] = get_contact($person['url'], $uid); + $datarray['contact-id'] = $contact_id; $datarray['wall'] = 0; $datarray['network'] = NETWORK_DIASPORA; $datarray['guid'] = $guid; @@ -1005,8 +1018,8 @@ function diaspora_store_by_guid($guid, $server, $uid = 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 + /// @TODO + /// Looking if there is some subscribe mechanism in Diaspora to get all comments for this post return $message_id; } @@ -1076,8 +1089,8 @@ function diaspora_fetch_message($guid, $server, $level = 0) { $body = scale_external_images($body); // Add OEmbed and other information to the body - // To-Do: It could be a repeated redmatrix item - // Then we shouldn't add further data to it + /// @TODO 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); @@ -1117,15 +1130,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)) { @@ -1303,15 +1315,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)) { @@ -1376,11 +1387,6 @@ function diaspora_asphoto($importer,$xml,$msg) { } - - - - - function diaspora_comment($importer,$xml,$msg) { $a = get_app(); @@ -1399,7 +1405,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; } @@ -1500,16 +1506,27 @@ function diaspora_comment($importer,$xml,$msg) { } } + // Fetch the contact id - if we know this contact + $r = q("SELECT `id`, `network` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1", + dbesc(normalise_link($person['url'])), intval($importer['uid'])); + if ($r) { + $cid = $r[0]['id']; + $network = $r[0]['network']; + } else { + $cid = $contact['id']; + $network = NETWORK_DIASPORA; + } + $body = diaspora2bb($text); $message_id = $diaspora_handle . ':' . $guid; $datarray = array(); $datarray['uid'] = $importer['uid']; - $datarray['contact-id'] = $contact['id']; + $datarray['contact-id'] = $cid; $datarray['type'] = 'remote-comment'; $datarray['wall'] = $parent_item['wall']; - $datarray['network'] = NETWORK_DIASPORA; + $datarray['network'] = $network; $datarray['verb'] = ACTIVITY_POST; $datarray['gravity'] = GRAVITY_COMMENT; $datarray['guid'] = $guid; @@ -1791,7 +1808,7 @@ 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) { @@ -1827,7 +1844,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 { @@ -1874,6 +1891,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) { @@ -1903,7 +1923,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; } @@ -1990,7 +2010,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; } @@ -2142,13 +2162,24 @@ function diaspora_like($importer,$xml,$msg) { EOT; $bodyverb = t('%1$s likes %2$s\'s %3$s'); + // Fetch the contact id - if we know this contact + $r = q("SELECT `id`, `network` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1", + dbesc(normalise_link($person['url'])), intval($importer['uid'])); + if ($r) { + $cid = $r[0]['id']; + $network = $r[0]['network']; + } else { + $cid = $contact['id']; + $network = NETWORK_DIASPORA; + } + $arr = array(); $arr['uri'] = $uri; $arr['uid'] = $importer['uid']; $arr['guid'] = $guid; - $arr['network'] = NETWORK_DIASPORA; - $arr['contact-id'] = $contact['id']; + $arr['network'] = $network; + $arr['contact-id'] = $cid; $arr['type'] = 'activity'; $arr['wall'] = $parent_item['wall']; $arr['gravity'] = GRAVITY_LIKE; @@ -2224,8 +2255,23 @@ function diaspora_retraction($importer,$xml) { if($type === 'Person') { require_once('include/Contact.php'); contact_remove($contact['id']); - } - elseif($type === 'Post') { + } elseif($type === 'StatusMessage') { + $guid = notags(unxmlify($xml->post_guid)); + + $r = q("SELECT * FROM `item` WHERE `guid` = '%s' AND `uid` = %d AND NOT `file` LIKE '%%[%%' LIMIT 1", + dbesc($guid), + intval($importer['uid']) + ); + if(count($r)) { + if(link_compare($r[0]['author-link'],$contact['url'])) { + q("UPDATE `item` SET `deleted` = 1, `changed` = '%s' WHERE `id` = %d", + dbesc(datetime_convert()), + intval($r[0]['id']) + ); + delete_thread($r[0]['id'], $r[0]['parent-uri']); + } + } + } elseif($type === 'Post') { $r = q("select * from item where guid = '%s' and uid = %d and not file like '%%[%%' limit 1", dbesc('guid'), intval($importer['uid']) @@ -2316,9 +2362,9 @@ function diaspora_signed_retraction($importer,$xml,$msg) { // The first item in the `item` table with the parent id is the parent. However, MySQL doesn't always // return the items ordered by `item`.`id`, in which case the wrong item is chosen as the parent. // The only item with `parent` and `id` as the parent id is the parent item. - $p = q("select origin from item where parent = %d and id = %d limit 1", - $r[0]['parent'], - $r[0]['parent'] + $p = q("SELECT `origin` FROM `item` WHERE `parent` = %d AND `id` = %d LIMIT 1", + intval($r[0]['parent']), + intval($r[0]['parent']) ); if(count($p)) { if(($p[0]['origin']) && (! $parent_author_signature)) { @@ -2408,7 +2454,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 @@ -2416,8 +2463,8 @@ function diaspora_profile($importer,$xml,$msg) { if(substr($birthday,5) === substr($contact['bd'],5)) $birthday = $contact['bd']; - // TODO: update name on item['author-name'] if the name changed. See consume_feed() - // Not doing this currently because D* protocol is scheduled for revision soon. + /// @TODO Update name on item['author-name'] if the name changed. See consume_feed() + /// (Not doing this currently because D* protocol is scheduled for revision soon). $r = q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' , `bd` = '%s', `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s' WHERE `id` = %d AND `uid` = %d", dbesc($name), @@ -2991,7 +3038,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 . ';' + $signed_text = $item['guid'] . ';' . $cnv['guid'] . ';' . $body . ';' . $created . ';' . $myaddr . ';' . $cnv['guid']; $sig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256')); @@ -2999,7 +3046,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),