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:
commit
914330bb8f
3 changed files with 57 additions and 12 deletions
|
@ -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'])
|
||||
);
|
||||
|
||||
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 {
|
||||
} 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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in a new issue