From 973b987f3a4788f5e28e7313a5581c68ccfe8431 Mon Sep 17 00:00:00 2001
From: Tom Lutzenberger <t.lutzenberger@adito.de>
Date: Mon, 10 Aug 2020 13:41:47 +0200
Subject: [PATCH] #1058862: Implementierung der Passwort-Policy Validierung
 (#1063293)

---
 entity/Employee_entity/Employee_entity.aod    |  1 +
 .../entityfields/password/onValidation.js     | 23 ++++++++++++++++++
 .../entityfields/jpassword/onValidation.js    | 10 ++++++++
 .../_____LANGUAGE_EXTRA.aod                   | 18 ++++++++++++++
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     | 24 +++++++++++++++++++
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     | 18 ++++++++++++++
 6 files changed, 94 insertions(+)
 create mode 100644 entity/Employee_entity/entityfields/password/onValidation.js

diff --git a/entity/Employee_entity/Employee_entity.aod b/entity/Employee_entity/Employee_entity.aod
index d3ae09d5ec..ed1770b8c1 100644
--- a/entity/Employee_entity/Employee_entity.aod
+++ b/entity/Employee_entity/Employee_entity.aod
@@ -71,6 +71,7 @@
       <contentType>PASSWORD</contentType>
       <mandatoryProcess>%aditoprj%/entity/Employee_entity/entityfields/password/mandatoryProcess.js</mandatoryProcess>
       <stateProcess>%aditoprj%/entity/Employee_entity/entityfields/password/stateProcess.js</stateProcess>
+      <onValidation>%aditoprj%/entity/Employee_entity/entityfields/password/onValidation.js</onValidation>
     </entityField>
     <entityField>
       <name>CONFIRM_PASSWORD</name>
diff --git a/entity/Employee_entity/entityfields/password/onValidation.js b/entity/Employee_entity/entityfields/password/onValidation.js
new file mode 100644
index 0000000000..594e4ab704
--- /dev/null
+++ b/entity/Employee_entity/entityfields/password/onValidation.js
@@ -0,0 +1,23 @@
+import("system.neon");
+import("system.result");
+import("system.translate");
+import("system.tools");
+import("system.vars");
+
+
+// Because employee password can only be set on new records
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) {
+    
+    let newPassword = vars.get("$local.value");
+    let policyMessages = tools.validatePasswordPolicies(newPassword);
+    let messages = [];
+
+    if(newPassword) {
+        if(Object.keys(policyMessages).length > 0) {
+            for(let msg in policyMessages) {
+                messages.push(translate.withArguments(msg, policyMessages[msg]));
+            }
+            result.string(messages.join("\n", messages));
+        }
+    }
+}
diff --git a/entity/Usersettings_entity/entityfields/jpassword/onValidation.js b/entity/Usersettings_entity/entityfields/jpassword/onValidation.js
index 26773ba48b..8186278630 100644
--- a/entity/Usersettings_entity/entityfields/jpassword/onValidation.js
+++ b/entity/Usersettings_entity/entityfields/jpassword/onValidation.js
@@ -1,13 +1,23 @@
 import("system.result");
 import("system.translate");
+import("system.tools");
 import("system.vars");
 
 
 let newPassword = vars.get("$local.value");
 let currentPassword = vars.get("$field.currentPassword");
+let policyMessages = tools.validatePasswordPolicies(newPassword);
+let messages = [];
 
 if(newPassword) {
     if(newPassword === currentPassword) {
         result.string(translate.text("New password must not be the same as the current password"));
     }
+    
+    if(Object.keys(policyMessages).length > 0) {
+        for(let msg in policyMessages) {
+            messages.push(translate.withArguments(msg, policyMessages[msg]));
+        }
+        result.string(messages.join("\n", messages));
+    }
 }
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index 19d06a930f..6c1dddac6a 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -6893,6 +6893,24 @@
     <entry>
       <key>Workflow Model</key>
     </entry>
+    <entry>
+      <key>Password must contain special characters</key>
+    </entry>
+    <entry>
+      <key>Password must contain numbers</key>
+    </entry>
+    <entry>
+      <key>Password must contain letters</key>
+    </entry>
+    <entry>
+      <key>Password must contain spaces</key>
+    </entry>
+    <entry>
+      <key>Password must be at least %0 characters</key>
+    </entry>
+    <entry>
+      <key>The use of any of your previous %0 passwords is prohibited</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 4e124f18e5..c5cf76e009 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -8833,6 +8833,30 @@ Bitte Datumseingabe prüfen</value>
     <entry>
       <key>Workflow Model</key>
     </entry>
+    <entry>
+      <key>The use of any of your previous %0 passwords is prohibited</key>
+      <value>Die Verwendung eines Ihrer vorherigen %0 Passwörter ist untersagt</value>
+    </entry>
+    <entry>
+      <key>Password must be at least %0 characters</key>
+      <value>Passwort muss aus mindestens %0 Zeichen bestehen</value>
+    </entry>
+    <entry>
+      <key>Password must contain letters</key>
+      <value>Passwort muss Buchstaben enhalten</value>
+    </entry>
+    <entry>
+      <key>Password must contain numbers</key>
+      <value>Passwort muss Zahlen enhalten</value>
+    </entry>
+    <entry>
+      <key>Password must contain spaces</key>
+      <value>Passwort muss Leerzeichen enhalten</value>
+    </entry>
+    <entry>
+      <key>Password must contain special characters</key>
+      <value>Passwort muss Sonderzeichen enhalten</value>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index 8beaf1c843..6ba7f62f93 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -6959,6 +6959,24 @@
     <entry>
       <key>Workflow Model</key>
     </entry>
+    <entry>
+      <key>Password must contain special characters</key>
+    </entry>
+    <entry>
+      <key>Password must contain numbers</key>
+    </entry>
+    <entry>
+      <key>Password must contain letters</key>
+    </entry>
+    <entry>
+      <key>Password must contain spaces</key>
+    </entry>
+    <entry>
+      <key>Password must be at least %0 characters</key>
+    </entry>
+    <entry>
+      <key>The use of any of your previous %0 passwords is prohibited</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
-- 
GitLab