X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fnotifier.php;h=d222fd9426d5506ab88d3d01ee8c38fd0a0c40d8;hb=6f5bc8d9a79204b81109bad208d48305cc592e81;hp=171b55fc37425f0fa513be5266cbfeab0933c7ad;hpb=234598280d96627861a1ff1dcfc8a4a59bd37054;p=friendica.git diff --git a/include/notifier.php b/include/notifier.php index 171b55fc37..d222fd9426 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -1,5 +1,4 @@ get_hostname()); if(strpos($localhost,':')) $localhost = substr($localhost,0,strpos($localhost,':')); /** * - * Be VERY CAREFUL if you make any changes to the following several lines. Seemingly innocuous changes - * have been known to cause runaway conditions which affected several servers, along with - * permissions issues. + * Be VERY CAREFUL if you make any changes to the following several lines. Seemingly innocuous changes + * have been known to cause runaway conditions which affected several servers, along with + * permissions issues. * */ - + $relay_to_owner = false; if((! $top_level) && ($parent['wall'] == 0) && (! $expire) && (stristr($target_item['uri'],$localhost))) { @@ -247,8 +274,8 @@ function notifier_run($argv, $argc){ if(($cmd === 'uplink') && (intval($parent['forum_mode']) == 1) && (! $top_level)) { - $relay_to_owner = true; - } + $relay_to_owner = true; + } // until the 'origin' flag has been in use for several months // we will just use it as a fallback test @@ -287,7 +314,7 @@ function notifier_run($argv, $argc){ } $allow_people = expand_acl($parent['allow_cid']); - $allow_groups = expand_groups(expand_acl($parent['allow_gid'])); + $allow_groups = expand_groups(expand_acl($parent['allow_gid']),true); $deny_people = expand_acl($parent['deny_cid']); $deny_groups = expand_groups(expand_acl($parent['deny_gid'])); @@ -404,6 +431,45 @@ function notifier_run($argv, $argc){ ); } + elseif($relocate) { + $public_message = false; // suggestions are not public + + $sugg_template = get_markup_template('atom_relocate.tpl'); + + /* get site pubkey. this could be a new installation with no site keys*/ + $pubkey = get_config('system','site_pubkey'); + if(! $pubkey) { + $res = new_keypair(1024); + set_config('system','site_prvkey', $res['prvkey']); + set_config('system','site_pubkey', $res['pubkey']); + } + + $rp = q("SELECT `resource-id` , `scale`, type FROM `photo` + WHERE `profile` = 1 AND `uid` = %d ORDER BY scale;", $uid); + $photos = array(); + $ext = Photo::supportedTypes(); + foreach($rp as $p){ + $photos[$p['scale']] = $a->get_baseurl().'/photo/'.$p['resource-id'].'-'.$p['scale'].'.'.$ext[$p['type']]; + } + unset($rp, $ext); + + $atom .= replace_macros($sugg_template, array( + '$name' => xmlify($owner['name']), + '$photo' => xmlify($photos[4]), + '$thumb' => xmlify($photos[5]), + '$micro' => xmlify($photos[6]), + '$url' => xmlify($owner['url']), + '$request' => xmlify($owner['request']), + '$confirm' => xmlify($owner['confirm']), + '$notify' => xmlify($owner['notify']), + '$poll' => xmlify($owner['poll']), + '$sitepubkey' => xmlify(get_config('system','site_pubkey')), + //'$pubkey' => xmlify($owner['pubkey']), + //'$prvkey' => xmlify($owner['prvkey']), + )); + $recipients_relocate = q("SELECT * FROM contact WHERE uid = %d AND self = 0 AND network = '%s'" , intval($uid), NETWORK_DFRN); + unset($photos); + } else { if($followup) { foreach($items as $item) { // there is only one item @@ -479,9 +545,12 @@ function notifier_run($argv, $argc){ else $recip_str = implode(', ', $recipients); - $r = q("SELECT * FROM `contact` WHERE `id` IN ( %s ) AND `blocked` = 0 AND `pending` = 0 ", - dbesc($recip_str) - ); + if ($relocate) + $r = $recipients_relocate; + else + $r = q("SELECT * FROM `contact` WHERE `id` IN ( %s ) AND `blocked` = 0 AND `pending` = 0 ", + dbesc($recip_str) + ); require_once('include/salmon.php'); @@ -493,7 +562,7 @@ function notifier_run($argv, $argc){ if(count($r)) { foreach($r as $contact) { - if((! $mail) && (! $fsuggest) && (! $followup) && (! $contact['self'])) { + if((! $mail) && (! $fsuggest) && (! $followup) && (!$relocate) && (! $contact['self'])) { if(($contact['network'] === NETWORK_DIASPORA) && ($public_message)) continue; q("insert into deliverq ( `cmd`,`item`,`contact` ) values ('%s', %d, %d )", @@ -508,12 +577,12 @@ function notifier_run($argv, $argc){ // 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 + // 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. + // 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) @@ -528,9 +597,9 @@ function notifier_run($argv, $argc){ 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 recipients here. - - if((! $mail) && (! $fsuggest) && (! $followup)) { + // we will deliver single recipient types of message and email recipients here. + + if((! $mail) && (! $fsuggest) && (!$relocate) && (! $followup)) { $this_batch[] = $contact['id']; @@ -542,10 +611,14 @@ function notifier_run($argv, $argc){ } continue; } + // be sure to pick up any stragglers + if(count($this_batch)) + proc_run('php','include/delivery.php',$cmd,$item_id,$this_batch); + $deliver_status = 0; - logger("main delivery by notifier: followup=$followup mail=$mail fsuggest=$fsuggest"); + logger("main delivery by notifier: followup=$followup mail=$mail fsuggest=$fsuggest relocate=$relocate"); switch($contact['network']) { case NETWORK_DFRN: @@ -562,20 +635,20 @@ function notifier_run($argv, $argc){ else $sql_extra = sprintf(" AND `issued-id` = '%s' ", dbesc($contact['dfrn-id'])); - $x = q("SELECT `contact`.*, `contact`.`uid` AS `importer_uid`, - `contact`.`pubkey` AS `cpubkey`, - `contact`.`prvkey` AS `cprvkey`, - `contact`.`thumb` AS `thumb`, + $x = q("SELECT `contact`.*, `contact`.`uid` AS `importer_uid`, + `contact`.`pubkey` AS `cpubkey`, + `contact`.`prvkey` AS `cprvkey`, + `contact`.`thumb` AS `thumb`, `contact`.`url` as `url`, `contact`.`name` as `senderName`, - `user`.* - FROM `contact` - LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid` + `user`.* + FROM `contact` + INNER JOIN `user` ON `contact`.`uid` = `user`.`uid` 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", + AND `user`.`account_expired` = 0 AND `user`.`account_removed` = 0 LIMIT 1", dbesc(NETWORK_DFRN), dbesc($nickname) ); @@ -583,7 +656,7 @@ function notifier_run($argv, $argc){ if($x && count($x)) { $write_flag = ((($x[0]['rel']) && ($x[0]['rel'] != CONTACT_IS_SHARING)) ? true : false); if((($owner['page-flags'] == PAGE_COMMUNITY) || ($write_flag)) && (! $x[0]['writable'])) { - q("update contact set writable = 1 where id = %d limit 1", + q("update contact set writable = 1 where id = %d", intval($x[0]['id']) ); $x[0]['writable'] = 1; @@ -591,7 +664,7 @@ function notifier_run($argv, $argc){ // 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); @@ -603,17 +676,15 @@ function notifier_run($argv, $argc){ require_once('library/simplepie/simplepie.inc'); logger('mod-delivery: local delivery'); local_delivery($x[0],$atom); - break; + break; } } - - logger('notifier: dfrndelivery: ' . $contact['name']); $deliver_status = dfrn_deliver($owner,$contact,$atom); logger('notifier: dfrn_delivery returns ' . $deliver_status); - + if($deliver_status == (-1)) { logger('notifier: delivery failed: queuing message'); // queue message for redelivery @@ -625,6 +696,7 @@ function notifier_run($argv, $argc){ // 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')) break; @@ -636,8 +708,7 @@ function notifier_run($argv, $argc){ // queue message for redelivery add_to_queue($contact['id'],NETWORK_OSTATUS,$slap); } - } - else { + } else { // only send salmon if public - e.g. if it's ok to notify // a public hub, it's ok to send a salmon @@ -659,7 +730,7 @@ function notifier_run($argv, $argc){ case NETWORK_MAIL: case NETWORK_MAIL2: - + if(get_config('system','dfrn_only')) break; @@ -684,7 +755,7 @@ function notifier_run($argv, $argc){ } if(! $it) break; - + $local_user = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", @@ -692,7 +763,7 @@ function notifier_run($argv, $argc){ ); if(! count($local_user)) break; - + $reply_to = ''; $r1 = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1", intval($uid) @@ -703,29 +774,43 @@ function notifier_run($argv, $argc){ $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: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . $local_user[0]['email'] . '>' . "\n"; + if($reply_to) { + $headers = 'From: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . $reply_to . '>' . "\n"; + $headers .= 'Sender: '.$local_user[0]['email']."\n"; + } else + $headers = 'From: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . $local_user[0]['email'] . '>' . "\n"; else $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"; - - // for testing purposes: Collect exported mails - //$file = tempnam("/tmp/friendica/", "mail-out2-"); - //file_put_contents($file, json_encode($it)); + //if($reply_to) + // $headers .= 'Reply-to: ' . $reply_to . "\n"; $headers .= 'Message-Id: <' . iri2msgid($it['uri']) . '>' . "\n"; if($it['uri'] !== $it['parent-uri']) { - $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'])); + $headers .= "References: <".iri2msgid($it["parent-uri"]).">"; + + // If Threading is enabled, write down the correct parent + if (($it["thr-parent"] != "") and ($it["thr-parent"] != $it["parent-uri"])) + $headers .= " <".iri2msgid($it["thr-parent"]).">"; + $headers .= "\n"; - if(count($r) AND ($r[0]['title'] != '')) + if(!$it['title']) { + $r = q("SELECT `title` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", + dbesc($it['parent-uri']), + intval($uid)); + + if(count($r) AND ($r[0]['title'] != '')) $subject = $r[0]['title']; + else { + $r = q("SELECT `title` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d LIMIT 1", + dbesc($it['parent-uri']), + intval($uid)); + + if(count($r) AND ($r[0]['title'] != '')) + $subject = $r[0]['title']; + } } if(strncasecmp($subject,'RE:',3)) $subject = 'Re: '.$subject; @@ -758,7 +843,7 @@ function notifier_run($argv, $argc){ if(! $contact['pubkey']) break; - + if($target_item['verb'] === ACTIVITY_DISLIKE) { // unsupported break; @@ -791,12 +876,15 @@ function notifier_run($argv, $argc){ case NETWORK_FACEBOOK: if(get_config('system','dfrn_only')) break; + case NETWORK_PUMPIO: + if(get_config('system','dfrn_only')) + break; default: break; } } } - + // send additional slaps to mentioned remote tags (@foo@example.com) if($slap && count($url_recipients) && ($followup || $top_level) && $public_message && (! $expire)) { @@ -814,14 +902,14 @@ function notifier_run($argv, $argc){ if($public_message) { - $r1 = q("SELECT DISTINCT(`batch`), `id`, `name`,`network` FROM `contact` WHERE `network` = '%s' + $r1 = q("SELECT DISTINCT(`batch`), `id`, `name`,`network` FROM `contact` WHERE `network` = '%s' AND `uid` = %d AND `rel` != %d group by `batch` ORDER BY rand() ", dbesc(NETWORK_DIASPORA), intval($owner['uid']), intval(CONTACT_IS_SHARING) ); - - $r2 = q("SELECT `id`, `name`,`network` FROM `contact` + + $r2 = q("SELECT `id`, `name`,`network` FROM `contact` 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), @@ -874,9 +962,18 @@ function notifier_run($argv, $argc){ $h = trim($h); if(! strlen($h)) continue; - $params = 'hub.mode=publish&hub.url=' . urlencode($a->get_baseurl() . '/dfrn_poll/' . $owner['nickname'] ); - post_url($h,$params); - logger('pubsub: publish: ' . $h . ' ' . $params . ' returned ' . $a->get_curl_code()); + + if ($h === '[internal]') { + // Set push flag for PuSH subscribers to this topic, + // they will be notified in queue.php + q("UPDATE `push_subscriber` SET `push` = 1 " . + "WHERE `nickname` = '%s'", dbesc($owner['nickname'])); + } else { + + $params = 'hub.mode=publish&hub.url=' . urlencode( $a->get_baseurl() . '/dfrn_poll/' . $owner['nickname'] ); + post_url($h,$params); + logger('pubsub: publish: ' . $h . ' ' . $params . ' returned ' . $a->get_curl_code()); + } if(count($hubs) > 1) sleep(7); // try and avoid multiple hubs responding at precisely the same time } @@ -902,6 +999,7 @@ function notifier_run($argv, $argc){ return; } + if (array_search(__file__,get_included_files())===0){ notifier_run($argv,$argc); killme();