Merge pull request #7578 from annando/archive
Don't transmit content to already archived contacts
This commit is contained in:
		
				commit
				
					
						e6f00455f3
					
				
			
		
					 5 changed files with 69 additions and 8 deletions
				
			
		| 
						 | 
				
			
			@ -671,7 +671,7 @@ class Worker
 | 
			
		|||
				$waiting_processes = 0;
 | 
			
		||||
				// Now adding all processes with workerqueue entries
 | 
			
		||||
				$stamp = (float)microtime(true);
 | 
			
		||||
				$jobs = DBA::p("SELECT COUNT(*) AS `entries`, `priority` FROM `workerqueue` WHERE NOT `done` AND `next_try` < ? GROUP BY `priority`", DateTimeFormat::utcNow());
 | 
			
		||||
				$jobs = DBA::p("SELECT COUNT(*) AS `entries`, `priority` FROM `workerqueue` WHERE NOT `done` GROUP BY `priority`");
 | 
			
		||||
				self::$db_duration += (microtime(true) - $stamp);
 | 
			
		||||
				self::$db_duration_stat += (microtime(true) - $stamp);
 | 
			
		||||
				while ($entry = DBA::fetch($jobs)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1243,7 +1243,7 @@ class Worker
 | 
			
		|||
		$new_retrial = self::getNextRetrial($queue, $max_level);
 | 
			
		||||
 | 
			
		||||
		if ($new_retrial > $max_level) {
 | 
			
		||||
			Logger::info('The task exceeded the maximum retry count', ['id' => $id, 'max_level' => $max_level, 'retrial' => $new_retrial]);
 | 
			
		||||
			Logger::info('The task exceeded the maximum retry count', ['id' => $id, 'created' => $queue['created'], 'old_prio' => $queue['priority'], 'old_retrial' => $queue['retrial'], 'max_level' => $max_level, 'retrial' => $new_retrial]);
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1259,7 +1259,7 @@ class Worker
 | 
			
		|||
			$priority = PRIORITY_NEGLIGIBLE;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		Logger::info('Deferred task', ['id' => $id, 'retrial' => $new_retrial, 'next_execution' => $next, 'old_prio' => $queue['priority'], 'new_prio' => $priority]);
 | 
			
		||||
		Logger::info('Deferred task', ['id' => $id, 'retrial' => $new_retrial, 'created' => $queue['created'], 'next_execution' => $next, 'old_prio' => $queue['priority'], 'new_prio' => $priority]);
 | 
			
		||||
 | 
			
		||||
		$stamp = (float)microtime(true);
 | 
			
		||||
		$fields = ['retrial' => $new_retrial, 'next_try' => $next, 'executed' => DBA::NULL_DATETIME, 'pid' => 0, 'priority' => $priority];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -860,8 +860,8 @@ class Contact extends BaseObject
 | 
			
		|||
				 * delete, though if the owner tries to unarchive them we'll start
 | 
			
		||||
				 * the whole process over again.
 | 
			
		||||
				 */
 | 
			
		||||
				DBA::update('contact', ['archive' => 1], ['id' => $contact['id']]);
 | 
			
		||||
				DBA::update('contact', ['archive' => 1], ['nurl' => Strings::normaliseLink($contact['url']), 'self' => false]);
 | 
			
		||||
				DBA::update('contact', ['archive' => true], ['id' => $contact['id']]);
 | 
			
		||||
				DBA::update('contact', ['archive' => true], ['nurl' => Strings::normaliseLink($contact['url']), 'self' => false]);
 | 
			
		||||
				GContact::updateFromPublicContactURL($contact['url']);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -899,7 +899,7 @@ class Contact extends BaseObject
 | 
			
		|||
		// It's a miracle. Our dead contact has inexplicably come back to life.
 | 
			
		||||
		$fields = ['term-date' => DBA::NULL_DATETIME, 'archive' => false];
 | 
			
		||||
		DBA::update('contact', $fields, ['id' => $contact['id']]);
 | 
			
		||||
		DBA::update('contact', $fields, ['nurl' => Strings::normaliseLink($contact['url'])]);
 | 
			
		||||
		DBA::update('contact', $fields, ['nurl' => Strings::normaliseLink($contact['url']), 'self' => false]);
 | 
			
		||||
		GContact::updateFromPublicContactURL($contact['url']);
 | 
			
		||||
 | 
			
		||||
		if (!empty($contact['batch'])) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1556,6 +1556,49 @@ class Contact extends BaseObject
 | 
			
		|||
		return $contact_id;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @brief Checks if the contact is archived
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int $cid contact id
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return boolean Is the contact archived?
 | 
			
		||||
	 * @throws \Friendica\Network\HTTPException\InternalServerErrorException
 | 
			
		||||
	 */
 | 
			
		||||
	public static function isArchived(int $cid)
 | 
			
		||||
	{
 | 
			
		||||
		if ($cid == 0) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$contact = DBA::selectFirst('contact', ['archive', 'url', 'batch'], ['id' => $cid]);
 | 
			
		||||
		if (!DBA::isResult($contact)) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ($contact['archive']) {
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Check status of ActivityPub endpoints
 | 
			
		||||
		$apcontact = APContact::getByURL($contact['url'], false);
 | 
			
		||||
		if (!empty($apcontact)) {
 | 
			
		||||
			if (!empty($apcontact['inbox']) && DBA::exists('inbox-status', ['archive' => true, 'url' => $apcontact['inbox']])) {
 | 
			
		||||
				return true;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (!empty($apcontact['sharedinbox']) && DBA::exists('inbox-status', ['archive' => true, 'url' => $apcontact['sharedinbox']])) {
 | 
			
		||||
				return true;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Check status of Diaspora endpoints
 | 
			
		||||
		if (!empty($contact['batch'])) {
 | 
			
		||||
			return DBA::exists('contact', ['archive' => true, 'batch' => $contact['batch'], 'contact-type' => self::TYPE_RELAY]);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @brief Checks if the contact is blocked
 | 
			
		||||
	 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -223,7 +223,7 @@ class Diaspora
 | 
			
		|||
				`fcontact`.`batch` AS `fbatch`, `fcontact`.`network` AS `fnetwork` FROM `participation`
 | 
			
		||||
				INNER JOIN `contact` ON `contact`.`id` = `participation`.`cid`
 | 
			
		||||
				INNER JOIN `fcontact` ON `fcontact`.`id` = `participation`.`fid`
 | 
			
		||||
				WHERE `participation`.`iid` = ?", $thread);
 | 
			
		||||
				WHERE `participation`.`iid` = ? AND NOT `contact`.`archive`", $thread);
 | 
			
		||||
 | 
			
		||||
		while ($contact = DBA::fetch($r)) {
 | 
			
		||||
			if (!empty($contact['fnetwork'])) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ class Delivery extends BaseObject
 | 
			
		|||
 | 
			
		||||
	public static function execute($cmd, $target_id, $contact_id)
 | 
			
		||||
	{
 | 
			
		||||
		Logger::log('Invoked: ' . $cmd . ': ' . $target_id . ' to ' . $contact_id, Logger::DEBUG);
 | 
			
		||||
		Logger::info('Invoked', ['cmd' => $cmd, 'target' => $target_id, 'contact' => $contact_id]);
 | 
			
		||||
 | 
			
		||||
		$top_level = false;
 | 
			
		||||
		$followup = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -96,6 +96,14 @@ class Delivery extends BaseObject
 | 
			
		|||
				return;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (!empty($contact_id) && Model\Contact::isArchived($contact_id)) {
 | 
			
		||||
				Logger::info('Contact is archived', ['id' => $contact_id, 'cmd' => $cmd, 'item' => $target_item['id']]);
 | 
			
		||||
				if (in_array($cmd, [Delivery::POST, Delivery::POKE])) {
 | 
			
		||||
					Model\ItemDeliveryData::incrementQueueFailed($target_item['id']);
 | 
			
		||||
				}
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// avoid race condition with deleting entries
 | 
			
		||||
			if ($items[0]['deleted']) {
 | 
			
		||||
				foreach ($items as $item) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -429,6 +429,11 @@ class Notifier
 | 
			
		|||
 | 
			
		||||
			if (DBA::isResult($r)) {
 | 
			
		||||
				foreach ($r as $rr) {
 | 
			
		||||
					if (!empty($rr['id']) && Contact::isArchived($rr['id'])) {
 | 
			
		||||
						Logger::info('Contact is archived', $rr);
 | 
			
		||||
						continue;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					if (self::isRemovalActivity($cmd, $owner, $rr['network'])) {
 | 
			
		||||
						Logger::log('Skipping dropping for ' . $rr['url'] . ' since the network supports account removal commands.', Logger::DEBUG);
 | 
			
		||||
						continue;
 | 
			
		||||
| 
						 | 
				
			
			@ -463,6 +468,11 @@ class Notifier
 | 
			
		|||
 | 
			
		||||
		// delivery loop
 | 
			
		||||
		while ($contact = DBA::fetch($delivery_contacts_stmt)) {
 | 
			
		||||
			if (!empty($contact['id']) && Contact::isArchived($contact['id'])) {
 | 
			
		||||
				Logger::info('Contact is archived', $contact);
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (self::isRemovalActivity($cmd, $owner, $contact['network'])) {
 | 
			
		||||
				Logger::log('Skipping dropping for ' . $contact['url'] . ' since the network supports account removal commands.', Logger::DEBUG);
 | 
			
		||||
				continue;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue