break up delivery into per-person processes
This commit is contained in:
		
							
								
								
									
										420
									
								
								include/delivery.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										420
									
								
								include/delivery.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,420 @@ | ||||
| <?php | ||||
| require_once("boot.php"); | ||||
|  | ||||
| function delivery_run($argv, $argc){ | ||||
| 	global $a, $db; | ||||
|  | ||||
| 	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); | ||||
| 	} | ||||
|  | ||||
| 	require_once("session.php"); | ||||
| 	require_once("datetime.php"); | ||||
| 	require_once('include/items.php'); | ||||
| 	require_once('include/bbcode.php'); | ||||
| 	require_once('include/diaspora.php'); | ||||
|  | ||||
| 	load_config('config'); | ||||
| 	load_config('system'); | ||||
|  | ||||
| 	load_hooks(); | ||||
|  | ||||
| 	if($argc < 3) | ||||
| 		return; | ||||
|  | ||||
| 	$a->set_baseurl(get_config('system','url')); | ||||
|  | ||||
| 	logger('delivery: invoked: ' . print_r($argv,true)); | ||||
|  | ||||
| 	$cmd        = $argv[1]; | ||||
| 	$item_id    = intval($argv[2]); | ||||
| 	$contact_id = intval($argv[3]); | ||||
|  | ||||
| 	if((! $item_id) || (! $contact_id)) | ||||
| 		return; | ||||
|  | ||||
| 	$expire = false; | ||||
| 	$top_level = false; | ||||
| 	$recipients = array(); | ||||
| 	$url_recipients = array(); | ||||
|  | ||||
| 	$normal_mode = true; | ||||
|  | ||||
| 	$recipients[] = $contact_id; | ||||
|  | ||||
| 	if($cmd === 'expire') { | ||||
| 		$normal_mode = false; | ||||
| 		$expire = true; | ||||
| 		$items = q("SELECT * FROM `item` WHERE `uid` = %d AND `wall` = 1  | ||||
| 			AND `deleted` = 1 AND `changed` > UTC_TIMESTAMP - INTERVAL 30 MINUTE", | ||||
| 			intval($item_id) | ||||
| 		); | ||||
| 		$uid = $item_id; | ||||
| 		$item_id = 0; | ||||
| 		if(! count($items)) | ||||
| 			return; | ||||
| 	} | ||||
| 	else { | ||||
|  | ||||
| 		// find ancestors | ||||
| 		$r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1", | ||||
| 			intval($item_id) | ||||
| 		); | ||||
|  | ||||
| 		if((! count($r)) || (! intval($r[0]['parent']))) { | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$target_item = $r[0]; | ||||
| 		$parent_id = intval($r[0]['parent']); | ||||
| 		$uid = $r[0]['uid']; | ||||
| 		$updated = $r[0]['edited']; | ||||
|  | ||||
| 		$items = q("SELECT * FROM `item` WHERE `parent` = %d ORDER BY `id` ASC", | ||||
| 			intval($parent_id) | ||||
| 		); | ||||
|  | ||||
| 		if(! count($items)) { | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$icontacts = q("SELECT * FROM `contact` WHERE `id` IN ( SELECT distinct(`contact-id`) FROM `item` where `parent` = %d ) ", | ||||
| 			intval($parent_id) | ||||
| 		); | ||||
| 		if(! count($icontacts)) | ||||
| 			return; | ||||
|  | ||||
|  | ||||
| 		// avoid race condition with deleting entries | ||||
|  | ||||
| 		if($items[0]['deleted']) { | ||||
| 			foreach($items as $item) | ||||
| 				$item['deleted'] = 1; | ||||
| 		} | ||||
|  | ||||
| 		if(count($items) == 1 && $items[0]['uri'] === $items[0]['parent-uri']) | ||||
| 			$top_level = true; | ||||
| 	} | ||||
|  | ||||
| 	$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`  | ||||
| 		WHERE `contact`.`uid` = %d AND `contact`.`self` = 1 LIMIT 1", | ||||
| 		intval($uid) | ||||
| 	); | ||||
|  | ||||
| 	if(! count($r)) | ||||
| 		return; | ||||
|  | ||||
| 	$owner = $r[0]; | ||||
|  | ||||
| 	$public_message = true; | ||||
|  | ||||
| 	// fill this in with a single salmon slap if applicable | ||||
| 	$slap = ''; | ||||
|  | ||||
| 	require_once('include/group.php'); | ||||
|  | ||||
| 	$parent = $items[0]; | ||||
|  | ||||
| 		// This is IMPORTANT!!!! | ||||
|  | ||||
| 		// We will only send a "notify owner to relay" or followup message if the referenced post | ||||
| 		// originated on our system by virtue of having our hostname somewhere | ||||
| 		// in the URI, AND it was a comment (not top_level) AND the parent originated elsewhere. | ||||
| 		// 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  | ||||
| 		// 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  | ||||
| 		// by stringing togther an array of retractions and sending them onward. | ||||
| 		  | ||||
|   	 | ||||
| 	$localhost = $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  | ||||
| 		 * have been known to cause runaway conditions which affected several servers, along with  | ||||
| 		 * permissions issues.  | ||||
| 		 * | ||||
| 		 */ | ||||
|   | ||||
| 	if((! $top_level) && ($parent['wall'] == 0) && (! $expire) && (stristr($target_item['uri'],$localhost))) { | ||||
| 		logger('relay denied for delivery agent.'); | ||||
|  | ||||
| 		/* no relay allowed for direct contact delivery */ | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	if((strlen($parent['allow_cid']))  | ||||
| 		|| (strlen($parent['allow_gid']))  | ||||
| 		|| (strlen($parent['deny_cid']))  | ||||
| 		|| (strlen($parent['deny_gid']))) { | ||||
| 		$public_message = false; // private recipients, not public | ||||
| 	} | ||||
|  | ||||
| 	$conversant_str = intval($contact_id); | ||||
|  | ||||
| 	$r = q("SELECT * FROM `contact` WHERE `id` = %d AND `blocked` = 0 AND `pending` = 0", | ||||
| 		intval($contact_id) | ||||
| 	); | ||||
|  | ||||
| 	if(count($r)) | ||||
| 		$contact = $r[0]; | ||||
| 	 | ||||
|  | ||||
| 	$feed_template = get_markup_template('atom_feed.tpl'); | ||||
| 	$mail_template = get_markup_template('atom_mail.tpl'); | ||||
|  | ||||
| 	$atom = ''; | ||||
| 	$slaps = array(); | ||||
|  | ||||
| 	$hubxml = feed_hublinks(); | ||||
|  | ||||
| 	$birthday = feed_birthday($owner['uid'],$owner['timezone']); | ||||
|  | ||||
| 	if(strlen($birthday)) | ||||
| 		$birthday = '<dfrn:birthday>' . xmlify($birthday) . '</dfrn:birthday>'; | ||||
|  | ||||
| 	$atom .= replace_macros($feed_template, array( | ||||
| 			'$version'      => xmlify(FRIENDIKA_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)) , | ||||
| 			'$hub'          => $hubxml, | ||||
| 			'$salmon'       => '',  // private feed, we don't use salmon here | ||||
| 			'$name'         => xmlify($owner['name']), | ||||
| 			'$profile_page' => xmlify($owner['url']), | ||||
| 			'$photo'        => xmlify($owner['photo']), | ||||
| 			'$thumb'        => xmlify($owner['thumb']), | ||||
| 			'$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 | ||||
| 	)); | ||||
|  | ||||
| 	foreach($items as $item) { | ||||
| 		if(! $item['parent']) | ||||
| 			continue; | ||||
|  | ||||
| 		// private emails may be in included in public conversations. Filter them. | ||||
| 		if(($public_message) && $item['private']) | ||||
| 			continue; | ||||
|  | ||||
| 		$item_contact = get_item_contact($item,$icontacts); | ||||
| 		if(! $item_contact) | ||||
| 			continue; | ||||
|  | ||||
| 		$atom .= atom_entry($item,'text',$item_contact,$owner,true); | ||||
|  | ||||
| 		if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire))  | ||||
| 			$slaps[] = atom_entry($item,'html',$item_contact,$owner,true); | ||||
| 	} | ||||
|  | ||||
| 	$atom .= '</feed>' . "\r\n"; | ||||
|  | ||||
| 	logger('notifier: ' . $atom, LOGGER_DATA); | ||||
|  | ||||
| 	logger('notifier: slaps: ' . print_r($slaps,true), LOGGER_DATA); | ||||
|  | ||||
|  | ||||
| 	require_once('include/salmon.php'); | ||||
|  | ||||
| 	if($contact['self']) | ||||
| 		return; | ||||
|  | ||||
| 	$deliver_status = 0; | ||||
|  | ||||
| 	switch($contact['network']) { | ||||
|  | ||||
| 		case NETWORK_DFRN : | ||||
| 			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 | ||||
| 				q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`) | ||||
| 					VALUES ( %d, '%s', '%s', '%s') ", | ||||
| 					intval($contact['id']), | ||||
| 					dbesc(datetime_convert()), | ||||
| 					dbesc(datetime_convert()), | ||||
| 					dbesc($atom) | ||||
| 				); | ||||
| 			} | ||||
| 			break; | ||||
|  | ||||
| 		case NETWORK_OSTATUS : | ||||
|  | ||||
| 			// Do not send to otatus 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; | ||||
|  | ||||
| 			// only send salmon if public - e.g. if it's ok to notify | ||||
| 			// a public hub, it's ok to send a salmon | ||||
|  | ||||
| 			if((count($slaps)) && ($public_message) && (! $expire)) { | ||||
| 				logger('notifier: slapdelivery: ' . $contact['name']); | ||||
| 				foreach($slaps as $slappy) { | ||||
| 					if($contact['notify']) { | ||||
| 						$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) | ||||
| 							);								 | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			break; | ||||
|  | ||||
| 		case NETWORK_MAIL : | ||||
| 						 | ||||
| 			if(get_config('system','dfrn_only')) | ||||
| 				break; | ||||
| 			// WARNING: does not currently convert to RFC2047 header encodings, etc. | ||||
|  | ||||
| 			$addr = $contact['addr']; | ||||
| 			if(! strlen($addr)) | ||||
| 				break; | ||||
|  | ||||
| 			if($cmd === 'wall-new' || $cmd === 'comment-new') { | ||||
|  | ||||
| 				$it = null; | ||||
| 				if($cmd === 'wall-new')  | ||||
| 					$it = $items[0]; | ||||
| 				else { | ||||
| 					$r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",  | ||||
| 						intval($argv[2]), | ||||
| 						intval($uid) | ||||
| 					); | ||||
| 					if(count($r)) | ||||
| 						$it = $r[0]; | ||||
| 				} | ||||
| 				if(! $it) | ||||
| 					break; | ||||
| 					 | ||||
|  | ||||
| 				$local_user = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", | ||||
| 					intval($uid) | ||||
| 				); | ||||
| 				if(! count($local_user)) | ||||
| 					break; | ||||
| 					 | ||||
| 				$reply_to = ''; | ||||
| 				$r1 = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1", | ||||
| 					intval($uid) | ||||
| 				); | ||||
| 				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"; | ||||
| 				if($reply_to) | ||||
| 					$headers .= 'Reply-to: ' . $reply_to . "\n"; | ||||
| 				$headers .= 'Message-id: <' . $it['uri'] . '>' . "\n"; | ||||
| 				if($it['uri'] !== $it['parent-uri']) { | ||||
| 					$header .= 'References: <' . $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; | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 				$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><body>' . $html . '</body></html>'; | ||||
| 				logger('notifier: email delivery to ' . $addr); | ||||
| 				mail($addr, $subject, $message, $headers); | ||||
| 			} | ||||
| 			break; | ||||
|  | ||||
| 		case NETWORK_DIASPORA : | ||||
| 			logger('delivery: diaspora deliver: ' . $contact['name']); | ||||
|  | ||||
| 			if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) | ||||
| 				break; | ||||
|  | ||||
| 			if(! $contact['pubkey']) | ||||
| 				break; | ||||
| 					 | ||||
| 			if($target_item['verb'] === ACTIVITY_DISLIKE) { | ||||
| 				// unsupported | ||||
| 				break; | ||||
| 			} | ||||
| 			elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) { | ||||
| 			logger('delivery: diaspora retract: ' . $contact['name']); | ||||
| 				// diaspora delete,  | ||||
| 				diaspora_send_retraction($target_item,$owner,$contact); | ||||
| 				break; | ||||
| 			} | ||||
| 			elseif($target_item['parent'] != $target_item['id']) { | ||||
|  | ||||
| 			logger('delivery: diaspora relay: ' . $contact['name']); | ||||
|  | ||||
| 				// we are the relay - send comments, likes and unlikes to our conversants | ||||
| 				diaspora_send_relay($target_item,$owner,$contact); | ||||
| 				break; | ||||
| 			}		 | ||||
| 			elseif($top_level) { | ||||
| 				logger('delivery: diaspora status: ' . $contact['name']); | ||||
| 				diaspora_send_status($target_item,$owner,$contact); | ||||
| 				break; | ||||
| 			} | ||||
|  | ||||
| 			logger('delivery: diaspora unknown mode: ' . $contact['name']); | ||||
|  | ||||
| 			break; | ||||
|  | ||||
| 		case NETWORK_FEED : | ||||
| 		case NETWORK_FACEBOOK : | ||||
| 			if(get_config('system','dfrn_only')) | ||||
| 				break; | ||||
| 		default: | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| 	return; | ||||
| } | ||||
|  | ||||
| if (array_search(__file__,get_included_files())===0){ | ||||
|   delivery_run($argv,$argc); | ||||
|   killme(); | ||||
| } | ||||
| @@ -1035,14 +1035,6 @@ function diaspora_send_relay($item,$owner,$contact) { | ||||
| 	else | ||||
| 		return; | ||||
|  | ||||
| 	// fetch the original signature	 | ||||
| 	$r = q("select * from sign where iid = %d limit 1", | ||||
| 		intval($item['id']) | ||||
| 	); | ||||
| 	if(! count($r))  | ||||
| 		return; | ||||
| 	$orig_sign = $r[0]; | ||||
|  | ||||
| 	if($item['verb'] === ACTIVITY_LIKE) { | ||||
| 		$tpl = get_markup_template('diaspora_like_relay.tpl'); | ||||
| 		$like = true; | ||||
| @@ -1056,12 +1048,37 @@ function diaspora_send_relay($item,$owner,$contact) { | ||||
|  | ||||
| 	$text = bb2diaspora($item['body']); | ||||
|  | ||||
| 	// sign it | ||||
| 	// fetch the original signature	if somebody sent the post to us to relay | ||||
| 	// if we are relaying for a reply originating here, there wasn't a 'send to relay' | ||||
| 	// action. It wasn't needed. In that case create the original signature and the  | ||||
| 	// owner (parent author) signature | ||||
|  | ||||
| 	if($like) | ||||
| 		$parent_signed_text = $orig_sign['signed_text']; | ||||
| 	else | ||||
| 		$parent_signed_text = $orig_sign['signed_text']; | ||||
| 	$r = q("select * from sign where iid = %d limit 1", | ||||
| 		intval($item['id']) | ||||
| 	); | ||||
| 	if(count($r)) {  | ||||
| 		$orig_sign = $r[0]; | ||||
| 		$signed_text = $orig_sign['signed_text']; | ||||
| 		$authorsig = $orig_sign['signature']; | ||||
| 	} | ||||
| 	else { | ||||
| 		if($like) | ||||
| 			$signed_text = $item['guid'] . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $myaddr; | ||||
| 		else | ||||
| 			$signed_text = $item['guid'] . ';' . $parent_guid . ';' . $text . ';' . $myaddr; | ||||
|  | ||||
| 		$authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha')); | ||||
|  | ||||
| 		q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ", | ||||
| 			intval($item['id']), | ||||
| 			dbesc($signed_text), | ||||
| 			dbesc(base64_encode($authorsig)), | ||||
| 			dbesc($myaddr) | ||||
| 		); | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	// sign it | ||||
|  | ||||
| 	$parentauthorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha')); | ||||
|  | ||||
| @@ -1071,18 +1088,11 @@ function diaspora_send_relay($item,$owner,$contact) { | ||||
| 		'$target_type' =>xmlify($target_type), | ||||
| 		'$authorsig' => xmlify($orig_sign['signature']), | ||||
| 		'$parentsig' => xmlify($parentauthorsig), | ||||
| 		'$text' => xmlify($text), | ||||
| 		'$body' => xmlify($text), | ||||
| 		'$positive' => xmlify($positive), | ||||
| 		'$diaspora_handle' => xmlify($myaddr) | ||||
| 		'$handle' => xmlify($myaddr) | ||||
| 	)); | ||||
|  | ||||
| 	// fetch the original signature	 | ||||
| 	$r = q("select * from sign where iid = %d limit 1", | ||||
| 		intval($item['id']) | ||||
| 	); | ||||
| 	if(! count($r))  | ||||
| 		return; | ||||
|  | ||||
| 	logger('diaspora_relay_comment: base message: ' . $msg, LOGGER_DATA); | ||||
|  | ||||
| 	$slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey']))); | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| <?php | ||||
|  | ||||
| require_once("boot.php"); | ||||
|  | ||||
| function notifier_run($argv, $argc){ | ||||
| @@ -35,7 +36,6 @@ function notifier_run($argv, $argc){ | ||||
| 	$cmd = $argv[1]; | ||||
|  | ||||
| 	switch($cmd) { | ||||
|  | ||||
| 		case 'mail': | ||||
| 		default: | ||||
| 			$item_id = intval($argv[2]); | ||||
| @@ -46,6 +46,8 @@ function notifier_run($argv, $argc){ | ||||
| 	} | ||||
|  | ||||
| 	$expire = false; | ||||
| 	$mail = false; | ||||
| 	$fsuggest = false; | ||||
| 	$top_level = false; | ||||
| 	$recipients = array(); | ||||
| 	$url_recipients = array(); | ||||
| @@ -54,6 +56,7 @@ function notifier_run($argv, $argc){ | ||||
|  | ||||
| 	if($cmd === 'mail') { | ||||
| 		$normal_mode = false; | ||||
| 		$mail = true; | ||||
| 		$message = q("SELECT * FROM `mail` WHERE `id` = %d LIMIT 1", | ||||
| 				intval($item_id) | ||||
| 		); | ||||
| @@ -79,6 +82,8 @@ function notifier_run($argv, $argc){ | ||||
| 	} | ||||
| 	elseif($cmd === 'suggest') { | ||||
| 		$normal_mode = false; | ||||
| 		$fsuggest = true; | ||||
|  | ||||
| 		$suggest = q("SELECT * FROM `fsuggest` WHERE `id` = %d LIMIT 1", | ||||
| 			intval($item_id) | ||||
| 		); | ||||
| @@ -144,7 +149,7 @@ function notifier_run($argv, $argc){ | ||||
| 	// fill this in with a single salmon slap if applicable | ||||
| 	$slap = ''; | ||||
|  | ||||
| 	if($cmd != 'mail' && $cmd != 'suggest') { | ||||
| 	if(! ($mail || $fsuggest)) { | ||||
|  | ||||
| 		require_once('include/group.php'); | ||||
|  | ||||
| @@ -235,7 +240,6 @@ function notifier_run($argv, $argc){ | ||||
|  | ||||
| 		$r = q("SELECT * FROM `contact` WHERE `id` IN ( $conversant_str ) AND `blocked` = 0 AND `pending` = 0"); | ||||
|  | ||||
|  | ||||
| 		if(count($r)) | ||||
| 			$contacts = $r; | ||||
| 	} | ||||
| @@ -270,7 +274,7 @@ function notifier_run($argv, $argc){ | ||||
| 			'$birthday'     => $birthday | ||||
| 	)); | ||||
|  | ||||
| 	if($cmd === 'mail') { | ||||
| 	if($mail) { | ||||
| 		$public_message = false;  // mail is  not public | ||||
|  | ||||
| 		$body = fix_private_photos($item['body'],$owner['uid']); | ||||
| @@ -286,7 +290,7 @@ function notifier_run($argv, $argc){ | ||||
| 			'$parent_id'    => xmlify($item['parent-uri']) | ||||
| 		)); | ||||
| 	} | ||||
| 	elseif($cmd === 'suggest') { | ||||
| 	elseif($fsuggest) { | ||||
| 		$public_message = false;  // suggestions are not public | ||||
|  | ||||
| 		$sugg_template = get_markup_template('atom_suggest.tpl'); | ||||
| @@ -383,8 +387,23 @@ function notifier_run($argv, $argc){ | ||||
| 			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.  | ||||
|  | ||||
| 			if((! $mail) && (! $fsuggest) && (! $followup)) { | ||||
| 				$interval = intval(get_config('system','delivery_interval')); | ||||
| 				if(! $interval) | ||||
| 					$interval = 2; | ||||
|  | ||||
| 				proc_run('php','include/delivery.php',$cmd,$item_id,$contact['id']); | ||||
| 				sleep($interval); | ||||
| 				continue; | ||||
| 			} | ||||
|  | ||||
| 			$deliver_status = 0; | ||||
|  | ||||
| 			logger("main delivery by notifier: followup=$followup mail=$mail fsuggest=$fsuggest"); | ||||
|  | ||||
| 			switch($contact['network']) { | ||||
| 				case NETWORK_DFRN: | ||||
| 					logger('notifier: dfrndelivery: ' . $contact['name']); | ||||
| @@ -589,52 +608,19 @@ function notifier_run($argv, $argc){ | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if((strlen($hub)) && ($public_message)) { | ||||
| 		$hubs = explode(',', $hub); | ||||
| 		if(count($hubs)) { | ||||
| 			foreach($hubs as $h) { | ||||
| 				$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(count($hubs) > 1) | ||||
| 					sleep(7);				// try and avoid multiple hubs responding at precisely the same time | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if($public_message) { | ||||
|  | ||||
| 		/** | ||||
| 		 * | ||||
| 		 * If you have less than 999 dfrn friends and it's a public message, | ||||
| 		 * we'll just go ahead and push them out securely with dfrn/rino or Diaspora. | ||||
| 		 * If you've got more than that, you'll have to rely on PuSH delivery. | ||||
| 		 * | ||||
| 		 */ | ||||
|  | ||||
| 		$max_allowed = ((get_config('system','maxpubdeliver') === false) ? 999 : intval(get_config('system','maxpubdeliver'))); | ||||
| 				 | ||||
| 		/** | ||||
| 		 * | ||||
| 		 * Only get the bare essentials and go back for the full record.  | ||||
| 		 * If you've got a lot of friends and we grab all the details at once it could exhaust memory.  | ||||
| 		 * | ||||
| 		 */ | ||||
|  | ||||
| 		$r = q("SELECT `id`, `name` FROM `contact`  | ||||
| 			WHERE `network` in ('%s','%s') AND `uid` = %d AND `blocked` = 0 AND `pending` = 0 | ||||
| 			AND `rel` != %d ", | ||||
| 			AND `rel` != %d order by rand() ", | ||||
| 			dbesc(NETWORK_DFRN), | ||||
| 			dbesc(NETWORK_DIASPORA), | ||||
| 			intval($owner['uid']), | ||||
| 			intval(CONTACT_IS_SHARING) | ||||
| 		); | ||||
|  | ||||
| 		if((count($r)) && (($max_allowed == 0) || (count($r) < $max_allowed))) { | ||||
|  | ||||
| 		if(count($r)) { | ||||
| 			logger('pubdeliver: ' . print_r($r,true)); | ||||
|  | ||||
| 			foreach($r as $rr) { | ||||
| @@ -646,63 +632,35 @@ function notifier_run($argv, $argc){ | ||||
| 					continue; | ||||
| 				} | ||||
|  | ||||
| 				$n = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", | ||||
| 					intval($rr['id']) | ||||
| 				); | ||||
| 				if((! $mail) && (! $fsuggest) && (! $followup)) { | ||||
| 					$interval = intval(get_config('system','delivery_interval')); | ||||
| 					if(! $interval) | ||||
| 						$interval = 2; | ||||
|  | ||||
| 				if(count($n)) { | ||||
| 					$contact = $n[0]; | ||||
| 					logger('pubdeliver: network: ' . $contact['network']); | ||||
|  | ||||
| 					switch($contact['network']) { | ||||
| 						case NETWORK_DFRN : | ||||
| 							logger('notifier: dfrnpubdelivery: ' . $contact['name']); | ||||
| 							$deliver_status = dfrn_deliver($owner,$contact,$atom); | ||||
| 							break; | ||||
| 						case NETWORK_DIASPORA : | ||||
| 							require_once('include/diaspora.php'); | ||||
|  | ||||
| 							logger('notifier: diaspora pubdelivery: ' . $contact['name']); | ||||
|  | ||||
| 							if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) { | ||||
| 								logger('notifier: diaspora pubdelivery not allowed at this time'); | ||||
| 								break; | ||||
| 							} | ||||
| 							 | ||||
| 							if(! $contact['pubkey']) { | ||||
| 								logger('notifier: diaspora pubdelivery: no pubkey'); | ||||
| 								break; | ||||
| 							} | ||||
| 					 | ||||
| 							if($target_item['verb'] === ACTIVITY_DISLIKE) { | ||||
| 								// unsupported | ||||
| 								break; | ||||
| 							} | ||||
| 							elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) { | ||||
| 								// diaspora delete,  | ||||
| 								diaspora_send_retraction($target_item,$owner,$contact); | ||||
| 								break; | ||||
| 							} | ||||
| 							elseif($followup) { | ||||
| 								// send comments, likes and retractions of 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 | ||||
| 								diaspora_send_relay($target_item,$owner,$contact); | ||||
| 								break; | ||||
| 							}		 | ||||
| 							elseif($top_level) { | ||||
| 								diaspora_send_status($target_item,$owner,$contact); | ||||
| 								break; | ||||
| 							} | ||||
| 						default: | ||||
| 							break; | ||||
| 					} | ||||
| 					proc_run('php','include/delivery.php',$cmd,$item_id,$rr['id']); | ||||
| 					sleep($interval); | ||||
| 					continue; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 		if(strlen($hub)) { | ||||
| 			$hubs = explode(',', $hub); | ||||
| 			if(count($hubs)) { | ||||
| 				foreach($hubs as $h) { | ||||
| 					$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(count($hubs) > 1) | ||||
| 						sleep(7);				// try and avoid multiple hubs responding at precisely the same time | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	return; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user