IDEMPIERE-373 Implement User Locking - fix the default date password change and use translatable message

This commit is contained in:
Elaine Tan 2012-09-05 14:48:14 +08:00
parent 15ef6841da
commit 65d8b478f3
5 changed files with 80 additions and 15 deletions

View File

@ -0,0 +1,31 @@
-- Sep 5, 2012 2:19:04 PM SGT
-- IDEMPIERE-373 Implement User Locking
INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Client_ID,AD_Org_ID,Created) VALUES ('E','User account ''{0}'' is locked, please contact the system administrator',200032,'D','4953cc21-e6db-40c6-bc8c-58f089e4786a','UserAccountLocked','Y',TO_DATE('2012-09-05 14:19:02','YYYY-MM-DD HH24:MI:SS'),100,100,0,0,TO_DATE('2012-09-05 14:19:02','YYYY-MM-DD HH24:MI:SS'))
;
-- Sep 5, 2012 2:19:05 PM SGT
-- IDEMPIERE-373 Implement User Locking
INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200032 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID)
;
-- Sep 5, 2012 2:19:26 PM SGT
-- IDEMPIERE-373 Implement User Locking
INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Client_ID,AD_Org_ID,Created) VALUES ('E','Reached the maximum number of login attempts, user account ''{0}'' is locked',200033,'D','f8a4fc39-5346-4064-8f3a-436fcac03920','ReachedMaxLoginAttempts','Y',TO_DATE('2012-09-05 14:19:25','YYYY-MM-DD HH24:MI:SS'),100,100,0,0,TO_DATE('2012-09-05 14:19:25','YYYY-MM-DD HH24:MI:SS'))
;
-- Sep 5, 2012 2:19:26 PM SGT
-- IDEMPIERE-373 Implement User Locking
INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200033 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID)
;
-- Sep 5, 2012 2:19:44 PM SGT
-- IDEMPIERE-373 Implement User Locking
INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Client_ID,AD_Org_ID,Created) VALUES ('E','Invalid User ID or Password (Login Attempts: {0} / {1})',200034,'D','77c2348b-0910-43aa-a6c0-f3c143a52de4','FailedLoginAttempt','Y',TO_DATE('2012-09-05 14:19:43','YYYY-MM-DD HH24:MI:SS'),100,100,0,0,TO_DATE('2012-09-05 14:19:43','YYYY-MM-DD HH24:MI:SS'))
;
-- Sep 5, 2012 2:19:44 PM SGT
-- IDEMPIERE-373 Implement User Locking
INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200034 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID)
;
SELECT register_migration_script('902_IDEMPIERE-373_User_Locking.sql') FROM dual

View File

@ -0,0 +1,31 @@
-- Sep 5, 2012 2:19:04 PM SGT
-- IDEMPIERE-373 Implement User Locking
INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Client_ID,AD_Org_ID,Created) VALUES ('E','User account ''{0}'' is locked, please contact the system administrator',200032,'D','4953cc21-e6db-40c6-bc8c-58f089e4786a','UserAccountLocked','Y',TO_TIMESTAMP('2012-09-05 14:19:02','YYYY-MM-DD HH24:MI:SS'),100,100,0,0,TO_TIMESTAMP('2012-09-05 14:19:02','YYYY-MM-DD HH24:MI:SS'))
;
-- Sep 5, 2012 2:19:05 PM SGT
-- IDEMPIERE-373 Implement User Locking
INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200032 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID)
;
-- Sep 5, 2012 2:19:26 PM SGT
-- IDEMPIERE-373 Implement User Locking
INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Client_ID,AD_Org_ID,Created) VALUES ('E','Reached the maximum number of login attempts, user account ''{0}'' is locked',200033,'D','f8a4fc39-5346-4064-8f3a-436fcac03920','ReachedMaxLoginAttempts','Y',TO_TIMESTAMP('2012-09-05 14:19:25','YYYY-MM-DD HH24:MI:SS'),100,100,0,0,TO_TIMESTAMP('2012-09-05 14:19:25','YYYY-MM-DD HH24:MI:SS'))
;
-- Sep 5, 2012 2:19:26 PM SGT
-- IDEMPIERE-373 Implement User Locking
INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200033 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID)
;
-- Sep 5, 2012 2:19:44 PM SGT
-- IDEMPIERE-373 Implement User Locking
INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Client_ID,AD_Org_ID,Created) VALUES ('E','Invalid User ID or Password (Login Attempts: {0} / {1})',200034,'D','77c2348b-0910-43aa-a6c0-f3c143a52de4','FailedLoginAttempt','Y',TO_TIMESTAMP('2012-09-05 14:19:43','YYYY-MM-DD HH24:MI:SS'),100,100,0,0,TO_TIMESTAMP('2012-09-05 14:19:43','YYYY-MM-DD HH24:MI:SS'))
;
-- Sep 5, 2012 2:19:44 PM SGT
-- IDEMPIERE-373 Implement User Locking
INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200034 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID)
;
SELECT register_migration_script('902_IDEMPIERE-373_User_Locking.sql') FROM dual

View File

@ -1381,7 +1381,7 @@ public class Login
if (days > MAX_INACTIVE_PERIOD_DAY) if (days > MAX_INACTIVE_PERIOD_DAY)
{ {
user.setIsLocked(true); user.setIsLocked(true);
user.setDateAccountLocked(new Timestamp(new Date().getTime())); user.setDateAccountLocked(new Timestamp(now));
if (!user.save()) if (!user.save())
log.severe("Failed to lock user account"); log.severe("Failed to lock user account");
} }
@ -1415,7 +1415,7 @@ public class Login
if (MAX_PASSWORD_AGE > 0 && !user.isNoPasswordReset()) if (MAX_PASSWORD_AGE > 0 && !user.isNoPasswordReset())
{ {
if (user.getDatePasswordChanged() == null) if (user.getDatePasswordChanged() == null)
user.setDatePasswordChanged(user.getUpdated()); user.setDatePasswordChanged(new Timestamp(now));
long days = (now - user.getDatePasswordChanged().getTime()) / (1000 * 60 * 60 * 24); long days = (now - user.getDatePasswordChanged().getTime()) / (1000 * 60 * 60 * 24);
if (days > MAX_PASSWORD_AGE) if (days > MAX_PASSWORD_AGE)
@ -1475,7 +1475,7 @@ public class Login
for (MUser user : users) for (MUser user : users)
{ {
user.setFailedLoginCount(0); user.setFailedLoginCount(0);
user.setDateLastLogin(new Timestamp(new Date().getTime())); user.setDateLastLogin(new Timestamp(now));
if (!user.save()) if (!user.save())
log.severe("Failed to update user record with date last login"); log.severe("Failed to update user record with date last login");
} }
@ -1486,7 +1486,8 @@ public class Login
{ {
if (user.isLocked()) if (user.isLocked())
{ {
loginErrMsg = "User account '" + app_user + "' is locked, please contact the system administrator"; // User account '{0}' is locked, please contact the system administrator
loginErrMsg = Msg.getMsg(m_ctx, "UserAccountLocked", new Object[] {app_user});
break; break;
} }
@ -1496,12 +1497,14 @@ public class Login
int MAX_LOGIN_ATTEMPT = MSysConfig.getIntValue(MSysConfig.USER_LOCKING_MAX_LOGIN_ATTEMPT, 0); int MAX_LOGIN_ATTEMPT = MSysConfig.getIntValue(MSysConfig.USER_LOCKING_MAX_LOGIN_ATTEMPT, 0);
if (MAX_LOGIN_ATTEMPT > 0 && count >= MAX_LOGIN_ATTEMPT) if (MAX_LOGIN_ATTEMPT > 0 && count >= MAX_LOGIN_ATTEMPT)
{ {
loginErrMsg = "Reached the maximum number of login attempts, user account '" + app_user + "' is locked"; // Reached the maximum number of login attempts, user account '{0}' is locked
loginErrMsg = Msg.getMsg(m_ctx, "ReachedMaxLoginAttempts", new Object[] {app_user});
reachMaxAttempt = true; reachMaxAttempt = true;
} }
else if (MAX_LOGIN_ATTEMPT > 0) else if (MAX_LOGIN_ATTEMPT > 0)
{ {
loginErrMsg = "Invalid User ID or Password (Login Attempts: " + count + " / " + MAX_LOGIN_ATTEMPT + ")"; // Invalid User ID or Password (Login Attempts: {0} / {1})
loginErrMsg = Msg.getMsg(m_ctx, "FailedLoginAttempt", new Object[] {count, MAX_LOGIN_ATTEMPT});
reachMaxAttempt = false; reachMaxAttempt = false;
} }
else else
@ -1511,7 +1514,7 @@ public class Login
user.setFailedLoginCount(count); user.setFailedLoginCount(count);
user.setIsLocked(reachMaxAttempt); user.setIsLocked(reachMaxAttempt);
user.setDateAccountLocked(user.isLocked() ? new Timestamp(new Date().getTime()) : null); user.setDateAccountLocked(user.isLocked() ? new Timestamp(now) : null);
if (!user.save()) if (!user.save())
log.severe("Failed to update user record with increase failed login count"); log.severe("Failed to update user record with increase failed login count");
} }

View File

@ -626,26 +626,26 @@ public final class ALogin extends CDialog
if (Util.isEmpty(oldPassword)) if (Util.isEmpty(oldPassword))
{ {
statusBar.setStatusLine(Msg.getMsg(m_ctx, "@OldPasswordMandatory@"), true); statusBar.setStatusLine(Msg.getMsg(m_ctx, "OldPasswordMandatory"), true);
return; return;
} }
if (Util.isEmpty(retypeNewPassword)) if (Util.isEmpty(retypeNewPassword))
{ {
statusBar.setStatusLine(Msg.getMsg(m_ctx, "@NewPasswordConfirmMandatory@"), true); statusBar.setStatusLine(Msg.getMsg(m_ctx, "NewPasswordConfirmMandatory"), true);
return; return;
} }
if (!newPassword.equals(retypeNewPassword)) if (!newPassword.equals(retypeNewPassword))
{ {
statusBar.setStatusLine(Msg.getMsg(m_ctx, "@PasswordNotMatch@"), true); statusBar.setStatusLine(Msg.getMsg(m_ctx, "PasswordNotMatch"), true);
return; return;
} }
String m_userPassword = new String(m_pwd); String m_userPassword = new String(m_pwd);
if (!oldPassword.equals(m_userPassword)) if (!oldPassword.equals(m_userPassword))
{ {
statusBar.setStatusLine(Msg.getMsg(m_ctx, "@OldPasswordNoMatch@"), true); statusBar.setStatusLine(Msg.getMsg(m_ctx, "OldPasswordNoMatch"), true);
return; return;
} }

View File

@ -200,16 +200,16 @@ public class ChangePasswordPanel extends Window implements EventListener<Event>
String retypeNewPassword = txtRetypeNewPassword.getValue(); String retypeNewPassword = txtRetypeNewPassword.getValue();
if (Util.isEmpty(oldPassword)) if (Util.isEmpty(oldPassword))
throw new IllegalArgumentException(Msg.getMsg(m_ctx, "@OldPasswordMandatory@")); throw new IllegalArgumentException(Msg.getMsg(m_ctx, "OldPasswordMandatory"));
if (Util.isEmpty(retypeNewPassword)) if (Util.isEmpty(retypeNewPassword))
throw new IllegalArgumentException(Msg.getMsg(m_ctx, "@NewPasswordConfirmMandatory@")); throw new IllegalArgumentException(Msg.getMsg(m_ctx, "NewPasswordConfirmMandatory"));
if (!newPassword.equals(retypeNewPassword)) if (!newPassword.equals(retypeNewPassword))
throw new IllegalArgumentException(Msg.getMsg(m_ctx, "@PasswordNotMatch@")); throw new IllegalArgumentException(Msg.getMsg(m_ctx, "PasswordNotMatch"));
if (!oldPassword.equals(m_userPassword)) if (!oldPassword.equals(m_userPassword))
throw new IllegalArgumentException(Msg.getMsg(m_ctx, "@OldPasswordNoMatch@")); throw new IllegalArgumentException(Msg.getMsg(m_ctx, "OldPasswordNoMatch"));
for (KeyNamePair clientKNPair : m_clientKNPairs) for (KeyNamePair clientKNPair : m_clientKNPairs)
{ {