FR [2893090] - Implement remember me
https://sourceforge.net/tracker/?func=detail&atid=955896&aid=2893090&group_id=176962 Implemented sysconfig keys to control the feature - it can be configured now to allow saving User/Password/None for zk or swing
This commit is contained in:
parent
b32c97c23d
commit
b93ee106b0
|
@ -55,7 +55,7 @@ public class MSystem extends X_AD_System
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 5528932721084369075L;
|
||||
private static final long serialVersionUID = 8639311032004561198L;
|
||||
|
||||
/**
|
||||
* Load System Record
|
||||
|
@ -461,6 +461,37 @@ public class MSystem extends X_AD_System
|
|||
*/
|
||||
} // info
|
||||
|
||||
/*
|
||||
* Allow remember me feature
|
||||
* ZK_LOGIN_ALLOW_REMEMBER_ME and SWING_ALLOW_REMEMBER_ME parameter allow the next values
|
||||
* U - Allow remember the username (default for zk)
|
||||
* P - Allow remember the username and password (default for swing)
|
||||
* N - None
|
||||
*
|
||||
* @return boolean representing if remember me feature is allowed
|
||||
*/
|
||||
private static final String SYSTEM_ALLOW_REMEMBER_USER = "U";
|
||||
private static final String SYSTEM_ALLOW_REMEMBER_PASSWORD = "P";
|
||||
|
||||
public static boolean isZKRememberUserAllowed() {
|
||||
String ca = MSysConfig.getValue("ZK_LOGIN_ALLOW_REMEMBER_ME", SYSTEM_ALLOW_REMEMBER_USER);
|
||||
return (ca.equalsIgnoreCase(SYSTEM_ALLOW_REMEMBER_USER) || ca.equalsIgnoreCase(SYSTEM_ALLOW_REMEMBER_PASSWORD));
|
||||
}
|
||||
|
||||
public static boolean isZKRememberPasswordAllowed() {
|
||||
String ca = MSysConfig.getValue("ZK_LOGIN_ALLOW_REMEMBER_ME", SYSTEM_ALLOW_REMEMBER_USER);
|
||||
return (ca.equalsIgnoreCase(SYSTEM_ALLOW_REMEMBER_PASSWORD));
|
||||
}
|
||||
|
||||
public static boolean isSwingRememberUserAllowed() {
|
||||
String ca = MSysConfig.getValue("SWING_LOGIN_ALLOW_REMEMBER_ME", SYSTEM_ALLOW_REMEMBER_PASSWORD);
|
||||
return (ca.equalsIgnoreCase(SYSTEM_ALLOW_REMEMBER_USER) || ca.equalsIgnoreCase(SYSTEM_ALLOW_REMEMBER_PASSWORD));
|
||||
}
|
||||
|
||||
public static boolean isSwingRememberPasswordAllowed() {
|
||||
String ca = MSysConfig.getValue("SWING_LOGIN_ALLOW_REMEMBER_ME", SYSTEM_ALLOW_REMEMBER_PASSWORD);
|
||||
return (ca.equalsIgnoreCase(SYSTEM_ALLOW_REMEMBER_PASSWORD));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test
|
||||
|
|
|
@ -318,8 +318,11 @@ public class Login
|
|||
//
|
||||
if (Ini.isClient())
|
||||
{
|
||||
Ini.setProperty(Ini.P_UID, app_user);
|
||||
if (Ini.isPropertyBool(Ini.P_STORE_PWD))
|
||||
if (MSystem.isSwingRememberUserAllowed())
|
||||
Ini.setProperty(Ini.P_UID, app_user);
|
||||
else
|
||||
Ini.setProperty(Ini.P_UID, "");
|
||||
if (Ini.isPropertyBool(Ini.P_STORE_PWD) && MSystem.isSwingRememberPasswordAllowed())
|
||||
Ini.setProperty(Ini.P_PWD, app_pwd);
|
||||
|
||||
m_connectionProfile = rs.getString(4); // User Based
|
||||
|
|
|
@ -53,6 +53,7 @@ import org.compiere.db.CConnection;
|
|||
import org.compiere.grid.ed.VDate;
|
||||
import org.compiere.minigrid.MiniTable;
|
||||
import org.compiere.model.MRole;
|
||||
import org.compiere.model.MSystem;
|
||||
import org.compiere.model.MUser;
|
||||
import org.compiere.print.CPrinter;
|
||||
import org.compiere.swing.CButton;
|
||||
|
@ -257,15 +258,18 @@ public final class Preference extends CDialog
|
|||
customizePane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
|
||||
|
||||
Border insetBorder = BorderFactory.createEmptyBorder(2, 2, 2, 0);
|
||||
CPanel loginPanel = new CPanel();
|
||||
loginPanel.setBorder(BorderFactory.createTitledBorder(Msg.getMsg(Env.getCtx(), "Login")));
|
||||
loginPanel.setLayout(new GridLayout(1, 2));
|
||||
autoLogin.setBorder(insetBorder);
|
||||
storePassword.setBorder(insetBorder);
|
||||
loginPanel.add(autoLogin);
|
||||
loginPanel.add(storePassword);
|
||||
customizePane.add(loginPanel, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0
|
||||
,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(2, 0, 2, 0), 0, 0));
|
||||
if (MSystem.isSwingRememberPasswordAllowed()) {
|
||||
CPanel loginPanel = new CPanel();
|
||||
loginPanel.setBorder(BorderFactory.createTitledBorder(Msg.getMsg(Env.getCtx(), "Login")));
|
||||
loginPanel.setLayout(new GridLayout(1, 2));
|
||||
autoLogin.setBorder(insetBorder);
|
||||
storePassword.setBorder(insetBorder);
|
||||
loginPanel.add(autoLogin);
|
||||
loginPanel.add(storePassword);
|
||||
|
||||
customizePane.add(loginPanel, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0
|
||||
,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(2, 0, 2, 0), 0, 0));
|
||||
}
|
||||
|
||||
CPanel windowPanel = new CPanel();
|
||||
windowPanel.setBorder(BorderFactory.createTitledBorder(Msg.getMsg(Env.getCtx(), "Window")));
|
||||
|
@ -480,10 +484,15 @@ public final class Preference extends CDialog
|
|||
logMigrationScript.setEnabled(false);
|
||||
}
|
||||
}
|
||||
// AutoLogin
|
||||
autoLogin.setSelected(Ini.isPropertyBool(Ini.P_A_LOGIN));
|
||||
// Save Password
|
||||
storePassword.setSelected(Ini.isPropertyBool(Ini.P_STORE_PWD));
|
||||
if (MSystem.isSwingRememberPasswordAllowed()) {
|
||||
// AutoLogin
|
||||
autoLogin.setSelected(Ini.isPropertyBool(Ini.P_A_LOGIN));
|
||||
// Save Password
|
||||
storePassword.setSelected(Ini.isPropertyBool(Ini.P_STORE_PWD));
|
||||
} else {
|
||||
autoLogin.setSelected(false);
|
||||
storePassword.setSelected(false);
|
||||
}
|
||||
// Show Acct Tab
|
||||
if (MRole.getDefault().isShowAcct())
|
||||
showAcct.setSelected(Ini.isPropertyBool(Ini.P_SHOW_ACCT));
|
||||
|
@ -566,10 +575,15 @@ public final class Preference extends CDialog
|
|||
Ini.setProperty(Ini.P_ADEMPIERESYS, adempiereSys.isSelected());
|
||||
// LogMigrationScript
|
||||
Ini.setProperty(Ini.P_LOGMIGRATIONSCRIPT, logMigrationScript.isSelected());
|
||||
// AutoLogin
|
||||
Ini.setProperty(Ini.P_A_LOGIN, (autoLogin.isSelected()));
|
||||
// Save Password
|
||||
Ini.setProperty(Ini.P_STORE_PWD, (storePassword.isSelected()));
|
||||
if (MSystem.isSwingRememberPasswordAllowed()) {
|
||||
// AutoLogin
|
||||
Ini.setProperty(Ini.P_A_LOGIN, (autoLogin.isSelected()));
|
||||
// Save Password
|
||||
Ini.setProperty(Ini.P_STORE_PWD, (storePassword.isSelected()));
|
||||
} else {
|
||||
Ini.setProperty(Ini.P_A_LOGIN, false);
|
||||
Ini.setProperty(Ini.P_STORE_PWD, false);
|
||||
}
|
||||
// Show Acct Tab
|
||||
Ini.setProperty(Ini.P_SHOW_ACCT, (showAcct.isSelected()));
|
||||
Env.setContext(Env.getCtx(), "#ShowAcct", (showAcct.isSelected()));
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
-- Dec 14, 2009 6:16:10 PM COT
|
||||
-- FR2893090_Implement remember me
|
||||
INSERT INTO AD_SysConfig (AD_Client_ID,AD_Org_ID,AD_SysConfig_ID,ConfigurationLevel,Created,CreatedBy,Description,EntityType,IsActive,Name,Updated,UpdatedBy,Value) VALUES (0,0,50037,'S',TO_DATE('2009-12-14 18:16:10','YYYY-MM-DD HH24:MI:SS'),100,'Allow remember me on zkwebui - allowed values [U]ser / [P]assword / [N]one','D','Y','ZK_LOGIN_ALLOW_REMEMBER_ME',TO_DATE('2009-12-14 18:16:10','YYYY-MM-DD HH24:MI:SS'),100,'U')
|
||||
;
|
||||
|
||||
-- Dec 14, 2009 6:16:24 PM COT
|
||||
INSERT INTO AD_SysConfig (AD_Client_ID,AD_Org_ID,AD_SysConfig_ID,ConfigurationLevel,Created,CreatedBy,Description,EntityType,IsActive,Name,Updated,UpdatedBy,Value) VALUES (0,0,50038,'S',TO_DATE('2009-12-14 18:16:23','YYYY-MM-DD HH24:MI:SS'),100,'Allow remember me on swing - allowed values [U]ser / [P]assword / [N]one','D','Y','SWING_LOGIN_ALLOW_REMEMBER_ME',TO_DATE('2009-12-14 18:16:23','YYYY-MM-DD HH24:MI:SS'),100,'P')
|
||||
;
|
||||
|
||||
-- Dec 14, 2009 8:32:30 PM COT
|
||||
INSERT INTO AD_Message (AD_Client_ID,AD_Message_ID,AD_Org_ID,Created,CreatedBy,EntityType,IsActive,MsgText,MsgType,Updated,UpdatedBy,Value) VALUES (0,53091,0,TO_DATE('2009-12-14 20:32:29','YYYY-MM-DD HH24:MI:SS'),100,'D','Y','Remember Me','I',TO_DATE('2009-12-14 20:32:29','YYYY-MM-DD HH24:MI:SS'),100,'RememberMe')
|
||||
;
|
||||
|
||||
-- Dec 14, 2009 8:32:30 PM COT
|
||||
INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy) 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 FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=53091 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)
|
||||
;
|
||||
|
||||
-- Dec 14, 2009 8:32:51 PM COT
|
||||
UPDATE AD_Message_Trl SET IsTranslated='Y',MsgText='Recordar mis datos',Updated=TO_DATE('2009-12-14 20:32:51','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Message_ID=53091 AND AD_Language LIKE 'es_%'
|
||||
;
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
-- Dec 14, 2009 6:16:10 PM COT
|
||||
-- FR2893090_Implement remember me
|
||||
INSERT INTO AD_SysConfig (AD_Client_ID,AD_Org_ID,AD_SysConfig_ID,ConfigurationLevel,Created,CreatedBy,Description,EntityType,IsActive,Name,Updated,UpdatedBy,Value) VALUES (0,0,50037,'S',TO_TIMESTAMP('2009-12-14 18:16:10','YYYY-MM-DD HH24:MI:SS'),100,'Allow remember me on zkwebui - allowed values [U]ser / [P]assword / [N]one','D','Y','ZK_LOGIN_ALLOW_REMEMBER_ME',TO_TIMESTAMP('2009-12-14 18:16:10','YYYY-MM-DD HH24:MI:SS'),100,'U')
|
||||
;
|
||||
|
||||
-- Dec 14, 2009 6:16:24 PM COT
|
||||
INSERT INTO AD_SysConfig (AD_Client_ID,AD_Org_ID,AD_SysConfig_ID,ConfigurationLevel,Created,CreatedBy,Description,EntityType,IsActive,Name,Updated,UpdatedBy,Value) VALUES (0,0,50038,'S',TO_TIMESTAMP('2009-12-14 18:16:23','YYYY-MM-DD HH24:MI:SS'),100,'Allow remember me on swing - allowed values [U]ser / [P]assword / [N]one','D','Y','SWING_LOGIN_ALLOW_REMEMBER_ME',TO_TIMESTAMP('2009-12-14 18:16:23','YYYY-MM-DD HH24:MI:SS'),100,'P')
|
||||
;
|
||||
|
||||
-- Dec 14, 2009 8:32:30 PM COT
|
||||
INSERT INTO AD_Message (AD_Client_ID,AD_Message_ID,AD_Org_ID,Created,CreatedBy,EntityType,IsActive,MsgText,MsgType,Updated,UpdatedBy,Value) VALUES (0,53091,0,TO_TIMESTAMP('2009-12-14 20:32:29','YYYY-MM-DD HH24:MI:SS'),100,'D','Y','Remember Me','I',TO_TIMESTAMP('2009-12-14 20:32:29','YYYY-MM-DD HH24:MI:SS'),100,'RememberMe')
|
||||
;
|
||||
|
||||
-- Dec 14, 2009 8:32:30 PM COT
|
||||
INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy) 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 FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=53091 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)
|
||||
;
|
||||
|
||||
-- Dec 14, 2009 8:32:51 PM COT
|
||||
UPDATE AD_Message_Trl SET IsTranslated='Y',MsgText='Recordar mis datos',Updated=TO_TIMESTAMP('2009-12-14 20:32:51','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Message_ID=53091 AND AD_Language LIKE 'es_%'
|
||||
;
|
||||
|
|
@ -37,6 +37,7 @@ import org.adempiere.webui.util.UserPreference;
|
|||
import org.compiere.model.MRole;
|
||||
import org.compiere.model.MSession;
|
||||
import org.compiere.model.MSysConfig;
|
||||
import org.compiere.model.MSystem;
|
||||
import org.compiere.model.MUser;
|
||||
import org.compiere.util.CLogger;
|
||||
import org.compiere.util.Env;
|
||||
|
@ -244,7 +245,7 @@ public class AdempiereWebUI extends Window implements EventListener, IWebClient
|
|||
currSess.setAttribute("execution.carryover", eco);
|
||||
}
|
||||
|
||||
if ("Y".equalsIgnoreCase(Env.getContext(ctx, BrowserToken.REMEMBER_ME)))
|
||||
if ("Y".equalsIgnoreCase(Env.getContext(ctx, BrowserToken.REMEMBER_ME)) && MSystem.isZKRememberUserAllowed())
|
||||
{
|
||||
MUser user = MUser.get(ctx);
|
||||
BrowserToken.save(mSession, user);
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
package org.adempiere.webui.panel;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Locale;
|
||||
import java.util.Properties;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.logging.Level;
|
||||
|
@ -45,6 +46,7 @@ import org.adempiere.webui.util.UserPreference;
|
|||
import org.adempiere.webui.window.LoginWindow;
|
||||
import org.compiere.Adempiere;
|
||||
import org.compiere.model.MSession;
|
||||
import org.compiere.model.MSystem;
|
||||
import org.compiere.model.MUser;
|
||||
import org.compiere.util.CLogger;
|
||||
import org.compiere.util.DB;
|
||||
|
@ -178,17 +180,19 @@ public class LoginPanel extends Window implements EventListener
|
|||
tr.appendChild(td);
|
||||
td.appendChild(lstLanguage);
|
||||
|
||||
tr = new Tr();
|
||||
tr.setId("rowRememberMe");
|
||||
table.appendChild(tr);
|
||||
td = new Td();
|
||||
tr.appendChild(td);
|
||||
td.setSclass(ITheme.LOGIN_LABEL_CLASS);
|
||||
td.appendChild(new Label(""));
|
||||
td = new Td();
|
||||
td.setSclass(ITheme.LOGIN_FIELD_CLASS);
|
||||
tr.appendChild(td);
|
||||
td.appendChild(chkRememberMe);
|
||||
if (MSystem.isZKRememberUserAllowed()) {
|
||||
tr = new Tr();
|
||||
tr.setId("rowRememberMe");
|
||||
table.appendChild(tr);
|
||||
td = new Td();
|
||||
tr.appendChild(td);
|
||||
td.setSclass(ITheme.LOGIN_LABEL_CLASS);
|
||||
td.appendChild(new Label(""));
|
||||
td = new Td();
|
||||
td.setSclass(ITheme.LOGIN_FIELD_CLASS);
|
||||
tr.appendChild(td);
|
||||
td.appendChild(chkRememberMe);
|
||||
}
|
||||
|
||||
div = new Div();
|
||||
div.setSclass(ITheme.LOGIN_BOX_FOOTER_CLASS);
|
||||
|
@ -218,12 +222,16 @@ public class LoginPanel extends Window implements EventListener
|
|||
String token = data[1];
|
||||
if (BrowserToken.validateToken(session, user, token))
|
||||
{
|
||||
txtUserId.setValue(user.getName());
|
||||
onUserIdChange();
|
||||
txtPassword.setValue(token);
|
||||
txtPassword.setAttribute("user.token.hash", token);
|
||||
txtPassword.setAttribute("user.token.sid", AD_Session_ID);
|
||||
chkRememberMe.setChecked(true);
|
||||
if (MSystem.isZKRememberUserAllowed()) {
|
||||
txtUserId.setValue(user.getName());
|
||||
onUserIdChange();
|
||||
chkRememberMe.setChecked(true);
|
||||
}
|
||||
if (MSystem.isZKRememberPasswordAllowed()) {
|
||||
txtPassword.setValue(token);
|
||||
txtPassword.setAttribute("user.token.hash", token);
|
||||
txtPassword.setAttribute("user.token.sid", AD_Session_ID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -278,6 +286,8 @@ public class LoginPanel extends Window implements EventListener
|
|||
lstLanguage.appendItem(langName, language.getAD_Language());
|
||||
}
|
||||
|
||||
chkRememberMe = new Checkbox(Msg.getMsg(Language.getBaseAD_Language(), "RememberMe"));
|
||||
|
||||
//set base language
|
||||
String baseLanguage = Language.getBaseLanguage().getName();
|
||||
for(int i = 0; i < lstLanguage.getItemCount(); i++)
|
||||
|
@ -290,9 +300,6 @@ public class LoginPanel extends Window implements EventListener
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: localization
|
||||
chkRememberMe = new Checkbox("Remember Me");
|
||||
}
|
||||
|
||||
public void onEvent(Event event)
|
||||
|
@ -349,10 +356,15 @@ public class LoginPanel extends Window implements EventListener
|
|||
{
|
||||
Language language = findLanguage(langName);
|
||||
|
||||
res = ResourceBundle.getBundle(RESOURCE, language.getLocale());
|
||||
// Locales
|
||||
Locale loc = language.getLocale();
|
||||
Locale.setDefault(loc);
|
||||
res = ResourceBundle.getBundle(RESOURCE, loc);
|
||||
|
||||
lblUserId.setValue(res.getString("User"));
|
||||
lblPassword.setValue(res.getString("Password"));
|
||||
lblLanguage.setValue(res.getString("Language"));
|
||||
chkRememberMe.setLabel(Msg.getMsg(language, "RememberMe"));
|
||||
}
|
||||
|
||||
private Language findLanguage(String langName) {
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.logging.Level;
|
|||
|
||||
import org.compiere.Adempiere;
|
||||
import org.compiere.model.MSession;
|
||||
import org.compiere.model.MSystem;
|
||||
import org.compiere.model.MUser;
|
||||
import org.compiere.util.CLogger;
|
||||
import org.zkoss.zk.au.out.AuScript;
|
||||
|
@ -126,7 +127,11 @@ public final class BrowserToken {
|
|||
BASE64Encoder encoder = new BASE64Encoder();
|
||||
digest.reset();
|
||||
digest.update(session.getWebSession().getBytes("UTF-8"));
|
||||
String password = user.getPassword();
|
||||
String password = null;
|
||||
if (MSystem.isZKRememberPasswordAllowed())
|
||||
password = user.getPassword();
|
||||
else
|
||||
password = new String("");
|
||||
byte[] input = digest.digest(password.getBytes("UTF-8"));
|
||||
String hash = encoder.encode(input);
|
||||
hash = URLEncoder.encode(hash, "UTF-8");
|
||||
|
|
Loading…
Reference in New Issue