X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fnotifier.php;h=067251b4294e094e6c9b753aed19ef2aad9c78c1;hb=f39e2803f89258f26dceaa7149b7796c89cd9960;hp=a3286355ddabb371578c990abbae967dda6764de;hpb=ed33d28e6149f7151dca9a9534baef3bcb936c12;p=friendica.git diff --git a/include/notifier.php b/include/notifier.php index a3286355dd..067251b429 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -5,16 +5,16 @@ require_once('include/html2plain.php'); /* * This file was at one time responsible for doing all deliveries, but this caused - * big problems on shared hosting systems, where the process might get killed by the - * hosting provider and nothing would get delivered. + * big problems on shared hosting systems, where the process might get killed by the + * hosting provider and nothing would get delivered. * It now only delivers one message under certain cases, and invokes a queued - * delivery mechanism (include/deliver.php) to deliver individual contacts at + * delivery mechanism (include/deliver.php) to deliver individual contacts at * controlled intervals. * This has a much better chance of surviving random processes getting killed - * by the hosting provider. + * by the hosting provider. * A lot of this code is duplicated in include/deliver.php until we have time to go back - * and re-structure the delivery procedure based on the obstacles that have been thrown at - * us by hosting providers. + * and re-structure the delivery procedure based on the obstacles that have been thrown at + * us by hosting providers. */ /* @@ -38,6 +38,7 @@ require_once('include/html2plain.php'); * tgroup (in items.php) * wall-new (in photos.php, item.php) * removeme (in Contact.php) + * relocate (in uimport.php) * * and ITEM_ID is the id of the item in the database that needs to be sent to others. */ @@ -49,12 +50,12 @@ function notifier_run(&$argv, &$argc){ if(is_null($a)){ $a = new App; } - + if(is_null($db)) { @include(".htconfig.php"); require_once("include/dba.php"); $db = new dba($db_host, $db_user, $db_pass, $db_data); - unset($db_host, $db_user, $db_pass, $db_data); + unset($db_host, $db_user, $db_pass, $db_data); } require_once("include/session.php"); @@ -89,7 +90,7 @@ function notifier_run(&$argv, &$argc){ $expire = false; $mail = false; $fsuggest = false; - $relocate = false; + $relocate = false; $top_level = false; $recipients = array(); $url_recipients = array(); @@ -134,8 +135,7 @@ function notifier_run(&$argv, &$argc){ $uid = $suggest[0]['uid']; $recipients[] = $suggest[0]['cid']; $item = $suggest[0]; - } - elseif($cmd === 'removeme') { + } elseif($cmd === 'removeme') { $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($item_id)); if (! $r) return; @@ -155,13 +155,11 @@ function notifier_run(&$argv, &$argc){ terminate_friendship($user, $self, $contact); } return; - } - elseif($cmd === 'relocate') { - $normal_mode = false; + } elseif($cmd === 'relocate') { + $normal_mode = false; $relocate = true; - $uid = $item_id; - } - else { + $uid = $item_id; + } else { // find ancestors $r = q("SELECT * FROM `item` WHERE `id` = %d and visible = 1 and moderated = 0 LIMIT 1", intval($item_id) @@ -203,10 +201,10 @@ function notifier_run(&$argv, &$argc){ } - $r = q("SELECT `contact`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`, - `user`.`timezone`, `user`.`nickname`, `user`.`sprvkey`, `user`.`spubkey`, + $r = q("SELECT `contact`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`, + `user`.`timezone`, `user`.`nickname`, `user`.`sprvkey`, `user`.`spubkey`, `user`.`page-flags`, `user`.`prvnets` - FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid` + FROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid` WHERE `contact`.`uid` = %d AND `contact`.`self` = 1 LIMIT 1", intval($uid) ); @@ -240,31 +238,31 @@ function notifier_run(&$argv, &$argc){ // if $parent['wall'] == 1 we will already have the parent message in our array // and we will relay the whole lot. - + // expire sends an entire group of expire messages and cannot be forwarded. - // However the conversation owner will be a part of the conversation and will + // However the conversation owner will be a part of the conversation and will // be notified during this run. // Other DFRN conversation members will be alerted during polled updates. // Diaspora members currently are not notified of expirations, and other networks have - // either limited or no ability to process deletions. We should at least fix Diaspora + // either limited or no ability to process deletions. We should at least fix Diaspora // by stringing togther an array of retractions and sending them onward. - - + + $localhost = str_replace('www.','',$a->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))) { @@ -273,8 +271,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 @@ -294,8 +292,28 @@ function notifier_run(&$argv, &$argc){ $followup = true; $public_message = false; // not public $conversant_str = dbesc($parent['contact-id']); - } - else { + $recipients = array($parent['contact-id']); + + if ($parent['network'] == NETWORK_OSTATUS) { + + // Check if the recipient isn't in your contact list + $r = q("SELECT `url` FROM `contact` WHERE `id` = %d", $parent['contact-id']); + if (count($r)) { + $url_recipients = array(); + + $thrparent = q("SELECT `author-link` FROM `item` WHERE `uri` = '%s'", dbesc($target_item["thr-parent"])); + if (count($thrparent) AND (normalise_link($r[0]["url"]) != normalise_link($thrparent[0]["author-link"]))) { + require_once("include/Scrape.php"); + $probed_contact = probe_url($thrparent[0]["author-link"]); + if ($probed_contact["notify"] != "") { + logger('scrape data for slapper: '.print_r($probed_contact, true)); + $url_recipients[$probed_contact["notify"]] = $probed_contact["notify"]; + } + } + } + logger("url_recipients".print_r($url_recipients,true)); + } + } else { $followup = false; // don't send deletions onward for other people's stuff @@ -305,9 +323,9 @@ function notifier_run(&$argv, &$argc){ return; } - if((strlen($parent['allow_cid'])) - || (strlen($parent['allow_gid'])) - || (strlen($parent['deny_cid'])) + if((strlen($parent['allow_cid'])) + || (strlen($parent['allow_gid'])) + || (strlen($parent['deny_cid'])) || (strlen($parent['deny_gid']))) { $public_message = false; // private recipients, not public } @@ -409,8 +427,7 @@ function notifier_run(&$argv, &$argc){ '$content' => xmlify($body), '$parent_id' => xmlify($item['parent-uri']) )); - } - elseif($fsuggest) { + } elseif($fsuggest) { $public_message = false; // suggestions are not public $sugg_template = get_markup_template('atom_suggest.tpl'); @@ -429,9 +446,8 @@ function notifier_run(&$argv, &$argc){ intval($item['id']) ); - } - elseif($relocate) { - $public_message = false; // suggestions are not public + } elseif($relocate) { + $public_message = false; // suggestions are not public $sugg_template = get_markup_template('atom_relocate.tpl'); @@ -442,7 +458,7 @@ function notifier_run(&$argv, &$argc){ 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(); @@ -451,25 +467,24 @@ function notifier_run(&$argv, &$argc){ $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); + + $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 { + } else { if($followup) { foreach($items as $item) { // there is only one item if(! $item['parent']) @@ -480,8 +495,7 @@ function notifier_run(&$argv, &$argc){ $atom .= atom_entry($item,'text',null,$owner,false); } } - } - else { + } else { foreach($items as $item) { if(! $item['parent']) @@ -505,11 +519,10 @@ function notifier_run(&$argv, &$argc){ if($item_id == $item['id'] || $item['id'] == $item['parent']) $atom .= atom_entry($item,'text',null,$owner,true); - } - else + } else $atom .= atom_entry($item,'text',null,$owner,true); - if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire)) + if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire)) $slaps[] = atom_entry($item,'html',null,$owner,true); } } @@ -525,8 +538,8 @@ function notifier_run(&$argv, &$argc){ $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1); if(! $mail_disabled) { - if((! strlen($target_item['allow_cid'])) && (! strlen($target_item['allow_gid'])) - && (! strlen($target_item['deny_cid'])) && (! strlen($target_item['deny_gid'])) + if((! strlen($target_item['allow_cid'])) && (! strlen($target_item['allow_gid'])) + && (! strlen($target_item['deny_cid'])) && (! strlen($target_item['deny_gid'])) && (intval($target_item['pubmail']))) { $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `network` = '%s'", intval($uid), @@ -544,12 +557,12 @@ function notifier_run(&$argv, &$argc){ else $recip_str = implode(', ', $recipients); - if ($relocate) - $r = $recipients_relocate; - else - $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'); @@ -576,12 +589,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) @@ -596,8 +609,8 @@ 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. - + // we will deliver single recipient types of message and email recipients here. + if((! $mail) && (! $fsuggest) && (!$relocate) && (! $followup)) { $this_batch[] = $contact['id']; @@ -634,15 +647,15 @@ 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' @@ -655,7 +668,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; @@ -663,7 +676,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); @@ -675,17 +688,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 @@ -697,6 +708,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; @@ -708,8 +720,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 @@ -731,7 +742,7 @@ function notifier_run(&$argv, &$argc){ case NETWORK_MAIL: case NETWORK_MAIL2: - + if(get_config('system','dfrn_only')) break; @@ -756,7 +767,7 @@ function notifier_run(&$argv, &$argc){ } if(! $it) break; - + $local_user = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", @@ -764,7 +775,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) @@ -787,10 +798,6 @@ function notifier_run(&$argv, &$argc){ //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)); - $headers .= 'Message-Id: <' . iri2msgid($it['uri']) . '>' . "\n"; if($it['uri'] !== $it['parent-uri']) { @@ -848,7 +855,7 @@ function notifier_run(&$argv, &$argc){ if(! $contact['pubkey']) break; - + if($target_item['verb'] === ACTIVITY_DISLIKE) { // unsupported break; @@ -881,12 +888,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)) { @@ -904,14 +914,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), @@ -948,7 +958,7 @@ function notifier_run(&$argv, &$argc){ } if((! $mail) && (! $fsuggest) && (! $followup)) { - logger('notifier: delivery agent: ' . $rr['name'] . ' ' . $rr['id']); + logger('notifier: delivery agent: ' . $rr['name'] . ' ' . $rr['id']); proc_run('php','include/delivery.php',$cmd,$item_id,$rr['id']); if($interval) @time_sleep_until(microtime(true) + (float) $interval); @@ -964,9 +974,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 } @@ -994,6 +1013,6 @@ function notifier_run(&$argv, &$argc){ if (array_search(__file__,get_included_files())===0){ - notifier_run($argv,$argc); - killme(); + notifier_run($_SERVER["argv"],$_SERVER["argc"]); + killme(); }