From c4b8be8b5f91dad69b33b2977376f36091d88c06 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Thu, 28 Jun 2018 19:41:38 +0200
Subject: [PATCH] Fixed #313 - convert password field to type password (added
 password confirmation input)

---
 .../controller/SettingsController.java        | 38 +++++++++++++++----
 .../budgetmaster/utils/Strings.java           |  3 ++
 src/main/resources/languages/_de.properties   |  3 ++
 src/main/resources/languages/_en.properties   |  3 ++
 src/main/resources/templates/settings.ftl     | 10 ++++-
 5 files changed, 48 insertions(+), 9 deletions(-)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java
index 8da778b15..86cc46e29 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java
@@ -58,19 +58,17 @@ public class SettingsController extends BaseController
 	@RequestMapping(value = "/settings/save", method = RequestMethod.POST)
 	public String post(Model model, @ModelAttribute("Settings") Settings settings, BindingResult bindingResult,
 					   @RequestParam(value = "password") String password,
+					   @RequestParam(value = "passwordConfirmation") String passwordConfirmation,
 					   @RequestParam(value = "languageType") String languageType)
 	{
-		if(password == null || password.equals(""))
-		{
-			bindingResult.addError(new FieldError("Settings", "password", password, false, new String[]{Strings.WARNING_SETTINGS_PASSWORD_EMPTY}, null, Strings.WARNING_SETTINGS_PASSWORD_EMPTY));
-		}
-		else if(password.length() < 3)
+		settings.setLanguage(LanguageType.fromName(languageType));
+
+		FieldError error = validatePassword(password, passwordConfirmation);
+		if(error != null)
 		{
-			bindingResult.addError(new FieldError("Settings", "password", password, false, new String[]{Strings.WARNING_SETTINGS_PASSWORD_LENGTH}, null, Strings.WARNING_SETTINGS_PASSWORD_LENGTH));
+			bindingResult.addError(error);
 		}
 
-		settings.setLanguage(LanguageType.fromName(languageType));
-
 		if(bindingResult.hasErrors())
 		{
 			model.addAttribute("error", bindingResult);
@@ -97,6 +95,30 @@ public class SettingsController extends BaseController
 		return "redirect:/settings";
 	}
 
+	private FieldError validatePassword(String password, String passwordConfirmation)
+	{
+		if(password == null || password.equals(""))
+		{
+			return new FieldError("Settings", "password", password, false, new String[]{Strings.WARNING_SETTINGS_PASSWORD_EMPTY}, null, Strings.WARNING_SETTINGS_PASSWORD_EMPTY);
+		}
+		else if(password.length() < 3)
+		{
+			return new FieldError("Settings", "password", password, false, new String[]{Strings.WARNING_SETTINGS_PASSWORD_LENGTH}, null, Strings.WARNING_SETTINGS_PASSWORD_LENGTH);
+		}
+
+		if(passwordConfirmation == null || passwordConfirmation.equals(""))
+		{
+			return new FieldError("Settings", "passwordConfirmation", passwordConfirmation, false, new String[]{Strings.WARNING_SETTINGS_PASSWORD_CONFIRMATION_EMPTY}, null, Strings.WARNING_SETTINGS_PASSWORD_CONFIRMATION_EMPTY);
+		}
+
+		if(!password.equals(passwordConfirmation))
+		{
+			return new FieldError("Settings", "passwordConfirmation", passwordConfirmation, false, new String[]{Strings.WARNING_SETTINGS_PASSWORD_CONFIRMATION_WRONG}, null, Strings.WARNING_SETTINGS_PASSWORD_CONFIRMATION_WRONG);
+		}
+
+		return null;
+	}
+
 	@RequestMapping("/settings/database/requestExport")
 	public void downloadFile(HttpServletResponse response)
 	{
diff --git a/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java b/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java
index 29d778ff3..4378afd78 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java
@@ -217,6 +217,9 @@ public class Strings
     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";
+    public static final String WARNING_SETTINGS_PASSWORD_CONFIRMATION_EMPTY = "warning.settings.password.confirmation.empty";
+    public static final String WARNING_SETTINGS_PASSWORD_CONFIRMATION_WRONG = "warning.settings.password.confirmation.wrong";
+
 
     //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 f3c80ec1f..26cfe2055 100644
--- a/src/main/resources/languages/_de.properties
+++ b/src/main/resources/languages/_de.properties
@@ -229,6 +229,8 @@ 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.
+warning.settings.password.confirmation.empty=Bitte gib dein Passwort zur Best�tigung erneut ein.
+warning.settings.password.confirmation.wrong=Passwort und Passwort Wiederholung stimmen nicht �berein.
 
 # ERROR
 error.unknown.host=Es konnte keine Verbindung mit dem Internet hergestellt werden.
@@ -318,6 +320,7 @@ menu.accounts=Konten
 category.new.label.name=Name
 
 settings.password=Passwort
+settings.password.confirmation=Passwort Wiederholung
 settings.currency=W�hrung
 settings.rest=�bertrag
 settings.rest.deactivated=Aus
diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties
index a4bb2ec83..2e6eedfa8 100644
--- a/src/main/resources/languages/_en.properties
+++ b/src/main/resources/languages/_en.properties
@@ -229,6 +229,8 @@ 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.
+warning.settings.password.confirmation.empty=Please enter your password again for confirmation.
+warning.settings.password.confirmation.wrong=Password and password confirmation do not match.
 
 # ERROR
 error.unknown.host=Could not connect to the Internet.
@@ -318,6 +320,7 @@ menu.accounts=Accounts
 category.new.label.name=Name
 
 settings.password=Password
+settings.password.confirmation=Password Confirmation
 settings.currency=Currency
 settings.rest=Rest
 settings.rest.deactivated=Off
diff --git a/src/main/resources/templates/settings.ftl b/src/main/resources/templates/settings.ftl
index 13d2f956b..495d835a4 100644
--- a/src/main/resources/templates/settings.ftl
+++ b/src/main/resources/templates/settings.ftl
@@ -24,11 +24,19 @@
                         <#-- password -->
                         <div class="row">
                             <div class="input-field col s12 m12 l8 offset-l2">
-                                <input id="settings-password" type="text" name="password" <@validation.validation "password"/> value="•••••">
+                                <input id="settings-password" type="password" name="password" <@validation.validation "password"/> value="•••••">
                                 <label for="settings-password">${locale.getString("settings.password")}</label>
                             </div>
                         </div>
 
+                        <#-- password confirmation-->
+                        <div class="row">
+                            <div class="input-field col s12 m12 l8 offset-l2">
+                                <input id="settings-password-confirmation" type="password" name="passwordConfirmation" <@validation.validation "passwordConfirmation"/> value="•••••">
+                                <label for="settings-password-confirmation">${locale.getString("settings.password.confirmation")}</label>
+                            </div>
+                        </div>
+
                         <#-- currency -->
                         <div class="row">
                             <div class="input-field col s12 m12 l8 offset-l2">
-- 
GitLab