Author: jleroux
Date: Mon May  9 18:53:40 2016
New Revision: 1743025

URL: http://svn.apache.org/viewvc?rev=1743025&view=rev
Log:
A patch from Amardeep Singh Jhajj for "New password set in forgot password 
workflow not works sometimes and gives error" 
https://issues.apache.org/jira/browse/OFBIZ-7058

Sometimes, on clicking the reset password link from "New password sent" email 
we get a reset password page and on saving the new password we get following 
error. 
[java] org.apache.shiro.crypto.CryptoException: Unable to execute 'doFinal' 
with cipher instance [javax.crypto.Cipher@3ea85a47].
     [java]     at 
org.apache.shiro.crypto.JcaCipherService.crypt(JcaCipherService.java:462) 
~[shiro-core-1.2.3.jar:1.2.3]
     [java]     at 
org.apache.shiro.crypto.JcaCipherService.crypt(JcaCipherService.java:445) 
~[shiro-core-1.2.3.jar:1.2.3]
     [java]     at 
org.apache.shiro.crypto.JcaCipherService.decrypt(JcaCipherService.java:390) 
~[shiro-core-1.2.3.jar:1.2.3]
     [java]     at 
org.apache.shiro.crypto.JcaCipherService.decrypt(JcaCipherService.java:382) 
~[shiro-core-1.2.3.jar:1.2.3]
     [java]     at 
org.ofbiz.entity.util.EntityCrypto$ShiroStorageHandler.decryptValue(EntityCrypto.java:282)
 ~[ofbiz-entity.jar:?]
     [java]     at 
org.ofbiz.entity.util.EntityCrypto.doDecrypt(EntityCrypto.java:147) 
~[ofbiz-entity.jar:?]
     [java]     at 
org.ofbiz.entity.util.EntityCrypto.decrypt(EntityCrypto.java:126) 
~[ofbiz-entity.jar:?]
     [java]     at 
org.ofbiz.webapp.control.LoginWorker.login(LoginWorker.java:389) 
~[ofbiz-webapp.jar:?]



I found that sometimes encrypted password string (Base64 String created from 
EntityCrypto's encrypt method) contain "+".
So on clicking the reset password link from email we get a reset password page 
and on saving the new password we get this error. The reason is "+" is 
converted to " " 
after url decoding. For example: Below URL having encrypted token with "+"

https://localhost:8443/partymgr/control/passwordChange?USERNAME=DemoUser&password=CcXuJ3vDfba0J7A8xO+X5A==&forgotPwdFlag=true&tenantId=

We can encrypt the token using URL encoder so that it is taken as it is in URL 
decoding.

Modified:
    
ofbiz/trunk/applications/securityext/src/org/ofbiz/securityext/login/LoginEvents.java

Modified: 
ofbiz/trunk/applications/securityext/src/org/ofbiz/securityext/login/LoginEvents.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/securityext/src/org/ofbiz/securityext/login/LoginEvents.java?rev=1743025&r1=1743024&r2=1743025&view=diff
==============================================================================
--- 
ofbiz/trunk/applications/securityext/src/org/ofbiz/securityext/login/LoginEvents.java
 (original)
+++ 
ofbiz/trunk/applications/securityext/src/org/ofbiz/securityext/login/LoginEvents.java
 Mon May  9 18:53:40 2016
@@ -19,6 +19,8 @@
 
 package org.ofbiz.securityext.login;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -259,12 +261,19 @@ public class LoginEvents {
             } else {
                 passwordToSend = 
supposedUserLogin.getString("currentPassword");
             }
+            /* Its a Base64 string, it can contain + and this + will be 
converted to space after decoding the url.
+               For example: passwordToSend "DGb1s2wgUQmwOBK9FK+fvQ==" will be 
converted to "DGb1s2wgUQmwOBK9FK fvQ=="
+               So to fix it, done Url encoding of passwordToSend.
+            */
+            passwordToSend = URLEncoder.encode(passwordToSend, "UTF-8");
         } catch (GenericEntityException e) {
             Debug.logWarning(e, "", module);
             Map<String, String> messageMap = UtilMisc.toMap("errorMessage", 
e.toString());
             errMsg = UtilProperties.getMessage(resource, 
"loginevents.error_accessing_password", messageMap, 
UtilHttp.getLocale(request));
             request.setAttribute("_ERROR_MESSAGE_", errMsg);
             return "error";
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
         }
 
         StringBuilder emails = new StringBuilder();


Reply via email to