X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FConsole%2FServerBlock.php;h=4d04dcff81e0d23847af76a05fe399728f1ea8b6;hb=e659a0314086dd700dbe5e754e383ab758725805;hp=7c17fdc5756a353d09c767f8043294a2904dc72a;hpb=c6c7c4e841ed2146f6baacc8adf802f730087450;p=friendica.git diff --git a/src/Console/ServerBlock.php b/src/Console/ServerBlock.php index 7c17fdc575..4d04dcff81 100644 --- a/src/Console/ServerBlock.php +++ b/src/Console/ServerBlock.php @@ -1,6 +1,6 @@ [-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; } - public function __construct(IConfig $config, $argv = null) + public function __construct(DomainPatternBlocklist $blocklist, $argv = null) { parent::__construct($argv); - $this->config = $config; + $this->blocklist = $blocklist; } - protected function doExecute() + protected function doExecute(): int { if (count($this->args) == 0) { - $this->printBlockedServers($this->config); + $this->printBlockedServers(); return 0; } switch ($this->getArgument(0)) { case 'add': - return $this->addBlockedServer($this->config); + return $this->addBlockedServer(); case 'remove': - return $this->removeBlockedServer($this->config); + return $this->removeBlockedServer(); case 'export': - return $this->exportBlockedServers($this->config); + return $this->exportBlockedServers(); case 'import': - return $this->importBlockedServers($this->config); + return $this->importBlockedServers(); default: throw new CommandArgsException('Unknown command.'); - break; } } /** - * Exports the list of blocked domains including the reason for the + * Exports the list of blocked domain patterns including the reason for the * block to a CSV file. * - * @param IConfig $config + * @return int + * @throws \Exception */ - private function exportBlockedServers(IConfig $config) + private function exportBlockedServers(): int { $filename = $this->getArgument(1); - $blocklist = $config->get('system', 'blocklist', []); - $fp = fopen($filename, 'w'); - foreach ($blocklist as $domain) { - fputcsv($fp, $domain); + + if (empty($filename)) { + $this->out('A file name is required, e.g. ./bin/console serverblock export backup.csv'); + return 1; } + + $this->blocklist->exportToFile($filename); + + // Success + return 0; } + /** - * Imports a list of domains and a reason for the block from a CSV + * Imports a list of domain patterns and a reason for the block from a CSV * file, e.g. created with the export function. * - * @param IConfig $config + * @return int + * @throws \Exception */ - private function importBlockedServers(IConfig $config) + private function importBlockedServers(): int { $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; - } + $newBlockList = $this->blocklist::extractFromCSVFile($filename); + + if ($this->blocklist->append($newBlockList)) { + $this->out(sprintf("Entries from %s that were not blocked before are now blocked", $filename)); + Worker::add(Worker::PRIORITY_LOW, 'UpdateBlockedServers'); + return 0; + } else { + $this->out("Couldn't save the block list"); + return 1; } } /** - * Prints the whole list of blocked domains including the reason - * - /* @param IConfig $config + * Prints the whole list of blocked domain patterns including the reason */ - private function printBlockedServers(IConfig $config) + private function printBlockedServers(): void { $table = new Console_Table(); - $table->setHeaders(['Domain', 'Reason']); - $blocklist = $config->get('system', 'blocklist', []); - foreach ($blocklist as $domain) { - $table->addRow($domain); + $table->setHeaders(['Pattern', 'Reason']); + foreach ($this->blocklist->get() as $pattern) { + $table->addRow($pattern); } + $this->out($table->getTable()); } /** - * Adds a server to the blocked list - * - * @param IConfig $config + * Adds a domain pattern to the block list * * @return int The return code (0 = success, 1 = failed) */ - private function addBlockedServer(IConfig $config) + private function addBlockedServer(): int { - if (count($this->args) < 2 || count($this->args) > 3) { - throw new CommandArgsException('Add needs a domain and optional a reason.'); - } - - $domain = $this->getArgument(1); - $reason = (count($this->args) === 3) ? $this->getArgument(2) : self::DEFAULT_REASON; - - $update = false; - - $currBlockList = $config->get('system', 'blocklist', []); - $newBlockList = []; - foreach ($currBlockList as $blocked) { - if ($blocked['domain'] === $domain) { - $update = true; - $newBlockList[] = [ - 'domain' => $domain, - 'reason' => $reason, - ]; - } else { - $newBlockList[] = $blocked; - } + if (count($this->args) != 3) { + throw new CommandArgsException('Add needs a domain pattern and a reason.'); } - if (!$update) { - $newBlockList[] = [ - 'domain' => $domain, - 'reason' => $reason, - ]; - } + $pattern = $this->getArgument(1); + $reason = $this->getArgument(2); - if ($config->set('system', 'blocklist', $newBlockList)) { - if ($update) { - $this->out(sprintf("The domain '%s' is now updated. (Reason: '%s')", $domain, $reason)); + $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)); } + Worker::add(Worker::PRIORITY_LOW, 'UpdateBlockedServers'); 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 IConfig $config + * Removes a domain pattern from the block list * * @return int The return code (0 = success, 1 = failed) */ - private function removeBlockedServer(IConfig $config) + private function removeBlockedServer(): int { if (count($this->args) !== 2) { throw new CommandArgsException('Remove needs a second parameter.'); } - $domain = $this->getArgument(1); + $pattern = $this->getArgument(1); - $found = false; - - $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)); + Worker::add(Worker::PRIORITY_LOW, 'UpdateBlockedServers'); + 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; } }