3 * @copyright Copyright (C) 2010-2023, the Friendica project
5 * @license GNU AGPL version 3 or any later version
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as
9 * published by the Free Software Foundation, either version 3 of the
10 * License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Affero General Public License for more details.
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 namespace Friendica\Console;
24 use Asika\SimpleConsole\CommandArgsException;
25 use Asika\SimpleConsole\Console;
27 use Friendica\Moderation\DomainPatternBlocklist;
30 * Manage blocked servers
32 * With this tool, you can list the current blocked servers
33 * or you can add / remove a blocked server from the list
35 class ServerBlock extends Console
37 protected $helpOptions = ['h', 'help', '?'];
39 /** @var DomainPatternBlocklist */
42 protected function getHelp(): string
45 console serverblock - Manage blocked server domain patterns
47 bin/console serverblock [-h|--help|-?] [-v]
48 bin/console serverblock add <pattern> <reason> [-h|--help|-?] [-v]
49 bin/console serverblock remove <pattern> [-h|--help|-?] [-v]
50 bin/console serverblock export <filename>
51 bin/console serverblock import <filename>
54 With this tool, you can list the current blocked server domain patterns
55 or you can add / remove a blocked server domain pattern from the list.
56 Using the export and import options you can share your server blocklist
57 with other node admins by CSV files.
59 Patterns are case-insensitive shell wildcard comprising the following special characters:
60 - * : Any number of characters
61 - ? : Any single character
62 - [<char1><char2>...] : char1 or char2 or...
65 -h|--help|-? Show help information
66 -v Show more debug information.
70 public function __construct(DomainPatternBlocklist $blocklist, $argv = null)
72 parent::__construct($argv);
74 $this->blocklist = $blocklist;
77 protected function doExecute(): int
79 if (count($this->args) == 0) {
80 $this->printBlockedServers();
84 switch ($this->getArgument(0)) {
86 return $this->addBlockedServer();
88 return $this->removeBlockedServer();
90 return $this->exportBlockedServers();
92 return $this->importBlockedServers();
94 throw new CommandArgsException('Unknown command.');
99 * Exports the list of blocked domain patterns including the reason for the
100 * block to a CSV file.
105 private function exportBlockedServers(): int
107 $filename = $this->getArgument(1);
109 $this->blocklist->exportToFile($filename);
116 * Imports a list of domain patterns and a reason for the block from a CSV
117 * file, e.g. created with the export function.
122 private function importBlockedServers(): int
124 $filename = $this->getArgument(1);
126 $newBlockList = $this->blocklist::extractFromCSVFile($filename);
128 if ($this->blocklist->append($newBlockList)) {
129 $this->out(sprintf("Entries from %s that were not blocked before are now blocked", $filename));
132 $this->out("Couldn't save the block list");
138 * Prints the whole list of blocked domain patterns including the reason
140 private function printBlockedServers(): void
142 $table = new Console_Table();
143 $table->setHeaders(['Pattern', 'Reason']);
144 foreach ($this->blocklist->get() as $pattern) {
145 $table->addRow($pattern);
148 $this->out($table->getTable());
152 * Adds a domain pattern to the block list
154 * @return int The return code (0 = success, 1 = failed)
156 private function addBlockedServer(): int
158 if (count($this->args) != 3) {
159 throw new CommandArgsException('Add needs a domain pattern and a reason.');
162 $pattern = $this->getArgument(1);
163 $reason = $this->getArgument(2);
165 $result = $this->blocklist->addPattern($pattern, $reason);
168 $this->out(sprintf("The domain pattern '%s' is now updated. (Reason: '%s')", $pattern, $reason));
170 $this->out(sprintf("The domain pattern '%s' is now blocked. (Reason: '%s')", $pattern, $reason));
174 $this->out(sprintf("Couldn't save '%s' as blocked domain pattern", $pattern));
180 * Removes a domain pattern from the block list
182 * @return int The return code (0 = success, 1 = failed)
184 private function removeBlockedServer(): int
186 if (count($this->args) !== 2) {
187 throw new CommandArgsException('Remove needs a second parameter.');
190 $pattern = $this->getArgument(1);
192 $result = $this->blocklist->removePattern($pattern);
195 $this->out(sprintf("The domain pattern '%s' isn't blocked anymore", $pattern));
198 $this->out(sprintf("The domain pattern '%s' wasn't blocked.", $pattern));
202 $this->out(sprintf("Couldn't remove '%s' from blocked domain patterns", $pattern));