X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fdiaspora.php;h=ac78beb2f9e58a9d2037307d01e19e577a71a7ac;hb=a9ec56ace1756726517650d96192df5320f445fe;hp=93e7d2cdbc57c3f90794ec51fabc64499c7eba1f;hpb=ce11d231b8157568a48bf046ae28ef23e500887e;p=friendica.git diff --git a/include/diaspora.php b/include/diaspora.php index 93e7d2cdbc..ac78beb2f9 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -4,6 +4,7 @@ require_once('include/crypto.php'); require_once('include/items.php'); require_once('include/bb2diaspora.php'); require_once('include/contact_selectors.php'); +require_once('include/queue_fn.php'); function diaspora_dispatch_public($msg) { @@ -28,6 +29,14 @@ function diaspora_dispatch($importer,$msg) { $ret = 0; + // php doesn't like dashes in variable names + + $msg['message'] = str_replace( + array('',''), + array('',''), + $msg['message']); + + $parsed_xml = parse_xml_string($msg['message'],false); $xmlbase = $parsed_xml->post; @@ -38,12 +47,21 @@ function diaspora_dispatch($importer,$msg) { elseif($xmlbase->status_message) { $ret = diaspora_post($importer,$xmlbase->status_message); } + elseif($xmlbase->profile) { + $ret = diaspora_profile($importer,$xmlbase->profile); + } elseif($xmlbase->comment) { $ret = diaspora_comment($importer,$xmlbase->comment,$msg); } elseif($xmlbase->like) { $ret = diaspora_like($importer,$xmlbase->like,$msg); } + elseif($xmlbase->asphoto) { + $ret = diaspora_asphoto($importer,$xmlbase->asphoto); + } + elseif($xmlbase->reshare) { + $ret = diaspora_reshare($importer,$xmlbase->reshare); + } elseif($xmlbase->retraction) { $ret = diaspora_retraction($importer,$xmlbase->retraction,$msg); } @@ -74,12 +92,14 @@ function find_diaspora_person_by_handle($handle) { dbesc($handle) ); if(count($r)) { + logger('find_diaspora_person_by handle: in cache ' . print_r($r,true), LOGGER_DEBUG); // update record occasionally so it doesn't get stale $d = strtotime($r[0]['updated'] . ' +00:00'); if($d > strtotime('now - 14 days')) return $r[0]; $update = true; } + logger('find_diaspora_person_by_handle: refresh',LOGGER_DEBUG); require_once('include/Scrape.php'); $r = probe_url($handle, PROBE_DIASPORA); if((count($r)) && ($r['network'] === NETWORK_DIASPORA)) { @@ -431,13 +451,14 @@ function diaspora_request($importer,$xml) { $batch = (($ret['batch']) ? $ret['batch'] : implode('/', array_slice(explode('/',$ret['url']),0,3)) . '/receive/public'); - $r = q("INSERT INTO `contact` (`uid`, `network`,`addr`,`created`,`url`,`batch`,`name`,`nick`,`photo`,`pubkey`,`notify`,`poll`,`blocked`,`priority`) - VALUES ( %d, '%s', '%s', '%s','%s','%s','%s','%s','%s','%s','%s','%s',%d,%d) ", + $r = q("INSERT INTO `contact` (`uid`, `network`,`addr`,`created`,`url`,`nurl`,`batch`,`name`,`nick`,`photo`,`pubkey`,`notify`,`poll`,`blocked`,`priority`) + VALUES ( %d, '%s', '%s', '%s', '%s','%s','%s','%s','%s','%s','%s','%s','%s',%d,%d) ", intval($importer['uid']), dbesc($ret['network']), dbesc($ret['addr']), datetime_convert(), dbesc($ret['url']), + dbesc(normalise_link($ret['url'])), dbesc($batch), dbesc($ret['name']), dbesc($ret['nick']), @@ -553,6 +574,10 @@ function diaspora_post($importer,$xml) { $datarray['tag'] = $str_tags; $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. + + $datarray['visible'] = ((strlen($body)) ? 1 : 0); + $message_id = item_store($datarray); if($message_id) { @@ -566,6 +591,245 @@ function diaspora_post($importer,$xml) { } +function diaspora_reshare($importer,$xml) { + + logger('diaspora_reshare: init: ' . print_r($xml,true)); + + $a = get_app(); + $guid = notags(unxmlify($xml->guid)); + $diaspora_handle = notags(unxmlify($xml->diaspora_handle)); + + + $contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle); + if(! $contact) + return; + + if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { + 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", + intval($importer['uid']), + dbesc($message_id), + dbesc($guid) + ); + if(count($r)) { + logger('diaspora_reshare: message exists: ' . $guid); + return; + } + + $orig_author = notags(unxmlify($xml->root_diaspora_id)); + $orig_guid = notags(unxmlify($xml->root_guid)); + + $source_url = 'https://' . substr($orig_author,strpos($orig_author,'@')+1) . '/p/' . $orig_guid . '.xml'; + $x = fetch_url($source_url); + if(! $x) + $x = fetch_url(str_replace('https://','http://',$source_url)); + if(! $x) { + logger('diaspora_reshare: unable to fetch source url ' . $source_url); + return; + } + logger('diaspora_reshare: source: ' . $x); + + $x = str_replace(array('',''),array('',''),$x); + $source_xml = parse_xml_string($x,false); + + if(strlen($source_xml->post->asphoto->objectId) && ($source_xml->post->asphoto->objectId != 0) && ($source_xml->post->asphoto->image_url)) { + $body = '[url=' . notags(unxmlify($source_xml->post->asphoto->image_url)) . '][img]' . notags(unxmlify($source_xml->post->asphoto->objectId)) . '[/img][/url]' . "\n"; + $body = scale_diaspora_images($body,false); + } + elseif($source_xml->post->asphoto->image_url) { + $body = '[img]' . notags(unxmlify($source_xml->post->asphoto->image_url)) . '[/img]' . "\n"; + $body = scale_diaspora_images($body); + } + elseif($source_xml->post->status_message) { + $body = diaspora2bb($source_xml->post->status_message->raw_message); + $body = scale_diaspora_images($body); + + } + else { + logger('diaspora_reshare: no reshare content found: ' . print_r($source_xml,true)); + return; + } + if(! $body) { + logger('diaspora_reshare: empty body: source= ' . $x); + return; + } + + $person = find_diaspora_person_by_handle($orig_author); + + if(is_array($person) && x($person,'name') && x($person,'url')) + $details = '[url=' . $person['url'] . ']' . $person['name'] . '[/url]'; + else + $details = $orig_author; + + $prefix = '♲ ' . $details . "\n"; + + + // 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); + + $datarray = array(); + + $str_tags = ''; + + $tags = get_tags($body); + + if(count($tags)) { + foreach($tags as $tag) { + if(strpos($tag,'#') === 0) { + if(strpos($tag,'[url=')) + continue; + $basetag = str_replace('_',' ',substr($tag,1)); + $body = str_replace($tag,'#[url=' . $a->get_baseurl() . '/search?search=' . rawurlencode($basetag) . ']' . $basetag . '[/url]',$body); + if(strlen($str_tags)) + $str_tags .= ','; + $str_tags .= '#[url=' . $a->get_baseurl() . '/search?search=' . rawurlencode($basetag) . ']' . $basetag . '[/url]'; + continue; + } + } + } + + $datarray['uid'] = $importer['uid']; + $datarray['contact-id'] = $contact['id']; + $datarray['wall'] = 0; + $datarray['guid'] = $guid; + $datarray['uri'] = $datarray['parent-uri'] = $message_id; + $datarray['created'] = $datarray['edited'] = datetime_convert('UTC','UTC',$created); + $datarray['private'] = $private; + $datarray['parent'] = 0; + $datarray['owner-name'] = $contact['name']; + $datarray['owner-link'] = $contact['url']; + $datarray['owner-avatar'] = $contact['thumb']; + $datarray['author-name'] = $contact['name']; + $datarray['author-link'] = $contact['url']; + $datarray['author-avatar'] = $contact['thumb']; + $datarray['body'] = $prefix . $body; + $datarray['tag'] = $str_tags; + $datarray['app'] = 'Diaspora'; + + $message_id = item_store($datarray); + + if($message_id) { + q("update item set plink = '%s' where id = %d limit 1", + dbesc($a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $message_id), + intval($message_id) + ); + } + + return; + +} + + +function diaspora_asphoto($importer,$xml) { + logger('diaspora_asphoto called'); + + $a = get_app(); + $guid = notags(unxmlify($xml->guid)); + $diaspora_handle = notags(unxmlify($xml->diaspora_handle)); + + $contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle); + if(! $contact) + return; + + if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { + 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", + intval($importer['uid']), + dbesc($message_id), + dbesc($guid) + ); + if(count($r)) { + logger('diaspora_asphoto: message exists: ' . $guid); + 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); + + if(strlen($xml->objectId) && ($xml->objectId != 0) && ($xml->image_url)) { + $body = '[url=' . notags(unxmlify($xml->image_url)) . '][img]' . notags(unxmlify($xml->objectId)) . '[/img][/url]' . "\n"; + $body = scale_diaspora_images($body,false); + } + elseif($xml->image_url) { + $body = '[img]' . notags(unxmlify($xml->image_url)) . '[/img]' . "\n"; + $body = scale_diaspora_images($body); + } + else { + logger('diaspora_asphoto: no photo url found.'); + return; + } + + $datarray = array(); + + + $datarray['uid'] = $importer['uid']; + $datarray['contact-id'] = $contact['id']; + $datarray['wall'] = 0; + $datarray['guid'] = $guid; + $datarray['uri'] = $datarray['parent-uri'] = $message_id; + $datarray['created'] = $datarray['edited'] = datetime_convert('UTC','UTC',$created); + $datarray['private'] = $private; + $datarray['parent'] = 0; + $datarray['owner-name'] = $contact['name']; + $datarray['owner-link'] = $contact['url']; + $datarray['owner-avatar'] = $contact['thumb']; + $datarray['author-name'] = $contact['name']; + $datarray['author-link'] = $contact['url']; + $datarray['author-avatar'] = $contact['thumb']; + $datarray['body'] = $body; + + $datarray['app'] = 'Diaspora/Cubbi.es'; + + $message_id = item_store($datarray); + + if($message_id) { + q("update item set plink = '%s' where id = %d limit 1", + dbesc($a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $message_id), + intval($message_id) + ); + } + + return; + +} + + + + + + function diaspora_comment($importer,$xml,$msg) { $a = get_app(); @@ -695,7 +959,10 @@ function diaspora_comment($importer,$xml,$msg) { $datarray['author-avatar'] = ((x($person,'thumb')) ? $person['thumb'] : $person['photo']); $datarray['body'] = $body; $datarray['tag'] = $str_tags; - $datarray['app'] = 'Diaspora'; + + // 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'; $message_id = item_store($datarray); @@ -706,7 +973,7 @@ function diaspora_comment($importer,$xml,$msg) { ); } - if(! $parent_author_signature) { + if(($parent_item['origin']) && (! $parent_author_signature)) { q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ", intval($message_id), dbesc($author_signed_data), @@ -762,8 +1029,10 @@ function diaspora_photo($importer,$xml,$msg) { $link_text = '[img]' . $remote_photo_path . $remote_photo_name . '[/img]' . "\n"; + $link_text = scale_diaspora_images($link_text); + if(strpos($parent_item['body'],$link_text) === false) { - $r = q("update item set `body` = '%s' where `id` = %d and `uid` = %d limit 1", + $r = q("update item set `body` = '%s', `visible` = 1 where `id` = %d and `uid` = %d limit 1", dbesc($link_text . $parent_item['body']), intval($parent_item['id']), intval($parent_item['uid']) @@ -911,9 +1180,9 @@ EOT; $arr['parent'] = $parent_item['id']; $arr['parent-uri'] = $parent_item['uri']; - $arr['owner-name'] = $contact['name']; - $arr['owner-link'] = $contact['url']; - $arr['owner-avatar'] = $contact['thumb']; + $arr['owner-name'] = $parent_item['name']; + $arr['owner-link'] = $parent_item['url']; + $arr['owner-avatar'] = $parent_item['thumb']; $arr['author-name'] = $person['name']; $arr['author-link'] = $person['url']; @@ -955,9 +1224,9 @@ EOT; // if the message isn't already being relayed, notify others // the existence of parent_author_signature means the parent_author or owner - // is already relaying. + // is already relaying. The parent_item['origin'] indicates the message was created on our system - if(! $parent_author_signature) + if(($parent_item['origin']) && (! $parent_author_signature)) proc_run('php','include/notifier.php','comment',$message_id); return; @@ -994,6 +1263,89 @@ function diaspora_retraction($importer,$xml) { return 202; // NOTREACHED } + +function diaspora_profile($importer,$xml) { + + $a = get_app(); + $diaspora_handle = notags(unxmlify($xml->diaspora_handle)); + + $contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle); + if(! $contact) + return; + + if($contact['blocked']) { + logger('diaspora_post: Ignoring this author.'); + return 202; + } + + $name = unxmlify($xml->first_name) . ((strlen($xml->last_name)) ? ' ' . unxmlify($xml->last_name) : ''); + $image_url = unxmlify($xml->image_url); + $birthday = unxmlify($xml->birthday); + + $r = q("SELECT DISTINCT ( `resource-id` ) FROM `photo` WHERE `uid` = %d AND `contact-id` = %d AND `album` = 'Contact Photos' ", + intval($importer['uid']), + intval($contact['id']) + ); + $oldphotos = ((count($r)) ? $r : null); + + require_once('include/Photo.php'); + + $images = import_profile_photo($image_url,$importer['uid'],$contact['id']); + + // Generic birthday. We don't know the timezone. The year is irrelevant. + + $birthday = str_replace('1000','1901',$birthday); + + $birthday = datetime_convert('UTC','UTC',$birthday,'Y-m-d'); + + $r = q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' , `bd` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1", + dbesc($name), + dbesc(datetime_convert()), + dbesc($images[0]), + dbesc($images[1]), + dbesc($images[2]), + dbesc(datetime_convert()), + dbesc($birthday), + intval($contact['id']), + intval($importer['uid']) + ); + + if($r) { + if($oldphotos) { + foreach($oldphotos as $ph) { + q("DELETE FROM `photo` WHERE `uid` = %d AND `contact-id` = %d AND `album` = 'Contact Photos' AND `resource-id` = '%s' ", + intval($importer['uid']), + intval($contact['id']), + dbesc($ph['resource-id']) + ); + } + } + } + + return; + +} + + + + + + + + + + + + + + + + + + + + + function diaspora_share($me,$contact) { $a = get_app(); @@ -1008,7 +1360,7 @@ function diaspora_share($me,$contact) { $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$me,$contact,$me['prvkey'],$contact['pubkey']))); - return(diaspora_transmit($owner,$contact,$slap)); + return(diaspora_transmit($owner,$contact,$slap, false)); } function diaspora_unshare($me,$contact) { @@ -1025,7 +1377,7 @@ function diaspora_unshare($me,$contact) { $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$me,$contact,$me['prvkey'],$contact['pubkey']))); - return(diaspora_transmit($owner,$contact,$slap)); + return(diaspora_transmit($owner,$contact,$slap, false)); } @@ -1041,6 +1393,14 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) { $body = $item['body']; +/* + // We're trying to match Diaspora's split message/photo protocol but + // all the photos are displayed on D* as links and not img's - even + // though we're sending pretty much precisely what they send us when + // doing the same operation. + // Commented out for now, we'll use bb2diaspora to convert photos to markdown + // which seems to get through intact. + $cnt = preg_match_all('|\[img\](.*?)\[\/img\]|',$body,$matches,PREG_SET_ORDER); if($cnt) { foreach($matches as $mtch) { @@ -1051,12 +1411,24 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) { $detail['guid'] = $item['guid']; $detail['handle'] = $myaddr; $images[] = $detail; - $body = str_replace($detail['str'],t('link'),$body); + $body = str_replace($detail['str'],$mtch[1],$body); } } +*/ $body = xmlify(html_entity_decode(bb2diaspora($body))); + if($item['attach']) { + $cnt = preg_match_all('/href=\"(.*?)\"(.*?)title=\"(.*?)\"/ism',$item['attach'],$matches,PREG_SET_ORDER); + if(cnt) { + $body .= "\n" . t('Attachments:') . "\n"; + foreach($matches as $mtch) { + $body .= '[' . $mtch[3] . '](' . $mtch[1] . ')' . "\n"; + } + } + } + + $public = (($item['private']) ? 'false' : 'true'); require_once('include/datetime.php'); @@ -1313,14 +1685,7 @@ function diaspora_transmit($owner,$contact,$slap,$public_batch) { if((! $return_code) || (($curl_stat == 503) && (stristr($a->get_curl_headers(),'retry-after')))) { logger('diaspora_transmit: queue message'); // queue message for redelivery - q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`,`batch`) - VALUES ( %d, '%s', '%s', '%s', %d) ", - intval($contact['id']), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc($slap), - intval($public_batch) - ); + add_to_queue($contact['id'],NETWORK_DIASPORA,$slap,$public_batch); }