X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=inline;f=include%2Fnotifier.php;h=5b23406fce629b514e472a5526ab8c2d70856de5;hb=f03c57007a2a9ec73902acfb2d951528e68e3117;hp=c3f7f33ea1566e21d1b292ff62de8c3a0de06df1;hpb=90870d4872dbc8ff408183a79fd005b905aa86c2;p=friendica.git diff --git a/include/notifier.php b/include/notifier.php old mode 100644 new mode 100755 index c3f7f33ea1..5b23406fce --- a/include/notifier.php +++ b/include/notifier.php @@ -1,6 +1,8 @@ get_hostname(); + $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 line. Seemingly innocuous changes + * 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))) { + $relay_to_owner = true; + } + + + if(($cmd === 'uplink') && (intval($parent['forum_mode'])) && (! $top_level)) { + $relay_to_owner = true; + } + + // until the 'origin' flag has been in use for several months + // we will just use it as a fallback test + // later we will be able to use it as the primary test of whether or not to relay. + + if(! $target_item['origin']) + $relay_to_owner = false; + + if($parent['origin']) + $relay_to_owner = false; + + + + if($relay_to_owner) { + logger('notifier: followup', LOGGER_DEBUG); // local followup to remote post $followup = true; $public_message = false; // not public @@ -217,6 +246,13 @@ function notifier_run($argv, $argc){ else { $followup = false; + // don't send deletions onward for other people's stuff + + if($target_item['deleted'] && (! intval($target_item['wall']))) { + logger('notifier: ignoring delete notification for non-wall item'); + return; + } + if((strlen($parent['allow_cid'])) || (strlen($parent['allow_gid'])) || (strlen($parent['deny_cid'])) @@ -229,6 +265,13 @@ 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 origional author causing + // a delivery fork + + if(intval($parent['forum_mode']) && (! $top_level) && ($cmd !== 'uplink')) { + proc_run('php','include/notifier','uplink',$item_id); + } + $conversants = array(); foreach($items as $item) { @@ -281,7 +324,7 @@ function notifier_run($argv, $argc){ $birthday = '' . xmlify($birthday) . ''; $atom .= replace_macros($feed_template, array( - '$version' => xmlify(FRIENDIKA_VERSION), + '$version' => xmlify(FRIENDICA_VERSION), '$feed_id' => xmlify($a->get_baseurl() . '/profile/' . $owner['nickname'] ), '$feed_title' => xmlify($owner['name']), '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', $updated . '+00:00' , ATOM_TIME)) , @@ -340,8 +383,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); } } } @@ -356,7 +399,9 @@ function notifier_run($argv, $argc){ if(($public_message) && $item['private']) continue; + $contact = get_item_contact($item,$contacts); + if(! $contact) continue; @@ -366,13 +411,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); } } } @@ -451,6 +496,54 @@ function notifier_run($argv, $argc){ switch($contact['network']) { case NETWORK_DFRN: + + // perform local delivery if we are on the same site + + $basepath = implode('/', array_slice(explode('/',$contact['url']),0,3)); + + if(link_compare($basepath,$a->get_baseurl())) { + + $nickname = basename($contact['url']); + if($contact['issued-id']) + $sql_extra = sprintf(" AND `dfrn-id` = '%s' ", dbesc($contact['issued-id'])); + 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`, + `contact`.`url` as `url`, + `contact`.`name` as `senderName`, + `user`.* + FROM `contact` + LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid` + WHERE `contact`.`blocked` = 0 AND `contact`.`pending` = 0 + AND `contact`.`network` = '%s' AND `user`.`nickname` = '%s' + $sql_extra + AND `user`.`account_expired` = 0 LIMIT 1", + dbesc(NETWORK_DFRN), + dbesc($nickname) + ); + + 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; + } + + require_once('library/simplepie/simplepie.inc'); + logger('mod-delivery: local delivery'); + local_delivery($x[0],$atom); + break; + } + } + + + logger('notifier: dfrndelivery: ' . $contact['name']); $deliver_status = dfrn_deliver($owner,$contact,$atom); @@ -459,13 +552,7 @@ function notifier_run($argv, $argc){ if($deliver_status == (-1)) { logger('notifier: delivery failed: queuing message'); // queue message for redelivery - q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`) - VALUES ( %d, '%s', '%s', '%s') ", - intval($contact['id']), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc($atom) - ); + add_to_queue($contact['id'],NETWORK_DFRN,$atom); } break; case NETWORK_OSTATUS: @@ -482,14 +569,7 @@ function notifier_run($argv, $argc){ if($deliver_status == (-1)) { // queue message for redelivery - q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`) - VALUES ( %d, '%s', '%s', '%s') ", - intval($contact['id']), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc($slap) - ); - + add_to_queue($contact['id'],NETWORK_OSTATUS,$slap); } } else { @@ -504,13 +584,7 @@ function notifier_run($argv, $argc){ $deliver_status = slapper($owner,$contact['notify'],$slappy); if($deliver_status == (-1)) { // queue message for redelivery - q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`) - VALUES ( %d, '%s', '%s', '%s') ", - intval($contact['id']), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc($slappy) - ); + add_to_queue($contact['id'],NETWORK_OSTATUS,$slappy); } } } @@ -519,6 +593,7 @@ function notifier_run($argv, $argc){ break; case NETWORK_MAIL: + case NETWORK_MAIL2: if(get_config('system','dfrn_only')) break; @@ -559,17 +634,27 @@ 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")) ; - $headers = 'From: ' . $local_user[0]['username'] . ' <' . $local_user[0]['email'] . '>' . "\n"; + + $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"; + 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"; - $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"; + $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']) @@ -586,19 +671,30 @@ function notifier_run($argv, $argc){ } } - $headers .= 'MIME-Version: 1.0' . "\n"; - $headers .= 'Content-Type: text/html; charset=UTF-8' . "\n"; + /*$headers .= 'MIME-Version: 1.0' . "\n"; + //$headers .= 'Content-Type: text/html; charset=UTF-8' . "\n"; + $headers .= 'Content-Type: text/plain; charset=UTF-8' . "\n"; $headers .= 'Content-Transfer-Encoding: 8bit' . "\n\n"; $html = prepare_body($it); - $message = '' . $html . ''; + //$message = '' . $html . ''; + $message = html2plain($html); logger('notifier: email delivery to ' . $addr); - mail($addr, $subject, $message, $headers); + mail($addr, $subject, $message, $headers);*/ + email_send($addr, $subject, $headers, $it); } break; case NETWORK_DIASPORA: require_once('include/diaspora.php'); - if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) + if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled'))) + break; + + if($mail) { + diaspora_send_mail($item,$owner,$contact); + break; + } + + if(! $normal_mode) break; // special handling for followup to public post @@ -631,7 +727,7 @@ function notifier_run($argv, $argc){ // we are the relay - send comments, likes and unlikes 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); @@ -668,16 +764,17 @@ function notifier_run($argv, $argc){ if($public_message) { $r1 = q("SELECT DISTINCT(`batch`), `id`, `name`,`network` FROM `contact` WHERE `network` = '%s' - AND `uid` = %d AND `rel` != %d ORDER BY rand() ", + 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` - WHERE `network` = '%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 `rel` != %d order by rand() ", dbesc(NETWORK_DFRN), + dbesc(NETWORK_MAIL2), intval($owner['uid']), intval(CONTACT_IS_SHARING) ); @@ -737,6 +834,11 @@ function notifier_run($argv, $argc){ } + if($normal_mode) + call_hooks('notifier_normal',$target_item); + + call_hooks('notifier_end',$target_item); + return; }