X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FConsole%2FServerBlock.php;h=46e7b89eb99deb8f48a280768f27c376811f39ad;hb=af2a38c5b3724d140700316f3a0251e82692de38;hp=202f7bb75edf271fe43ad7d1c4d36442e22fb033;hpb=a2d9a2865aa8b098aee387fcd325f41f636a05cc;p=friendica.git diff --git a/src/Console/ServerBlock.php b/src/Console/ServerBlock.php index 202f7bb75e..46e7b89eb9 100644 --- a/src/Console/ServerBlock.php +++ b/src/Console/ServerBlock.php @@ -1,38 +1,61 @@ . + * + */ namespace Friendica\Console; use Asika\SimpleConsole\CommandArgsException; use Asika\SimpleConsole\Console; use Console_Table; -use Friendica\BaseObject; -use Friendica\Core\Config\Configuration; +use Friendica\Moderation\DomainPatternBlocklist; /** - * @brief Manage blocked servers + * Manage blocked servers * * With this tool, you can list the current blocked servers * or you can add / remove a blocked server from the list */ class ServerBlock extends Console { - const DEFAULT_REASON = 'blocked'; - protected $helpOptions = ['h', 'help', '?']; - protected function getHelp() + /** @var DomainPatternBlocklist */ + private $blocklist; + + protected function getHelp(): string { - $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 @@ -42,134 +65,141 @@ Options -h|--help|-? Show help information -v Show more debug information. HELP; - return $help; } - protected function doExecute() + public function __construct(DomainPatternBlocklist $blocklist, $argv = null) { - $a = BaseObject::getApp(); + parent::__construct($argv); + $this->blocklist = $blocklist; + } + + protected function doExecute(): int + { if (count($this->args) == 0) { - $this->printBlockedServers($a->getConfig()); + $this->printBlockedServers(); return 0; } switch ($this->getArgument(0)) { case 'add': - return $this->addBlockedServer($a->getConfig()); + return $this->addBlockedServer(); case 'remove': - return $this->removeBlockedServer($a->getConfig()); + return $this->removeBlockedServer(); + case 'export': + return $this->exportBlockedServers(); + case 'import': + return $this->importBlockedServers(); default: throw new CommandArgsException('Unknown command.'); - break; } } /** - * Prints the whole list of blocked domains including the reason + * Exports the list of blocked domain patterns including the reason for the + * block to a CSV file. * - * @param Configuration $config + * @return int + * @throws \Exception */ - private function printBlockedServers(Configuration $config) + private function exportBlockedServers(): int { - $table = new Console_Table(); - $table->setHeaders(['Domain', 'Reason']); - $blocklist = $config->get('system', 'blocklist'); - foreach ($blocklist as $domain) { - $table->addRow($domain); - } - $this->out($table->getTable()); + $filename = $this->getArgument(1); + + $this->blocklist->exportToFile($filename); + + // Success + return 0; } /** - * Adds a server to the blocked list - * - * @param Configuration $config + * Imports a list of domain patterns and a reason for the block from a CSV + * file, e.g. created with the export function. * - * @return int The return code (0 = success, 1 = failed) + * @return int + * @throws \Exception */ - private function addBlockedServer(Configuration $config) + private function importBlockedServers(): int { - if (count($this->args) < 2 || count($this->args) > 3) { - throw new CommandArgsException('Add needs a domain and optional a reason.'); - } + $filename = $this->getArgument(1); - $domain = $this->getArgument(1); - $reason = (count($this->args) === 3) ? $this->getArgument(2) : self::DEFAULT_REASON; + $newBlockList = $this->blocklist::extractFromCSVFile($filename); - $update = false; + if ($this->blocklist->append($newBlockList)) { + $this->out(sprintf("Entries from %s that were not blocked before are now blocked", $filename)); + return 0; + } else { + $this->out("Couldn't save the block list"); + return 1; + } + } - $currBlocklist = $config->get('system', 'blocklist'); - $newBlockList = []; - foreach ($currBlocklist as $blocked) { - if ($blocked['domain'] === $domain) { - $update = true; - $newBlockList[] = [ - 'domain' => $domain, - 'reason' => $reason, - ]; - } else { - $newBlockList[] = $blocked; - } + /** + * Prints the whole list of blocked domain patterns including the reason + */ + private function printBlockedServers(): void + { + $table = new Console_Table(); + $table->setHeaders(['Pattern', 'Reason']); + foreach ($this->blocklist->get() as $pattern) { + $table->addRow($pattern); } - if (!$update) { - $newBlockList[] = [ - 'domain' => $domain, - 'reason' => $reason, - ]; + $this->out($table->getTable()); + } + + /** + * Adds a domain pattern to the block list + * + * @return int The return code (0 = success, 1 = failed) + */ + private function addBlockedServer(): int + { + if (count($this->args) != 3) { + throw new CommandArgsException('Add needs a domain pattern and a reason.'); } - if ($config->set('system', 'blocklist', $newBlockList)) { - if ($update) { - $this->out(sprintf("The domain '%s' is now updated. (Reason: '%s')", $domain, $reason)); + $pattern = $this->getArgument(1); + $reason = $this->getArgument(2); + + $result = $this->blocklist->addPattern($pattern, $reason); + if ($result) { + if ($result == 2) { + $this->out(sprintf("The domain pattern '%s' is now updated. (Reason: '%s')", $pattern, $reason)); } else { - $this->out(sprintf("The domain '%s' is now blocked. (Reason: '%s')", $domain, $reason)); + $this->out(sprintf("The domain pattern '%s' is now blocked. (Reason: '%s')", $pattern, $reason)); } return 0; } else { - $this->out(sprintf("Couldn't save '%s' as blocked server", $domain)); + $this->out(sprintf("Couldn't save '%s' as blocked domain pattern", $pattern)); return 1; } } /** - * Removes a server from the blocked list - * - * @param Configuration $config + * Removes a domain pattern from the block list * * @return int The return code (0 = success, 1 = failed) */ - private function removeBlockedServer(Configuration $config) + private function removeBlockedServer(): int { if (count($this->args) !== 2) { throw new CommandArgsException('Remove needs a second parameter.'); } - $domain = $this->getArgument(1); - - $found = false; + $pattern = $this->getArgument(1); - $currBlocklist = $config->get('system', 'blocklist'); - $newBlockList = []; - foreach ($currBlocklist as $blocked) { - if ($blocked['domain'] === $domain) { - $found = true; + $result = $this->blocklist->removePattern($pattern); + if ($result) { + if ($result == 2) { + $this->out(sprintf("The domain pattern '%s' isn't blocked anymore", $pattern)); + return 0; } else { - $newBlockList[] = $blocked; + $this->out(sprintf("The domain pattern '%s' wasn't blocked.", $pattern)); + return 1; } - } - - if (!$found) { - $this->out(sprintf("The domain '%s' is not blocked.", $domain)); - return 1; - } - - if ($config->set('system', 'blocklist', $newBlockList)) { - $this->out(sprintf("The domain '%s' is not more blocked", $domain)); - return 0; } else { - $this->out(sprintf("Couldn't remove '%s' from blocked servers", $domain)); + $this->out(sprintf("Couldn't remove '%s' from blocked domain patterns", $pattern)); return 1; } }