Merge pull request #2940 from annando/1611-dead-contacts

Mark contacts as dead or undead while transmitting and receiving messages
This commit is contained in:
Tobias Diekershoff 2016-11-19 22:59:57 +01:00 committed by GitHub
commit 914330bb8f
3 changed files with 57 additions and 12 deletions

View File

@ -145,7 +145,6 @@ function terminate_friendship($user,$self,$contact) {
// This provides for the possibility that their database is temporarily messed // 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. // 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) { function mark_for_death($contact) {
if($contact['archive']) if($contact['archive'])
@ -156,14 +155,24 @@ function mark_for_death($contact) {
dbesc(datetime_convert()), dbesc(datetime_convert()),
intval($contact['id']) 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 /// @todo
/// We really should send a notification to the owner after 2-3 weeks /// 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 /// so they won't be surprised when the contact vanishes and can take
/// remedial action if this was a serious mistake or glitch /// remedial action if this was a serious mistake or glitch
/// @todo
/// Check for contact vitality via probing
$expiry = $contact['term-date'] . ' + 32 days '; $expiry = $contact['term-date'] . ' + 32 days ';
if(datetime_convert() > datetime_convert('UTC','UTC',$expiry)) { if(datetime_convert() > datetime_convert('UTC','UTC',$expiry)) {
@ -171,26 +180,45 @@ function mark_for_death($contact) {
// archive them rather than delete // archive them rather than delete
// though if the owner tries to unarchive them we'll start the whole process over again // 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']) 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) { 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. // It's a miracle. Our dead contact has inexplicably come back to life.
q("UPDATE `contact` SET `term-date` = '%s' WHERE `id` = %d", q("UPDATE `contact` SET `term-date` = '%s' WHERE `id` = %d",
dbesc('0000-00-00 00:00:00'), dbesc('0000-00-00 00:00:00'),
intval($contact['id']) 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 * @brief Get contact data for a given profile link

View File

@ -381,7 +381,14 @@ function delivery_run(&$argv, &$argc){
if ($deliver_status == (-1)) { if ($deliver_status == (-1)) {
logger('notifier: delivery failed: queuing message'); logger('notifier: delivery failed: queuing message');
add_to_queue($contact['id'],NETWORK_DFRN,$atom); 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; break;
case NETWORK_OSTATUS: case NETWORK_OSTATUS:

View File

@ -999,17 +999,21 @@ class diaspora {
*/ */
private function author_contact_by_url($contact, $person, $uid) { 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)); dbesc(normalise_link($person["url"])), intval($uid));
if ($r) { if ($r) {
$cid = $r[0]["id"]; $cid = $r[0]["id"];
$network = $r[0]["network"]; $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 { } else {
$cid = $contact["id"]; $cid = $contact["id"];
$network = NETWORK_DIASPORA; $network = NETWORK_DIASPORA;
} }
return (array("cid" => $cid, "network" => $network)); return array("cid" => $cid, "network" => $network);
} }
/** /**
@ -2633,7 +2637,13 @@ class diaspora {
} else { } else {
// queue message for redelivery // queue message for redelivery
add_to_queue($contact["id"], NETWORK_DIASPORA, $slap, $public_batch); 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)); return(($return_code) ? $return_code : (-1));