From 2bbbfe7329fcdf521f579b88497696a42c55ff3a Mon Sep 17 00:00:00 2001
From: Rafael Queralta <rafaelcuba81@gmail.com>
Date: Wed, 20 Jan 2021 17:49:19 -0500
Subject: [PATCH] Fixed BUG-45583: If the user password expired, change it is
 required to complete the Terminal Authentication process. Change Password
 popup is shown to force it

---
 .../retail/posterminal/LoginUtilsServlet.java |  6 ++
 .../js/login/model/login-model.js             | 85 +++++++++++++------
 2 files changed, 67 insertions(+), 24 deletions(-)

diff --git a/src/org/openbravo/retail/posterminal/LoginUtilsServlet.java b/src/org/openbravo/retail/posterminal/LoginUtilsServlet.java
index 64860cacf..c71ff9e4a 100644
--- a/src/org/openbravo/retail/posterminal/LoginUtilsServlet.java
+++ b/src/org/openbravo/retail/posterminal/LoginUtilsServlet.java
@@ -28,6 +28,7 @@ import org.codehaus.jettison.json.JSONObject;
 import org.hibernate.criterion.Restrictions;
 import org.hibernate.query.Query;
 import org.openbravo.authentication.AuthenticationException;
+import org.openbravo.authentication.AuthenticationExpirationPasswordException;
 import org.openbravo.authentication.AuthenticationManager;
 import org.openbravo.base.secureApp.VariablesSecureApp;
 import org.openbravo.client.kernel.RequestContext;
@@ -273,6 +274,11 @@ public class LoginUtilsServlet extends MobileCoreLoginUtilsServlet {
         HttpServletResponse response = RequestContext.get().getResponse();
         userId = authManager.authenticate(request, response);
         terminal = OBDal.getInstance().get(OBPOSApplications.class, terminal.getId());
+      } catch (AuthenticationExpirationPasswordException aep) {
+        JSONObject jsonMsg = new JSONObject();
+        jsonMsg.put("key", "CPExpirationPassword");
+        jsonMsg.put("msg", aep.getMessage());
+        throw new AuthenticationException(jsonMsg.toString());
       } catch (AuthenticationException ae) {
         ConnectionProvider cp = new DalConnectionProvider(false);
         Client systemClient = OBDal.getInstance().get(Client.class, "0");
diff --git a/web/org.openbravo.retail.posterminal/js/login/model/login-model.js b/web/org.openbravo.retail.posterminal/js/login/model/login-model.js
index 05959cb75..2c8b5ea19 100644
--- a/web/org.openbravo.retail.posterminal/js/login/model/login-model.js
+++ b/web/org.openbravo.retail.posterminal/js/login/model/login-model.js
@@ -1920,9 +1920,49 @@
             inResponse.exception ||
             (inResponse.response && inResponse.response.error)
           ) {
-            var msg = inResponse.exception
-              ? OB.I18N.getLabel(inResponse.exception)
-              : inResponse.response.error.message;
+            var msg, jsonMsg;
+            try {
+              jsonMsg = JSON.parse(inResponse.response.error.message);
+              if (
+                !OB.UTIL.isNullOrUndefined(jsonMsg) &&
+                jsonMsg.key === 'CPExpirationPassword'
+              ) {
+                msg = jsonMsg.msg;
+              }
+            } catch (e) {
+              msg = inResponse.exception
+                ? OB.I18N.getLabel(inResponse.exception)
+                : inResponse.response.error.message;
+            }
+
+            var showTerminalAuthPopup = () => {
+              me = this;
+              me.dialog = OB.MobileApp.view.$.confirmationContainer.createComponent(
+                {
+                  kind: 'OB.UI.ModalSelectTerminal',
+                  name: 'modalSelectTerminal',
+                  classes: 'modalSelectTerminal',
+                  callback: callback,
+                  context: me
+                }
+              );
+              me.dialog.show();
+            };
+
+            var showChangePasswordPopup = () => {
+              me = this;
+              me.dialog = OB.MobileApp.view.$.confirmationContainer.createComponent(
+                {
+                  kind: 'OB.UI.ExpirationPassword',
+                  classes:
+                    'obUiTerminal-confirmationContainer-obUiExpirationPassword',
+                  context: me,
+                  callback: showTerminalAuthPopup
+                }
+              );
+              me.dialog.show();
+            };
+
             OB.UTIL.showConfirmation.display(
               'Error',
               msg,
@@ -1931,32 +1971,25 @@
                   label: OB.I18N.getLabel('OBMOBC_LblOk'),
                   isConfirmButton: true,
                   action: function() {
-                    if (OB.UI.ModalSelectTerminal) {
-                      me.dialog = OB.MobileApp.view.$.confirmationContainer.createComponent(
-                        {
-                          kind: 'OB.UI.ModalSelectTerminal',
-                          name: 'modalSelectTerminal',
-                          callback: callback,
-                          context: me
-                        }
-                      );
-                      me.dialog.show();
+                    if (
+                      !OB.UTIL.isNullOrUndefined(jsonMsg) &&
+                      jsonMsg.key === 'CPExpirationPassword'
+                    ) {
+                      showChangePasswordPopup();
+                      return;
+                    } else if (OB.UI.ModalSelectTerminal) {
+                      showTerminalAuthPopup();
                     }
                   }
                 }
               ],
               {
                 onHideFunction: function() {
-                  if (OB.UI.ModalSelectTerminal) {
-                    me.dialog = OB.MobileApp.view.$.confirmationContainer.createComponent(
-                      {
-                        kind: 'OB.UI.ModalSelectTerminal',
-                        name: 'modalSelectTerminal',
-                        callback: callback,
-                        context: me
-                      }
-                    );
-                    me.dialog.show();
+                  if (jsonMsg.key === 'CPExpirationPassword') {
+                    showChangePasswordPopup();
+                    return;
+                  } else if (OB.UI.ModalSelectTerminal) {
+                    showTerminalAuthPopup();
                   }
                 }
               }
@@ -1988,7 +2021,11 @@
                 parsedTerminalData.cacheSessionId +
                 '"'
             );
-            callback();
+            if (OB.MobileApp.model.get('passResetInTermAuth')) {
+              window.location.reload();
+            } else {
+              callback();
+            }
           }
         })
         .error(function() {
-- 
2.25.1

