X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FConsole%2FServerBlock.php;h=9bf2c0eccafe5b4b65f646404574d8d71ff9ef44;hb=e56a53647bd5469551bf4f9ef2df50a5dd16b943;hp=202f7bb75edf271fe43ad7d1c4d36442e22fb033;hpb=8b344141da6dcc6b01b498637131822fadab24ff;p=friendica.git diff --git a/src/Console/ServerBlock.php b/src/Console/ServerBlock.php index 202f7bb75e..9bf2c0ecca 100644 --- a/src/Console/ServerBlock.php +++ b/src/Console/ServerBlock.php @@ -1,15 +1,33 @@ . + * + */ namespace Friendica\Console; use Asika\SimpleConsole\CommandArgsException; use Asika\SimpleConsole\Console; use Console_Table; -use Friendica\BaseObject; -use Friendica\Core\Config\Configuration; +use Friendica\Core\Config\Capability\IManageConfigValues; /** - * @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 @@ -20,19 +38,28 @@ class ServerBlock extends Console protected $helpOptions = ['h', 'help', '?']; + /** + * @var IManageConfigValues + */ + private $config; + protected function getHelp() { $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 @@ -45,36 +72,108 @@ HELP; return $help; } - protected function doExecute() + public function __construct(IManageConfigValues $config, $argv = null) { - $a = BaseObject::getApp(); + parent::__construct($argv); + $this->config = $config; + } + + protected function doExecute() + { if (count($this->args) == 0) { - $this->printBlockedServers($a->getConfig()); + $this->printBlockedServers($this->config); return 0; } switch ($this->getArgument(0)) { case 'add': - return $this->addBlockedServer($a->getConfig()); + return $this->addBlockedServer($this->config); case 'remove': - return $this->removeBlockedServer($a->getConfig()); + 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; } } + /** + * Exports the list of blocked domains including the reason for the + * block to a CSV file. + * + * @param IManageConfigValues $config + */ + private function exportBlockedServers(IManageConfigValues $config) + { + $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); + } + } + /** + * Imports a list of domains and a reason for the block from a CSV + * file, e.g. created with the export function. + * + * @param IManageConfigValues $config + */ + private function importBlockedServers(IManageConfigValues $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; + } + + } else { + throw new Exception(sprintf('The file "%s" could not be opened for importing', $filename)); + } + } + /** * Prints the whole list of blocked domains including the reason * - * @param Configuration $config + * @param IManageConfigValues $config */ - private function printBlockedServers(Configuration $config) + private function printBlockedServers(IManageConfigValues $config) { $table = new Console_Table(); $table->setHeaders(['Domain', 'Reason']); - $blocklist = $config->get('system', 'blocklist'); + $blocklist = $config->get('system', 'blocklist', []); foreach ($blocklist as $domain) { $table->addRow($domain); } @@ -84,11 +183,11 @@ HELP; /** * Adds a server to the blocked list * - * @param Configuration $config + * @param IManageConfigValues $config * * @return int The return code (0 = success, 1 = failed) */ - private function addBlockedServer(Configuration $config) + private function addBlockedServer(IManageConfigValues $config) { if (count($this->args) < 2 || count($this->args) > 3) { throw new CommandArgsException('Add needs a domain and optional a reason.'); @@ -99,9 +198,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[] = [ @@ -136,11 +235,11 @@ HELP; /** * Removes a server from the blocked list * - * @param Configuration $config + * @param IManageConfigValues $config * * @return int The return code (0 = success, 1 = failed) */ - private function removeBlockedServer(Configuration $config) + private function removeBlockedServer(IManageConfigValues $config) { if (count($this->args) !== 2) { throw new CommandArgsException('Remove needs a second parameter.'); @@ -150,9 +249,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 {