]> git.mxchange.org Git - friendica.git/blobdiff - include/items.php
Merge remote branch 'upstream/master'
[friendica.git] / include / items.php
index fbd4af5f3df367065b5fd2ebab74e39065e97c06..aed0a8e6845f88ed6e7bbdb35d4d9ddf4858a67a 100755 (executable)
@@ -469,8 +469,8 @@ function get_atom_elements($feed,$item) {
                $res['last-child'] = 0;
 
        $private = $item->get_item_tags(NAMESPACE_DFRN,'private');
-       if($private && $private[0]['data'] == 1)
-               $res['private'] = 1;
+       if($private && intval($private[0]['data']) > 0)
+               $res['private'] = intval($private[0]['data']);
        else
                $res['private'] = 0;
 
@@ -817,7 +817,7 @@ function item_store($arr,$force_parent = false) {
                        // email correspondents to be private even if the overall thread is not. 
 
                        if($r[0]['private'])
-                               $arr['private'] = 1;
+                               $arr['private'] = $r[0]['private'];
 
                        // Edge case. We host a public forum that was originally posted to privately.
                        // The original author commented, but as this is a comment, the permissions
@@ -1460,11 +1460,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()),
@@ -1472,6 +1473,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')
                        );
                        
@@ -1660,6 +1662,21 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
                                        continue;
                                }
 
+                               $force_parent = false;
+                               if($contact['network'] === NETWORK_OSTATUS || stristr($contact['url'],'twitter.com')) {
+                                       if($contact['network'] === NETWORK_OSTATUS)
+                                               $force_parent = true;
+                                       if(strlen($datarray['title']))
+                                               unset($datarray['title']);
+                                       $r = q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d",
+                                               dbesc(datetime_convert()),
+                                               dbesc($parent_uri),
+                                               intval($importer['uid'])
+                                       );
+                                       $datarray['last-child'] = 1;
+                               }
+
+
                                $r = q("SELECT `uid`, `last-child`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
                                        dbesc($item_id),
                                        intval($importer['uid'])
@@ -1703,19 +1720,6 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
                                        continue;
                                }
 
-                               $force_parent = false;
-                               if($contact['network'] === NETWORK_OSTATUS || stristr($contact['url'],'twitter.com')) {
-                                       if($contact['network'] === NETWORK_OSTATUS)
-                                               $force_parent = true;
-                                       if(strlen($datarray['title']))
-                                               unset($datarray['title']);
-                                       $r = q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d",
-                                               dbesc(datetime_convert()),
-                                               dbesc($parent_uri),
-                                               intval($importer['uid'])
-                                       );
-                                       $datarray['last-child'] = 1;
-                               }
 
                                if(($contact['network'] === NETWORK_FEED) || (! strlen($contact['notify']))) {
                                        // one way feed - no remote comment ability
@@ -1728,10 +1732,12 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
                                        $datarray['type'] = 'activity';
                                        $datarray['gravity'] = GRAVITY_LIKE;
                                        // only one like or dislike per person
-                                       $r = q("select id from item where uid = %d and `contact-id` = %d and verb ='%s' and deleted = 0 limit 1",
+                                       $r = q("select id from item where uid = %d and `contact-id` = %d and verb ='%s' and deleted = 0 and (`parent-uri` = '%s' OR `thr-parent` = '%s') limit 1",
                                                intval($datarray['uid']),
                                                intval($datarray['contact-id']),
-                                               dbesc($datarray['verb'])
+                                               dbesc($datarray['verb']),
+                                               dbesc($parent_uri),
+                                               dbesc($parent_uri)
                                        );
                                        if($r && count($r))
                                                continue; 
@@ -1811,6 +1817,13 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
                                        }
                                }
 
+                               if($contact['network'] === NETWORK_OSTATUS || stristr($contact['url'],'twitter.com')) {
+                                       if(strlen($datarray['title']))
+                                               unset($datarray['title']);
+                                       $datarray['last-child'] = 1;
+                               }
+
+
                                $r = q("SELECT `uid`, `last-child`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
                                        dbesc($item_id),
                                        intval($importer['uid'])
@@ -1873,24 +1886,23 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
                                if(! is_array($contact))
                                        return;
 
-                               if($contact['network'] === NETWORK_OSTATUS || stristr($contact['url'],'twitter.com')) {
-                                       if(strlen($datarray['title']))
-                                               unset($datarray['title']);
-                                       $datarray['last-child'] = 1;
-                               }
 
                                if(($contact['network'] === NETWORK_FEED) || (! strlen($contact['notify']))) {
                                                // one way feed - no remote comment ability
                                                $datarray['last-child'] = 0;
                                }
                                if($contact['network'] === NETWORK_FEED)
-                                       $datarray['private'] = 1;
+                                       $datarray['private'] = 2;
 
                                // This is my contact on another system, but it's really me.
                                // Turn this into a wall post.
 
-                               if($contact['remote_self'])
+                               if($contact['remote_self']) {
                                        $datarray['wall'] = 1;
+                                       if($contact['network'] === NETWORK_FEED) {
+                                               $datarray['private'] = 0;
+                                       }
+                               }
 
                                $datarray['parent-uri'] = $item_id;
                                $datarray['uid'] = $importer['uid'];
@@ -2148,6 +2160,67 @@ 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 uid = %d limit 1",
+                                       dbesc($uri),
+                                       intval($importer['importer_uid'])
+                               );
+                               if(count($r)) {
+                                       $parent_uri = $r[0]['parent-uri'];
+                                       if($r[0]['id'] != $r[0]['parent'])
+                                               $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 +2308,11 @@ 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","drop",$item['id']);
+                                       }
                                }
                        }
                }
@@ -2268,15 +2345,17 @@ 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` 
-                               WHERE `item`.`uri` = '%s' AND `item`.`parent-uri` = '%s'
+                               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))
@@ -2364,10 +2443,13 @@ function local_delivery($importer,$data) {
                                        $datarray['gravity'] = GRAVITY_LIKE;
                                        $datarray['last-child'] = 0;
                                        // only one like or dislike per person
-                                       $r = q("select id from item where uid = %d and `contact-id` = %d and verb ='%s' and deleted = 0 limit 1",
+                                       $r = q("select id from item where uid = %d and `contact-id` = %d and verb = '%s' and (`thr-parent` = '%s' or `parent-uri` = '%s') and deleted = 0 limit 1",
                                                intval($datarray['uid']),
                                                intval($datarray['contact-id']),
-                                               dbesc($datarray['verb'])
+                                               dbesc($datarray['verb']),
+                                               dbesc($datarray['parent-uri']),
+                                               dbesc($datarray['parent-uri'])
+               
                                        );
                                        if($r && count($r))
                                                continue; 
@@ -2535,10 +2617,12 @@ function local_delivery($importer,$data) {
                                        $datarray['type'] = 'activity';
                                        $datarray['gravity'] = GRAVITY_LIKE;
                                        // only one like or dislike per person
-                                       $r = q("select id from item where uid = %d and `contact-id` = %d and verb ='%s' and deleted = 0 limit 1",
+                                       $r = q("select id from item where uid = %d and `contact-id` = %d and verb ='%s' and deleted = 0 and (`parent-uri` = '%s' OR `thr-parent` = '%s') limit 1",
                                                intval($datarray['uid']),
                                                intval($datarray['contact-id']),
-                                               dbesc($datarray['verb'])
+                                               dbesc($datarray['verb']),
+                                               dbesc($parent_uri),
+                                               dbesc($parent_uri)
                                        );
                                        if($r && count($r))
                                                continue; 
@@ -2933,8 +3017,10 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
        if(strlen($item['owner-name']))
                $o .= atom_author('dfrn:owner',$item['owner-name'],$item['owner-link'],80,80,$item['owner-avatar']);
 
-       if(($item['parent'] != $item['id']) || ($item['parent-uri'] !== $item['uri']))
-               $o .= '<thr:in-reply-to ref="' . xmlify($item['parent-uri']) . '" type="text/html" href="' .  xmlify($a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['parent']) . '" />' . "\r\n";
+       if(($item['parent'] != $item['id']) || ($item['parent-uri'] !== $item['uri']) || ($item['thr-parent'])) {
+               $parent_item = (($item['thr-parent']) ? $item['thr-parent'] : $item['parent-uri']);
+               $o .= '<thr:in-reply-to ref="' . xmlify($parent_item) . '" type="text/html" href="' .  xmlify($a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['parent']) . '" />' . "\r\n";
+       }
 
        $o .= '<id>' . xmlify($item['uri']) . '</id>' . "\r\n";
        $o .= '<title>' . xmlify($item['title']) . '</title>' . "\r\n";
@@ -2955,7 +3041,7 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
                $o .= '<georss:point>' . xmlify($item['coord']) . '</georss:point>' . "\r\n";
 
        if(($item['private']) || strlen($item['allow_cid']) || strlen($item['allow_gid']) || strlen($item['deny_cid']) || strlen($item['deny_gid']))
-               $o .= '<dfrn:private>1</dfrn:private>' . "\r\n";
+               $o .= '<dfrn:private>' . (($item['private']) ? $item['private'] : 1) . '</dfrn:private>' . "\r\n";
 
        if($item['extid'])
                $o .= '<dfrn:extid>' . xmlify($item['extid']) . '</dfrn:extid>' . "\r\n";
@@ -3351,40 +3437,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']);
 
@@ -3472,3 +3526,51 @@ function posted_date_widget($url,$uid,$wall) {
        ));
        return $o;
 }
+
+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) {
+               logger('drop_item: diaspora support disabled, not storing retraction signature', LOGGER_DEBUG);
+               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;
+}