]> git.mxchange.org Git - friendica.git/commitdiff
prevent runaway notifications when parent=0 due to race condition
authorFriendika <info@friendika.com>
Fri, 4 Feb 2011 12:25:53 +0000 (04:25 -0800)
committerFriendika <info@friendika.com>
Fri, 4 Feb 2011 12:25:53 +0000 (04:25 -0800)
include/items.php
include/notifier.php
mod/dfrn_notify.php

index 45d8b62c0ba267544671edd7ca616d0af97ed7af..0c9d4cfc2e7d804a3c63fae78c65047a30eafa1f 100644 (file)
@@ -688,11 +688,12 @@ function item_store($arr,$force_parent = false) {
                                $arr['parent-uri'] = $r[0]['parent-uri'];
                        }
 
-                       $parent_id = $r[0]['id'];
-                       $allow_cid = $r[0]['allow_cid'];
-                       $allow_gid = $r[0]['allow_gid'];
-                       $deny_cid  = $r[0]['deny_cid'];
-                       $deny_gid  = $r[0]['deny_gid'];
+                       $parent_id      = $r[0]['id'];
+                       $parent_deleted = $r[0]['deleted'];
+                       $allow_cid      = $r[0]['allow_cid'];
+                       $allow_gid      = $r[0]['allow_gid'];
+                       $deny_cid       = $r[0]['deny_cid'];
+                       $deny_gid       = $r[0]['deny_gid'];
                }
                else {
 
@@ -750,13 +751,14 @@ function item_store($arr,$force_parent = false) {
        // Set parent id - and also make sure to inherit the parent's ACL's.
 
        $r = q("UPDATE `item` SET `parent` = %d, `allow_cid` = '%s', `allow_gid` = '%s',
-               `deny_cid` = '%s', `deny_gid` = '%s', `private` = %d WHERE `id` = %d LIMIT 1",
+               `deny_cid` = '%s', `deny_gid` = '%s', `private` = %d, `deleted` = $d WHERE `id` = %d LIMIT 1",
                intval($parent_id),
                dbesc($allow_cid),
                dbesc($allow_gid),
                dbesc($deny_cid),
                dbesc($deny_gid),
                intval($private),
+               intval($parent_deleted),
                intval($current_post)
        );
 
index 8442349cfdcfe83ebc574c5f43ea150be096f21a..a71da853db977f1a5725759b96d9c5231c880b13 100644 (file)
@@ -2,18 +2,18 @@
 require_once("boot.php");
 
 function notifier_run($argv, $argc){
-  global $a, $db;
+       global $a, $db;
 
-  if(is_null($a)){
-    $a = new App;
-  }
+       if(is_null($a)){
+               $a = new App;
+       }
   
-  if(is_null($db)){
-    @include(".htconfig.php");
-    require_once("dba.php");
-    $db = new dba($db_host, $db_user, $db_pass, $db_data);
-    unset($db_host, $db_user, $db_pass, $db_data);
-  };
+       if(is_null($db)) {
+               @include(".htconfig.php");
+               require_once("dba.php");
+               $db = new dba($db_host, $db_user, $db_pass, $db_data);
+                       unset($db_host, $db_user, $db_pass, $db_data);
+       }
 
        require_once("session.php");
        require_once("datetime.php");
@@ -62,11 +62,12 @@ function notifier_run($argv, $argc){
                $r = q("SELECT `parent`, `uid`, `edited` FROM `item` WHERE `id` = %d LIMIT 1",
                        intval($item_id)
                );
-               if(! count($r)){
+
+               if((! count($r)) || (! intval($r[0]['parent']))) {
                        return;
                }
-  
-               $parent_id = $r[0]['parent'];
+
+               $parent_id = intval($r[0]['parent']);
                $uid = $r[0]['uid'];
                $updated = $r[0]['edited'];
 
@@ -77,6 +78,13 @@ function notifier_run($argv, $argc){
                if(! count($items)){
                        return;
                }
+
+               // avoid race condition with deleting entries
+
+               if($items[0]['deleted']) {
+                       foreach($items as $item)
+                               $item['deleted'] = 1;
+
        }
 
        $r = q("SELECT `contact`.*, `user`.`nickname`, `user`.`sprvkey`, `user`.`spubkey`, `user`.`page-flags` 
@@ -122,8 +130,8 @@ function notifier_run($argv, $argc){
 
                        $allow_people = expand_acl($parent['allow_cid']);
                        $allow_groups = expand_groups(expand_acl($parent['allow_gid']));
-                       $deny_people = expand_acl($parent['deny_cid']);
-                       $deny_groups = expand_groups(expand_acl($parent['deny_gid']));
+                       $deny_people  = expand_acl($parent['deny_cid']);
+                       $deny_groups  = expand_groups(expand_acl($parent['deny_gid']));
 
                        $conversants = array();
 
@@ -220,6 +228,8 @@ function notifier_run($argv, $argc){
        else {
                if($followup) {
                        foreach($items as $item) {  // there is only one item
+                               if(! $item['parent'])
+                                       continue;
                                if($item['id'] == $item_id) {
                                        logger('notifier: followup: item: ' . print_r($item,true), LOGGER_DATA);
                                        $slap  = atom_entry($item,'html',$owner,$owner,false);
@@ -229,6 +239,9 @@ function notifier_run($argv, $argc){
                }
                else {
                        foreach($items as $item) {
+                               if(! $item['parent'])
+                                       continue;
+
                                $contact = get_item_contact($item,$contacts);
                                if(! $contact)
                                        continue;
index 7f023ef222a34eaf21b969d97f81ddc8120c7c7e..142d1328450d20e06b14a838fd4bb4e3db267914 100644 (file)
@@ -289,54 +289,58 @@ function dfrn_notify_post(&$a) {
                                        $datarray['last-child'] = 0;
                                }
                                $posted_id = item_store($datarray);
+                               $parent = 0;
 
                                if($posted_id) {
+                                       $r = q("SELECT `parent` FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+                                               intval($posted_id),
+                                               intval($importer['importer_uid'])
+                                       );
+                                       if(count($r))
+                                               $parent = $r[0]['parent'];
+                               
                                        if(! $is_like) {
-                                               $r = q("SELECT `parent` FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-                                                       intval($posted_id),
-                                                       intval($importer['importer_uid'])
+                                               $r1 = q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `uid` = %d AND `parent` = %d",
+                                                       dbesc(datetime_convert()),
+                                                       intval($importer['importer_uid']),
+                                                       intval($r[0]['parent'])
                                                );
-                                               if(count($r)) {
-                                                       $r1 = q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `uid` = %d AND `parent` = %d",
-                                                               dbesc(datetime_convert()),
-                                                               intval($importer['importer_uid']),
-                                                               intval($r[0]['parent'])
-                                                       );
-                                               }
+
                                                $r2 = q("UPDATE `item` SET `last-child` = 1, `changed` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
-                                                               dbesc(datetime_convert()),
-                                                               intval($importer['importer_uid']),
-                                                               intval($posted_id)
+                                                       dbesc(datetime_convert()),
+                                                       intval($importer['importer_uid']),
+                                                       intval($posted_id)
                                                );
                                        }
 
-                                       $php_path = ((strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php');
+                                       if($posted_id && $parent) {
+                               
+                                               $php_path = ((strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php');
 
-                                       //proc_close(proc_open("\"$php_path\" \"include/notifier.php\" \"comment-import\" \"$posted_id\" &", array(),$foo));
-                                       proc_run($php_path,"include/notifier.php","comment-import","$posted_id");
+                                               proc_run($php_path,"include/notifier.php","comment-import","$posted_id");
                                        
-                                       if((! $is_like) && ($importer['notify-flags'] & NOTIFY_COMMENT) && (! $importer['self'])) {
-                                               require_once('bbcode.php');
-                                               $from = stripslashes($datarray['author-name']);
-                                               $tpl = load_view_file('view/cmnt_received_eml.tpl');                    
-                                               $email_tpl = replace_macros($tpl, array(
-                                                       '$sitename' => $a->config['sitename'],
-                                                       '$siteurl' =>  $a->get_baseurl(),
-                                                       '$username' => $importer['username'],
-                                                       '$email' => $importer['email'],
-                                                       '$display' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id, 
-                                                       '$from' => $from,
-                                                       '$body' => strip_tags(bbcode(stripslashes($datarray['body'])))
-                                               ));
-       
-                                               $res = mail($importer['email'], $from . t(' commented on an item at ') . $a->config['sitename'],
-                                                       $email_tpl, "From: " . t('Administrator') . '@' . $a->get_hostname() );
+                                               if((! $is_like) && ($importer['notify-flags'] & NOTIFY_COMMENT) && (! $importer['self'])) {
+                                                       require_once('bbcode.php');
+                                                       $from = stripslashes($datarray['author-name']);
+                                                       $tpl = load_view_file('view/cmnt_received_eml.tpl');                    
+                                                       $email_tpl = replace_macros($tpl, array(
+                                                               '$sitename' => $a->config['sitename'],
+                                                               '$siteurl' =>  $a->get_baseurl(),
+                                                               '$username' => $importer['username'],
+                                                               '$email' => $importer['email'],
+                                                               '$display' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id, 
+                                                               '$from' => $from,
+                                                               '$body' => strip_tags(bbcode(stripslashes($datarray['body'])))
+                                                       ));
+               
+                                                       $res = mail($importer['email'], $from . t(' commented on an item at ') . $a->config['sitename'],
+                                                               $email_tpl, "From: " . t('Administrator') . '@' . $a->get_hostname() );
+                                               }
                                        }
-                               }
-
-                               xml_status(0);
-                               // NOTREACHED
 
+                                       xml_status(0);
+                                       // NOTREACHED
+                               }
                        }
                        else {
                                // regular comment that is part of this total conversation. Have we seen it? If not, import it.
@@ -375,13 +379,13 @@ function dfrn_notify_post(&$a) {
                        
                                if(($datarray['type'] != 'activity') && ($importer['notify-flags'] & NOTIFY_COMMENT)) {
 
-                                       $myconv = q("SELECT `author-link` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d",
+                                       $myconv = q("SELECT `author-link` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 ",
                                                dbesc($parent_uri),
                                                intval($importer['importer_uid'])
                                        );
                                        if(count($myconv)) {
                                                foreach($myconv as $conv) {
-                                                       if($conv['author-link'] != $importer['url'])
+                                                       if(! link_compare($conv['author-link'],$importer['url']))
                                                                continue;
                                                        require_once('bbcode.php');
                                                        $from = stripslashes($datarray['author-name']);