From c6c7c4e841ed2146f6baacc8adf802f730087450 Mon Sep 17 00:00:00 2001
From: Tobias Diekershoff <tobias.diekershoff@gmx.net>
Date: Sun, 19 Jul 2020 09:49:17 +0200
Subject: [PATCH 1/7] 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 ada4f22132..7c17fdc575 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 <pattern> <reason> [-h|--help|-?] [-v]
 	bin/console serverblock remove <pattern> [-h|--help|-?] [-v]
+	bin/console serverblock export <filename>
+	bin/console serverblock import <filename>
 
 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><char2>...] : 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><char2>...] : 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 <tobias.diekershoff@gmx.net>
Date: Sun, 19 Jul 2020 09:58:31 +0200
Subject: [PATCH 2/7] 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 7c17fdc575..934226867b 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 <tobias.diekershoff@gmx.net>
Date: Fri, 7 Aug 2020 11:49:25 +0200
Subject: [PATCH 3/7] 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 934226867b..ca81ffb596 100644
--- a/src/Console/ServerBlock.php
+++ b/src/Console/ServerBlock.php
@@ -48,26 +48,27 @@ class ServerBlock extends Console
 		$help = <<<HELP
 console serverblock - Manage blocked server domain patterns
 Usage
-	bin/console serverblock [-h|--help|-?] [-v]
-	bin/console serverblock add <pattern> <reason> [-h|--help|-?] [-v]
-	bin/console serverblock remove <pattern> [-h|--help|-?] [-v]
-	bin/console serverblock export <filename>
-	bin/console serverblock import <filename>
+    bin/console serverblock [-h|--help|-?] [-v]
+    bin/console serverblock add <pattern> <reason> [-h|--help|-?] [-v]
+    bin/console serverblock remove <pattern> [-h|--help|-?] [-v]
+    bin/console serverblock export <filename>
+    bin/console serverblock import <filename>
 
 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><char2>...] : 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><char2>...] : 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 027da035e7..7b125b8b12 100644
--- a/tests/src/Console/ServerBlockConsoleTest.php
+++ b/tests/src/Console/ServerBlockConsoleTest.php
@@ -334,14 +334,18 @@ CONS;
 		$help = <<<HELP
 console serverblock - Manage blocked server domain patterns
 Usage
-	bin/console serverblock [-h|--help|-?] [-v]
-	bin/console serverblock add <pattern> <reason> [-h|--help|-?] [-v]
-	bin/console serverblock remove <pattern> [-h|--help|-?] [-v]
+    bin/console serverblock [-h|--help|-?] [-v]
+    bin/console serverblock add <pattern> <reason> [-h|--help|-?] [-v]
+    bin/console serverblock remove <pattern> [-h|--help|-?] [-v]
+    bin/console serverblock export <filename>
+    bin/console serverblock import <filename>
 
 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 <tobias.diekershoff@gmx.net>
Date: Fri, 7 Aug 2020 12:51:14 +0200
Subject: [PATCH 4/7] 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 ca81ffb596..18ea65d6d0 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 <tobias.diekershoff@gmx.net>
Date: Sat, 8 Aug 2020 08:35:34 +0200
Subject: [PATCH 5/7] 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 18ea65d6d0..40d8e45e74 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 <tobias.diekershoff@gmx.net>
Date: Sat, 8 Aug 2020 08:47:21 +0200
Subject: [PATCH 6/7] 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 40d8e45e74..d052612e1f 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 <tobias.diekershoff@gmx.net>
Date: Sat, 8 Aug 2020 15:49:25 +0200
Subject: [PATCH 7/7] 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 d052612e1f..d39fe8c3b2 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));