From 89d5aa64baf26eef1bc252208a2477c9c9bd9844 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 19 Nov 2016 20:10:29 +0000 Subject: [PATCH] Mark contacts as dead or undead while transmitting and receiving messages --- include/Contact.php | 48 +++++++++++++++++++++++++++++++++++--------- include/delivery.php | 7 +++++++ include/diaspora.php | 14 +++++++++++-- 3 files changed, 57 insertions(+), 12 deletions(-) diff --git a/include/Contact.php b/include/Contact.php index 23b5bbe5b..949feb356 100644 --- a/include/Contact.php +++ b/include/Contact.php @@ -145,7 +145,6 @@ function terminate_friendship($user,$self,$contact) { // This provides for the possibility that their database is temporarily messed // up or some other transient event and that there's a possibility we could recover from it. -if(! function_exists('mark_for_death')) { function mark_for_death($contact) { if($contact['archive']) @@ -156,14 +155,24 @@ function mark_for_death($contact) { dbesc(datetime_convert()), intval($contact['id']) ); - } - else { + + if ($contact['url'] != '') { + q("UPDATE `contact` SET `term-date` = '%s' + WHERE `nurl` = '%s' AND `term-date` <= '1000-00-00'", + dbesc(datetime_convert()), + dbesc(normalise_link($contact['url'])) + ); + } + } else { /// @todo /// We really should send a notification to the owner after 2-3 weeks /// so they won't be surprised when the contact vanishes and can take /// remedial action if this was a serious mistake or glitch + /// @todo + /// Check for contact vitality via probing + $expiry = $contact['term-date'] . ' + 32 days '; if(datetime_convert() > datetime_convert('UTC','UTC',$expiry)) { @@ -171,26 +180,45 @@ function mark_for_death($contact) { // archive them rather than delete // though if the owner tries to unarchive them we'll start the whole process over again - q("update contact set `archive` = 1 where id = %d", + q("UPDATE `contact` SET `archive` = 1 WHERE `id` = %d", intval($contact['id']) ); - q("UPDATE `item` SET `private` = 2 WHERE `contact-id` = %d AND `uid` = %d", intval($contact['id']), intval($contact['uid'])); - - //contact_remove($contact['id']); + if ($contact['url'] != '') { + q("UPDATE `contact` SET `archive` = 1 WHERE `nurl` = '%s'", + dbesc(normalise_link($contact['url'])) + ); + } } } -}} +} -if(! function_exists('unmark_for_death')) { function unmark_for_death($contact) { + + $r = q("SELECT `term-date` FROM `contact` WHERE `id` = %d AND `term-date` > '%s'", + intval($contact['id']), + dbesc('1000-00-00 00:00:00') + ); + + // We don't need to update, we never marked this contact as dead + if (!dbm::is_result($r)) { + return; + } + // It's a miracle. Our dead contact has inexplicably come back to life. q("UPDATE `contact` SET `term-date` = '%s' WHERE `id` = %d", dbesc('0000-00-00 00:00:00'), intval($contact['id']) ); -}} + + if ($contact['url'] != '') { + q("UPDATE `contact` SET `term-date` = '%s' WHERE `nurl` = '%s'", + dbesc('0000-00-00 00:00:00'), + dbesc(normalise_link($contact['url'])) + ); + } +} /** * @brief Get contact data for a given profile link diff --git a/include/delivery.php b/include/delivery.php index 7c0ba63a6..8fce98774 100644 --- a/include/delivery.php +++ b/include/delivery.php @@ -381,7 +381,14 @@ function delivery_run(&$argv, &$argc){ if ($deliver_status == (-1)) { logger('notifier: delivery failed: queuing message'); add_to_queue($contact['id'],NETWORK_DFRN,$atom); + + // The message could not be delivered. We mark the contact as "dead" + mark_for_death($contact); + } else { + // We successfully delivered a message, the contact is alive + unmark_for_death($contact); } + break; case NETWORK_OSTATUS: diff --git a/include/diaspora.php b/include/diaspora.php index 10f1be93d..f2d484867 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -999,17 +999,21 @@ class diaspora { */ private function author_contact_by_url($contact, $person, $uid) { - $r = q("SELECT `id`, `network` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1", + $r = q("SELECT `id`, `network`, `url` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1", dbesc(normalise_link($person["url"])), intval($uid)); if ($r) { $cid = $r[0]["id"]; $network = $r[0]["network"]; + + // We are receiving content from a user that is about to be terminated + // This means the user is vital, so we remove a possible termination date. + unmark_for_death($contact); } else { $cid = $contact["id"]; $network = NETWORK_DIASPORA; } - return (array("cid" => $cid, "network" => $network)); + return array("cid" => $cid, "network" => $network); } /** @@ -2633,7 +2637,13 @@ class diaspora { } else { // queue message for redelivery add_to_queue($contact["id"], NETWORK_DIASPORA, $slap, $public_batch); + + // The message could not be delivered. We mark the contact as "dead" + mark_for_death($contact); } + } elseif (($return_code >= 200) AND ($return_code <= 299)) { + // We successfully delivered a message, the contact is alive + unmark_for_death($contact); } return(($return_code) ? $return_code : (-1));