From 45fc6759b82ccb9f3db8f4b720d55ab74804f363 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Tue, 12 Oct 2021 20:12:30 -0400 Subject: [PATCH 1/6] Remove unused method in Model\\Contact --- src/Model/Contact.php | 42 ------------------------------------------ 1 file changed, 42 deletions(-) diff --git a/src/Model/Contact.php b/src/Model/Contact.php index f095543ebd..88cd8fdaf3 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -2562,48 +2562,6 @@ class Contact return $result; } - /** - * Updated contact's SSL policy - * - * @param array $contact Contact array - * @param string $new_policy New policy, valid: self,full - * - * @return array Contact array with updated values - * @throws \Exception - */ - public static function updateSslPolicy(array $contact, $new_policy) - { - $ssl_changed = false; - if ((intval($new_policy) == BaseURL::SSL_POLICY_SELFSIGN || $new_policy === 'self') && strstr($contact['url'], 'https:')) { - $ssl_changed = true; - $contact['url'] = str_replace('https:', 'http:', $contact['url']); - $contact['request'] = str_replace('https:', 'http:', $contact['request']); - $contact['notify'] = str_replace('https:', 'http:', $contact['notify']); - $contact['poll'] = str_replace('https:', 'http:', $contact['poll']); - $contact['confirm'] = str_replace('https:', 'http:', $contact['confirm']); - $contact['poco'] = str_replace('https:', 'http:', $contact['poco']); - } - - if ((intval($new_policy) == BaseURL::SSL_POLICY_FULL || $new_policy === 'full') && strstr($contact['url'], 'http:')) { - $ssl_changed = true; - $contact['url'] = str_replace('http:', 'https:', $contact['url']); - $contact['request'] = str_replace('http:', 'https:', $contact['request']); - $contact['notify'] = str_replace('http:', 'https:', $contact['notify']); - $contact['poll'] = str_replace('http:', 'https:', $contact['poll']); - $contact['confirm'] = str_replace('http:', 'https:', $contact['confirm']); - $contact['poco'] = str_replace('http:', 'https:', $contact['poco']); - } - - if ($ssl_changed) { - $fields = ['url' => $contact['url'], 'request' => $contact['request'], - 'notify' => $contact['notify'], 'poll' => $contact['poll'], - 'confirm' => $contact['confirm'], 'poco' => $contact['poco']]; - self::update($fields, ['id' => $contact['id']]); - } - - return $contact; - } - /** * Follow a contact * From f80478f2627f8459cdf64d8bb15272a44fff3758 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 16 Oct 2021 19:06:43 -0400 Subject: [PATCH 2/6] Improve argument handling in Core\Worker::add - The argument name made it unclear the first argument is supposed to be a priority number --- src/Core/Worker.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Core/Worker.php b/src/Core/Worker.php index 3519ce3e51..0431c79521 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -1199,10 +1199,8 @@ class Worker * array $arr * */ - public static function add($cmd) + public static function add(...$args) { - $args = func_get_args(); - if (!count($args)) { return 0; } @@ -1241,6 +1239,8 @@ class Worker if (isset($run_parameter['force_priority'])) { $force_priority = $run_parameter['force_priority']; } + } else { + throw new \InvalidArgumentException('Priority number or task parameter array expected as first argument'); } $command = array_shift($args); From efe0e4517068fc118e86bedbc8131fed71ee31a5 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Tue, 12 Oct 2021 20:14:06 -0400 Subject: [PATCH 3/6] Create new Worker task to remove a contact's content from the database --- src/Worker/Contact/RemoveContent.php | 90 ++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/Worker/Contact/RemoveContent.php diff --git a/src/Worker/Contact/RemoveContent.php b/src/Worker/Contact/RemoveContent.php new file mode 100644 index 0000000000..cc9139c2c8 --- /dev/null +++ b/src/Worker/Contact/RemoveContent.php @@ -0,0 +1,90 @@ +. + * + */ + +namespace Friendica\Worker\Contact; + +use Friendica\Core\Logger; +use Friendica\Database\DBA; +use Friendica\Database\DBStructure; +use Friendica\Model\Photo; +use Friendica\Model\Post; + +/** + * Removes all content related to the given contact id, doesn't remove the contact itself + */ +class RemoveContent +{ + public static function execute(int $id): array + { + if (empty($id)) { + return []; + } + + // Only delete if the contact is to be deleted + $contact = DBA::selectFirst('contact', ['id', 'uid', 'url', 'nick', 'name'], ['deleted' => true, 'id' => $id]); + if (!DBA::isResult($contact)) { + return []; + } + + Logger::info('Start deleting contact content', ['contact' => $contact]); + + // Now we delete the contact and all depending tables + DBA::delete('post-tag', ['cid' => $id]); + + if (DBStructure::existsTable('item')) { + DBA::delete('item', ['author-id' => $id]); + DBA::delete('item', ['owner-id' => $id]); + DBA::delete('item', ['causer-id' => $id]); + DBA::delete('item', ['contact-id' => $id]); + } + + DBA::delete('mail', ['contact-id' => $id]); + DBA::delete('mail', ['author-id' => $id]); + + Post\ThreadUser::delete(['author-id' => $id]); + Post\ThreadUser::delete(['owner-id' => $id]); + Post\ThreadUser::delete(['causer-id' => $id]); + Post\ThreadUser::delete(['contact-id' => $id]); + Post\Thread::delete(['author-id' => $id]); + Post\Thread::delete(['owner-id' => $id]); + Post\Thread::delete(['causer-id' => $id]); + Post\User::delete(['author-id' => $id]); + Post\User::delete(['owner-id' => $id]); + Post\User::delete(['causer-id' => $id]); + Post\User::delete(['contact-id' => $id]); + Post::delete(['author-id' => $id]); + Post::delete(['owner-id' => $id]); + Post::delete(['causer-id' => $id]); + + Photo::delete(['contact-id' => $id]); + + DBA::delete('contact-relation', ['contact-id = ? OR cid = ?', $id, $id]); + DBA::delete('event', ['cid' => $id]); + DBA::delete('fsuggest', ['cid' => $id]); + DBA::delete('post-tag', ['cid' => $id]); + DBA::delete('user-contact', ['cid' => $id]); + + DBA::delete('group_member', ['contact-id' => $id]); + DBA::delete('intro', ['contact-id' => $id]); + + return $contact; + } +} From fc2175260f8b32db464a5b2d131c590f9268ab88 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Tue, 12 Oct 2021 20:14:56 -0400 Subject: [PATCH 4/6] Move Worker task RemoveContact to Contact\Remove --- src/Model/Contact.php | 2 +- src/Worker/CheckDeletedContacts.php | 2 +- src/Worker/Contact/Remove.php | 47 +++++++++++++++++ src/Worker/RemoveContact.php | 79 ----------------------------- 4 files changed, 49 insertions(+), 81 deletions(-) create mode 100644 src/Worker/Contact/Remove.php delete mode 100644 src/Worker/RemoveContact.php diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 88cd8fdaf3..9aed40cf59 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -823,7 +823,7 @@ class Contact self::update(['archive' => true, 'network' => Protocol::PHANTOM, 'deleted' => true], ['id' => $id]); // Delete it in the background - Worker::add(PRIORITY_MEDIUM, 'RemoveContact', $id); + Worker::add(PRIORITY_MEDIUM, 'Contact\Remove', $id); } /** diff --git a/src/Worker/CheckDeletedContacts.php b/src/Worker/CheckDeletedContacts.php index 505d026e3a..385cdc12d5 100644 --- a/src/Worker/CheckDeletedContacts.php +++ b/src/Worker/CheckDeletedContacts.php @@ -34,7 +34,7 @@ class CheckDeletedContacts { $contacts = DBA::select('contact', ['id'], ['deleted' => true]); while ($contact = DBA::fetch($contacts)) { - Worker::add(PRIORITY_MEDIUM, 'RemoveContact', $contact['id']); + Worker::add(PRIORITY_MEDIUM, 'Contact\Remove', $contact['id']); } DBA::close($contacts); } diff --git a/src/Worker/Contact/Remove.php b/src/Worker/Contact/Remove.php new file mode 100644 index 0000000000..a3378fd5aa --- /dev/null +++ b/src/Worker/Contact/Remove.php @@ -0,0 +1,47 @@ +. + * + */ + +namespace Friendica\Worker\Contact; + +use Friendica\Core\Logger; +use Friendica\Database\DBA; + +/** + * Removes a contact and all its related content + */ +class Remove extends RemoveContent +{ + public static function execute(int $id): array + { + $contact = parent::execute($id); + + if (!empty($contact)) { + return []; + } + + $ret = DBA::delete('contact', ['id' => $id]); + Logger::info('Deleted contact', ['id' => $id, 'result' => $ret]); + + $contact['id'] = null; + + return $contact; + } +} diff --git a/src/Worker/RemoveContact.php b/src/Worker/RemoveContact.php deleted file mode 100644 index f64d4d02d5..0000000000 --- a/src/Worker/RemoveContact.php +++ /dev/null @@ -1,79 +0,0 @@ -. - * - */ - -namespace Friendica\Worker; - -use Friendica\Core\Logger; -use Friendica\Database\DBA; -use Friendica\Database\DBStructure; -use Friendica\Model\Photo; -use Friendica\Model\Post; - -/** - * Removes orphaned data from deleted contacts - */ -class RemoveContact { - public static function execute($id) { - if (empty($id)) { - return; - } - - // Only delete if the contact is to be deleted - $contact = DBA::selectFirst('contact', ['id', 'uid', 'url', 'nick', 'name'], ['deleted' => true, 'id' => $id]); - if (!DBA::isResult($contact)) { - return; - } - - Logger::info('Start deleting contact', ['contact' => $contact]); - - // Now we delete the contact and all depending tables - DBA::delete('post-tag', ['cid' => $id]); - - if (DBStructure::existsTable('item')) { - DBA::delete('item', ['author-id' => $id]); - DBA::delete('item', ['owner-id' => $id]); - DBA::delete('item', ['causer-id' => $id]); - DBA::delete('item', ['contact-id' => $id]); - } - - DBA::delete('mail', ['contact-id' => $id]); - DBA::delete('mail', ['author-id' => $id]); - - Post\ThreadUser::delete(['author-id' => $id]); - Post\ThreadUser::delete(['owner-id' => $id]); - Post\ThreadUser::delete(['causer-id' => $id]); - Post\ThreadUser::delete(['contact-id' => $id]); - Post\Thread::delete(['author-id' => $id]); - Post\Thread::delete(['owner-id' => $id]); - Post\Thread::delete(['causer-id' => $id]); - Post\User::delete(['author-id' => $id]); - Post\User::delete(['owner-id' => $id]); - Post\User::delete(['causer-id' => $id]); - Post\User::delete(['contact-id' => $id]); - Post::delete(['author-id' => $id]); - Post::delete(['owner-id' => $id]); - Post::delete(['causer-id' => $id]); - - Photo::delete(['contact-id' => $id]); - $ret = DBA::delete('contact', ['id' => $id]); - Logger::info('Deleted contact', ['id' => $id, 'result' => $ret]); - } -} From aea07a7c15cd5d28878f8615412c5809d8d54982 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Tue, 12 Oct 2021 20:15:20 -0400 Subject: [PATCH 5/6] Add new purge contact content option to admin contact blocklist --- src/Module/Admin/Blocklist/Contact.php | 29 +++++++++++++++---- view/templates/admin/blocklist/contact.tpl | 2 ++ .../templates/admin/blocklist/contact.tpl | 1 + 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/Module/Admin/Blocklist/Contact.php b/src/Module/Admin/Blocklist/Contact.php index 8d325810ec..bd30e2f8dd 100644 --- a/src/Module/Admin/Blocklist/Contact.php +++ b/src/Module/Admin/Blocklist/Contact.php @@ -23,10 +23,12 @@ namespace Friendica\Module\Admin\Blocklist; use Friendica\Content\Pager; use Friendica\Core\Renderer; +use Friendica\Core\Worker; use Friendica\Database\DBA; use Friendica\DI; -use Friendica\Module\BaseAdmin; use Friendica\Model; +use Friendica\Module\BaseAdmin; +use Friendica\Util\Network; class Contact extends BaseAdmin { @@ -38,16 +40,30 @@ class Contact extends BaseAdmin $contact_url = $_POST['contact_url'] ?? ''; $block_reason = $_POST['contact_block_reason'] ?? ''; + $block_purge = $_POST['contact_block_purge'] ?? false; $contacts = $_POST['contacts'] ?? []; if (!empty($_POST['page_contactblock_block'])) { - $contact_id = Model\Contact::getIdForURL($contact_url); - if ($contact_id) { - Model\Contact::block($contact_id, $block_reason); - info(DI::l10n()->t('The contact has been blocked from the node')); - } else { + $contact = Model\Contact::getByURL($contact_url, null, ['id', 'nurl']); + if (empty($contact)) { notice(DI::l10n()->t('Could not find any contact entry for this URL (%s)', $contact_url)); + DI::baseUrl()->redirect('admin/blocklist/contact'); } + + if (Network::isLocalLink($contact['nurl'])) { + notice(DI::l10n()->t('You can\'t block a local contact, please block the user instead')); + DI::baseUrl()->redirect('admin/blocklist/contact'); + } + + Model\Contact::block($contact['id'], $block_reason); + + if ($block_purge) { + foreach (Model\Contact::selectToArray(['id'], ['nurl' => $contact['nurl']]) as $contact) { + Worker::add(PRIORITY_LOW, 'Contact\RemoveContent', $contact['id']); + } + } + + info(DI::l10n()->t('The contact has been blocked from the node')); } if (!empty($_POST['page_contactblock_unblock'])) { @@ -98,6 +114,7 @@ class Contact extends BaseAdmin '$total_contacts' => DI::l10n()->tt('%s total blocked contact', '%s total blocked contacts', $total), '$paginate' => $pager->renderFull($total), '$contacturl' => ['contact_url', DI::l10n()->t('Profile URL'), '', DI::l10n()->t('URL of the remote contact to block.')], + '$contact_block_purge' => ['contact_block_purge', DI::l10n()->t('Also purge contact'), false, DI::l10n()->t('Removes all content related to this contact from the node. Keeps the contact record. This action canoot be undone.')], '$contact_block_reason' => ['contact_block_reason', DI::l10n()->t('Block Reason')], ]); return $o; diff --git a/view/templates/admin/blocklist/contact.tpl b/view/templates/admin/blocklist/contact.tpl index 78b4cd78fe..f12eed7a5f 100644 --- a/view/templates/admin/blocklist/contact.tpl +++ b/view/templates/admin/blocklist/contact.tpl @@ -56,6 +56,7 @@ {{include file="field_input.tpl" field=$contacturl}} + {{include file="field_checkbox.tpl" field=$contact_block_purge}} {{include file="field_textarea.tpl" field=$contact_block_reason}} @@ -63,3 +64,4 @@
+ diff --git a/view/theme/frio/templates/admin/blocklist/contact.tpl b/view/theme/frio/templates/admin/blocklist/contact.tpl index fabfa928f0..8f9fd282fc 100644 --- a/view/theme/frio/templates/admin/blocklist/contact.tpl +++ b/view/theme/frio/templates/admin/blocklist/contact.tpl @@ -22,6 +22,7 @@ {{include file="field_input.tpl" field=$contacturl}} + {{include file="field_checkbox.tpl" field=$contact_block_purge}} {{include file="field_textarea.tpl" field=$contact_block_reason}}
From 2e78e0353d09aca63353557b4b9d2e12efad9123 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 16 Oct 2021 16:49:01 -0400 Subject: [PATCH 6/6] Updated main translation file after adding a string --- view/lang/C/messages.po | 56 +++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po index 4dc6d1fdc8..a2829de9f2 100644 --- a/view/lang/C/messages.po +++ b/view/lang/C/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 2021.12-dev\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-14 06:20+0000\n" +"POT-Creation-Date: 2021-10-16 19:31-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -715,7 +715,7 @@ msgid "Your Identity Address:" msgstr "" #: mod/follow.php:141 mod/unfollow.php:100 -#: src/Module/Admin/Blocklist/Contact.php:100 src/Module/Contact.php:561 +#: src/Module/Admin/Blocklist/Contact.php:116 src/Module/Contact.php:561 #: src/Module/Notifications/Introductions.php:107 #: src/Module/Notifications/Introductions.php:176 msgid "Profile URL" @@ -1476,7 +1476,7 @@ msgstr "" msgid "Connected Apps" msgstr "" -#: mod/settings.php:429 src/Module/Admin/Blocklist/Contact.php:90 +#: mod/settings.php:429 src/Module/Admin/Blocklist/Contact.php:106 #: src/Module/Admin/Users/Active.php:129 src/Module/Admin/Users/Blocked.php:130 #: src/Module/Admin/Users/Create.php:71 src/Module/Admin/Users/Deleted.php:88 #: src/Module/Admin/Users/Index.php:142 src/Module/Admin/Users/Index.php:162 @@ -2420,7 +2420,7 @@ msgid "Could not find any contact entry for this URL (%s)" msgstr "" #: src/Console/GlobalCommunityBlock.php:101 -#: src/Module/Admin/Blocklist/Contact.php:47 +#: src/Module/Admin/Blocklist/Contact.php:66 msgid "The contact has been blocked from the node" msgstr "" @@ -3010,7 +3010,7 @@ msgstr "" msgid "Send PM" msgstr "" -#: src/Content/Item.php:449 src/Module/Admin/Blocklist/Contact.php:84 +#: src/Content/Item.php:449 src/Module/Admin/Blocklist/Contact.php:100 #: src/Module/Admin/Users/Active.php:140 src/Module/Admin/Users/Index.php:154 #: src/Module/Contact.php:544 src/Module/Contact.php:787 #: src/Module/Contact.php:1064 @@ -4868,7 +4868,7 @@ msgid "Enable" msgstr "" #: src/Module/Admin/Addons/Details.php:111 src/Module/Admin/Addons/Index.php:67 -#: src/Module/Admin/Blocklist/Contact.php:78 +#: src/Module/Admin/Blocklist/Contact.php:94 #: src/Module/Admin/Blocklist/Server.php:88 src/Module/Admin/Federation.php:159 #: src/Module/Admin/Item/Delete.php:65 src/Module/Admin/Logs/Settings.php:80 #: src/Module/Admin/Logs/View.php:83 src/Module/Admin/Queue.php:72 @@ -4968,76 +4968,90 @@ msgstr "" msgid "Relay" msgstr "" -#: src/Module/Admin/Blocklist/Contact.php:57 +#: src/Module/Admin/Blocklist/Contact.php:54 +msgid "You can't block a local contact, please block the user instead" +msgstr "" + +#: src/Module/Admin/Blocklist/Contact.php:73 #, php-format msgid "%s contact unblocked" msgid_plural "%s contacts unblocked" msgstr[0] "" msgstr[1] "" -#: src/Module/Admin/Blocklist/Contact.php:79 +#: src/Module/Admin/Blocklist/Contact.php:95 msgid "Remote Contact Blocklist" msgstr "" -#: src/Module/Admin/Blocklist/Contact.php:80 +#: src/Module/Admin/Blocklist/Contact.php:96 msgid "" "This page allows you to prevent any message from a remote contact to reach " "your node." msgstr "" -#: src/Module/Admin/Blocklist/Contact.php:81 +#: src/Module/Admin/Blocklist/Contact.php:97 msgid "Block Remote Contact" msgstr "" -#: src/Module/Admin/Blocklist/Contact.php:82 +#: src/Module/Admin/Blocklist/Contact.php:98 #: src/Module/Admin/Users/Active.php:138 src/Module/Admin/Users/Blocked.php:139 #: src/Module/Admin/Users/Index.php:151 src/Module/Admin/Users/Pending.php:103 msgid "select all" msgstr "" -#: src/Module/Admin/Blocklist/Contact.php:83 +#: src/Module/Admin/Blocklist/Contact.php:99 msgid "select none" msgstr "" -#: src/Module/Admin/Blocklist/Contact.php:85 +#: src/Module/Admin/Blocklist/Contact.php:101 #: src/Module/Admin/Users/Blocked.php:142 src/Module/Admin/Users/Index.php:156 #: src/Module/Contact.php:544 src/Module/Contact.php:787 #: src/Module/Contact.php:1064 msgid "Unblock" msgstr "" -#: src/Module/Admin/Blocklist/Contact.php:86 +#: src/Module/Admin/Blocklist/Contact.php:102 msgid "No remote contact is blocked from this node." msgstr "" -#: src/Module/Admin/Blocklist/Contact.php:88 +#: src/Module/Admin/Blocklist/Contact.php:104 msgid "Blocked Remote Contacts" msgstr "" -#: src/Module/Admin/Blocklist/Contact.php:89 +#: src/Module/Admin/Blocklist/Contact.php:105 msgid "Block New Remote Contact" msgstr "" -#: src/Module/Admin/Blocklist/Contact.php:90 +#: src/Module/Admin/Blocklist/Contact.php:106 msgid "Photo" msgstr "" -#: src/Module/Admin/Blocklist/Contact.php:90 +#: src/Module/Admin/Blocklist/Contact.php:106 msgid "Reason" msgstr "" -#: src/Module/Admin/Blocklist/Contact.php:98 +#: src/Module/Admin/Blocklist/Contact.php:114 #, php-format msgid "%s total blocked contact" msgid_plural "%s total blocked contacts" msgstr[0] "" msgstr[1] "" -#: src/Module/Admin/Blocklist/Contact.php:100 +#: src/Module/Admin/Blocklist/Contact.php:116 msgid "URL of the remote contact to block." msgstr "" -#: src/Module/Admin/Blocklist/Contact.php:101 +#: src/Module/Admin/Blocklist/Contact.php:117 +msgid "Also purge contact" +msgstr "" + +#: src/Module/Admin/Blocklist/Contact.php:117 +msgid "" +"Removes all content related to this contact from the node. Keeps the contact " +"record. This action canoot be undone." +msgstr "" + +#: src/Module/Admin/Blocklist/Contact.php:118 msgid "Block Reason" msgstr ""