From 866fbb4d8064553164743b29b38a09f908e1b950 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 23 Apr 2018 05:33:47 +0000 Subject: [PATCH 1/2] Added console command to manually archive contacts --- src/Core/Console.php | 2 + src/Core/Console/ArchiveContact.php | 79 +++++++++++++++++++++++++++++ src/Worker/Queue.php | 2 +- 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 src/Core/Console/ArchiveContact.php diff --git a/src/Core/Console.php b/src/Core/Console.php index 82c485179e..a5aff4ae80 100644 --- a/src/Core/Console.php +++ b/src/Core/Console.php @@ -21,6 +21,7 @@ class Console extends \Asika\SimpleConsole\Console 'extract' => __NAMESPACE__ . '\Console\Extract', 'globalcommunityblock' => __NAMESPACE__ . '\Console\GlobalCommunityBlock', 'globalcommunitysilence' => __NAMESPACE__ . '\Console\GlobalCommunitySilence', + 'archivecontact' => __NAMESPACE__ . '\Console\ArchiveContact', 'autoinstall' => __NAMESPACE__ . '\Console\AutomaticInstallation', 'maintenance' => __NAMESPACE__ . '\Console\Maintenance', 'newpassword' => __NAMESPACE__ . '\Console\NewPassword', @@ -42,6 +43,7 @@ Commands: extract Generate translation string file for the Friendica project (deprecated) globalcommunityblock Block remote profile from interacting with this node globalcommunitysilence Silence remote profile from global community page + archivecontact Archive a contact when you know that it isn't existing anymore help Show help about a command, e.g (bin/console help config) autoinstall Starts automatic installation of friendica based on values from htconfig.php maintenance Set maintenance mode for this node diff --git a/src/Core/Console/ArchiveContact.php b/src/Core/Console/ArchiveContact.php new file mode 100644 index 0000000000..7a973f3116 --- /dev/null +++ b/src/Core/Console/ArchiveContact.php @@ -0,0 +1,79 @@ + [-h|--help|-?] [-v] + +Description + Archive a contact when you know that it isn't existing anymore. Normally this does happen automatically after a few days. + +Options + -h|--help|-? Show help information + -v Show more debug information. +HELP; + return $help; + } + + protected function doExecute() + { + $a = get_app(); + + if ($this->getOption('v')) { + $this->out('Class: ' . __CLASS__); + $this->out('Arguments: ' . var_export($this->args, true)); + $this->out('Options: ' . var_export($this->options, true)); + } + + if (count($this->args) == 0) { + $this->out($this->getHelp()); + return 0; + } + + if (count($this->args) > 1) { + throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments'); + } + + require_once '.htconfig.php'; + $result = \dba::connect($db_host, $db_user, $db_pass, $db_data); + unset($db_host, $db_user, $db_pass, $db_data); + + if (!$result) { + throw new \RuntimeException('Unable to connect to database'); + } + + $nurl = normalise_link($this->getArgument(0)); + if (!dba::exists('contact', ['nurl' => $nurl, 'archive' => false])) { + throw new \RuntimeException(L10n::t('Could not find any unarchived contact entry for this URL (%s)', $nurl)); + } + if (dba::update('contact', ['archive' => true], ['nurl' => $nurl])) { + $condition = ["`cid` IN (SELECT `id` FROM `contact` WHERE `archive`)"]; + dba::delete('queue', $condition); + $this->out(L10n::t('The contact entries have been archived')); + } else { + throw new \RuntimeException('The contact archival failed.'); + } + + return 0; + } +} diff --git a/src/Worker/Queue.php b/src/Worker/Queue.php index 57f6e92774..345da39abb 100644 --- a/src/Worker/Queue.php +++ b/src/Worker/Queue.php @@ -63,7 +63,7 @@ class Queue return; } - if (empty($contact['notify'])) { + if (empty($contact['notify']) || $contact['archive']) { QueueModel::removeItem($q_item['id']); return; } From b3d24f0ff2720f7e4c47d52a45113acb372626b1 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 23 Apr 2018 06:03:55 +0000 Subject: [PATCH 2/2] DFRN: mark for archival at different places --- src/Protocol/DFRN.php | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index bffcb2086f..4821f3e4a1 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -1197,6 +1197,7 @@ class DFRN $ret = Network::curl($url); if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) { + Contact::markForArchival($contact); return -2; // timed out } @@ -1204,24 +1205,28 @@ class DFRN $curl_stat = $a->get_curl_code(); if (empty($curl_stat)) { + Contact::markForArchival($contact); return -3; // timed out } logger('dfrn_deliver: ' . $xml, LOGGER_DATA); if (empty($xml)) { + Contact::markForArchival($contact); return 3; } if (strpos($xml, 'status) != 0) || (! strlen($res->challenge)) || (! strlen($res->dfrn_id))) { + if ((intval($res->status) != 0) || !strlen($res->challenge) || !strlen($res->dfrn_id)) { + Contact::markForArchival($contact); return ($res->status ? $res->status : 3); } @@ -1274,6 +1279,7 @@ class DFRN if ($final_dfrn_id != $orig_id) { logger('dfrn_deliver: wrong dfrn_id.'); // did not decode properly - cannot trust this site + Contact::markForArchival($contact); return 3; } @@ -1309,6 +1315,7 @@ class DFRN break; default: logger("rino: invalid requested version '$rino_remote_version'"); + Contact::markForArchival($contact); return -8; } @@ -1346,22 +1353,26 @@ class DFRN $curl_stat = $a->get_curl_code(); if (empty($curl_stat) || empty($xml)) { + Contact::markForArchival($contact); return -9; // timed out } if (($curl_stat == 503) && stristr($a->get_curl_headers(), 'retry-after')) { + Contact::markForArchival($contact); return -10; } if (strpos($xml, 'status)) { + Contact::markForArchival($contact); return -11; } @@ -1374,7 +1385,7 @@ class DFRN logger('Delivery returned status '.$res->status.' - '.$res->message, LOGGER_DEBUG); } - if ($res->status == 200) { + if (($res->status >= 200) && ($res->status <= 299)) { Contact::unmarkForArchival($contact); } @@ -1403,6 +1414,7 @@ class DFRN if (empty($contact['addr'])) { logger('Unable to find contact handle for ' . $contact['id'] . ' - ' . $contact['url']); + Contact::markForArchival($contact); return -21; } } @@ -1410,6 +1422,7 @@ class DFRN $fcontact = Diaspora::personByHandle($contact['addr']); if (empty($fcontact)) { logger('Unable to find contact details for ' . $contact['id'] . ' - ' . $contact['addr']); + Contact::markForArchival($contact); return -22; } @@ -1433,22 +1446,26 @@ class DFRN $curl_stat = $a->get_curl_code(); if (empty($curl_stat) || empty($xml)) { logger('Empty answer from ' . $contact['id'] . ' - ' . $dest_url); + Contact::markForArchival($contact); return -9; // timed out } if (($curl_stat == 503) && (stristr($a->get_curl_headers(), 'retry-after'))) { + Contact::markForArchival($contact); return -10; } if (strpos($xml, 'status)) { + Contact::markForArchival($contact); return -23; } @@ -1456,7 +1473,7 @@ class DFRN logger('Transmit to ' . $dest_url . ' returned status '.$res->status.' - '.$res->message, LOGGER_DEBUG); } - if ($res->status == 200) { + if (($res->status >= 200) && ($res->status <= 299)) { Contact::unmarkForArchival($contact); }