From f0b41709eb40237334de5d9a0ae7adbcd95fb841 Mon Sep 17 00:00:00 2001 From: friendica Date: Mon, 25 Jun 2012 17:45:33 -0700 Subject: improve remote delete forwarding --- include/items.php | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) (limited to 'include/items.php') diff --git a/include/items.php b/include/items.php index e495393fa..b90b5434f 100755 --- a/include/items.php +++ b/include/items.php @@ -2148,6 +2148,66 @@ function local_delivery($importer,$data) { } if($deleted) { + + $is_reply = false; + $r = q("select * from item where uri = '%s' and id = parent limit 1", + dbesc($uri) + ); + if(count($r)) { + $parent_uri = $r[0]['parent-uri']; + if($r[0]['parent-uri'] != $uri && $r[0]['thr-parent'] != $uri) + $is_reply = true; + } + + + if($is_reply) { + $community = false; + + if($importer['page-flags'] == PAGE_COMMUNITY || $importer['page-flags'] == PAGE_PRVGROUP ) { + $sql_extra = ''; + $community = true; + logger('local_delivery: possible community delete'); + } + else + $sql_extra = " and contact.self = 1 and item.wall = 1 "; + + // was the top-level post for this reply written by somebody on this site? + // Specifically, the recipient? + + $is_a_remote_delete = false; + + $r = q("select `item`.`id`, `item`.`uri`, `item`.`tag`, `item`.`forum_mode`,`item`.`origin`,`item`.`wall`, + `contact`.`name`, `contact`.`url`, `contact`.`thumb` from `item` + LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id` + WHERE `item`.`uri` = '%s' AND (`item`.`parent-uri` = '%s' or `item`.`thr-parent` = '%s') + AND `item`.`uid` = %d + $sql_extra + LIMIT 1", + dbesc($parent_uri), + dbesc($parent_uri), + dbesc($parent_uri), + intval($importer['importer_uid']) + ); + if($r && count($r)) + $is_a_remote_delete = true; + + // Does this have the characteristics of a community or private group comment? + // If it's a reply to a wall post on a community/prvgroup page it's a + // valid community comment. Also forum_mode makes it valid for sure. + // If neither, it's not. + + if($is_a_remote_delete && $community) { + if((! $r[0]['forum_mode']) && (! $r[0]['wall'])) { + $is_a_remote_delete = false; + logger('local_delivery: not a community delete'); + } + } + + if($is_a_remote_delete) { + logger('local_delivery: received remote delete'); + } + } + $r = q("SELECT `item`.*, `contact`.`self` FROM `item` left join contact on `item`.`contact-id` = `contact`.`id` WHERE `uri` = '%s' AND `item`.`uid` = %d AND `contact-id` = %d AND NOT `item`.`file` LIKE '%%[%%' LIMIT 1", dbesc($uri), @@ -2235,7 +2295,9 @@ function local_delivery($importer,$data) { ); } } - } + if($is_a_remote_delete) + proc_run('php',"include/notifier.php","delete",$item['id']); + } } } } -- cgit v1.2.3 From 8bb7ab88fb8a1bfef198f6a2aff53a15e667aa59 Mon Sep 17 00:00:00 2001 From: Zach Prezkuta Date: Sat, 9 Jun 2012 18:39:21 -0600 Subject: Clean up the Diaspora connectivity: - Move Diaspora code into separate functions to make it more modular - Create more checks for whether Diaspora connectivity has been enabled --- include/items.php | 131 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 82 insertions(+), 49 deletions(-) (limited to 'include/items.php') diff --git a/include/items.php b/include/items.php index e495393fa..af46eaaa1 100755 --- a/include/items.php +++ b/include/items.php @@ -383,16 +383,21 @@ function get_atom_elements($feed,$item) { $res['app'] = 'OStatus'; } + // base64 encoded json structure representing Diaspora signature + $dspr_enabled = intval(get_config('system','diaspora_enabled')); + + if( $dspr_enabled) { + $dsig = $item->get_item_tags(NAMESPACE_DFRN,'diaspora_signature'); + if($dsig) { + $res['dsprsig'] = unxmlify($dsig[0]['data']); + } - $dsig = $item->get_item_tags(NAMESPACE_DFRN,'diaspora_signature'); - if($dsig) { - $res['dsprsig'] = unxmlify($dsig[0]['data']); + $dguid = $item->get_item_tags(NAMESPACE_DFRN,'diaspora_guid'); + if($dguid) + $res['guid'] = unxmlify($dguid[0]['data']); } - $dguid = $item->get_item_tags(NAMESPACE_DFRN,'diaspora_guid'); - if($dguid) - $res['guid'] = unxmlify($dguid[0]['data']); $bm = $item->get_item_tags(NAMESPACE_DFRN,'bookmark'); if($bm) @@ -699,13 +704,17 @@ function item_store($arr,$force_parent = false) { // If a Diaspora signature structure was passed in, pull it out of the // item array and set it aside for later storage. + $dspr_enabled = intval(get_config('system','diaspora_enabled')); $dsprsig = null; + if(x($arr,'dsprsig')) { - $dsprsig = json_decode(base64_decode($arr['dsprsig'])); + if($dspr_enabled) + $dsprsig = json_decode(base64_decode($arr['dsprsig'])); unset($arr['dsprsig']); } + if(x($arr, 'gravity')) $arr['gravity'] = intval($arr['gravity']); elseif($arr['parent-uri'] === $arr['uri']) @@ -934,7 +943,9 @@ function item_store($arr,$force_parent = false) { intval($parent_id) ); - if($dsprsig) { + + // Store the Diaspora signature if there is one + if($dspr_enabled && $dsprsig) { q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ", intval($current_post), dbesc($dsprsig->signed_text), @@ -1008,6 +1019,7 @@ function tag_deliver($uid,$item_id) { $dlink = normalise_link($a->get_baseurl() . '/u/' . $u[0]['nickname']); + $cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism',$item['body'],$matches,PREG_SET_ORDER); if($cnt) { foreach($matches as $mtch) { @@ -2973,12 +2985,15 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) { if($item['app']) $o .= '' . "\r\n"; - if($item['guid']) - $o .= '' . $item['guid'] . '' . "\r\n"; + $dspr_enabled = intval(get_config('system','diaspora_enabled')); + if( $dspr_enabled) { + if($item['guid']) + $o .= '' . $item['guid'] . '' . "\r\n"; - if($item['signed_text']) { - $sign = base64_encode(json_encode(array('signed_text' => $item['signed_text'],'signature' => $item['signature'],'signer' => $item['signer']))); - $o .= '' . xmlify($sign) . '' . "\r\n"; + if($item['signed_text']) { + $sign = base64_encode(json_encode(array('signed_text' => $item['signed_text'],'signature' => $item['signature'],'signer' => $item['signer']))); + $o .= '' . xmlify($sign) . '' . "\r\n"; + } } $verb = construct_verb($item); @@ -3317,7 +3332,9 @@ function drop_item($id,$interactive = true) { // ignore the result } - // clean up item_id and sign meta-data tables + // clean up item_id and sign (Diaspora signature) meta-data tables + // Clean up the sign table even if Diaspora support is disabled. We may still need to + // clean it up if Diaspora support had been enabled in the past $r = q("DELETE FROM item_id where iid in (select id from item where parent = %d and uid = %d)", intval($item['id']), @@ -3359,40 +3376,8 @@ function drop_item($id,$interactive = true) { ); } - // Add a relayable_retraction signature for Diaspora. Note that we can't add a target_author_signature - // if the comment was deleted by a remote user. That should be ok, because if a remote user is deleting - // the comment, that means we're the home of the post, and Diaspora will only - // check the parent_author_signature of retractions that it doesn't have to relay further - // - // I don't think this function gets called for an "unlike," but I'll check anyway - $signed_text = $item['guid'] . ';' . ( ($item['verb'] === ACTIVITY_LIKE) ? 'Like' : 'Comment'); - - if(local_user() == $item['uid']) { - - $handle = $a->user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); - $authorsig = base64_encode(rsa_sign($signed_text,$a->user['prvkey'],'sha256')); - } - else { - $r = q("SELECT `nick`, `url` FROM `contact` WHERE `id` = '%d' LIMIT 1", - $item['contact-id'] - ); - if(count($r)) { - // The below handle only works for NETWORK_DFRN. I think that's ok, because this function - // only handles DFRN deletes - $handle_baseurl_start = strpos($r['url'],'://') + 3; - $handle_baseurl_length = strpos($r['url'],'/profile') - $handle_baseurl_start; - $handle = $r['nick'] . '@' . substr($r['url'], $handle_baseurl_start, $handle_baseurl_length); - $authorsig = ''; - } - } - - if(isset($handle)) - q("insert into sign (`retract_iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ", - intval($item['id']), - dbesc($signed_text), - dbesc($authorsig), - dbesc($handle) - ); + // Add a relayable_retraction signature for Diaspora. + store_diaspora_retract_sig($item, $a->user, $a->get_baseurl()); } $drop_id = intval($item['id']); @@ -3479,4 +3464,52 @@ function posted_date_widget($url,$uid,$wall) { '$dates' => $ret )); return $o; -} \ No newline at end of file +} + + +function store_diaspora_retract_sig($item, $user, $baseurl) { + // Note that we can't add a target_author_signature + // if the comment was deleted by a remote user. That should be ok, because if a remote user is deleting + // the comment, that means we're the home of the post, and Diaspora will only + // check the parent_author_signature of retractions that it doesn't have to relay further + // + // I don't think this function gets called for an "unlike," but I'll check anyway + + $enabled = intval(get_config('system','diaspora_enabled')); + if(! $enabled) { + return; + } + + logger('drop_item: storing diaspora retraction signature'); + + $signed_text = $item['guid'] . ';' . ( ($item['verb'] === ACTIVITY_LIKE) ? 'Like' : 'Comment'); + + if(local_user() == $item['uid']) { + + $handle = $user['nickname'] . '@' . substr($baseurl, strpos($baseurl,'://') + 3); + $authorsig = base64_encode(rsa_sign($signed_text,$user['prvkey'],'sha256')); + } + else { + $r = q("SELECT `nick`, `url` FROM `contact` WHERE `id` = '%d' LIMIT 1", + $item['contact-id'] + ); + if(count($r)) { + // The below handle only works for NETWORK_DFRN. I think that's ok, because this function + // only handles DFRN deletes + $handle_baseurl_start = strpos($r['url'],'://') + 3; + $handle_baseurl_length = strpos($r['url'],'/profile') - $handle_baseurl_start; + $handle = $r['nick'] . '@' . substr($r['url'], $handle_baseurl_start, $handle_baseurl_length); + $authorsig = ''; + } + } + + if(isset($handle)) + q("insert into sign (`retract_iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ", + intval($item['id']), + dbesc($signed_text), + dbesc($authorsig), + dbesc($handle) + ); + + return; +} -- cgit v1.2.3 From c0c50ece0fa625b9b1c6bd89045b8f16057d8eb2 Mon Sep 17 00:00:00 2001 From: Zach Prezkuta Date: Tue, 12 Jun 2012 18:38:24 -0600 Subject: revert extra Diaspora disabling changes to try to eliminate Mustard double-posting --- include/items.php | 46 +++++++++++++++------------------------------- 1 file changed, 15 insertions(+), 31 deletions(-) (limited to 'include/items.php') diff --git a/include/items.php b/include/items.php index af46eaaa1..7e8b8af4c 100755 --- a/include/items.php +++ b/include/items.php @@ -383,21 +383,16 @@ function get_atom_elements($feed,$item) { $res['app'] = 'OStatus'; } - // base64 encoded json structure representing Diaspora signature - $dspr_enabled = intval(get_config('system','diaspora_enabled')); - - if( $dspr_enabled) { - $dsig = $item->get_item_tags(NAMESPACE_DFRN,'diaspora_signature'); - if($dsig) { - $res['dsprsig'] = unxmlify($dsig[0]['data']); - } - $dguid = $item->get_item_tags(NAMESPACE_DFRN,'diaspora_guid'); - if($dguid) - $res['guid'] = unxmlify($dguid[0]['data']); + $dsig = $item->get_item_tags(NAMESPACE_DFRN,'diaspora_signature'); + if($dsig) { + $res['dsprsig'] = unxmlify($dsig[0]['data']); } + $dguid = $item->get_item_tags(NAMESPACE_DFRN,'diaspora_guid'); + if($dguid) + $res['guid'] = unxmlify($dguid[0]['data']); $bm = $item->get_item_tags(NAMESPACE_DFRN,'bookmark'); if($bm) @@ -704,17 +699,13 @@ function item_store($arr,$force_parent = false) { // If a Diaspora signature structure was passed in, pull it out of the // item array and set it aside for later storage. - $dspr_enabled = intval(get_config('system','diaspora_enabled')); $dsprsig = null; - if(x($arr,'dsprsig')) { - if($dspr_enabled) - $dsprsig = json_decode(base64_decode($arr['dsprsig'])); + $dsprsig = json_decode(base64_decode($arr['dsprsig'])); unset($arr['dsprsig']); } - if(x($arr, 'gravity')) $arr['gravity'] = intval($arr['gravity']); elseif($arr['parent-uri'] === $arr['uri']) @@ -943,9 +934,7 @@ function item_store($arr,$force_parent = false) { intval($parent_id) ); - - // Store the Diaspora signature if there is one - if($dspr_enabled && $dsprsig) { + if($dsprsig) { q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ", intval($current_post), dbesc($dsprsig->signed_text), @@ -1019,7 +1008,6 @@ function tag_deliver($uid,$item_id) { $dlink = normalise_link($a->get_baseurl() . '/u/' . $u[0]['nickname']); - $cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism',$item['body'],$matches,PREG_SET_ORDER); if($cnt) { foreach($matches as $mtch) { @@ -2280,6 +2268,7 @@ function local_delivery($importer,$data) { $is_a_remote_comment = false; + // POSSIBLE CLEANUP --> Why select so many fields when only forum_mode and wall are used? $r = q("select `item`.`id`, `item`.`uri`, `item`.`tag`, `item`.`forum_mode`,`item`.`origin`,`item`.`wall`, `contact`.`name`, `contact`.`url`, `contact`.`thumb` from `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id` @@ -2985,15 +2974,12 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) { if($item['app']) $o .= '' . "\r\n"; - $dspr_enabled = intval(get_config('system','diaspora_enabled')); - if( $dspr_enabled) { - if($item['guid']) - $o .= '' . $item['guid'] . '' . "\r\n"; + if($item['guid']) + $o .= '' . $item['guid'] . '' . "\r\n"; - if($item['signed_text']) { - $sign = base64_encode(json_encode(array('signed_text' => $item['signed_text'],'signature' => $item['signature'],'signer' => $item['signer']))); - $o .= '' . xmlify($sign) . '' . "\r\n"; - } + if($item['signed_text']) { + $sign = base64_encode(json_encode(array('signed_text' => $item['signed_text'],'signature' => $item['signature'],'signer' => $item['signer']))); + $o .= '' . xmlify($sign) . '' . "\r\n"; } $verb = construct_verb($item); @@ -3332,9 +3318,7 @@ function drop_item($id,$interactive = true) { // ignore the result } - // clean up item_id and sign (Diaspora signature) meta-data tables - // Clean up the sign table even if Diaspora support is disabled. We may still need to - // clean it up if Diaspora support had been enabled in the past + // clean up item_id and sign meta-data tables $r = q("DELETE FROM item_id where iid in (select id from item where parent = %d and uid = %d)", intval($item['id']), -- cgit v1.2.3 From 5773241537b09aa411c48b4d67eefcebb1ea9c84 Mon Sep 17 00:00:00 2001 From: Zach Prezkuta Date: Tue, 12 Jun 2012 19:05:01 -0600 Subject: add some debug logging --- include/items.php | 1 + 1 file changed, 1 insertion(+) (limited to 'include/items.php') diff --git a/include/items.php b/include/items.php index 7e8b8af4c..7d51261db 100755 --- a/include/items.php +++ b/include/items.php @@ -3461,6 +3461,7 @@ function store_diaspora_retract_sig($item, $user, $baseurl) { $enabled = intval(get_config('system','diaspora_enabled')); if(! $enabled) { + logger('drop_item: diaspora support disabled, not storing retraction signature', LOGGER_DEBUG); return; } -- cgit v1.2.3 From f1991a59524ce36eea0b982954d90a6c55e59e41 Mon Sep 17 00:00:00 2001 From: friendica Date: Mon, 25 Jun 2012 18:15:56 -0700 Subject: propagate remote deletes --- include/items.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'include/items.php') diff --git a/include/items.php b/include/items.php index b90b5434f..7578bf155 100755 --- a/include/items.php +++ b/include/items.php @@ -2148,18 +2148,19 @@ function local_delivery($importer,$data) { } if($deleted) { + // check for relayed deletes to our conversation $is_reply = false; - $r = q("select * from item where uri = '%s' and id = parent limit 1", - dbesc($uri) + $r = q("select * from item where uri = '%s' and uid = %d limit 1", + dbesc($uri), + intval($importer['importer_uid']) ); if(count($r)) { $parent_uri = $r[0]['parent-uri']; - if($r[0]['parent-uri'] != $uri && $r[0]['thr-parent'] != $uri) + if($r[0]['id'] != $r[0]['parent']) $is_reply = true; } - if($is_reply) { $community = false; @@ -2295,8 +2296,10 @@ function local_delivery($importer,$data) { ); } } + // if this is a relayed delete, propagate it to other recipients + if($is_a_remote_delete) - proc_run('php',"include/notifier.php","delete",$item['id']); + proc_run('php',"include/notifier.php","drop",$item['id']); } } } -- cgit v1.2.3 From 78ede4744ff17c564f7104731c152672138f3efb Mon Sep 17 00:00:00 2001 From: friendica Date: Mon, 25 Jun 2012 21:37:38 -0700 Subject: add event titles to discovered birthday events --- include/items.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'include/items.php') diff --git a/include/items.php b/include/items.php index e19d729ba..a4faf3adc 100755 --- a/include/items.php +++ b/include/items.php @@ -1457,11 +1457,12 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0) * */ - $bdtext = t('Birthday:') . ' [url=' . $contact['url'] . ']' . $contact['name'] . '[/url]' ; + $bdtext = sprintf( t('%s\'s birthday'), $contact['name']); + $bdtext2 = sprintf( t('Happy Birthday %s'), ' [url=' . $contact['url'] . ']' . $contact['name'] . '[/url]' ; - $r = q("INSERT INTO `event` (`uid`,`cid`,`created`,`edited`,`start`,`finish`,`desc`,`type`) - VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s' ) ", + $r = q("INSERT INTO `event` (`uid`,`cid`,`created`,`edited`,`start`,`finish`,`summary`,`desc`,`type`) + VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ", intval($contact['uid']), intval($contact['id']), dbesc(datetime_convert()), @@ -1469,6 +1470,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0) dbesc(datetime_convert('UTC','UTC', $birthday)), dbesc(datetime_convert('UTC','UTC', $birthday . ' + 1 day ')), dbesc($bdtext), + dbesc($bdtext2), dbesc('birthday') ); -- cgit v1.2.3 From d32d0e21544ffc487042f855280f05ba63651e7d Mon Sep 17 00:00:00 2001 From: friendica Date: Mon, 25 Jun 2012 21:39:07 -0700 Subject: typos --- include/items.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'include/items.php') diff --git a/include/items.php b/include/items.php index a4faf3adc..1f0571968 100755 --- a/include/items.php +++ b/include/items.php @@ -1458,7 +1458,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0) */ $bdtext = sprintf( t('%s\'s birthday'), $contact['name']); - $bdtext2 = sprintf( t('Happy Birthday %s'), ' [url=' . $contact['url'] . ']' . $contact['name'] . '[/url]' ; + $bdtext2 = sprintf( t('Happy Birthday %s'), ' [url=' . $contact['url'] . ']' . $contact['name'] . '[/url]' ) ; $r = q("INSERT INTO `event` (`uid`,`cid`,`created`,`edited`,`start`,`finish`,`summary`,`desc`,`type`) -- cgit v1.2.3