diff options
-rw-r--r-- | include/account.php | 2 | ||||
-rwxr-xr-x | include/diaspora.php | 274 | ||||
-rwxr-xr-x | include/items.php | 1 | ||||
-rw-r--r-- | include/network.php | 5 | ||||
-rw-r--r-- | include/notifier.php | 77 | ||||
-rw-r--r-- | include/zot.php | 13 | ||||
-rw-r--r-- | view/tpl/diaspora_comment.tpl | 11 | ||||
-rw-r--r-- | view/tpl/diaspora_comment_relay.tpl | 12 | ||||
-rw-r--r-- | view/tpl/diaspora_conversation.tpl | 29 | ||||
-rw-r--r-- | view/tpl/diaspora_like.tpl | 12 | ||||
-rw-r--r-- | view/tpl/diaspora_like_relay.tpl | 13 | ||||
-rw-r--r-- | view/tpl/diaspora_message.tpl | 13 | ||||
-rw-r--r-- | view/tpl/diaspora_photo.tpl | 13 | ||||
-rw-r--r-- | view/tpl/diaspora_post.tpl | 12 | ||||
-rw-r--r-- | view/tpl/diaspora_profile.tpl | 16 | ||||
-rw-r--r-- | view/tpl/diaspora_relay_retraction.tpl | 10 | ||||
-rw-r--r-- | view/tpl/diaspora_relayable_retraction.tpl | 11 | ||||
-rw-r--r-- | view/tpl/diaspora_reshare.tpl | 13 | ||||
-rw-r--r-- | view/tpl/diaspora_retract.tpl | 9 | ||||
-rw-r--r-- | view/tpl/diaspora_share.tpl | 8 | ||||
-rw-r--r-- | view/tpl/diaspora_signed_retract.tpl | 10 | ||||
-rwxr-xr-x | view/tpl/notifications.tpl | 2 | ||||
-rw-r--r-- | view/tpl/xrd_diaspora.tpl | 5 |
23 files changed, 489 insertions, 82 deletions
diff --git a/include/account.php b/include/account.php index 138db3290..4ded069d5 100644 --- a/include/account.php +++ b/include/account.php @@ -423,7 +423,7 @@ function user_deny($hash) { if(! count($register)) return false; - $account = q("SELECT account_id FROM account WHERE account_id = %d LIMIT 1", + $account = q("SELECT account_id, account_email FROM account WHERE account_id = %d LIMIT 1", intval($register[0]['uid']) ); diff --git a/include/diaspora.php b/include/diaspora.php index 982e40f2f..1e101b4a7 100755 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -121,7 +121,129 @@ function diaspora_is_blacklisted($s) { return false; } +function diaspora_process_outbound($arr) { +/* + + We are passed the following array from the notifier, providing everything we need to make delivery decisions. + + diaspora_process_outbound(array( + 'channel' => $channel, + 'env_recips' => $env_recips, + 'recipients' => $recipients, + 'item' => $item, + 'target_item' => $target_item, + 'hub' => $hub, + 'top_level_post' => $top_level_post, + 'private' => $private, + 'followup' => $followup, + 'relay_to_owner' => $relay_to_owner, + 'uplink' => $uplink, + 'cmd' => $cmd, + 'expire' => $expire, + 'mail' => $mail, + 'fsuggest' => $fsuggest, + 'normal_mode' => $normal_mode, + 'packet_type' => $packet_type, + 'walltowall' => $walltowall, + )); +*/ + + + if($arr['walltowall']) + return; + + if($arr['env_recips']) { + $r = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_url = '%s' + and xchan_hash in (" . implode(',',$arr['env_recips']) . ") + and xchan_network in ('diaspora', 'friendica-over-diaspora') ", + dbesc($arr['hub']['hubloc_url']) + ); + if(! $r) { + logger('diaspora_process_outbound: no recipients'); + return; + } + + foreach($r as $contact) { + + if($arr['mail']) { + diaspora_send_mail($arr['item'],$arr['channel'],$contact); + continue; + } + + if(! $arr['normal_mode']) + continue; + + // special handling for followup to public post + // all other public posts processed as public batches further below + + if((! $arr['private']) && ($arr['followup'])) { + diaspora_send_followup($arr['target_item'],$arr['channel'],$contact, true); + continue; + } + + if(! $contact['xchan_pubkey']) + continue; + + if(activity_match($arr['target_item']['verb'],ACTIVITY_DISLIKE)) { + continue; + } + elseif(($arr['target_item']['item_restrict'] & ITEM_DELETED) + && (($arr['target_item']['mid'] === $arr['target_item']['parent_mid']) || $arr['followup'])) { + // send both top-level retractions and relayable retractions for owner to relay + diaspora_send_retraction($arr['target_item'],$arr['channel'],$contact); + continue; + } + elseif($arr['followup']) { + // send comments and likes to owner to relay + diaspora_send_followup($arr['target_item'],$arr['channel'],$contact); + continue; + } + + elseif($target_item['mid'] !== $target_item['parent_mid']) { + // we are the relay - send comments, likes and relayable_retractions + // (of comments and likes) to our conversants + diaspora_send_relay($arr['target_item'],$arr['channel'],$contact); + continue; + } + elseif($arr['top_level']) { + diaspora_send_status($arr['target_item'],$arr['channel'],$contact); + continue; + } + } + } + else { + // public message + + $contact = $arr['hub']; + + if($target_item['verb'] === ACTIVITY_DISLIKE) { + // unsupported + return; + } + elseif(($arr['target_item']['deleted']) + && ($arr['target_item']['mid'] === $arr['target_item']['parent_mod'])) { + // top-level retraction + logger('delivery: diaspora retract: ' . $loc); + diaspora_send_retraction($arr['target_item'],$arr['channel'],$contact,true); + return; + } + elseif($arr['target_item']['mid'] !== $arr['target_item']['parent_mid']) { + // we are the relay - send comments, likes and relayable_retractions to our conversants + logger('delivery: diaspora relay: ' . $loc); + diaspora_send_relay($arr['target_item'],$arr['channel'],$contact,true); + return; + } + elseif($arr['top_level_post']) { + // currently no workable solution for sending walltowall + logger('delivery: diaspora status: ' . $loc); + diaspora_send_status($arr['target_item'],$arr['channel'],$contact,true); + return; + } + + } + +} @@ -226,13 +348,13 @@ $magic_env = <<< EOT <?xml version='1.0' encoding='UTF-8'?> <diaspora xmlns="https://joindiaspora.com/protocol" xmlns:me="http://salmon-protocol.org/ns/magic-env" > <header> - <author_id>$handle</author_id> + <author_id>$handle</author_id> </header> <me:env> - <me:encoding>base64url</me:encoding> - <me:alg>RSA-SHA256</me:alg> - <me:data type="application/xml">$data</me:data> - <me:sig>$sig</me:sig> + <me:encoding>base64url</me:encoding> + <me:alg>RSA-SHA256</me:alg> + <me:data type="application/xml">$data</me:data> + <me:sig>$sig</me:sig> </me:env> </diaspora> EOT; @@ -323,10 +445,10 @@ $magic_env = <<< EOT <diaspora xmlns="https://joindiaspora.com/protocol" xmlns:me="http://salmon-protocol.org/ns/magic-env" > $encrypted_header <me:env> - <me:encoding>base64url</me:encoding> - <me:alg>RSA-SHA256</me:alg> - <me:data type="application/xml">$data</me:data> - <me:sig>$sig</me:sig> + <me:encoding>base64url</me:encoding> + <me:alg>RSA-SHA256</me:alg> + <me:data type="application/xml">$data</me:data> + <me:sig>$sig</me:sig> </me:env> </diaspora> EOT; @@ -386,19 +508,19 @@ function diaspora_decode($importer,$xml) { * $decrypted now contains something like * * <decrypted_header> - * <iv>8e+G2+ET8l5BPuW0sVTnQw==</iv> - * <aes_key>UvSMb4puPeB14STkcDWq+4QE302Edu15oaprAQSkLKU=</aes_key> + * <iv>8e+G2+ET8l5BPuW0sVTnQw==</iv> + * <aes_key>UvSMb4puPeB14STkcDWq+4QE302Edu15oaprAQSkLKU=</aes_key> ***** OBSOLETE - * <author> - * <name>Ryan Hughes</name> - * <uri>acct:galaxor@diaspora.pirateship.org</uri> - * </author> + * <author> + * <name>Ryan Hughes</name> + * <uri>acct:galaxor@diaspora.pirateship.org</uri> + * </author> ***** CURRENT - * <author_id>galaxor@diaspora.priateship.org</author_id> + * <author_id>galaxor@diaspora.priateship.org</author_id> ***** END DIFFS @@ -576,7 +698,7 @@ function diaspora_request($importer,$xml) { if($new_connection) { require_once('include/enotify.php'); notification(array( - 'type' => NOTIFY_INTRO, + 'type' => NOTIFY_INTRO, 'from_xchan' => $ret['xchan_hash'], 'to_xchan' => $importer['channel_hash'], 'link' => z_root() . '/connedit/' . $new_connection[0]['abook_id'], @@ -585,7 +707,7 @@ function diaspora_request($importer,$xml) { if($default_perms) { // Send back a sharing notification to them diaspora_share($importer['channel_id'],$new_connection[0]); - + } } } @@ -1309,11 +1431,11 @@ function diaspora_conversation($importer,$xml,$msg) { ); if($r) $c = q("select * from conv where uid = %d and guid = '%s' limit 1", - intval($importer['channel_id']), - dbesc($guid) - ); - if(count($c)) - $conversation = $c[0]; + intval($importer['channel_id']), + dbesc($guid) + ); + if(count($c)) + $conversation = $c[0]; } if(! $conversation) { logger('diaspora_conversation: unable to create conversation.'); @@ -1578,7 +1700,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", @@ -2044,6 +2166,18 @@ function diaspora_profile($importer,$xml,$msg) { function diaspora_share($me,$contact) { $a = get_app(); $myaddr = $me['channel_address'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); + + if(! array_key_exists('xchan_hash',$contact)) { + $c = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where xchan_hash = '%s' limit 1", + dbesc($contact['hubloc_hash']) + ); + if(! $c) { + logger('diaspora_share: ' . $contact['hubloc_hash'] . ' not found.'); + return; + } + $contact = $c[0]; + } + $theiraddr = $contact['xchan_addr']; $tpl = get_markup_template('diaspora_share.tpl'); @@ -2052,29 +2186,25 @@ function diaspora_share($me,$contact) { '$recipient' => $theiraddr )); - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$me,$contact,$me['prvkey'],$contact['pubkey']))); - //$slap = 'xml=' . urlencode(diaspora_msg_build($msg,$me,$contact,$me['prvkey'],$contact['pubkey'])); - + $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$me,$contact,$me['channel_prvkey'],$contact['xchan_pubkey']))); return(diaspora_transmit($owner,$contact,$slap, false)); } function diaspora_unshare($me,$contact) { $a = get_app(); - $myaddr = $me['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); + $myaddr = $me['channel_address'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); $tpl = get_markup_template('diaspora_retract.tpl'); $msg = replace_macros($tpl, array( - '$guid' => $me['guid'], + '$guid' => $me['channel_guid'], '$type' => 'Person', '$handle' => $myaddr )); - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$me,$contact,$me['prvkey'],$contact['pubkey']))); - //$slap = 'xml=' . urlencode(diaspora_msg_build($msg,$me,$contact,$me['prvkey'],$contact['pubkey'])); + $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$me,$contact,$me['channel_prvkey'],$contact['xchan_pubkey']))); return(diaspora_transmit($owner,$contact,$slap, false)); - } @@ -2082,7 +2212,6 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) { $a = get_app(); $myaddr = $owner['channel_address'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); - $theiraddr = $contact['xchan_addr']; $images = array(); @@ -2112,12 +2241,38 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) { } */ - //if(strlen($title)) - // $body = "[b]".html_entity_decode($title)."[/b]\n\n".$body; + + $body = str_ireplace("[quote", "\n\n[quote", $body); + $body = str_ireplace("[/quote]", "[/quote]\n\n", $body); + + // strip bookmark indicators + + $body = preg_replace('/\#\^\[([zu])rl/i', '[$1rl', $body); + $body = preg_replace('/\#\^http/i', 'http', $body); + + // protect tags and mentions from hijacking + + if(! intval(get_pconfig($owner['channel_id'],'system','allow_tag_hijacking'))) { + $new_tag = html_entity_decode('⋕',ENT_COMPAT,'UTF-8'); + $new_mention = html_entity_decode('@',ENT_COMPAT,'UTF-8'); + + // #-tags + $body = preg_replace('/\#\[url/i', $new_tag . '[url', $body); + $body = preg_replace('/\#\[zrl/i', $new_tag . '[zrl', $body); + // @-mentions + $body = preg_replace('/\@\[url/i', $new_mention . '[url', $body); + $body = preg_replace('/\@\[zrl/i', $new_mention . '[zrl', $body); + } + + // remove multiple newlines + do { + $oldbody = $body; + $body = str_replace("\n\n\n", "\n\n", $body); + } while ($oldbody != $body); + // convert to markdown $body = xmlify(html_entity_decode(bb2diaspora($body))); - //$body = bb2diaspora($body); // Adding the title if(strlen($title)) @@ -2133,7 +2288,6 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) { } } - $public = (($item['item_private']) ? 'false' : 'true'); require_once('include/datetime.php'); @@ -2150,7 +2304,7 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) { '$handle' => xmlify($myaddr), '$public' => $public, '$created' => $created, - '$provider' => $item['app'] + '$provider' => (($item['app']) ? $item['app'] : 'redmatrix') )); } else { $tpl = get_markup_template('diaspora_post.tpl'); @@ -2160,14 +2314,13 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) { '$handle' => xmlify($myaddr), '$public' => $public, '$created' => $created, - '$provider' => $item['app'] + '$provider' => (($item['app']) ? $item['app'] : 'redmatrix') )); } - logger('diaspora_send_status: '.$owner['channel_name'].' -> '.$contact['xchan_name'].' base message: '.$msg, LOGGER_DATA); + logger('diaspora_send_status: '.$owner['channel_name'].' -> '.$contact['xchan_name'].' base message: ' . $msg, LOGGER_DATA); $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['channel_prvkey'],$contact['xchan_pubkey'],$public_batch))); - //$slap = 'xml=' . urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)); $return_code = diaspora_transmit($owner,$contact,$slap,$public_batch); @@ -2210,7 +2363,7 @@ function diaspora_is_reshare($body) { $ret= array(); $ret["root_handle"] = preg_replace("=https?://(.*)/u/(.*)=ism", "$2@$1", $profile); - if (($ret["root_handle"] == $profile) OR ($ret["root_handle"] == "")) + if (($ret["root_handle"] == $profile) OR ($ret["root_handle"] == "")) return(false); $link = ""; @@ -2262,7 +2415,6 @@ function diaspora_send_images($item,$owner,$contact,$images,$public_batch = fals logger('diaspora_send_photo: base message: ' . $msg, LOGGER_DATA); $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['channel_prvkey'],$contact['xchan_pubkey'],$public_batch))); - //$slap = 'xml=' . urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)); diaspora_transmit($owner,$contact,$slap,$public_batch); } @@ -2346,7 +2498,7 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) { $a = get_app(); $myaddr = $owner['channel_address'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); -// $theiraddr = $contact['addr']; + $body = $item['body']; $text = html_entity_decode(bb2diaspora($body)); @@ -2356,7 +2508,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 * from item where mid = '%s' limit 1", - dbesc($item['thr_parent']) + dbesc($item['thr_parent']) ); } else { @@ -2364,9 +2516,9 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) { // 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 * from item where parent = %d and id = %d limit 1", - intval($item['parent']), - intval($item['parent']) - ); + intval($item['parent']), + intval($item['parent']) + ); } if($p) $parent = $p[0]; @@ -2471,8 +2623,7 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) { logger('diaspora_send_relay: base message: ' . $msg, LOGGER_DATA); - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch))); - //$slap = 'xml=' . urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)); + $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['channel_prvkey'],$contact['xchan_pubkey'],$public_batch))); return(diaspora_transmit($owner,$contact,$slap,$public_batch)); @@ -2506,8 +2657,7 @@ function diaspora_send_retraction($item,$owner,$contact,$public_batch = false) { '$signature' => xmlify(base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256'))) )); - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch))); - //$slap = 'xml=' . urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)); + $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['channel_prvkey'],$contact['xchan_pubkey'],$public_batch))); return(diaspora_transmit($owner,$contact,$slap,$public_batch)); } @@ -2542,7 +2692,7 @@ function diaspora_send_mail($item,$owner,$contact) { $signed_text = $item['guid'] . ';' . $cnv['guid'] . ';' . $body . ';' . $created . ';' . $myaddr . ';' . $cnv['guid']; - $sig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256')); + $sig = base64_encode(rsa_sign($signed_text,$owner['channel_prvkey'],'sha256')); $msg = array( 'guid' => xmlify($item['guid']), @@ -2567,8 +2717,7 @@ function diaspora_send_mail($item,$owner,$contact) { logger('diaspora_conversation: ' . print_r($xmsg,true), LOGGER_DATA); - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($xmsg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],false))); - //$slap = 'xml=' . urlencode(diaspora_msg_build($xmsg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],false)); + $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($xmsg,$owner,$contact,$owner['channel_prvkey'],$contact['xchan_pubkey'],false))); return(diaspora_transmit($owner,$contact,$slap,false)); @@ -2582,6 +2731,21 @@ function diaspora_transmit($owner,$contact,$slap,$public_batch,$queue_run=false) return 200; } + if($public_batch) + $dest_url = $contact['hubloc_callback'] . '/public'; + else + $dest_url = $contact['hubloc_callback'] . '/users/' . $contact['hubloc_guid']; + + logger('diaspora_transmit: URL: ' . $dest_url, LOGGER_DEBUG); + + if(intval(get_config('system','diaspora_test'))) + return 200; + + + +return 200; + + $a = get_app(); $logid = random_string(4); $dest_url = (($public_batch) ? $contact['batch'] : $contact['notify']); diff --git a/include/items.php b/include/items.php index f10a5c570..e9f11ee4a 100755 --- a/include/items.php +++ b/include/items.php @@ -95,6 +95,7 @@ function collect_recipients($item,&$private_envelope) { $recipients[] = $item['author_xchan']; if($item['owner_xchan'] != $item['author_xchan']) $recipients[] = $item['owner_xchan']; + return $recipients; } diff --git a/include/network.php b/include/network.php index 83a3ea4d0..ff0502f5a 100644 --- a/include/network.php +++ b/include/network.php @@ -929,7 +929,7 @@ function discover_by_webbie($webbie) { dbesc($webbie) ); if(! $r) { - $r = q("insert into hubloc ( hubloc_guid, hubloc_hash, hubloc_addr, hubloc_network, hubloc_url, hubloc_host, hubloc_callback, hubloc_updated ) values ('%s','%s','%s','%s','%s','%s','%s','%s')", + $r = q("insert into hubloc ( hubloc_guid, hubloc_hash, hubloc_addr, hubloc_network, hubloc_url, hubloc_host, hubloc_callback, hubloc_updated, hubloc_flags ) values ('%s','%s','%s','%s','%s','%s','%s','%s', %d)", dbesc($guid), dbesc($addr), dbesc($addr), @@ -937,7 +937,8 @@ function discover_by_webbie($webbie) { dbesc(trim($diaspora_base,'/')), dbesc($hostname), dbesc($notify), - dbesc(datetime_convert()) + dbesc(datetime_convert()), + intval(HUBLOC_FLAGS_PRIMARY) ); } $photos = import_profile_photo($vcard['photo'],$addr); diff --git a/include/notifier.php b/include/notifier.php index 180a538bc..7f4d7a9f8 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -103,28 +103,33 @@ function notifier_run($argv, $argc){ ); if($r) { // Get the sender - $s = q("select * from channel where channel_id = %d limit 1", + $s = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_id = %d limit 1", intval($r[0]['abook_channel']) ); if($s) { - - // send a refresh message to each hub they have registered here - $h = q("select * from hubloc where hubloc_hash = '%s'", - dbesc($r[0]['hubloc_hash']) - ); - if($h) { - foreach($h as $hh) { - $data = zot_build_packet($s[0],'refresh',array(array( - 'guid' => $hh['hubloc_guid'], - 'guid_sig' => $hh['hubloc_guid_sig'], - 'url' => $hh['hubloc_url']) - )); - if($data) { - $result = zot_zot($hh['hubloc_callback'],$data); + if($r[0]['hubloc_network'] === 'diaspora' || $r[0]['hubloc_network'] === 'friendica_over_diaspora') { + require_once('include/diaspora.php'); + diaspora_share($s[0],$r[0]); + } + else { + // send a refresh message to each hub they have registered here + $h = q("select * from hubloc where hubloc_hash = '%s'", + dbesc($r[0]['hubloc_hash']) + ); + if($h) { + foreach($h as $hh) { + $data = zot_build_packet($s[0],'refresh',array(array( + 'guid' => $hh['hubloc_guid'], + 'guid_sig' => $hh['hubloc_guid_sig'], + 'url' => $hh['hubloc_url']) + )); + if($data) { + $result = zot_zot($hh['hubloc_callback'],$data); // zot_queue_item is not yet written // if(! $result['success']) // zot_queue_item(); + } } } } @@ -366,6 +371,8 @@ function notifier_run($argv, $argc){ } + $walltowall = (($top_level_post && $channel['xchan_hash'] === $target_item['author_xchan']) ? true : false); + // Generic delivery section, we have an encoded item and recipients // Now start the delivery process @@ -438,11 +445,11 @@ function notifier_run($argv, $argc){ // aren't the owner or author. - $r = q("select hubloc_sitekey, hubloc_flags, hubloc_callback, hubloc_host from hubloc + $r = q("select hubloc_guid, hubloc_sitekey, hubloc_network, hubloc_flags, hubloc_callback, hubloc_host from hubloc where hubloc_hash in (" . implode(',',$recipients) . ") group by hubloc_sitekey order by hubloc_connected desc limit 1"); } else { - $r = q("select hubloc_sitekey, hubloc_flags, hubloc_callback, hubloc_host from hubloc + $r = q("select hubloc_guid, hubloc_sitekey, hubloc_network, hubloc_flags, hubloc_callback, hubloc_host from hubloc where hubloc_hash in (" . implode(',',$recipients) . ") $sql_extra group by hubloc_sitekey"); } @@ -485,6 +492,42 @@ function notifier_run($argv, $argc){ } } + + if($hub['hubloc_network'] === 'diaspora' || $hub['hubloc_network'] === 'friendica-over-diaspora') { + if(! get_config('system','diaspora_enabled')) + continue; + + require_once('include/diaspora.php'); + + diaspora_process_outbound(array( + 'channel' => $channel, + 'env_recips' => $env_recips, + 'recipients' => $recipients, + 'item' => $item, + 'target_item' => $target_item, + 'hub' => $hub, + 'top_level_post' => $top_level_post, + 'private' => $private, + 'followup' => $followup, + 'relay_to_owner' => $relay_to_owner, + 'uplink' => $uplink, + 'cmd' => $cmd, + 'expire' => $expire, + 'mail' => $mail, + 'fsuggest' => $fsuggest, + 'normal_mode' => $normal_mode, + 'packet_type' => $packet_type, + 'walltowall' => $walltowall + )); + + continue; + + } + + + // default: zot protocol + + $hash = random_string(); if($packet_type === 'refresh' || $packet_type === 'purge') { $n = zot_build_packet($channel,$packet_type); diff --git a/include/zot.php b/include/zot.php index a155b2588..65c092b93 100644 --- a/include/zot.php +++ b/include/zot.php @@ -198,11 +198,17 @@ function zot_finger($webbie,$channel,$autofallback = true) { if($r) { $url = $r[0]['hubloc_url']; + + if($r[0]['hubloc_network'] && $r[0]['hubloc_network'] !== 'zot') { + logger('zot_finger: alternate network: ' . $webbie); + return array('success' => false); + } } else { $url = 'https://' . $host; } - + + $rhs = '/.well-known/zot-info'; $https = ((strpos($url,'https://') === 0) ? true : false); @@ -271,6 +277,11 @@ function zot_finger($webbie,$channel,$autofallback = true) { function zot_refresh($them,$channel = null, $force = false) { + if(array_key_exists('xchan_network',$them) && ($them['xchan_network'] !== 'zot')) { + logger('zot_refresh: not got zot. ' . $them['xchan_name']); + return true; + } + logger('zot_refresh: them: ' . print_r($them,true), LOGGER_DATA); if($channel) logger('zot_refresh: channel: ' . print_r($channel,true), LOGGER_DATA); diff --git a/view/tpl/diaspora_comment.tpl b/view/tpl/diaspora_comment.tpl new file mode 100644 index 000000000..27ec3dffc --- /dev/null +++ b/view/tpl/diaspora_comment.tpl @@ -0,0 +1,11 @@ +<XML> + <post> + <comment> + <guid>{{$guid}}</guid> + <parent_guid>{{$parent_guid}}</parent_guid> + <author_signature>{{$authorsig}}</author_signature> + <text>{{$body}}</text> + <diaspora_handle>{{$handle}}</diaspora_handle> + </comment> + </post> +</XML>
\ No newline at end of file diff --git a/view/tpl/diaspora_comment_relay.tpl b/view/tpl/diaspora_comment_relay.tpl new file mode 100644 index 000000000..37a9e88b3 --- /dev/null +++ b/view/tpl/diaspora_comment_relay.tpl @@ -0,0 +1,12 @@ +<XML> + <post> + <comment> + <guid>{{$guid}}</guid> + <parent_guid>{{$parent_guid}}</parent_guid> + <parent_author_signature>{{$parentsig}}</parent_author_signature> + <author_signature>{{$authorsig}}</author_signature> + <text>{{$body}}</text> + <diaspora_handle>{{$handle}}</diaspora_handle> + </comment> + </post> +</XML>
\ No newline at end of file diff --git a/view/tpl/diaspora_conversation.tpl b/view/tpl/diaspora_conversation.tpl new file mode 100644 index 000000000..dc4482e4b --- /dev/null +++ b/view/tpl/diaspora_conversation.tpl @@ -0,0 +1,29 @@ +<XML> + <post> + <conversation> + <guid>{{$conv.guid}}</guid> + <subject>{{$conv.subject}}</subject> + <created_at>{{$conv.created_at}}</created_at> + + {{foreach $conv.messages as $msg}} + + <message> + <guid>{{$msg.guid}}</guid> + <parent_guid>{{$msg.parent_guid}}</parent_guid> + {{if $msg.parent_author_signature}} + <parent_author_signature>{{$msg.parent_author_signature}}</parent_author_signature> + {{/if}} + <author_signature>{{$msg.author_signature}}</author_signature> + <text>{{$msg.text}}</text> + <created_at>{{$msg.created_at}}</created_at> + <diaspora_handle>{{$msg.diaspora_handle}}</diaspora_handle> + <conversation_guid>{{$msg.conversation_guid}}</conversation_guid> + </message> + + {{/foreach}} + + <diaspora_handle>{{$conv.diaspora_handle}}</diaspora_handle> + <participant_handles>{{$conv.participant_handles}}</participant_handles> + </conversation> + </post> +</XML> diff --git a/view/tpl/diaspora_like.tpl b/view/tpl/diaspora_like.tpl new file mode 100644 index 000000000..a27e92240 --- /dev/null +++ b/view/tpl/diaspora_like.tpl @@ -0,0 +1,12 @@ +<XML> + <post> + <like> + <positive>{{$positive}}</positive> + <guid>{{$guid}}</guid> + <target_type>{{$target_type}}</target_type> + <parent_guid>{{$parent_guid}}</parent_guid> + <author_signature>{{$authorsig}}</author_signature> + <diaspora_handle>{{$handle}}</diaspora_handle> + </like> + </post> +</XML> diff --git a/view/tpl/diaspora_like_relay.tpl b/view/tpl/diaspora_like_relay.tpl new file mode 100644 index 000000000..8209540c5 --- /dev/null +++ b/view/tpl/diaspora_like_relay.tpl @@ -0,0 +1,13 @@ +<XML> + <post> + <like> + <positive>{{$positive}}</positive> + <guid>{{$guid}}</guid> + <target_type>{{$target_type}}</target_type> + <parent_guid>{{$parent_guid}}</parent_guid> + <parent_author_signature>{{$parentsig}}</parent_author_signature> + <author_signature>{{$authorsig}}</author_signature> + <diaspora_handle>{{$handle}}</diaspora_handle> + </like> + </post> +</XML> diff --git a/view/tpl/diaspora_message.tpl b/view/tpl/diaspora_message.tpl new file mode 100644 index 000000000..3413d79b0 --- /dev/null +++ b/view/tpl/diaspora_message.tpl @@ -0,0 +1,13 @@ +<XML> + <post> + <message> + <guid>{{$msg.guid}}</guid> + <parent_guid>{{$msg.parent_guid}}</parent_guid> + <author_signature>{{$msg.author_signature}}</author_signature> + <text>{{$msg.text}}</text> + <created_at>{{$msg.created_at}}</created_at> + <diaspora_handle>{{$msg.diaspora_handle}}</diaspora_handle> + <conversation_guid>{{$msg.conversation_guid}}</conversation_guid> + </message> + </post> +</XML> diff --git a/view/tpl/diaspora_photo.tpl b/view/tpl/diaspora_photo.tpl new file mode 100644 index 000000000..256459d8d --- /dev/null +++ b/view/tpl/diaspora_photo.tpl @@ -0,0 +1,13 @@ +<XML> + <post> + <photo> + <guid>{{$guid}}</guid> + <diaspora_handle>{{$handle}}</diaspora_handle> + <public>{{$public}}</public> + <created_at>{{$created_at}}</created_at> + <remote_photo_path>{{$path}}</remote_photo_path> + <remote_photo_name>{{$filename}}</remote_photo_name> + <status_message_guid>{{$msg_guid}}</status_message_guid> + </photo> + </post> +</XML> diff --git a/view/tpl/diaspora_post.tpl b/view/tpl/diaspora_post.tpl new file mode 100644 index 000000000..2fe916e00 --- /dev/null +++ b/view/tpl/diaspora_post.tpl @@ -0,0 +1,12 @@ +<XML> + <post> + <status_message> + <raw_message>{{$body}}</raw_message> + <guid>{{$guid}}</guid> + <diaspora_handle>{{$handle}}</diaspora_handle> + <public>{{$public}}</public> + <created_at>{{$created}}</created_at> + <provider_display_name>{{$provider}}</provider_display_name> + </status_message> + </post> +</XML> diff --git a/view/tpl/diaspora_profile.tpl b/view/tpl/diaspora_profile.tpl new file mode 100644 index 000000000..cf53f51c0 --- /dev/null +++ b/view/tpl/diaspora_profile.tpl @@ -0,0 +1,16 @@ +<XML> + <post><profile> + <diaspora_handle>{{$handle}}</diaspora_handle> + <first_name>{{$first}}</first_name> + <last_name>{{$last}}</last_name> + <image_url>{{$large}}</image_url> + <image_url_medium>{{$medium}}</image_url_medium> + <image_url_small>{{$small}}</image_url_small> + <birthday>{{$dob}}</birthday> + <gender>{{$gender}}</gender> + <bio>{{$about}}</bio> + <location>{{$location}}</location> + <searchable>{{$searchable}}</searchable> + <tag_string>{{$tags}}</tag_string> + </profile></post> +</XML> diff --git a/view/tpl/diaspora_relay_retraction.tpl b/view/tpl/diaspora_relay_retraction.tpl new file mode 100644 index 000000000..5e7aed41f --- /dev/null +++ b/view/tpl/diaspora_relay_retraction.tpl @@ -0,0 +1,10 @@ +<XML> + <post> + <relayable_retraction> + <target_type>{{$type}}</target_type> + <target_guid>{{$guid}}</target_guid> + <target_author_signature>{{$signature}}</target_author_signature> + <sender_handle>{{$handle}}</sender_handle> + </relayable_retraction> + </post> +</XML> diff --git a/view/tpl/diaspora_relayable_retraction.tpl b/view/tpl/diaspora_relayable_retraction.tpl new file mode 100644 index 000000000..4e3ff3243 --- /dev/null +++ b/view/tpl/diaspora_relayable_retraction.tpl @@ -0,0 +1,11 @@ +<XML> + <post> + <relayable_retraction> + <parent_author_signature>{{$parentsig}}</parent_author_signature> + <target_guid>{{$guid}}</target_guid> + <target_type>{{$target_type}}</target_type> + <sender_handle>{{$handle}}</sender_handle> + <target_author_signature>{{$authorsig}}</target_author_signature> + </relayable_retraction> + </post> +</XML> diff --git a/view/tpl/diaspora_reshare.tpl b/view/tpl/diaspora_reshare.tpl new file mode 100644 index 000000000..963bb9e12 --- /dev/null +++ b/view/tpl/diaspora_reshare.tpl @@ -0,0 +1,13 @@ +<XML> + <post> + <reshare> + <root_diaspora_id>{{$root_handle}}</root_diaspora_id> + <root_guid>{{$root_guid}}</root_guid> + <guid>{{$guid}}</guid> + <diaspora_handle>{{$handle}}</diaspora_handle> + <public>{{$public}}</public> + <created_at>{{$created}}</created_at> + <provider_display_name>{{$provider}}</provider_display_name> + </reshare> + </post> +</XML> diff --git a/view/tpl/diaspora_retract.tpl b/view/tpl/diaspora_retract.tpl new file mode 100644 index 000000000..9df066d38 --- /dev/null +++ b/view/tpl/diaspora_retract.tpl @@ -0,0 +1,9 @@ +<XML> + <post> + <retraction> + <post_guid>{{$guid}}</post_guid> + <diaspora_handle>{{$handle}}</diaspora_handle> + <type>{{$type}}</type> + </retraction> + </post> +</XML> diff --git a/view/tpl/diaspora_share.tpl b/view/tpl/diaspora_share.tpl new file mode 100644 index 000000000..59eb06124 --- /dev/null +++ b/view/tpl/diaspora_share.tpl @@ -0,0 +1,8 @@ +<XML> + <post> + <request> + <sender_handle>{{$sender}}</sender_handle> + <recipient_handle>{{$recipient}}</recipient_handle> + </request> + </post> +</XML>
\ No newline at end of file diff --git a/view/tpl/diaspora_signed_retract.tpl b/view/tpl/diaspora_signed_retract.tpl new file mode 100644 index 000000000..f0f346da8 --- /dev/null +++ b/view/tpl/diaspora_signed_retract.tpl @@ -0,0 +1,10 @@ +<XML> + <post> + <signed_retraction> + <target_guid>{{$guid}}</target_guid> + <target_type>{{$type}}</target_type> + <sender_handle>{{$handle}}</sender_handle> + <target_author_signature>{{$signature}}</target_author_signature> + </signed_retraction> + </post> +</XML> diff --git a/view/tpl/notifications.tpl b/view/tpl/notifications.tpl index ae87c8ec8..285efbae0 100755 --- a/view/tpl/notifications.tpl +++ b/view/tpl/notifications.tpl @@ -1,6 +1,6 @@ <h1>{{$notif_header}}</h1> {{if $notifications_available}} -<a href="#" onclick="markRead('notify');">{{$notif_link_mark_seen}}</a> +<a href="#" onclick="markRead('notify'); setTimeout(function() { window.location.href=window.location.href; },1500); return false;">{{$notif_link_mark_seen}}</a> {{/if}} <div class="notif-network-wrapper"> {{$notif_content}} diff --git a/view/tpl/xrd_diaspora.tpl b/view/tpl/xrd_diaspora.tpl index 143980bcc..aa0d8c740 100644 --- a/view/tpl/xrd_diaspora.tpl +++ b/view/tpl/xrd_diaspora.tpl @@ -1,8 +1,3 @@ -{{* - * AUTOMATICALLY GENERATED TEMPLATE - * DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN - * - *}} <Link rel="http://joindiaspora.com/seed_location" type="text/html" href="{{$baseurl}}/" /> <Link rel="http://joindiaspora.com/guid" type="text/html" href="{{$dspr_guid}}" /> <Link rel="diaspora-public-key" type="RSA" href="{{$dspr_key}}" /> |