From c625e64b51ebd68c450a403594758581bc4ef7c6 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sun, 3 Jun 2018 13:06:35 +0200
Subject: [PATCH] #256 - settings can now be saved

---
 .../controller/SettingsController.java        | 74 +++++++++++--------
 .../budgetmaster/entities/Settings.java       | 18 +----
 .../budgetmaster/utils/LanguageType.java      | 13 ++++
 .../budgetmaster/utils/Strings.java           |  2 +
 src/main/resources/languages/_de.properties   |  2 +
 src/main/resources/languages/_en.properties   |  2 +
 src/main/resources/templates/settings.ftl     |  8 +-
 7 files changed, 70 insertions(+), 49 deletions(-)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java
index d57398433..6740ca49e 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java
@@ -1,15 +1,23 @@
 package de.deadlocker8.budgetmaster.controller;
 
+import de.deadlocker8.budgetmaster.authentication.User;
+import de.deadlocker8.budgetmaster.authentication.UserRepository;
 import de.deadlocker8.budgetmaster.entities.Settings;
 import de.deadlocker8.budgetmaster.repositories.SettingsRepository;
 import de.deadlocker8.budgetmaster.services.HelpersService;
+import de.deadlocker8.budgetmaster.utils.LanguageType;
+import de.deadlocker8.budgetmaster.utils.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.validation.ObjectError;
 import org.springframework.web.bind.annotation.ModelAttribute;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 
 
 @Controller
@@ -18,6 +26,9 @@ public class SettingsController extends BaseController
 	@Autowired
 	private SettingsRepository settingsRepository;
 
+	@Autowired
+	private UserRepository userRepository;
+
 	@Autowired
 	private HelpersService helpers;
 
@@ -29,36 +40,41 @@ public class SettingsController extends BaseController
 	}
 
 	@RequestMapping(value = "/settings/save", method = RequestMethod.POST)
-	public String post(Model model, @ModelAttribute("Settings") Settings settings, BindingResult bindingResult)
+	public String post(Model model, @ModelAttribute("Settings") Settings settings, BindingResult bindingResult,
+					   @RequestParam(value = "password") String password,
+					   @RequestParam(value = "languageType") String languageType)
 	{
-//		CategoryValidator userValidator = new CategoryValidator();
-//		userValidator.validate(category, bindingResult);
-//
-//		if(bindingResult.hasErrors())
-//		{
-//			model.addAttribute("error", bindingResult);
-//
-//			if(helpers.getCategoryColorList().contains(category.getColor()))
-//			{
-//				model.addAttribute("customColor", "#FFFFFF");
-//			}
-//			else
-//			{
-//				model.addAttribute("customColor", category.getColor());
-//			}
-//
-//			if(category.getColor() == null)
-//			{
-//				category.setColor(ConvertTo.toRGBHexWithoutOpacity(Colors.CATEGORIES_LIGHT_GREY).toLowerCase());
-//			}
-//			model.addAttribute("category", category);
-//			return "categories/newCategory";
-//		}
-//		else
-//		{
-//			category.setType(CategoryType.CUSTOM);
-//			categoryRepository.save(category);
-//		}
+		if(password == null ||password.equals(""))
+		{
+			bindingResult.addError(new ObjectError("password", Strings.WARNING_SETTINGS_PASSWORD_EMPTY));
+		}
+		else if(password.length() < 3)
+		{
+			bindingResult.addError(new ObjectError("password", Strings.WARNING_SETTINGS_PASSWORD_LENGTH));
+		}
+
+		settings.setLanguage(LanguageType.fromName(languageType));
+
+		if(bindingResult.hasErrors())
+		{
+			model.addAttribute("error", bindingResult);
+			model.addAttribute("settings", settings);
+			return "settings";
+		}
+		else
+		{
+			if(!password.equals("•••••"))
+			{
+				BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
+				String encryptedPassword = bCryptPasswordEncoder.encode(password);
+				User user = userRepository.findByName("Default");
+				user.setPassword(encryptedPassword);
+				userRepository.save(user);
+			}
+
+			settingsRepository.delete(0);
+			settingsRepository.save(settings);
+		}
 
 		return "redirect:/settings";
 	}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/Settings.java b/src/main/java/de/deadlocker8/budgetmaster/entities/Settings.java
index dc924b1e8..520349c78 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/entities/Settings.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/entities/Settings.java
@@ -16,9 +16,6 @@ public class Settings
 {
 	@Id
 	private int ID;
-	@NotNull
-	@Size(min = 1)
-	private String password;
 	private String currency;
 	private LanguageType language;
 	private boolean restActivated;
@@ -33,7 +30,6 @@ public class Settings
 	public static Settings getDefault()
 	{
 		Settings defaultSettings = new Settings();
-		defaultSettings.setPassword("BudgetMaster");
 		defaultSettings.setCurrency("€");
 		defaultSettings.setLanguage(LanguageType.ENGLISH);
 		defaultSettings.setRestActivated(true);
@@ -48,16 +44,6 @@ public class Settings
 		return ID;
 	}
 
-	public String getPassword()
-	{
-		return password;
-	}
-
-	public void setPassword(String password)
-	{
-		this.password = password;
-	}
-
 	public String getCurrency()
 	{
 		return currency;
@@ -111,8 +97,8 @@ public class Settings
 	@Override
 	public String toString()
 	{
-		return "SettingsRepository{" +
-				"password='" + password + '\'' +
+		return "Settings{" +
+				"ID=" + ID +
 				", currency='" + currency + '\'' +
 				", language=" + language +
 				", restActivated=" + restActivated +
diff --git a/src/main/java/de/deadlocker8/budgetmaster/utils/LanguageType.java b/src/main/java/de/deadlocker8/budgetmaster/utils/LanguageType.java
index 5ec11ab94..66c88f1c0 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/utils/LanguageType.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/utils/LanguageType.java
@@ -32,4 +32,17 @@ public enum LanguageType
 	{
 		return iconName;
 	}
+
+	public static LanguageType fromName(String name)
+	{
+		for(LanguageType type : values())
+		{
+			if(type.getName().equals(name))
+			{
+				return type;
+			}
+		}
+
+		return null;
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java b/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java
index 470cdfb19..29d778ff3 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java
@@ -215,6 +215,8 @@ public class Strings
     public static final String WARNING_SERVER_VERSION = "warning.server.version";
     public static final String WARNING_EMPTY_YEAR = "warning.empty.year";
     public static final String WARNING_WRONG_YEAR = "warning.wrong.year";
+    public static final String WARNING_SETTINGS_PASSWORD_EMPTY = "warning.settings.password.empty";
+    public static final String WARNING_SETTINGS_PASSWORD_LENGTH = "warning.settings.password.length";
 
     //ERROR
     public static final String ERROR_UNKNOWN_HOST = "error.unknown.host";
diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties
index 23a6e7b19..9cd5b17ec 100644
--- a/src/main/resources/languages/_de.properties
+++ b/src/main/resources/languages/_de.properties
@@ -226,6 +226,8 @@ warning.wrong.password=Das Passwort ist nicht korrekt.
 warning.server.version=Die installierte Serverversion (Version: {0}) ist nicht kompatibel mit deinem Client (Version: {1}).\n\nBitte aktualisiere deinen Server:\nSchritt 1: Server stoppen\nSchritt 2: BudgetMasterServer.jar mit aktuellester Version ersetzen\nSchritt 3: Server starten
 warning.empty.year=Bitte gib ein Jahr ein.
 warning.wrong.year=Bitte gib eine g�ltige Jahreszahl ein (4 Ziffern).
+warning.settings.password.empty=Bitte gib ein Passwort ein.
+warning.settings.password.length=Das Passwort muss mindestens drei Zeichen lang sein.
 
 # ERROR
 error.unknown.host=Es konnte keine Verbindung mit dem Internet hergestellt werden.
diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties
index df51cd34c..dc6a4f064 100644
--- a/src/main/resources/languages/_en.properties
+++ b/src/main/resources/languages/_en.properties
@@ -226,6 +226,8 @@ warning.wrong.password=The password is not correct.
 warning.server.version=The installed server version (version: {0}) is not compatible with your client (version: {1}).\n\nPlease update your server:\nStep 1: stop server\nStep 2: replace BudgetMasterServer.jar with latest version\nStep 3: start server
 warning.empty.year=Please enter a year.
 warning.wrong.year=Please enter a valid year (4 digits).
+warning.settings.password.empty=Please enter a password.
+warning.settings.password.length=The password must be at least three characters long.
 
 # ERROR
 error.unknown.host=Could not connect to the Internet.
diff --git a/src/main/resources/templates/settings.ftl b/src/main/resources/templates/settings.ftl
index da30e8618..caefd9b88 100644
--- a/src/main/resources/templates/settings.ftl
+++ b/src/main/resources/templates/settings.ftl
@@ -44,7 +44,7 @@
                                 <div class="switch">
                                     <label>
                                     ${locale.getString("settings.rest.deactivated")}
-                                        <input type="checkbox" name="isPayment" <#if settings.isRestActivated()>checked</#if>>
+                                        <input type="checkbox" name="restActivated" <#if settings.isRestActivated()>checked</#if>>
                                         <span class="lever"></span>
                                     ${locale.getString("settings.rest.activated")}
                                     </label>
@@ -55,7 +55,7 @@
                                 <div class="switch">
                                     <label>
                                     ${locale.getString("settings.darkTheme.deactivated")}
-                                        <input type="checkbox" name="isPayment" <#if settings.isUseDarkTheme()>checked</#if>>
+                                        <input type="checkbox" name="useDarkTheme" <#if settings.isUseDarkTheme()>checked</#if>>
                                         <span class="lever"></span>
                                     ${locale.getString("settings.darkTheme.activated")}
                                     </label>
@@ -66,7 +66,7 @@
                         <#-- language -->
                         <div class="row">
                             <div class="input-field col s12 m12 l8 offset-l2">
-                                <select id="settings-language" name="language" <@validation.validation "language"/>>
+                                <select id="settings-language" name="languageType" <@validation.validation "language"/>>
                                     <#list helpers.getAvailableLanguages() as language>
                                         <#if settings.getLanguage() == language>
                                             <option selected value="${language.getName()}">${language.getName()}</option>
@@ -94,7 +94,7 @@
                                             <div class="switch">
                                                 <label>
                                                 ${locale.getString("settings.updates.automatic.deactivated")}
-                                                    <input type="checkbox" name="isPayment" <#if settings.isUseDarkTheme()>checked</#if>>
+                                                    <input type="checkbox" name="autoUpdateCheckEnabled" <#if settings.isUseDarkTheme()>checked</#if>>
                                                     <span class="lever"></span>
                                                 ${locale.getString("settings.updates.automatic.activated")}
                                                 </label>
-- 
GitLab