X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fdiaspora.php;h=1ae8ca8006e3d4f3cf3551d7ac3e27c4266e1129;hb=c6ac4387350eefce8ba68485c49ba8da60ff437b;hp=2145ca56ccc8e54ed137d88c06d535d96afaaf09;hpb=5c0e135fe98fc91cee32e065c81e7a440c25ee2c;p=friendica.git diff --git a/include/diaspora.php b/include/diaspora.php index 2145ca56cc..1ae8ca8006 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -8,15 +8,18 @@ require_once('include/contact_selectors.php'); function diaspora_dispatch_public($msg) { - $r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN ( SELECT `uid` FROM `contact` WHERE `network` = '%s' AND `addr` = '%s' ) ", + $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 ", dbesc(NETWORK_DIASPORA), dbesc($msg['author']) ); if(count($r)) { foreach($r as $rr) { + logger('diaspora_public: delivering to: ' . $rr['username']); diaspora_dispatch($rr,$msg); } } + else + logger('diaspora_public: no subscribers'); } @@ -65,6 +68,7 @@ function diaspora_get_contact_by_handle($uid,$handle) { } function find_diaspora_person_by_handle($handle) { + $update = false; $r = q("select * from fcontact where network = '%s' and addr = '%s' limit 1", dbesc(NETWORK_DIASPORA), dbesc($handle) @@ -72,18 +76,14 @@ function find_diaspora_person_by_handle($handle) { if(count($r)) { // update record occasionally so it doesn't get stale $d = strtotime($r[0]['updated'] . ' +00:00'); - if($d < strtotime('now - 14 days')) { - q("delete from fcontact where id = %d limit 1", - intval($r[0]['id']) - ); - } - else + if($d > strtotime('now - 14 days')) return $r[0]; + $update = true; } require_once('include/Scrape.php'); $r = probe_url($handle, PROBE_DIASPORA); if((count($r)) && ($r['network'] === NETWORK_DIASPORA)) { - add_fcontact($r); + add_fcontact($r,$update); return ($r); } return false; @@ -100,9 +100,60 @@ function get_diaspora_key($uri) { } -function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) { +function diaspora_pubmsg_build($msg,$user,$contact,$prvkey,$pubkey) { $a = get_app(); + logger('diaspora_pubmsg_build: ' . $msg, LOGGER_DATA); + + + $handle = $user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); + +// $b64_data = base64_encode($msg); +// $b64url_data = base64url_encode($b64_data); + + $b64url_data = base64url_encode($msg); + + $data = str_replace(array("\n","\r"," ","\t"),array('','','',''),$b64url_data); + + $type = 'application/xml'; + $encoding = 'base64url'; + $alg = 'RSA-SHA256'; + + $signable_data = $data . '.' . base64url_encode($type) . '.' + . base64url_encode($encoding) . '.' . base64url_encode($alg) ; + + $signature = rsa_sign($signable_data,$prvkey); + $sig = base64url_encode($signature); + +$magic_env = <<< EOT + + +
+ $handle +
+ + base64url + RSA-SHA256 + $data + $sig + +
+EOT; + + logger('diaspora_pubmsg_build: magic_env: ' . $magic_env, LOGGER_DATA); + return $magic_env; + +} + + + + +function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey,$public = false) { + $a = get_app(); + + if($public) + return diaspora_pubmsg_build($msg,$user,$contact,$prvkey,$pubkey); + logger('diaspora_msg_build: ' . $msg, LOGGER_DATA); $inner_aes_key = random_string(32); @@ -115,7 +166,7 @@ function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) { $outer_iv = random_string(16); $b_outer_iv = base64_encode($outer_iv); - $handle = 'acct:' . $user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); + $handle = $user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); $padded_data = pkcs5_pad($msg,16); $inner_encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $inner_aes_key, $padded_data, MCRYPT_MODE_CBC, $inner_iv); @@ -126,7 +177,7 @@ function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) { $b64url_data = base64url_encode($b64_data); $data = str_replace(array("\n","\r"," ","\t"),array('','','',''),$b64url_data); - $type = 'application/atom+xml'; + $type = 'application/xml'; $encoding = 'base64url'; $alg = 'RSA-SHA256'; @@ -140,10 +191,7 @@ $decrypted_header = <<< EOT $b_inner_iv $b_inner_aes_key - - {$user['username']} - $handle - + $handle EOT; @@ -168,15 +216,15 @@ EOT; $magic_env = <<< EOT - + $encrypted_header - + base64url RSA-SHA256 $data $sig - + EOT; logger('diaspora_msg_build: magic_env: ' . $magic_env, LOGGER_DATA); @@ -204,11 +252,11 @@ function diaspora_decode($importer,$xml) { $public = false; $basedom = parse_xml_string($xml); - $children = $basedom->children(NAMESPACE_DIASPORA_PROTOCOL); + $children = $basedom->children('https://joindiaspora.com/protocol'); if($children->header) { $public = true; - $author_link = str_replace('acct:','',$children->author_id); + $author_link = str_replace('acct:','',$children->header->author_id); } else { @@ -246,7 +294,7 @@ function diaspora_decode($importer,$xml) { ***** CURRENT - * acct:galaxor@diaspora.priateship.org + * galaxor@diaspora.priateship.org ***** END DIFFS @@ -288,16 +336,6 @@ function diaspora_decode($importer,$xml) { // strip whitespace so our data element will return to one big base64 blob $data = str_replace(array(" ","\t","\r","\n"),array("","","",""),$base->data); - // Add back the 60 char linefeeds - - // This completely violates the entire principle of salmon magic signatures, - // which was to have a message signing format that was completely ambivalent to linefeeds - // and transport whitespace mangling, and base64 wrapping rules. Guess what? PHP and Ruby - // use different linelengths for base64 output. - -// $lines = str_split($data,60); - // $data = implode("\n",$lines); - // stash away some other stuff for later @@ -391,13 +429,16 @@ function diaspora_request($importer,$xml) { return; } - $r = q("INSERT INTO `contact` (`uid`, `network`,`addr`,`created`,`url`,`name`,`nick`,`photo`,`pubkey`,`notify`,`poll`,`blocked`,`priority`) - VALUES ( %d, '%s', '%s', '%s','%s','%s','%s','%s','%s','%s','%s',%d,%d) ", + $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) ", intval($importer['uid']), dbesc($ret['network']), dbesc($ret['addr']), datetime_convert(), dbesc($ret['url']), + dbesc($batch), dbesc($ret['name']), dbesc($ret['nick']), dbesc($ret['photo']), @@ -947,7 +988,7 @@ function diaspora_unshare($me,$contact) { -function diaspora_send_status($item,$owner,$contact) { +function diaspora_send_status($item,$owner,$contact,$public_batch = false) { $a = get_app(); $myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); @@ -989,19 +1030,19 @@ function diaspora_send_status($item,$owner,$contact) { logger('diaspora_send_status: ' . $owner['username'] . ' -> ' . $contact['name'] . ' base message: ' . $msg, LOGGER_DATA); - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey']))); + $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch))); - $return_code = diaspora_transmit($owner,$contact,$slap); + $return_code = diaspora_transmit($owner,$contact,$slap,$public_batch); if(count($images)) { - diaspora_send_images($item,$owner,$contact,$images); + diaspora_send_images($item,$owner,$contact,$images,$public_batch); } return $return_code; } -function diaspora_send_images($item,$owner,$contact,$images) { +function diaspora_send_images($item,$owner,$contact,$images,$public_batch = false) { $a = get_app(); if(! count($images)) return; @@ -1033,14 +1074,14 @@ function diaspora_send_images($item,$owner,$contact,$images) { logger('diaspora_send_photo: base message: ' . $msg, LOGGER_DATA); - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey']))); + $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch))); - diaspora_transmit($owner,$contact,$slap); + diaspora_transmit($owner,$contact,$slap,$public_batch); } } -function diaspora_send_followup($item,$owner,$contact) { +function diaspora_send_followup($item,$owner,$contact,$public_batch = false) { $a = get_app(); $myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); @@ -1088,13 +1129,13 @@ function diaspora_send_followup($item,$owner,$contact) { logger('diaspora_followup: base message: ' . $msg, LOGGER_DATA); - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey']))); + $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch))); - return(diaspora_transmit($owner,$contact,$slap)); + return(diaspora_transmit($owner,$contact,$slap,$public_batch)); } -function diaspora_send_relay($item,$owner,$contact) { +function diaspora_send_relay($item,$owner,$contact,$public_batch = false) { $a = get_app(); @@ -1190,15 +1231,15 @@ function diaspora_send_relay($item,$owner,$contact) { logger('diaspora_relay_comment: base message: ' . $msg, LOGGER_DATA); - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey']))); + $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch))); - return(diaspora_transmit($owner,$contact,$slap)); + return(diaspora_transmit($owner,$contact,$slap,$public_batch)); } -function diaspora_send_retraction($item,$owner,$contact) { +function diaspora_send_retraction($item,$owner,$contact,$public_batch = false) { $a = get_app(); $myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); @@ -1210,32 +1251,35 @@ function diaspora_send_retraction($item,$owner,$contact) { '$handle' => $myaddr )); - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey']))); + $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch))); - return(diaspora_transmit($owner,$contact,$slap)); + return(diaspora_transmit($owner,$contact,$slap,$public_batch)); } -function diaspora_transmit($owner,$contact,$slap) { +function diaspora_transmit($owner,$contact,$slap,$public_batch) { $a = get_app(); - - post_url($contact['notify'] . '/',$slap); + $logid = random_string(4); + logger('diaspora_transmit: ' . $logid . ' ' . (($public_batch) ? $contact['batch'] : $contact['notify'])); + post_url((($public_batch) ? $contact['batch'] : $contact['notify']) . '/',$slap); $return_code = $a->get_curl_code(); - logger('diaspora_transmit: returns: ' . $return_code); + logger('diaspora_transmit: ' . $logid . ' returns: ' . $return_code); - if(! $return_code) { + 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`) - VALUES ( %d, '%s', '%s', '%s') ", + 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) + dbesc($slap), + intval($public_batch) ); } + return(($return_code) ? $return_code : (-1)); }