From 6a19807c780214298437fa62514ed708008b12f1 Mon Sep 17 00:00:00 2001
From: Roland Haeder <roland@mxchange.org>
Date: Mon, 27 Jul 2015 15:33:58 +0200
Subject: [PATCH] =?utf8?q?Special=20characters=20cannot=20be=20securely=20?=
 =?utf8?q?written=20with=20direct=20writeBytes()=20and=20readLine()=20meth?=
 =?utf8?q?od,=20but=20BASE64=20works=20flawless=20...=20Signed-off-by:Rola?=
 =?utf8?q?nd=20H=C3=A4der=20<roland@mxchange.org>?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

---
 .../backend/csv/CsvDatabaseBackend.java       | 24 +++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

diff --git a/Addressbook/src/org/mxchange/addressbook/database/backend/csv/CsvDatabaseBackend.java b/Addressbook/src/org/mxchange/addressbook/database/backend/csv/CsvDatabaseBackend.java
index b09fe8f..49b3128 100644
--- a/Addressbook/src/org/mxchange/addressbook/database/backend/csv/CsvDatabaseBackend.java
+++ b/Addressbook/src/org/mxchange/addressbook/database/backend/csv/CsvDatabaseBackend.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.io.RandomAccessFile;
 import java.text.MessageFormat;
 import java.util.ArrayList;
+import java.util.Base64;
 import java.util.Iterator;
 import java.util.List;
 import java.util.StringTokenizer;
@@ -59,7 +60,7 @@ public class CsvDatabaseBackend extends BaseDatabaseBackend implements CsvBacken
 		this.setTableName(tableName);
 
 		// Construct file name
-		String fileName = String.format("data/table_%s.csv", tableName);
+		String fileName = String.format("data/table_%s.b64", tableName);
 
 		// Debug message
 		this.getLogger().debug(MessageFormat.format("Trying to open file {0} ...", fileName));
@@ -171,8 +172,11 @@ public class CsvDatabaseBackend extends BaseDatabaseBackend implements CsvBacken
 		// Debug message
 		this.getLogger().debug(MessageFormat.format("str({0})={1}", str.length(), str));
 
+		// Encode line in BASE-64
+		byte[] encoded = Base64.getEncoder().encode(str.trim().getBytes());
+
 		// The string is now a valid CSV string
-		this.getStorageFile().writeBytes(str);
+		this.getStorageFile().write(encoded);
 	}
 
 	/**
@@ -298,13 +302,19 @@ public class CsvDatabaseBackend extends BaseDatabaseBackend implements CsvBacken
 				// Get next token
 				String token = tokenizer.nextToken();
 
+				// If char " is at pos 2 (0,1,2), then cut it of there
+				if ((token.charAt(0) != '"') && (token.charAt(2) == '"')) {
+					// UTF-8 writer characters found
+					token = token.substring(2);
+				}
+				
 				// Debug message
 				this.getLogger().debug(MessageFormat.format("token={0}", token));
 
 				// Verify token, it must have double-quotes on each side
 				if ((!token.startsWith("\"")) || (!token.endsWith("\""))) {
 					// Something bad was read
-					throw new BadTokenException(MessageFormat.format("Token {0} has not double-quotes on both ends.", token));
+					throw new BadTokenException(MessageFormat.format("Token {0} at position {1} has not double-quotes on both ends.", token, count));
 				}
 
 				// All fine, so remove it
@@ -516,7 +526,13 @@ public class CsvDatabaseBackend extends BaseDatabaseBackend implements CsvBacken
 		String input = null;
 
 		try {
-			input = this.getStorageFile().readLine();
+			String base64 = this.getStorageFile().readLine();
+
+			// Decode BASE-64
+			byte[] decoded = Base64.getDecoder().decode(base64);
+
+			// Convert to string
+			input = new String(decoded);
 		} catch (final IOException ex) {
 			this.getLogger().catching(ex);
 		}
-- 
2.39.5