aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/Scrape.php2
-rw-r--r--include/diaspora.php262
-rw-r--r--include/items.php2
-rw-r--r--include/network.php22
-rw-r--r--include/notifier.php28
-rw-r--r--include/security.php2
-rw-r--r--include/text.php2
7 files changed, 253 insertions, 67 deletions
diff --git a/include/Scrape.php b/include/Scrape.php
index 1c9fe7d45..cc46af644 100644
--- a/include/Scrape.php
+++ b/include/Scrape.php
@@ -485,7 +485,7 @@ function probe_url($url, $mode = PROBE_NORMAL) {
if($diaspora && $diaspora_base && $diaspora_guid) {
if($mode == PROBE_DIASPORA || ! $notify)
- $notify = $diaspora_base . 'receive/post/' . $diaspora_guid;
+ $notify = $diaspora_base . 'receive/users/' . $diaspora_guid;
if(strpos($url,'@'))
$addr = str_replace('acct:', '', $url);
}
diff --git a/include/diaspora.php b/include/diaspora.php
index 9987c2139..b14c38f1d 100644
--- a/include/diaspora.php
+++ b/include/diaspora.php
@@ -4,25 +4,11 @@ require_once('include/crypto.php');
require_once('include/items.php');
function get_diaspora_key($uri) {
- $key = '';
-
logger('Fetching diaspora key for: ' . $uri);
- $arr = lrdd($uri);
-
- if(is_array($arr)) {
- foreach($arr as $a) {
- if($a['@attributes']['rel'] === 'diaspora-public-key') {
- $key = base64_decode($a['@attributes']['href']);
- }
- }
- }
- else {
- return '';
- }
-
- if($key)
- return rsatopem($key);
+ $r = find_diaspora_person_by_handle($uri);
+ if($r)
+ return $r['pubkey'];
return '';
}
@@ -40,6 +26,8 @@ function diaspora_base_message($type,$data) {
function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) {
$a = get_app();
+ logger('diaspora_msg_build: ' . $msg, LOGGER_DATA);
+
$inner_aes_key = random_string(32);
$b_inner_aes_key = base64_encode($inner_aes_key);
$inner_iv = random_string(32);
@@ -110,6 +98,7 @@ $magic_env = <<< EOT
</entry>
EOT;
+ logger('diaspora_msg_build: magic_env: ' . $magic_env, LOGGER_DATA);
return $magic_env;
}
@@ -218,7 +207,7 @@ function diaspora_decode($importer,$xml) {
$encoding = $base->encoding;
$alg = $base->alg;
- // Diaspora devs: I can't even begin to tell you how sucky this is. Read the freaking spec.
+ // Diaspora devs: I can't even begin to tell you how sucky this is. Please read the spec.
$signed_data = $data . (($data[-1] != "\n") ? "\n" : '') . '.' . base64url_encode($type) . "\n" . '.' . base64url_encode($encoding) . "\n" . '.' . base64url_encode($alg) . "\n";
@@ -278,28 +267,33 @@ function diaspora_get_contact_by_handle($uid,$handle) {
return false;
}
-function find_person_by_handle($handle) {
- $r = q("select * from fcontact where network = '%s' and addr = '%s' limit 1",
- dbesc(NETWORK_DIASPORA),
- dbesc($handle)
- );
- if(count($r))
- return $r[0];
-
- // we don't care about the uid, we just want to save an expensive webfinger probe
- $r = q("select * from contact where network = '%s' and addr = '%s' LIMIT 1",
- dbesc(NETWORK_DIASPORA),
- dbesc($handle)
- );
- if(count($r))
+function find_diaspora_person_by_handle($handle) {
+ $r = q("select * from fcontact where network = '%s' and addr = '%s' limit 1",
+ dbesc(NETWORK_DIASPORA),
+ dbesc($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
return $r[0];
- $r = probe_url($handle);
- // need to cached this, perhaps in fcontact
- if(count($r))
- return ($r);
- return false;
+ }
+ require_once('include/Scrape.php');
+ $r = probe_url($handle, PROBE_DIASPORA);
+ if((count($r)) && ($r['network'] === NETWORK_DIASPORA)) {
+ add_fcontact($r);
+ return ($r);
+ }
+ return false;
}
+
+
function diaspora_request($importer,$xml) {
$sender_handle = unxmlify($xml->sender_handle);
@@ -317,7 +311,7 @@ function diaspora_request($importer,$xml) {
// That makes us friends.
if($contact['rel'] == CONTACT_IS_FOLLOWER) {
- q("UPDATE `contact` SET `rel` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval(CONTACT_IS_FRIEND),
intval($contact['id']),
intval($importer['uid'])
@@ -327,8 +321,8 @@ function diaspora_request($importer,$xml) {
return;
}
- require_once('include/Scrape.php');
- $ret = probe_url($sender_handle);
+ $ret = find_diaspora_person_by_handle($sender_handle);
+
if((! count($ret)) || ($ret['network'] != NETWORK_DIASPORA)) {
logger('diaspora_request: Cannot resolve diaspora handle ' . $sender_handle . ' for ' . $recipient_handle);
@@ -359,11 +353,12 @@ function diaspora_request($importer,$xml) {
$hash = random_string() . (string) time(); // Generate a confirm_key
if($contact_record) {
- $ret = q("INSERT INTO `intro` ( `uid`, `contact-id`, `blocked`, `knowyou`, `note`, `hash`, `datetime`,`blocked`)
- VALUES ( %d, %d, 1, %d, '%s', '%s', '%s', 0 )",
+ $ret = q("INSERT INTO `intro` ( `uid`, `contact-id`, `blocked`, `knowyou`, `note`, `hash`, `datetime` )
+ VALUES ( %d, %d, %d, %d, '%s', '%s', '%s' )",
intval($importer['uid']),
intval($contact_record['id']),
0,
+ 0,
dbesc( t('Sharing notification from Diaspora network')),
dbesc($hash),
dbesc(datetime_convert())
@@ -490,7 +485,7 @@ function diaspora_comment($importer,$xml,$msg) {
dbesc($parent_guid)
);
if(! count($r)) {
- logger('diaspora_comment: parent item not found: ' . $guid);
+ logger('diaspora_comment: parent item not found: parent: ' . $parent_guid . ' item: ' . $guid);
return;
}
$parent_item = $r[0];
@@ -504,7 +499,7 @@ function diaspora_comment($importer,$xml,$msg) {
$key = $msg['key'];
}
else {
- $person = find_person_by_handle($diaspora_handle);
+ $person = find_diaspora_person_by_handle($diaspora_handle);
if(is_array($person) && x($person,'pubkey'))
$key = $person['pubkey'];
@@ -519,6 +514,7 @@ function diaspora_comment($importer,$xml,$msg) {
return;
}
+
if($parent_author_signature) {
$owner_signed_data = $guid . ';' . $parent_guid . ';' . $text . ';' . $msg['author'];
@@ -585,8 +581,18 @@ function diaspora_comment($importer,$xml,$msg) {
$datarray['author-avatar'] = ((x($person,'thumb')) ? $person['thumb'] : $person['photo']);
$datarray['body'] = $body;
- item_store($datarray);
+ $message_id = item_store($datarray);
+ if(! $parent_author_signature) {
+ q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
+ intval($message_id),
+ dbesc($author_signed_data),
+ dbesc(base64_encode($author_signature)),
+ dbesc($diaspora_handle)
+ );
+ }
+
+ // notify others
return;
}
@@ -661,7 +667,7 @@ function diaspora_like($importer,$xml,$msg) {
$key = $msg['key'];
}
else {
- $person = find_person_by_handle($diaspora_handle);
+ $person = find_diaspora_person_by_handle($diaspora_handle);
if(is_array($person) && x($person,'pubkey'))
$key = $person['pubkey'];
else {
@@ -743,12 +749,20 @@ EOT;
$arr['unseen'] = 1;
$arr['last-child'] = 0;
- $post_id = item_store($arr);
+ $message_id = item_store($arr);
+ if(! $parent_author_signature) {
+ q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
+ intval($message_id),
+ dbesc($author_signed_data),
+ dbesc(base64_encode($author_signature)),
+ dbesc($diaspora_handle)
+ );
+ }
// FIXME send notification
-
+ return;
}
function diaspora_retraction($importer,$xml) {
@@ -775,13 +789,14 @@ function diaspora_share($me,$contact) {
$myaddr = $me['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
$theiraddr = $contact['addr'];
+logger('diaspora_share: contact: ' . print_r($contact,true), LOGGER_DATA);
$tpl = get_markup_template('diaspora_share.tpl');
$msg = replace_macros($tpl, array(
- '$sender' => myaddr,
+ '$sender' => $myaddr,
'$recipient' => $theiraddr
));
- $slap = 'xml=' . urlencode(diaspora_msg_build($msg,$me,$contact,$me['prvkey'],$contact['pubkey']));
+ $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$me,$contact,$me['prvkey'],$contact['pubkey'])));
post_url($contact['notify'],$slap);
$return_code = $a->get_curl_code();
@@ -791,7 +806,7 @@ function diaspora_share($me,$contact) {
function diaspora_send_status($item,$owner,$contact) {
$a = get_app();
- $myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
+ $myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
$theiraddr = $contact['addr'];
require_once('include/bbcode.php');
@@ -812,7 +827,7 @@ function diaspora_send_status($item,$owner,$contact) {
logger('diaspora_send_status: base message: ' . $msg, LOGGER_DATA);
- $slap = 'xml=' . 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'])));
post_url($contact['notify'],$slap);
$return_code = $a->get_curl_code();
@@ -820,3 +835,146 @@ function diaspora_send_status($item,$owner,$contact) {
return $return_code;
}
+
+function diaspora_send_followup($item,$owner,$contact) {
+
+ $a = get_app();
+ $myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
+ $theiraddr = $contact['addr'];
+
+ $p = q("select guid from item where parent = %d limit 1",
+ $item['parent']
+ );
+ if(count($p))
+ $parent_guid = $p[0]['guid'];
+ else
+ return;
+
+ if($item['verb'] === ACTIVITY_LIKE) {
+ $tpl = get_markup_template('diaspora_like.tpl');
+ $like = true;
+ $target_type = 'Post';
+ $positive = (($item['deleted']) ? 'false' : 'true');
+ }
+ else {
+ $tpl = get_markup_template('diaspora_comment.tpl');
+ $like = false;
+ }
+
+ $text = bbcode($item['body']);
+
+ // sign it
+
+ if($like)
+ $signed_text = $item['guid'] . ';' . $target_type . ';' . $positive . ';' . $myaddr;
+ else
+ $signed_text = $item['guid'] . ';' . $parent_guid . ';' . $text . ';' . $myaddr;
+
+ $authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey']));
+
+ $msg = replace_macros($tpl,array(
+ '$guid' => xmlify($item['guid']),
+ '$parent_guid' => xmlify($parent_guid),
+ '$target_type' =>xmlify($target_type),
+ '$authorsig' => xmlify($authorsig),
+ '$body' => xmlify($text),
+ '$positive' => xmlify($positive),
+ '$handle' => xmlify($myaddr)
+ ));
+
+ logger('diaspora_followup: base message: ' . $msg, LOGGER_DATA);
+
+ $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
+
+ post_url($contact['notify'],$slap);
+ $return_code = $a->get_curl_code();
+ logger('diaspora_send_status: returns: ' . $return_code);
+ return $return_code;
+
+}
+
+
+function diaspora_send_relay($item,$owner,$contact) {
+
+
+ $a = get_app();
+ $myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
+ $theiraddr = $contact['addr'];
+
+
+ $p = q("select guid from item where parent = %d limit 1",
+ $item['parent']
+ );
+ if(count($p))
+ $parent_guid = $p[0]['guid'];
+ else
+ return;
+
+ // fetch the original signature
+ $r = q("select * from sign where iid = %d limit 1",
+ intval($item['id'])
+ );
+ if(! count($r))
+ return;
+ $orig_sign = $r[0];
+
+ if($item['verb'] === ACTIVITY_LIKE) {
+ $tpl = get_markup_template('diaspora_like_relay.tpl');
+ $like = true;
+ $target_type = 'Post';
+ $positive = (($item['deleted']) ? 'false' : 'true');
+ }
+ else {
+ $tpl = get_markup_template('diaspora_comment_relay.tpl');
+ $like = false;
+ }
+
+ $text = bbcode($item['body']);
+
+ // sign it
+
+ if($like)
+ $parent_signed_text = $orig_sign['signed_text'];
+ else
+ $parent_signed_text = $orig_sign['signed_text'];
+
+ $parentauthorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey']));
+
+ $msg = replace_macros($tpl,array(
+ '$guid' => xmlify($item['guid']),
+ '$parent_guid' => xmlify($parent_guid),
+ '$target_type' =>xmlify($target_type),
+ '$authorsig' => xmlify($orig_sign['signature']),
+ '$parentsig' => xmlify($parentauthorsig),
+ '$text' => xmlify($text),
+ '$positive' => xmlify($positive),
+ '$diaspora_handle' => xmlify($myaddr)
+ ));
+
+ // fetch the original signature
+ $r = q("select * from sign where iid = %d limit 1",
+ intval($item['id'])
+ );
+ if(! count($r))
+ return;
+
+ logger('diaspora_relay_comment: base message: ' . $msg, LOGGER_DATA);
+
+ $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
+
+ post_url($contact['notify'],$slap);
+ $return_code = $a->get_curl_code();
+ logger('diaspora_send_status: returns: ' . $return_code);
+ return $return_code;
+
+}
+
+
+
+function diaspora_send_retraction($item,$owner,$contact) {
+
+
+
+
+
+} \ No newline at end of file
diff --git a/include/items.php b/include/items.php
index ec519ad9b..39a61c4ad 100644
--- a/include/items.php
+++ b/include/items.php
@@ -1635,7 +1635,7 @@ function atom_entry($item,$type,$author,$owner,$comment = false) {
$o .= '<published>' . xmlify(datetime_convert('UTC','UTC',$item['created'] . '+00:00',ATOM_TIME)) . '</published>' . "\r\n";
$o .= '<updated>' . xmlify(datetime_convert('UTC','UTC',$item['edited'] . '+00:00',ATOM_TIME)) . '</updated>' . "\r\n";
$o .= '<dfrn:env>' . base64url_encode($body, true) . '</dfrn:env>' . "\r\n";
- $o .= '<content type="' . $type . '" >' . xmlify(($type === 'html') ? bbcode($body) : $body) . '</content>' . "\r\n";
+ $o .= '<content type="' . $type . '" >' . xmlify((($type === 'html') ? bbcode($body) : $body)) . '</content>' . "\r\n";
$o .= '<link rel="alternate" type="text/html" href="' . xmlify($a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id']) . '" />' . "\r\n";
if($comment)
$o .= '<dfrn:comment-allow>' . intval($item['last-child']) . '</dfrn:comment-allow>' . "\r\n";
diff --git a/include/network.php b/include/network.php
index bbf1d6a63..10e3648a1 100644
--- a/include/network.php
+++ b/include/network.php
@@ -693,3 +693,25 @@ function parse_xml_string($s,$strict = true) {
}
return $x;
}}
+
+function add_fcontact($arr) {
+
+ $r = q("insert into fcontact ( `url`,`name`,`photo`,`request`,`nick`,`addr`,
+ `notify`,`poll`,`confirm`,`network`,`alias`,`pubkey`,`updated` )
+ values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
+ dbesc($arr['url']),
+ dbesc($arr['name']),
+ dbesc($arr['photo']),
+ dbesc($arr['request']),
+ dbesc($arr['nick']),
+ dbesc($arr['addr']),
+ dbesc($arr['notify']),
+ dbesc($arr['poll']),
+ dbesc($arr['confirm']),
+ dbesc($arr['network']),
+ dbesc($arr['alias']),
+ dbesc($arr['pubkey']),
+ dbesc(datetime_convert())
+ );
+ return $r;
+}
diff --git a/include/notifier.php b/include/notifier.php
index 15fb38534..cf8871fb9 100644
--- a/include/notifier.php
+++ b/include/notifier.php
@@ -502,22 +502,27 @@ function notifier_run($argv, $argc){
}
break;
case NETWORK_DIASPORA:
- if(get_config('system','dfrn_only') || (! get_config('diaspora_enabled')) || (! $normal_mode))
+ require_once('include/diaspora.php');
+ if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode))
break;
-
- if($target_item['deleted']) {
- // diaspora delete, (check for like)
-
+
+ if($target_item['verb'] === ACTIVITY_DISLIKE) {
+ // unsupported
+ break;
+ }
+ elseif($target_item['deleted'] && (! $parent_item['verb'] === ACTIVITY_LIKE)) {
+ // diaspora delete,
+ diaspora_send_retraction($target_item,$owner,$contact);
break;
}
elseif($followup) {
- // send to owner to relay
-
+ // send comments, likes and retractions of likes to owner to relay
+ diaspora_send_followup($target_item,$owner,$contact);
break;
}
elseif($target_item['parent'] != $target_item['id']) {
- // we are the relay
-
+ // we are the relay - send comments, likes and unlikes to our conversants
+ diaspora_send_relay($target_item,$owner,$contact);
break;
}
elseif($top_level) {
@@ -571,7 +576,7 @@ function notifier_run($argv, $argc){
/**
*
- * If you have less than 150 dfrn friends and it's a public message,
+ * If you have less than 999 dfrn friends and it's a public message,
* we'll just go ahead and push them out securely with dfrn/rino.
* If you've got more than that, you'll have to rely on PuSH delivery.
*
@@ -587,8 +592,9 @@ function notifier_run($argv, $argc){
*/
$r = q("SELECT `id`, `name` FROM `contact`
- WHERE `network` = NETWORK_DFRN AND `uid` = %d AND `blocked` = 0 AND `pending` = 0
+ WHERE `network` = '%s' AND `uid` = %d AND `blocked` = 0 AND `pending` = 0
AND `rel` != %d ",
+ dbesc(NETWORK_DFRN),
intval($owner['uid']),
intval(CONTACT_IS_SHARING)
);
diff --git a/include/security.php b/include/security.php
index 6fbdd697f..684a88a51 100644
--- a/include/security.php
+++ b/include/security.php
@@ -28,7 +28,7 @@ function can_write_wall(&$a,$owner) {
AND `user`.`blockwall` = 0 AND `readonly` = 0 AND ( `contact`.`rel` IN ( %d , %d ) OR `user`.`page-flags` = %d ) LIMIT 1",
intval($owner),
intval(remote_user()),
- intval(CONTACT_IS_FOLLOWER),
+ intval(CONTACT_IS_SHARING),
intval(CONTACT_IS_FRIEND),
intval(PAGE_COMMUNITY)
);
diff --git a/include/text.php b/include/text.php
index 803bf0e51..b13cf980f 100644
--- a/include/text.php
+++ b/include/text.php
@@ -147,7 +147,7 @@ if(! function_exists('xmlify')) {
function xmlify($str) {
$buffer = '';
- for($x = 0; $x < strlen($str); $x ++) {
+ for($x = 0; $x < mb_strlen($str); $x ++) {
$char = $str[$x];
switch( $char ) {