From c6c7c4e841ed2146f6baacc8adf802f730087450 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sun, 19 Jul 2020 09:49:17 +0200 Subject: [PATCH 01/12] added CSV import/export of server blocklist --- src/Console/ServerBlock.php | 90 +++++++++++++++++++++++++++++++------ 1 file changed, 77 insertions(+), 13 deletions(-) diff --git a/src/Console/ServerBlock.php b/src/Console/ServerBlock.php index ada4f2213..7c17fdc57 100644 --- a/src/Console/ServerBlock.php +++ b/src/Console/ServerBlock.php @@ -51,19 +51,23 @@ Usage bin/console serverblock [-h|--help|-?] [-v] bin/console serverblock add [-h|--help|-?] [-v] bin/console serverblock remove [-h|--help|-?] [-v] + bin/console serverblock export + bin/console serverblock import Description With this tool, you can list the current blocked server domain patterns - or you can add / remove a blocked server domain pattern from the list. - - Patterns are case-insensitive shell wildcard comprising the following special characters: - - * : Any number of characters - - ? : Any single character - - [...] : char1 or char2 or... + or you can add / remove a blocked server domain pattern from the list. + Using the export and import options you can share your server blocklist + with other node admins by CSV files. + + Patterns are case-insensitive shell wildcard comprising the following special characters: + - * : Any number of characters + - ? : Any single character + - [...] : char1 or char2 or... Options - -h|--help|-? Show help information - -v Show more debug information. + -h|--help|-? Show help information + -v Show more debug information. HELP; return $help; } @@ -87,6 +91,10 @@ HELP; return $this->addBlockedServer($this->config); case 'remove': return $this->removeBlockedServer($this->config); + case 'export': + return $this->exportBlockedServers($this->config); + case 'import': + return $this->importBlockedServers($this->config); default: throw new CommandArgsException('Unknown command.'); break; @@ -94,10 +102,66 @@ HELP; } /** - * Prints the whole list of blocked domains including the reason + * Exports the list of blocked domains including the reason for the + * block to a CSV file. * * @param IConfig $config */ + private function exportBlockedServers(IConfig $config) + { + $filename = $this->getArgument(1); + $blocklist = $config->get('system', 'blocklist', []); + $fp = fopen($filename, 'w'); + foreach ($blocklist as $domain) { + fputcsv($fp, $domain); + } + } + /** + * Imports a list of domains and a reason for the block from a CSV + * file, e.g. created with the export function. + * + * @param IConfig $config + */ + private function importBlockedServers(IConfig $config) + { + $filename = $this->getArgument(1); + $currBlockList = $config->get('system', 'blocklist', []); + $newBlockList = []; + if (($fp = fopen($filename, 'r')) !== FALSE) { + while (($data = fgetcsv($fp, 1000, ',')) !== FALSE) { + $domain = $data[0]; + if (count($data) == 0) { + $reason = self::DEFAULT_REASON; + } else { + $reason = $data[1]; + } + $data = [ + 'domain' => $domain, + 'reason' => $reason + ]; + if (!in_array($data, $newBlockList)) + $newBlockList[] = $data; + } + foreach ($currBlockList as $blocked) { + if (!in_array($blocked, $newBlockList)) + $newBlockList[] = $blocked; + } + if ($config->set('system', 'blocklist', $newBlockList)) { + $this->out(sprintf("Entries from %s that were not blocked before are now blocked", $filename)); + return 0; + } else { + $this->out(sprintf("Couldn't save '%s' as blocked server", $domain)); + return 1; + } + + } + } + + /** + * Prints the whole list of blocked domains including the reason + * + /* @param IConfig $config + */ private function printBlockedServers(IConfig $config) { $table = new Console_Table(); @@ -127,9 +191,9 @@ HELP; $update = false; - $currBlocklist = $config->get('system', 'blocklist', []); + $currBlockList = $config->get('system', 'blocklist', []); $newBlockList = []; - foreach ($currBlocklist as $blocked) { + foreach ($currBlockList as $blocked) { if ($blocked['domain'] === $domain) { $update = true; $newBlockList[] = [ @@ -178,9 +242,9 @@ HELP; $found = false; - $currBlocklist = $config->get('system', 'blocklist', []); + $currBlockList = $config->get('system', 'blocklist', []); $newBlockList = []; - foreach ($currBlocklist as $blocked) { + foreach ($currBlockList as $blocked) { if ($blocked['domain'] === $domain) { $found = true; } else { From b191c8c11cf811db9f88a54d166b89336899320d Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sun, 19 Jul 2020 09:58:31 +0200 Subject: [PATCH 02/12] spaces instead of tabs here --- src/Console/ServerBlock.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Console/ServerBlock.php b/src/Console/ServerBlock.php index 7c17fdc57..934226867 100644 --- a/src/Console/ServerBlock.php +++ b/src/Console/ServerBlock.php @@ -67,7 +67,7 @@ Description Options -h|--help|-? Show help information - -v Show more debug information. + -v Show more debug information. HELP; return $help; } From 97df01c938cdbd7d0bb727061da4c3301490ff72 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 7 Aug 2020 11:49:25 +0200 Subject: [PATCH 03/12] update the test of the help text --- src/Console/ServerBlock.php | 33 ++++++++++---------- tests/src/Console/ServerBlockConsoleTest.php | 14 ++++++--- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/Console/ServerBlock.php b/src/Console/ServerBlock.php index 934226867..ca81ffb59 100644 --- a/src/Console/ServerBlock.php +++ b/src/Console/ServerBlock.php @@ -48,26 +48,27 @@ class ServerBlock extends Console $help = << [-h|--help|-?] [-v] - bin/console serverblock remove [-h|--help|-?] [-v] - bin/console serverblock export - bin/console serverblock import + bin/console serverblock [-h|--help|-?] [-v] + bin/console serverblock add [-h|--help|-?] [-v] + bin/console serverblock remove [-h|--help|-?] [-v] + bin/console serverblock export + bin/console serverblock import Description - With this tool, you can list the current blocked server domain patterns - or you can add / remove a blocked server domain pattern from the list. - Using the export and import options you can share your server blocklist - with other node admins by CSV files. - - Patterns are case-insensitive shell wildcard comprising the following special characters: - - * : Any number of characters - - ? : Any single character - - [...] : char1 or char2 or... + With this tool, you can list the current blocked server domain patterns + or you can add / remove a blocked server domain pattern from the list. + Using the export and import options you can share your server blocklist + with other node admins by CSV files. + + Patterns are case-insensitive shell wildcard comprising the following special characters: + - * : Any number of characters + - ? : Any single character + - [...] : char1 or char2 or... Options - -h|--help|-? Show help information - -v Show more debug information. + -h|--help|-? Show help information + -v Show more debug information. + HELP; return $help; } diff --git a/tests/src/Console/ServerBlockConsoleTest.php b/tests/src/Console/ServerBlockConsoleTest.php index 027da035e..7b125b8b1 100644 --- a/tests/src/Console/ServerBlockConsoleTest.php +++ b/tests/src/Console/ServerBlockConsoleTest.php @@ -334,14 +334,18 @@ CONS; $help = << [-h|--help|-?] [-v] - bin/console serverblock remove [-h|--help|-?] [-v] + bin/console serverblock [-h|--help|-?] [-v] + bin/console serverblock add [-h|--help|-?] [-v] + bin/console serverblock remove [-h|--help|-?] [-v] + bin/console serverblock export + bin/console serverblock import Description - With this tool, you can list the current blocked server domain patterns + With this tool, you can list the current blocked server domain patterns or you can add / remove a blocked server domain pattern from the list. - + Using the export and import options you can share your server blocklist + with other node admins by CSV files. + Patterns are case-insensitive shell wildcard comprising the following special characters: - * : Any number of characters - ? : Any single character From afb167602b3c383e5ec466484faad65e1db5ed71 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Fri, 7 Aug 2020 12:51:14 +0200 Subject: [PATCH 04/12] remove empty line --- src/Console/ServerBlock.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Console/ServerBlock.php b/src/Console/ServerBlock.php index ca81ffb59..18ea65d6d 100644 --- a/src/Console/ServerBlock.php +++ b/src/Console/ServerBlock.php @@ -68,7 +68,6 @@ Description Options -h|--help|-? Show help information -v Show more debug information. - HELP; return $help; } From 1834f24c9fb5f91d6978f7f1788f98a058c37ca4 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 8 Aug 2020 08:35:34 +0200 Subject: [PATCH 05/12] some small stuff --- src/Console/ServerBlock.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Console/ServerBlock.php b/src/Console/ServerBlock.php index 18ea65d6d..40d8e45e7 100644 --- a/src/Console/ServerBlock.php +++ b/src/Console/ServerBlock.php @@ -127,10 +127,10 @@ HELP; $filename = $this->getArgument(1); $currBlockList = $config->get('system', 'blocklist', []); $newBlockList = []; - if (($fp = fopen($filename, 'r')) !== FALSE) { - while (($data = fgetcsv($fp, 1000, ',')) !== FALSE) { + if (($fp = fopen($filename, 'r')) !== false) { + while (($data = fgetcsv($fp, 1000, ',')) !== false) { $domain = $data[0]; - if (count($data) == 0) { + if (count($data) == 0) { $reason = self::DEFAULT_REASON; } else { $reason = $data[1]; @@ -139,12 +139,14 @@ HELP; 'domain' => $domain, 'reason' => $reason ]; - if (!in_array($data, $newBlockList)) + if (!in_array($data, $newBlockList)) { $newBlockList[] = $data; + } } foreach ($currBlockList as $blocked) { - if (!in_array($blocked, $newBlockList)) + if (!in_array($blocked, $newBlockList)) { $newBlockList[] = $blocked; + } } if ($config->set('system', 'blocklist', $newBlockList)) { $this->out(sprintf("Entries from %s that were not blocked before are now blocked", $filename)); From ef0ecf243a4ee25079eb8b2386d0f869047d7877 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 8 Aug 2020 08:47:21 +0200 Subject: [PATCH 06/12] fopen error messages --- src/Console/ServerBlock.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Console/ServerBlock.php b/src/Console/ServerBlock.php index 40d8e45e7..d052612e1 100644 --- a/src/Console/ServerBlock.php +++ b/src/Console/ServerBlock.php @@ -112,6 +112,9 @@ HELP; $filename = $this->getArgument(1); $blocklist = $config->get('system', 'blocklist', []); $fp = fopen($filename, 'w'); + if (!$fp) { + throw new Exception(sprintf('The file "%s" could not be created.', $filename)); + } foreach ($blocklist as $domain) { fputcsv($fp, $domain); } @@ -156,6 +159,8 @@ HELP; return 1; } + } else { + throw new Exception(sprintf('The file "%s" could not be opened for importing', $filename)); } } From 3c0968a692b960eb10f7b236fdc7a7270935938f Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 8 Aug 2020 15:49:25 +0200 Subject: [PATCH 07/12] indentation --- src/Console/ServerBlock.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Console/ServerBlock.php b/src/Console/ServerBlock.php index d052612e1..d39fe8c3b 100644 --- a/src/Console/ServerBlock.php +++ b/src/Console/ServerBlock.php @@ -144,12 +144,12 @@ HELP; ]; if (!in_array($data, $newBlockList)) { $newBlockList[] = $data; - } + } } foreach ($currBlockList as $blocked) { if (!in_array($blocked, $newBlockList)) { $newBlockList[] = $blocked; - } + } } if ($config->set('system', 'blocklist', $newBlockList)) { $this->out(sprintf("Entries from %s that were not blocked before are now blocked", $filename)); From 692bb2a8952722df3181cd5af8d09ce958a35986 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 8 Aug 2020 12:58:56 -0400 Subject: [PATCH 08/12] Restore auto-complete in comment boxes beyond the first --- view/js/autocomplete.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js index c3993603b..0405715ac 100644 --- a/view/js/autocomplete.js +++ b/view/js/autocomplete.js @@ -202,16 +202,17 @@ function string2bb(element) { // jQuery wrapper for yuku/old-textcomplete // uses a local object directory to avoid recreating Textcomplete objects $.fn.textcomplete = function (strategies, options) { - if (!(this.data('textcompleteId') in textcompleteObjects)) { - let editor = new Textcomplete.editors.Textarea(this.get(0)); + return this.each(function () { + let $this = $(this); + if (!($this.data('textcompleteId') in textcompleteObjects)) { + let editor = new Textcomplete.editors.Textarea($this.get(0)); - this.data('textcompleteId', textcompleteObjects.length); - textcompleteObjects.push(new Textcomplete(editor, options)); - } + $this.data('textcompleteId', textcompleteObjects.length); + textcompleteObjects.push(new Textcomplete(editor, options)); + } - textcompleteObjects[this.data('textcompleteId')].register(strategies); - - return this; + textcompleteObjects[$this.data('textcompleteId')].register(strategies); + }); }; /** From 7a5f2437f9fc438b7aa17e56f5b09ac7f24da8c2 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 8 Aug 2020 15:19:04 -0400 Subject: [PATCH 09/12] Fix option syntax for textcomplete --- view/js/autocomplete.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js index c3993603b..d83f54c7c 100644 --- a/view/js/autocomplete.js +++ b/view/js/autocomplete.js @@ -293,7 +293,7 @@ function string2bb(element) { }; this.attr('autocomplete','off'); - this.textcomplete([contacts, forums, smilies, tags], {className:'acpopup', zIndex:10000}); + this.textcomplete([contacts, forums, smilies, tags], {dropdown: {className:'acpopup'}}); this.fixTextcompleteEscape(); return this; @@ -328,7 +328,7 @@ function string2bb(element) { }; this.attr('autocomplete', 'off'); - this.textcomplete([contacts, community, tags], {className:'acpopup', maxCount:100, zIndex: 10000, appendTo:'nav'}); + this.textcomplete([contacts, community, tags], {dropdown: {className:'acpopup', maxCount:100}}); this.fixTextcompleteEscape(); this.on('textComplete:select', function(e, value, strategy) { submit_form(this); }); @@ -349,7 +349,7 @@ function string2bb(element) { }; this.attr('autocomplete','off'); - this.textcomplete([names], {className:'acpopup', zIndex:10000}); + this.textcomplete([names], {dropdown: {className:'acpopup'}}); this.fixTextcompleteEscape(); if(autosubmit) { @@ -399,7 +399,7 @@ function string2bb(element) { }; this.attr('autocomplete','off'); - this.textcomplete([bbco], {className:'acpopup', zIndex:10000}); + this.textcomplete([bbco], {dropdown: {className:'acpopup'}}); this.fixTextcompleteEscape(); this.on('textComplete:select', function(e, value, strategy) { value; }); From 4f37b14e42ff2238b5c4c2da8be082e477d571ef Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 8 Aug 2020 15:19:20 -0400 Subject: [PATCH 10/12] Enable footer scripts in minimal view --- view/php/minimal.php | 4 +++- view/theme/frio/php/minimal.php | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/view/php/minimal.php b/view/php/minimal.php index 7b8ac61af..76e14ebe5 100644 --- a/view/php/minimal.php +++ b/view/php/minimal.php @@ -7,7 +7,9 @@
- +
diff --git a/view/theme/frio/php/minimal.php b/view/theme/frio/php/minimal.php index 43c530586..2ab0a62e4 100644 --- a/view/theme/frio/php/minimal.php +++ b/view/theme/frio/php/minimal.php @@ -10,7 +10,9 @@
- +