Don't transmit content to already archived contacts

This commit is contained in:
Michael Vogel 2019-08-27 21:01:11 +02:00
parent b2162f34e9
commit 9b7432781b
5 changed files with 64 additions and 7 deletions

View file

@ -1243,7 +1243,7 @@ class Worker
$new_retrial = self::getNextRetrial($queue, $max_level); $new_retrial = self::getNextRetrial($queue, $max_level);
if ($new_retrial > $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; return false;
} }
@ -1259,7 +1259,7 @@ class Worker
$priority = PRIORITY_NEGLIGIBLE; $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); $stamp = (float)microtime(true);
$fields = ['retrial' => $new_retrial, 'next_try' => $next, 'executed' => DBA::NULL_DATETIME, 'pid' => 0, 'priority' => $priority]; $fields = ['retrial' => $new_retrial, 'next_try' => $next, 'executed' => DBA::NULL_DATETIME, 'pid' => 0, 'priority' => $priority];

View file

@ -860,8 +860,8 @@ class Contact extends BaseObject
* delete, though if the owner tries to unarchive them we'll start * delete, though if the owner tries to unarchive them we'll start
* the whole process over again. * the whole process over again.
*/ */
DBA::update('contact', ['archive' => 1], ['id' => $contact['id']]); DBA::update('contact', ['archive' => true], ['id' => $contact['id']]);
DBA::update('contact', ['archive' => 1], ['nurl' => Strings::normaliseLink($contact['url']), 'self' => false]); DBA::update('contact', ['archive' => true], ['nurl' => Strings::normaliseLink($contact['url']), 'self' => false]);
GContact::updateFromPublicContactURL($contact['url']); 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. // It's a miracle. Our dead contact has inexplicably come back to life.
$fields = ['term-date' => DBA::NULL_DATETIME, 'archive' => false]; $fields = ['term-date' => DBA::NULL_DATETIME, 'archive' => false];
DBA::update('contact', $fields, ['id' => $contact['id']]); 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']); GContact::updateFromPublicContactURL($contact['url']);
if (!empty($contact['batch'])) { if (!empty($contact['batch'])) {
@ -1556,6 +1556,45 @@ class Contact extends BaseObject
return $contact_id; 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($cid)
{
if ($cid == 0) {
return false;
}
$archived = DBA::selectFirst('contact', ['archive', 'url'], ['id' => $cid]);
if (!DBA::isResult($archived)) {
return false;
}
if ($archived['archive']) {
return true;
}
$apcontact = APContact::getByURL($archived['url'], false);
if (empty($apcontact)) {
return false;
}
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;
}
return false;
}
/** /**
* @brief Checks if the contact is blocked * @brief Checks if the contact is blocked
* *

View file

@ -223,7 +223,7 @@ class Diaspora
`fcontact`.`batch` AS `fbatch`, `fcontact`.`network` AS `fnetwork` FROM `participation` `fcontact`.`batch` AS `fbatch`, `fcontact`.`network` AS `fnetwork` FROM `participation`
INNER JOIN `contact` ON `contact`.`id` = `participation`.`cid` INNER JOIN `contact` ON `contact`.`id` = `participation`.`cid`
INNER JOIN `fcontact` ON `fcontact`.`id` = `participation`.`fid` 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)) { while ($contact = DBA::fetch($r)) {
if (!empty($contact['fnetwork'])) { if (!empty($contact['fnetwork'])) {

View file

@ -33,7 +33,7 @@ class Delivery extends BaseObject
public static function execute($cmd, $target_id, $contact_id) 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; $top_level = false;
$followup = false; $followup = false;
@ -96,6 +96,14 @@ class Delivery extends BaseObject
return; 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 // avoid race condition with deleting entries
if ($items[0]['deleted']) { if ($items[0]['deleted']) {
foreach ($items as $item) { foreach ($items as $item) {

View file

@ -429,6 +429,11 @@ class Notifier
if (DBA::isResult($r)) { if (DBA::isResult($r)) {
foreach ($r as $rr) { 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'])) { if (self::isRemovalActivity($cmd, $owner, $rr['network'])) {
Logger::log('Skipping dropping for ' . $rr['url'] . ' since the network supports account removal commands.', Logger::DEBUG); Logger::log('Skipping dropping for ' . $rr['url'] . ' since the network supports account removal commands.', Logger::DEBUG);
continue; continue;
@ -463,6 +468,11 @@ class Notifier
// delivery loop // delivery loop
while ($contact = DBA::fetch($delivery_contacts_stmt)) { 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'])) { if (self::isRemovalActivity($cmd, $owner, $contact['network'])) {
Logger::log('Skipping dropping for ' . $contact['url'] . ' since the network supports account removal commands.', Logger::DEBUG); Logger::log('Skipping dropping for ' . $contact['url'] . ' since the network supports account removal commands.', Logger::DEBUG);
continue; continue;