X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fnotifier.php;h=f0a1940d498cffd17cc426ddc41f64ebe7d6f535;hb=111ace5abd855a0c4f248b34d468285b825abbd0;hp=53178ce53a4bcd62d29b74becd2ecb814fff8916;hpb=94e396e6c4fda7a9113bfdb122fadfde0421e81c;p=friendica.git diff --git a/include/notifier.php b/include/notifier.php old mode 100755 new mode 100644 index 53178ce53a..f0a1940d49 --- a/include/notifier.php +++ b/include/notifier.php @@ -2,6 +2,7 @@ require_once("boot.php"); require_once('include/queue_fn.php'); +require_once('include/html2plain.php'); /* * This file was at one time responsible for doing all deliveries, but this caused @@ -35,7 +36,7 @@ function notifier_run($argv, $argc){ require_once("datetime.php"); require_once('include/items.php'); require_once('include/bbcode.php'); - + require_once('include/email.php'); load_config('config'); load_config('system'); @@ -46,7 +47,7 @@ function notifier_run($argv, $argc){ $a->set_baseurl(get_config('system','url')); - logger('notifier: invoked: ' . print_r($argv,true)); + logger('notifier: invoked: ' . print_r($argv,true), LOGGER_DEBUG); $cmd = $argv[1]; @@ -124,6 +125,7 @@ function notifier_run($argv, $argc){ $uid = $r[0]['uid']; $updated = $r[0]['edited']; + // The following seems superfluous. We've already checked for "if (! intval($r[0]['parent']))" a few lines up if(! $parent_id) return; @@ -200,7 +202,7 @@ function notifier_run($argv, $argc){ // by stringing togther an array of retractions and sending them onward. - $localhost = $a->get_hostname(); + $localhost = str_replace('www.','',$a->get_hostname()); if(strpos($localhost,':')) $localhost = substr($localhost,0,strpos($localhost,':')); @@ -219,7 +221,7 @@ function notifier_run($argv, $argc){ } - if(($cmd === 'uplink') && (intval($parent['forum_mode'])) && (! $top_level)) { + if(($cmd === 'uplink') && (intval($parent['forum_mode']) == 1) && (! $top_level)) { $relay_to_owner = true; } @@ -264,10 +266,10 @@ function notifier_run($argv, $argc){ $deny_people = expand_acl($parent['deny_cid']); $deny_groups = expand_groups(expand_acl($parent['deny_gid'])); - // if our parent is a forum, uplink to the origonal author causing - // a delivery fork + // if our parent is a public forum (forum_mode == 1), uplink to the origional author causing + // a delivery fork. private groups (forum_mode == 2) do not uplink - if(intval($parent['forum_mode']) && (! $top_level) && ($cmd !== 'uplink')) { + if((intval($parent['forum_mode']) == 1) && (! $top_level) && ($cmd !== 'uplink')) { proc_run('php','include/notifier','uplink',$item_id); } @@ -303,7 +305,7 @@ function notifier_run($argv, $argc){ $conversant_str = dbesc(implode(', ',$conversants)); } - $r = q("SELECT * FROM `contact` WHERE `id` IN ( $conversant_str ) AND `blocked` = 0 AND `pending` = 0"); + $r = q("SELECT * FROM `contact` WHERE `id` IN ( $conversant_str ) AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0"); if(count($r)) $contacts = $r; @@ -336,13 +338,15 @@ function notifier_run($argv, $argc){ '$picdate' => xmlify(datetime_convert('UTC','UTC',$owner['avatar-date'] . '+00:00' , ATOM_TIME)) , '$uridate' => xmlify(datetime_convert('UTC','UTC',$owner['uri-date'] . '+00:00' , ATOM_TIME)) , '$namdate' => xmlify(datetime_convert('UTC','UTC',$owner['name-date'] . '+00:00' , ATOM_TIME)) , - '$birthday' => $birthday + '$birthday' => $birthday, + '$community' => (($owner['page-flags'] == PAGE_COMMUNITY) ? '1' : '') + )); if($mail) { $public_message = false; // mail is not public - $body = fix_private_photos($item['body'],$owner['uid']); + $body = fix_private_photos($item['body'],$owner['uid'],null,$message[0]['contact-id']); $atom .= replace_macros($mail_template, array( '$name' => xmlify($owner['name']), @@ -382,8 +386,8 @@ function notifier_run($argv, $argc){ continue; if($item['id'] == $item_id) { logger('notifier: followup: item: ' . print_r($item,true), LOGGER_DATA); - $slap = atom_entry($item,'html',$owner,$owner,false); - $atom .= atom_entry($item,'text',$owner,$owner,false); + $slap = atom_entry($item,'html',null,$owner,false); + $atom .= atom_entry($item,'text',null,$owner,false); } } } @@ -410,13 +414,13 @@ function notifier_run($argv, $argc){ // older sites without a corresponding dfrn_notify change may do the wrong thing. if($item_id == $item['id'] || $item['id'] == $item['parent']) - $atom .= atom_entry($item,'text',$contact,$owner,true); + $atom .= atom_entry($item,'text',null,$owner,true); } else - $atom .= atom_entry($item,'text',$contact,$owner,true); + $atom .= atom_entry($item,'text',null,$owner,true); if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire)) - $slaps[] = atom_entry($item,'html',$contact,$owner,true); + $slaps[] = atom_entry($item,'html',null,$owner,true); } } } @@ -475,17 +479,42 @@ function notifier_run($argv, $argc){ } } - foreach($r as $contact) { + + // This controls the number of deliveries to execute with each separate delivery process. + // By default we'll perform one delivery per process. Assuming a hostile shared hosting + // provider, this provides the greatest chance of deliveries if processes start getting + // killed. We can also space them out with the delivery_interval to also help avoid them + // getting whacked. + + // If $deliveries_per_process > 1, we will chain this number of multiple deliveries + // together into a single process. This will reduce the overall number of processes + // spawned for each delivery, but they will run longer. + + $deliveries_per_process = intval(get_config('system','delivery_batch_count')); + if($deliveries_per_process <= 0) + $deliveries_per_process = 1; + + $this_batch = array(); + + for($x = 0; $x < count($r); $x ++) { + $contact = $r[$x]; + if($contact['self']) continue; // potentially more than one recipient. Start a new process and space them out a bit. - // we will deliver single recipient types of message and email receipients here. - + // we will deliver single recipient types of message and email recipients here. + if((! $mail) && (! $fsuggest) && (! $followup)) { - proc_run('php','include/delivery.php',$cmd,$item_id,$contact['id']); - if($interval) - @time_sleep_until(microtime(true) + (float) $interval); + + $this_batch[] = $contact['id']; + + if(count($this_batch) == $deliveries_per_process) { + proc_run('php','include/delivery.php',$cmd,$item_id,$this_batch); + $this_batch = array(); + if($interval) + @time_sleep_until(microtime(true) + (float) $interval); + } continue; } @@ -517,7 +546,8 @@ function notifier_run($argv, $argc){ `user`.* FROM `contact` LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid` - WHERE `contact`.`blocked` = 0 AND `contact`.`pending` = 0 + WHERE `contact`.`blocked` = 0 AND `contact`.`archive` = 0 + AND `contact`.`pending` = 0 AND `contact`.`network` = '%s' AND `user`.`nickname` = '%s' $sql_extra AND `user`.`account_expired` = 0 LIMIT 1", @@ -526,6 +556,25 @@ function notifier_run($argv, $argc){ ); if(count($x)) { + + if($owner['page-flags'] == PAGE_COMMUNITY && ! $x[0]['writable']) { + q("update contact set writable = 1 where id = %d limit 1", + intval($x[0]['id']) + ); + $x[0]['writable'] = 1; + } + + // if contact's ssl policy changed, which we just determined + // is on our own server, update our contact links + + $ssl_policy = get_config('system','ssl_policy'); + fix_contact_ssl_policy($x[0],$ssl_policy); + + // If we are setup as a soapbox we aren't accepting input from this person + + if($x[0]['page-flags'] == PAGE_SOAPBOX) + break; + require_once('library/simplepie/simplepie.inc'); logger('mod-delivery: local delivery'); local_delivery($x[0],$atom); @@ -548,7 +597,7 @@ function notifier_run($argv, $argc){ break; case NETWORK_OSTATUS: - // Do not send to otatus if we are not configured to send to public networks + // Do not send to ostatus if we are not configured to send to public networks if($owner['prvnets']) break; if(get_config('system','ostatus_disabled') || get_config('system','dfrn_only')) @@ -625,46 +674,38 @@ function notifier_run($argv, $argc){ ); if($r1 && $r1[0]['reply_to']) $reply_to = $r1[0]['reply_to']; - - $subject = (($it['title']) ? $it['title'] : t("\x28no subject\x29")) ; + + $subject = (($it['title']) ? email_header_encode($it['title'],'UTF-8') : t("\x28no subject\x29")) ; // only expose our real email address to true friends if(($contact['rel'] == CONTACT_IS_FRIEND) && (! $contact['blocked'])) - $headers = 'From: ' . $local_user[0]['username'] . ' <' . $local_user[0]['email'] . '>' . "\n"; + $headers = 'From: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . $local_user[0]['email'] . '>' . "\n"; else - $headers = 'From: ' . $local_user[0]['username'] . ' <' . t('noreply') . '@' . $a->get_hostname() . '>' . "\n"; + $headers = 'From: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . t('noreply') . '@' . $a->get_hostname() . '>' . "\n"; if($reply_to) $headers .= 'Reply-to: ' . $reply_to . "\n"; - $headers .= 'Message-id: <' . $it['uri'] . '>' . "\n"; + // for testing purposes: Collect exported mails + //$file = tempnam("/tmp/friendica/", "mail-out2-"); + //file_put_contents($file, json_encode($it)); + + $headers .= 'Message-Id: <' . iri2msgid($it['uri']) . '>' . "\n"; if($it['uri'] !== $it['parent-uri']) { - $header .= 'References: <' . $it['parent-uri'] . '>' . "\n"; - if(! strlen($it['title'])) { + $headers .= 'References: <' . iri2msgid($it['parent-uri']) . '>' . "\n"; + if(!strlen($it['title'])) { $r = q("SELECT `title` FROM `item` WHERE `parent-uri` = '%s' LIMIT 1", - dbesc($it['parent-uri']) - ); - if(count($r)) { - $subtitle = $r[0]['title']; - if($subtitle) { - if(strncasecmp($subtitle,'RE:',3)) - $subject = $subtitle; - else - $subject = 'Re: ' . $subtitle; - } - } + dbesc($it['parent-uri'])); + + if(count($r) AND ($r[0]['title'] != '')) + $subject = $r[0]['title']; } + if(strncasecmp($subject,'RE:',3)) + $subject = 'Re: '.$subject; } - - $headers .= 'MIME-Version: 1.0' . "\n"; - $headers .= 'Content-Type: text/html; charset=UTF-8' . "\n"; - $headers .= 'Content-Transfer-Encoding: 8bit' . "\n\n"; - $html = prepare_body($it); - $message = '' . $html . ''; - logger('notifier: email delivery to ' . $addr); - mail($addr, $subject, $message, $headers); + email_send($addr, $subject, $headers, $it); } break; case NETWORK_DIASPORA: @@ -697,21 +738,22 @@ function notifier_run($argv, $argc){ // unsupported break; } - elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) { - // diaspora delete, + elseif(($target_item['deleted']) && (($target_item['uri'] === $target_item['parent-uri']) || $followup)) { + // send both top-level retractions and relayable retractions for owner to relay diaspora_send_retraction($target_item,$owner,$contact); break; } elseif($followup) { - // send comments, likes and retractions of likes to owner to relay + // send comments and likes to owner to relay diaspora_send_followup($target_item,$owner,$contact); break; } - elseif($target_item['parent'] != $target_item['id']) { - // we are the relay - send comments, likes and unlikes to our conversants + elseif($target_item['uri'] !== $target_item['parent-uri']) { + // we are the relay - send comments, likes and relayable_retractions + // (of comments and likes) to our conversants diaspora_send_relay($target_item,$owner,$contact); break; - } + } elseif(($top_level) && (! $walltowall)) { // currently no workable solution for sending walltowall diaspora_send_status($target_item,$owner,$contact); @@ -755,7 +797,7 @@ function notifier_run($argv, $argc){ ); $r2 = q("SELECT `id`, `name`,`network` FROM `contact` - WHERE `network` in ( '%s', '%s') AND `uid` = %d AND `blocked` = 0 AND `pending` = 0 + WHERE `network` in ( '%s', '%s') AND `uid` = %d AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 AND `rel` != %d order by rand() ", dbesc(NETWORK_DFRN), dbesc(NETWORK_MAIL2), @@ -818,6 +860,15 @@ function notifier_run($argv, $argc){ } + // If the item was deleted, clean up the `sign` table + if($target_item['deleted']) { + $r = q("DELETE FROM sign where `retract_iid` = %d", + intval($target_item['id']) + ); + } + + logger('notifier: calling hooks', LOGGER_DEBUG); + if($normal_mode) call_hooks('notifier_normal',$target_item);