IDEMPIERE-358 Login- how to make unique and safe

This commit is contained in:
Juliana Corredor 2012-08-13 17:01:42 -05:00
parent 3d8114fd41
commit 85abedd47f
37 changed files with 651 additions and 262 deletions

View File

@ -0,0 +1,19 @@
-- Aug 8, 2012 9:58:31 AM COT
-- IDEMPIERE-358 Login- how to make unique and safe
INSERT INTO AD_SysConfig (AD_SysConfig_ID,EntityType,ConfigurationLevel,Value,Description,AD_SysConfig_UU,Created,Updated,AD_Client_ID,AD_Org_ID,CreatedBy,IsActive,UpdatedBy,Name) VALUES (200014,'D','S','N','Use email for login multitenant, WARNING! Before enabling this please check all your users have email filled','70cb7f9b-9993-4f38-a8df-4ce9840af9cf',TO_DATE('2012-08-08 09:58:29','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2012-08-08 09:58:29','YYYY-MM-DD HH24:MI:SS'),0,0,0,'Y',0,'USE_EMAIL_FOR_LOGIN')
;
-- This is to prevent somebody changing the sysconfig key and disabling access to system roles
update ad_user set email='superuser @ idempiere.com' where name = 'SuperUser';
update ad_user set email='system @ idempiere.com' where name = 'System';
-- delete wrong GardenAdmin record assigning a system role
delete from ad_user_roles where ad_user_id=101 and ad_role_id=50002 and ad_client_id=0;
UPDATE AD_System
SET LastMigrationScriptApplied='871_IDEMPIERE_358.sql'
WHERE LastMigrationScriptApplied<'871_IDEMPIERE_358.sql'
OR LastMigrationScriptApplied IS NULL
;

View File

@ -0,0 +1,18 @@
-- Aug 8, 2012 9:58:31 AM COT
-- IDEMPIERE-358 Login- how to make unique and safe
INSERT INTO AD_SysConfig (AD_SysConfig_ID,EntityType,ConfigurationLevel,Value,Description,AD_SysConfig_UU,Created,Updated,AD_Client_ID,AD_Org_ID,CreatedBy,IsActive,UpdatedBy,Name) VALUES (200014,'D','S','N','Use email for login multitenant, WARNING! Before enabling this please check all your users have email filled','70cb7f9b-9993-4f38-a8df-4ce9840af9cf',TO_TIMESTAMP('2012-08-08 09:58:29','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2012-08-08 09:58:29','YYYY-MM-DD HH24:MI:SS'),0,0,0,'Y',0,'USE_EMAIL_FOR_LOGIN')
;
-- This is to prevent somebody changing the sysconfig key and disabling access to system roles
update ad_user set email='superuser @ idempiere.com' where name = 'SuperUser';
update ad_user set email='system @ idempiere.com' where name = 'System';
-- delete wrong GardenAdmin record assigning a system role
delete from ad_user_roles where ad_user_id=101 and ad_role_id=50002 and ad_client_id=0;
UPDATE AD_System
SET LastMigrationScriptApplied='871_IDEMPIERE_358.sql'
WHERE LastMigrationScriptApplied<'871_IDEMPIERE_358.sql'
OR LastMigrationScriptApplied IS NULL
;

View File

@ -36,6 +36,7 @@ import org.compiere.util.CCache;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.compiere.util.Msg;
import org.compiere.util.Secure;
import org.compiere.util.SecureEngine;
@ -54,7 +55,7 @@ public class MUser extends X_AD_User
/**
*
*/
private static final long serialVersionUID = -5343496366428193731L;
private static final long serialVersionUID = 239972951892250043L;
/**
* Get active Users of BPartner
@ -472,6 +473,8 @@ public class MUser extends X_AD_User
String hash = null;
String salt = null;
boolean valid=false;
hash = getPassword();
salt = getSalt();
@ -482,13 +485,15 @@ public class MUser extends X_AD_User
salt = "0000000000000000";
try {
return SecureEngine.getSHA512Hash(1000, password, Secure.convertHexString(salt)).equals(hash);
valid= SecureEngine.getSHA512Hash(1000, password, Secure.convertHexString(salt)).equals(hash);
} catch (NoSuchAlgorithmException ignored) {
log.log(Level.WARNING, "Password hashing not supported by JVM");
} catch (UnsupportedEncodingException ignored) {
log.log(Level.WARNING, "Password hashing not supported by JVM");
}
return false;
return valid;
}
/**
@ -917,6 +922,23 @@ public class MUser extends X_AD_User
if (newRecord || super.getValue() == null || is_ValueChanged("Value"))
setValue(super.getValue());
boolean email_login = MSysConfig.getBooleanValue("USE_EMAIL_FOR_LOGIN", false);
if (email_login && getPassword() != null && getPassword().length() > 0) {
// email is mandatory for users with password
if (getEMail() == null || getEMail().length() == 0) {
log.saveError("FillMandatory", Msg.getElement(getCtx(), COLUMNNAME_EMail));
return false;
}
// email with password must be unique on the same tenant
int cnt = DB.getSQLValue(get_TrxName(),
"SELECT COUNT(*) FROM AD_User WHERE Password IS NOT NULL AND EMail=? AND AD_Client_ID=? AND AD_User_ID!=?",
getEMail(), getAD_Client_ID(), getAD_User_ID());
if (cnt > 0) {
log.saveError("SaveErrorNotUnique", Msg.getElement(getCtx(), COLUMNNAME_EMail));
return false;
}
}
if (newRecord || is_ValueChanged("Password")) {
// Validate password policies / IDEMPIERE-221
if (get_ValueOld("Salt") == null && get_Value("Salt") != null) { // being hashed
@ -938,6 +960,8 @@ public class MUser extends X_AD_User
return true;
} // beforeSave
/**
* Is Menu Auto Expand - user preference
* Check if the user has a preference, otherwise use the value from current role
@ -952,6 +976,62 @@ public class MUser extends X_AD_User
return isMenuAutoExpand;
}
/**
* Get User that has roles (already authenticated)
* @param ctx context
* @param name name
* @return user or null
*/
public static MUser get(Properties ctx, String name) {
if (name == null || name.length() == 0)
{
s_log.warning ("Invalid Name = " + name);
return null;
}
MUser retValue = null;
int AD_Client_ID = Env.getAD_Client_ID(ctx);
StringBuffer sql = new StringBuffer("SELECT DISTINCT u.AD_User_ID ")
.append("FROM AD_User u")
.append(" INNER JOIN AD_User_Roles ur ON (u.AD_User_ID=ur.AD_User_ID AND ur.IsActive='Y')")
.append(" INNER JOIN AD_Role r ON (ur.AD_Role_ID=r.AD_Role_ID AND r.IsActive='Y') ");
sql.append("WHERE u.Password IS NOT NULL AND ur.AD_Client_ID=? AND "); // #1/2
boolean email_login = MSysConfig.getBooleanValue("USE_EMAIL_FOR_LOGIN", false);
if (email_login)
sql.append("u.EMail=?");
else
sql.append("COALESCE(u.LDAPUser,u.Name)=?");
sql.append(" AND u.IsActive='Y'").append(" AND EXISTS (SELECT * FROM AD_Client c WHERE u.AD_Client_ID=c.AD_Client_ID AND c.IsActive='Y')");
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql.toString(), null);
pstmt.setInt(1, AD_Client_ID);
pstmt.setString (2, name);
rs = pstmt.executeQuery ();
if (rs.next())
{
retValue = new MUser (ctx, rs.getInt(1), null);
if (rs.next())
s_log.warning ("More then one user with Name/Password = " + name);
}
else
s_log.fine("No record");
}
catch (Exception e)
{
s_log.log(Level.SEVERE, sql.toString(), e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
return retValue;
}
/**
* Test
* @param args ignored

View File

@ -22,6 +22,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import java.util.logging.Level;
@ -41,6 +42,7 @@ import org.compiere.model.MTable;
import org.compiere.model.MTree_Base;
import org.compiere.model.MUser;
import org.compiere.model.ModelValidationEngine;
import org.compiere.model.Query;
/**
@ -556,14 +558,14 @@ public class Login
* @param client client information
* @return list of valid Org KeyNodePairs or null if in error
*/
public KeyNamePair[] getOrgs (KeyNamePair client)
public KeyNamePair[] getOrgs (KeyNamePair rol)
{
if (client == null)
throw new IllegalArgumentException("Client missing");
if (Env.getContext(m_ctx,"#AD_Role_ID").length() == 0) // could be number 0
throw new UnsupportedOperationException("Missing Context #AD_Role_ID");
if (rol == null)
throw new IllegalArgumentException("Rol missing");
if (Env.getContext(m_ctx,"#AD_Client_ID").length() == 0) // could be number 0
throw new UnsupportedOperationException("Missing Context #AD_Client_ID");
int AD_Role_ID = Env.getContextAsInt(m_ctx,"#AD_Role_ID");
int AD_Client_ID = Env.getContextAsInt(m_ctx,"#AD_Client_ID");
int AD_User_ID = Env.getContextAsInt(m_ctx, "#AD_User_ID");
// s_log.fine("Client: " + client.toStringX() + ", AD_Role_ID=" + AD_Role_ID);
@ -571,18 +573,21 @@ public class Login
ArrayList<KeyNamePair> list = new ArrayList<KeyNamePair>();
KeyNamePair[] retValue = null;
//
String sql = "SELECT o.AD_Org_ID,o.Name,o.IsSummary " // 1..3
+ "FROM AD_Role r, AD_Client c"
+ " INNER JOIN AD_Org o ON (c.AD_Client_ID=o.AD_Client_ID OR o.AD_Org_ID=0) "
+ "WHERE r.AD_Role_ID=?" // #1
+ " AND c.AD_Client_ID=?" // #2
+ " AND o.IsActive='Y' AND o.IsSummary='N'"
+ " AND (r.IsAccessAllOrgs='Y' "
+ "OR (r.IsUseUserOrgAccess='N' AND o.AD_Org_ID IN (SELECT AD_Org_ID FROM AD_Role_OrgAccess ra "
+ "WHERE ra.AD_Role_ID=r.AD_Role_ID AND ra.IsActive='Y')) "
+ "OR (r.IsUseUserOrgAccess='Y' AND o.AD_Org_ID IN (SELECT AD_Org_ID FROM AD_User_OrgAccess ua "
+ "WHERE ua.AD_User_ID=? AND ua.IsActive='Y'))" // #3
+ ") "
String sql = " SELECT DISTINCT r.UserLevel, r.ConnectionProfile,o.AD_Org_ID,o.Name,o.IsSummary "
+" FROM AD_Org o"
+" INNER JOIN AD_Role_OrgAccess ra ON (ra.AD_Org_ID=o.AD_Org_ID)"
+" INNER JOIN AD_Role r on (ra.AD_Role_ID=r.AD_Role_ID) "
+" INNER JOIN AD_Client c on (ra.AD_Client_ID=c.AD_Client_ID)"
+" WHERE r.AD_Role_ID=?"
+" AND c.AD_Client_ID=?"
+" AND o.IsActive='Y' "
+" AND o.IsSummary='N'"
+" AND (r.IsAccessAllOrgs='Y'"
+" OR (r.IsUseUserOrgAccess='N' AND o.AD_Org_ID IN (SELECT AD_Org_ID FROM AD_Role_OrgAccess ra"
+" WHERE ra.AD_Role_ID=r.AD_Role_ID AND ra.IsActive='Y')) "
+" OR (r.IsUseUserOrgAccess='Y' AND o.AD_Org_ID IN (SELECT AD_Org_ID FROM AD_User_OrgAccess ua"
+" WHERE ua.AD_User_ID=?"
+" AND ua.IsActive='Y')))"
+ "ORDER BY o.Name";
//
PreparedStatement pstmt = null;
@ -591,20 +596,46 @@ public class Login
try
{
pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, AD_Role_ID);
pstmt.setInt(2, client.getKey());
pstmt.setInt(1, rol.getKey());
pstmt.setInt(2, AD_Client_ID);
pstmt.setInt(3, AD_User_ID);
rs = pstmt.executeQuery();
// load Orgs
while (rs.next())
if (!rs.next())
{
int AD_Org_ID = rs.getInt(1);
String Name = rs.getString(2);
boolean summary = "Y".equals(rs.getString(3));
rs.close();
pstmt.close();
log.log(Level.SEVERE, "No org for Role: " + rol.toStringX());
return null;
}
// Role Info
Env.setContext(m_ctx, "#AD_Role_ID", rol.getKey());
Env.setContext(m_ctx, "#AD_Role_Name", rol.getName());
Ini.setProperty(Ini.P_ROLE, rol.getName());
// User Level
Env.setContext(m_ctx, "#User_Level", rs.getString(1)); // Format 'SCO'
// ConnectionProfile
CConnection cc = CConnection.get();
if (m_connectionProfile == null) // No User Based
{
m_connectionProfile = rs.getString(2); // Role Based
if (m_connectionProfile != null && !cc.getConnectionProfile().equals(m_connectionProfile))
{
cc.setConnectionProfile(m_connectionProfile);
Ini.setProperty(Ini.P_CONNECTION, cc.toStringLong());
Ini.saveProperties(false);
}
}
// load Orgs
do{
int AD_Org_ID = rs.getInt(3);
String Name = rs.getString(4);
boolean summary = "Y".equals(rs.getString(5));
if (summary)
{
if (role == null)
role = MRole.get(m_ctx, AD_Role_ID);
role = MRole.get(m_ctx, rol.getKey());
getOrgsAddSummary (list, AD_Org_ID, Name, role);
}
else
@ -613,14 +644,12 @@ public class Login
if (!list.contains(p))
list.add(p);
}
}
//
}while (rs.next());
retValue = new KeyNamePair[list.size()];
list.toArray(retValue);
log.fine("Client: " + client.toStringX()
+ ", AD_Role_ID=" + AD_Role_ID
+ ", AD_User_ID=" + AD_User_ID
+ " - orgs #" + retValue.length);
log.fine("Client: " + AD_Client_ID +", AD_Role_ID=" + rol.getName()+", AD_User_ID=" + AD_User_ID+" - orgs #" + retValue.length);
}
catch (SQLException ex)
{
@ -632,19 +661,14 @@ public class Login
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
// No Orgs
if (retValue == null || retValue.length == 0)
{
log.log(Level.WARNING, "No Org for Client: " + client.toStringX()
+ ", AD_Role_ID=" + AD_Role_ID
log.log(Level.WARNING, "No Org for Client: " + AD_Client_ID
+ ", AD_Role_ID=" + rol.getKey()
+ ", AD_User_ID=" + AD_User_ID);
return null;
}
// Client Info
Env.setContext(m_ctx, "#AD_Client_ID", client.getKey());
Env.setContext(m_ctx, "#AD_Client_Name", client.getName());
Ini.setProperty(Ini.P_CLIENT, client.getName());
return retValue;
} // getOrgs
@ -1235,4 +1259,221 @@ public class Login
return null;
} // getPrincipal
/**
* Validate Client Login.
* Sets Context with login info
* @param app_user user id
* @param app_pwd password
* @return client array or null if in error.
*/
public KeyNamePair[] getClients(String app_user, String app_pwd) {
log.info("User=" + app_user);
if (app_user == null)
{
log.warning("No Apps User");
return null;
}
// Authentication
boolean authenticated = false;
MSystem system = MSystem.get(m_ctx);
if (system == null)
throw new IllegalStateException("No System Info");
if (app_pwd == null || app_pwd.length() == 0)
{
log.warning("No Apps Password");
return null;
}
if (system.isLDAP())
{
authenticated = system.isLDAP(app_user, app_pwd);
if (authenticated){
app_pwd = null;
authenticated=true;
}
// if not authenticated, use AD_User as backup
}
boolean hash_password = MSysConfig.getBooleanValue("USER_PASSWORD_HASH", false);
boolean email_login = MSysConfig.getBooleanValue("USE_EMAIL_FOR_LOGIN", false);
KeyNamePair[] retValue = null;
ArrayList<KeyNamePair> clientList = new ArrayList<KeyNamePair>();
ArrayList<Integer> clientsValidated = new ArrayList<Integer>();
StringBuffer where = new StringBuffer("Password IS NOT NULL AND ");
if (email_login)
where.append("EMail=?");
else
where.append("COALESCE(LDAPUser,Name)=?");
where.append(" AND")
.append(" EXISTS (SELECT * FROM AD_User_Roles ur")
.append(" INNER JOIN AD_Role r ON (ur.AD_Role_ID=r.AD_Role_ID)")
.append(" WHERE ur.AD_User_ID=AD_User.AD_User_ID AND ur.IsActive='Y' AND r.IsActive='Y') AND ")
.append(" EXISTS (SELECT * FROM AD_Client c")
.append(" WHERE c.AD_Client_ID=AD_User.AD_Client_ID")
.append(" AND c.IsActive='Y') AND ")
.append(" AD_User.IsActive='Y'");
List<MUser> users = new Query(m_ctx, MUser.Table_Name, where.toString(), null)
.setParameters(app_user)
.setOrderBy(MUser.COLUMNNAME_AD_User_ID)
.list();
if (users.size() == 0) {
log.saveError("UserPwdError", app_user, false);
return null;
}
for (MUser user : users) {
if (clientsValidated.contains(user.getAD_Client_ID())) {
log.severe("Two users with password with the same name/email combination on same tenant: " + app_user);
return null;
}
clientsValidated.add(user.getAD_Client_ID());
boolean valid = false;
if (hash_password) {
String hash = user.getPassword();
String salt = user.getSalt();
// always do calculation to confuse timing based attacks
if ( hash == null )
hash = "0000000000000000";
if ( salt == null )
salt = "0000000000000000";
valid = user.authenticateHash(app_pwd);
} else {
// password not hashed
valid = user.getPassword().equals(app_pwd);
}
if (valid ) {
StringBuffer sql= new StringBuffer("SELECT DISTINCT cli.AD_Client_ID, cli.Name, u.AD_User_ID, u.Name");
sql.append(" FROM AD_User_Roles ur")
.append(" INNER JOIN AD_User u on (ur.AD_User_ID=u.AD_User_ID)")
.append(" INNER JOIN AD_Client cli on (ur.AD_Client_ID=cli.AD_Client_ID)")
.append(" WHERE ur.IsActive='Y'")
.append(" AND u.IsActive='Y'")
.append(" AND ur.AD_User_ID=?");
PreparedStatement pstmt=null;
ResultSet rs=null;
try{
pstmt=DB.prepareStatement(sql.toString(),null);
pstmt.setInt(1, user.getAD_User_ID());
rs=pstmt.executeQuery();
while (rs.next() && rs!=null){
int AD_Client_ID=rs.getInt(1);
String Name=rs.getString(2);
KeyNamePair p = new KeyNamePair(AD_Client_ID,Name);
clientList.add(p);
}
}catch (SQLException ex)
{
log.log(Level.SEVERE, sql.toString(), ex);
retValue = null;
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
}
}
if (clientList.size() > 0)
authenticated=true;
if (authenticated) {
if (Ini.isClient())
{
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);
}
retValue = new KeyNamePair[clientList.size()];
clientList.toArray(retValue);
log.fine("User=" + app_user + " - roles #" + retValue.length);
}
return retValue;
}
/**************************************************************************
* Load Roles.
* <p>
* Sets Client info in context and loads its roles
* @param client client information
* @return list of valid roles KeyNodePairs or null if in error
*/
public KeyNamePair[] getRoles(String app_user, KeyNamePair client) {
if (client == null)
throw new IllegalArgumentException("Client missing");
ArrayList<KeyNamePair> rolesList = new ArrayList<KeyNamePair>();
KeyNamePair[] retValue = null;
StringBuffer sql = new StringBuffer("SELECT u.AD_User_ID, r.AD_Role_ID,r.Name ")
.append("FROM AD_User u")
.append(" INNER JOIN AD_User_Roles ur ON (u.AD_User_ID=ur.AD_User_ID AND ur.IsActive='Y')")
.append(" INNER JOIN AD_Role r ON (ur.AD_Role_ID=r.AD_Role_ID AND r.IsActive='Y') ");
sql.append("WHERE u.Password IS NOT NULL AND ur.AD_Client_ID=? AND ");
boolean email_login = MSysConfig.getBooleanValue("USE_EMAIL_FOR_LOGIN", false);
if (email_login)
sql.append("u.EMail=?");
else
sql.append("COALESCE(u.LDAPUser,u.Name)=?");
sql.append(" AND u.IsActive='Y'").append(" AND EXISTS (SELECT * FROM AD_Client c WHERE u.AD_Client_ID=c.AD_Client_ID AND c.IsActive='Y')");
sql.append(" ORDER BY r.Name");
PreparedStatement pstmt = null;
ResultSet rs = null;
// get Role details
try
{
pstmt = DB.prepareStatement(sql.toString(), null);
pstmt.setInt(1, client.getKey());
pstmt.setString(2, app_user);
rs = pstmt.executeQuery();
if (!rs.next())
{
rs.close();
pstmt.close();
log.log(Level.SEVERE, "No Roles for Client: " + client.toStringX());
return null;
}
// load Roles
do
{
int AD_Role_ID = rs.getInt(2);
String Name = rs.getString(3);
KeyNamePair p = new KeyNamePair(AD_Role_ID, Name);
rolesList.add(p);
}
while (rs.next());
//
retValue = new KeyNamePair[rolesList.size()];
rolesList.toArray(retValue);
log.fine("Role: " + client.toStringX() + " - clients #" + retValue.length);
}
catch (SQLException ex)
{
log.log(Level.SEVERE, sql.toString(), ex);
retValue = null;
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
//Client Info
Env.setContext(m_ctx, "#AD_Client_ID", client.getKey());
Env.setContext(m_ctx, "#AD_Client_Name", client.getName());
Ini.setProperty(Ini.P_CLIENT, client.getName());
return retValue;
} // getRoles
} // Login

View File

@ -50,6 +50,7 @@ import org.adempiere.webui.window.LoginWindow;
import org.compiere.Adempiere;
import org.compiere.model.MClient;
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;
@ -90,11 +91,11 @@ import org.zkoss.zul.Image;
*/
public class LoginPanel extends Window implements EventListener
{
private static final String ON_LOAD_TOKEN = "onLoadToken";
/**
*
*/
private static final long serialVersionUID = 3992171368813030624L;
private static final long serialVersionUID = -6308022048294680475L;
private static final String ON_LOAD_TOKEN = "onLoadToken";
private static final String RESOURCE = "org.compiere.apps.ALoginRes";
private ResourceBundle res = ResourceBundle.getBundle(RESOURCE);
private static CLogger logger = CLogger.getCLogger(LoginPanel.class);
@ -109,6 +110,7 @@ public class LoginPanel extends Window implements EventListener
private LoginWindow wndLogin;
private Checkbox chkRememberMe;
private Checkbox chkSelectRole;
boolean email_login = MSysConfig.getBooleanValue("USE_EMAIL_FOR_LOGIN", false);
public LoginPanel(Properties ctx, LoginWindow loginWindow)
{
@ -244,7 +246,15 @@ public class LoginPanel extends Window implements EventListener
if (BrowserToken.validateToken(session, user, token))
{
if (MSystem.isZKRememberUserAllowed()) {
if (email_login) {
txtUserId.setValue(user.getEMail());
} else {
if (user.getLDAPUser() != null && user.getLDAPUser().length() > 0) {
txtUserId.setValue(user.getLDAPUser());
} else {
txtUserId.setValue(user.getName());
}
}
onUserIdChange();
chkRememberMe.setChecked(true);
}
@ -405,6 +415,9 @@ public class LoginPanel extends Window implements EventListener
Locale.setDefault(loc);
res = ResourceBundle.getBundle(RESOURCE, loc);
if (email_login)
lblUserId.setValue(res.getString("EMail"));
else
lblUserId.setValue(res.getString("User"));
lblPassword.setValue(res.getString("Password"));
lblLanguage.setValue(res.getString("Language"));
@ -453,8 +466,8 @@ public class LoginPanel extends Window implements EventListener
Session currSess = Executions.getCurrent().getDesktop().getSession();
KeyNamePair rolesKNPairs[] = login.getRoles(userId, userPassword);
if(rolesKNPairs == null || rolesKNPairs.length == 0)
KeyNamePair clientsKNPairs[] = login.getClients(userId, userPassword);
if (clientsKNPairs == null || clientsKNPairs.length == 0)
throw new WrongValueException("User Id or Password invalid!!!");
else
@ -467,7 +480,7 @@ public class LoginPanel extends Window implements EventListener
Language language = findLanguage(langName);
Env.setContext(ctx, UserPreference.LANGUAGE_NAME, language.getName()); // Elaine 2009/02/06
wndLogin.loginOk(userId, userPassword, chkSelectRole.isChecked());
wndLogin.loginOk(userId, userPassword, chkSelectRole.isChecked(), clientsKNPairs);
Locale locale = language.getLocale();
currSess.setAttribute(Attributes.PREFERRED_LOCALE, locale);

View File

@ -34,13 +34,12 @@ import org.adempiere.webui.component.Combobox;
import org.adempiere.webui.component.ConfirmPanel;
import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.Window;
import org.adempiere.webui.exception.ApplicationException;
import org.adempiere.webui.editor.WDateEditor;
import org.adempiere.webui.session.SessionManager;
import org.adempiere.webui.theme.ITheme;
import org.adempiere.webui.theme.ThemeManager;
import org.adempiere.webui.util.UserPreference;
import org.adempiere.webui.window.LoginWindow;
import org.adempiere.webui.editor.WDateEditor;
import org.compiere.model.MRole;
import org.compiere.model.MSysConfig;
import org.compiere.model.MUser;
@ -77,13 +76,12 @@ public class RolePanel extends Window implements EventListener, Deferrable
/**
*
*/
private static final long serialVersionUID = 4485820129703005679L;
private static final long serialVersionUID = 153231955030136145L;
private static final String RESOURCE = "org.compiere.apps.ALoginRes";
private LoginWindow wndLogin;
private Login login;
private KeyNamePair rolesKNPairs[];
private Combobox lstRole, lstClient, lstOrganisation, lstWarehouse;
private Label lblRole, lblClient, lblOrganisation, lblWarehouse, lblDate;
@ -95,26 +93,34 @@ public class RolePanel extends Window implements EventListener, Deferrable
/** Username */
private String m_userName;
/** Password */
private String m_password;
private KeyNamePair[] m_clientKNPairs;
private boolean m_show = true;
public RolePanel(Properties ctx, LoginWindow loginWindow, String userName, String password, boolean show) {
public RolePanel(Properties ctx, LoginWindow loginWindow, String userName, boolean show, KeyNamePair[] clientsKNPairs) {
this.wndLogin = loginWindow;
m_ctx = ctx;
m_userName = userName;
m_password = password; login = new Login(ctx);
login = new Login(ctx);
m_show = show;
rolesKNPairs = login.getRoles(userName, password);
if(rolesKNPairs == null)
throw new ApplicationException("Login is invalid, UserName: " + userName + " and Password:" + password);
m_clientKNPairs = clientsKNPairs;
initComponents();
init();
this.setId("rolePanel");
if (m_show) {
AuFocus auf = new AuFocus(lstRole);
AuFocus auf = null;
if (lstClient.getItemCount() > 1) {
auf = new AuFocus(lstClient);
} else {
if (MSysConfig.getBooleanValue("ALogin_ShowOneRole", true) || lstRole.getItemCount() > 1) {
auf = new AuFocus(lstRole);
} else {
auf = new AuFocus(lstOrganisation);
}
}
Clients.response(auf);
} else {
validateRoles();
@ -148,18 +154,6 @@ public class RolePanel extends Window implements EventListener, Deferrable
image.setSrc(ThemeManager.getLargeLogo());
td.appendChild(image);
tr = new Tr();
tr.setId("rowRole");
table.appendChild(tr);
td = new Td();
tr.appendChild(td);
td.setSclass(ITheme.LOGIN_LABEL_CLASS);
td.appendChild(lblRole.rightAlign());
td = new Td();
td.setSclass(ITheme.LOGIN_FIELD_CLASS);
tr.appendChild(td);
td.appendChild(lstRole);
tr = new Tr();
tr.setId("rowclient");
table.appendChild(tr);
@ -172,6 +166,18 @@ public class RolePanel extends Window implements EventListener, Deferrable
tr.appendChild(td);
td.appendChild(lstClient);
tr = new Tr();
tr.setId("rowRole");
table.appendChild(tr);
td = new Td();
tr.appendChild(td);
td.setSclass(ITheme.LOGIN_LABEL_CLASS);
td.appendChild(lblRole.rightAlign());
td = new Td();
td.setSclass(ITheme.LOGIN_FIELD_CLASS);
tr.appendChild(td);
td.appendChild(lstRole);
tr = new Tr();
tr.setId("rowOrganisation");
table.appendChild(tr);
@ -226,14 +232,14 @@ public class RolePanel extends Window implements EventListener, Deferrable
ResourceBundle res = ResourceBundle.getBundle(RESOURCE, language.getLocale());
lblRole = new Label();
lblRole.setId("lblRole");
lblRole.setValue(res.getString("Role"));
lblClient = new Label();
lblClient.setId("lblClient");
lblClient.setValue(res.getString("Client"));
lblRole = new Label();
lblRole.setId("lblRole");
lblRole.setValue(res.getString("Role"));
lblOrganisation = new Label();
lblOrganisation.setId("lblOrganisation");
lblOrganisation.setValue(res.getString("Organization"));
@ -295,24 +301,70 @@ public class RolePanel extends Window implements EventListener, Deferrable
btnCancel.setLabel("Cancel");
btnCancel.addEventListener("onClick", this);
// initial role - Elaine 2009/02/06
// initial client - Elaine 2009/02/06
UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference();
String initDefault = userPreference.getProperty(UserPreference.P_CLIENT);
if (m_clientKNPairs != null && m_clientKNPairs.length > 0)
{
for(int i = 0; i < m_clientKNPairs.length; i++)
{
ComboItem ci = new ComboItem(m_clientKNPairs[i].getName(), m_clientKNPairs[i].getID());
lstClient.appendChild(ci);
if (m_clientKNPairs[i].getID().equals(initDefault))
lstClient.setSelectedItem(ci);
}
if (lstClient.getSelectedIndex() == -1 && lstClient.getItemCount() > 0) {
m_show = true; // didn't find default client
lstClient.setSelectedIndex(0);
}
}
//
if (m_clientKNPairs.length == 1) {
// don't show client if is just one
lstClient.setSelectedIndex(0);
lblClient.setVisible(false);
lstClient.setVisible(false);
} else {
lblClient.setVisible(true);
lstClient.setVisible(true);
}
setUserID();
updateRoleList();
}
private void updateRoleList()
{
lstRole.getItems().clear();
Comboitem lstItemClient = lstClient.getSelectedItem();
if (lstItemClient != null)
{
// initial role
UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference();
String initDefault = userPreference.getProperty(UserPreference.P_ROLE);
for(int i = 0; i < rolesKNPairs.length; i++)
KeyNamePair clientKNPair = new KeyNamePair(new Integer((String)lstItemClient.getValue()), lstItemClient.getLabel());
KeyNamePair roleKNPairs[] = login.getRoles(m_userName, clientKNPair);
if (roleKNPairs != null && roleKNPairs.length > 0)
{
ComboItem ci = new ComboItem(rolesKNPairs[i].getName(), rolesKNPairs[i].getID());
for (int i = 0; i < roleKNPairs.length; i++)
{
ComboItem ci = new ComboItem(roleKNPairs[i].getName(), roleKNPairs[i].getID());
lstRole.appendChild(ci);
if(rolesKNPairs[i].getID().equals(initDefault))
if (roleKNPairs[i].getID().equals(initDefault))
lstRole.setSelectedItem(ci);
}
if (lstRole.getSelectedIndex() == -1 && lstRole.getItemCount() > 0) {
m_show = true; // didn't find default role
lstRole.setSelectedIndex(0);
}
}
//
//force reload of default role
MRole.getDefault(m_ctx, true);
// If we have only one role, we can hide the combobox - metas-2009_0021_AP1_G94
if (lstRole.getItemCount() == 1 && ! MSysConfig.getBooleanValue("ALogin_ShowOneRole", true))
if (m_clientKNPairs.length == 1 && lstRole.getItemCount() == 1 && ! MSysConfig.getBooleanValue("ALogin_ShowOneRole", true))
{
lstRole.setSelectedIndex(0);
lblRole.setVisible(false);
@ -324,38 +376,6 @@ public class RolePanel extends Window implements EventListener, Deferrable
lstRole.setVisible(true);
}
updateClientList();
}
private void updateClientList()
{
lstClient.getItems().clear();
Comboitem lstItemRole = lstRole.getSelectedItem();
if(lstItemRole != null)
{
// initial client - Elaine 2009/02/06
UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference();
String initDefault = userPreference.getProperty(UserPreference.P_CLIENT);
KeyNamePair roleKNPair = new KeyNamePair(new Integer((String)lstItemRole.getValue()), lstItemRole.getLabel());
KeyNamePair clientKNPairs[] = login.getClients(roleKNPair);
if(clientKNPairs != null && clientKNPairs.length > 0)
{
for(int i = 0; i < clientKNPairs.length; i++)
{
ComboItem ci = new ComboItem(clientKNPairs[i].getName(), clientKNPairs[i].getID());
lstClient.appendChild(ci);
if(clientKNPairs[i].getID().equals(initDefault))
lstClient.setSelectedItem(ci);
}
if (lstClient.getSelectedIndex() == -1 && lstClient.getItemCount() > 0) {
m_show = true; // didn't find default client
lstClient.setSelectedIndex(0);
}
}
//
//force reload of default role
MRole.getDefault(m_ctx, true);
}
setUserID();
updateOrganisationList();
@ -365,14 +385,14 @@ public class RolePanel extends Window implements EventListener, Deferrable
{
lstOrganisation.getItems().clear();
lstOrganisation.setText("");
Comboitem lstItemClient = lstClient.getSelectedItem();
if(lstItemClient != null)
Comboitem lstItemRole = lstRole.getSelectedItem();
if(lstItemRole != null)
{
// initial organisation - Elaine 2009/02/06
UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference();
String initDefault = userPreference.getProperty(UserPreference.P_ORG);
KeyNamePair clientKNPair = new KeyNamePair(new Integer((String)lstItemClient.getValue()), lstItemClient.getLabel());
KeyNamePair orgKNPairs[] = login.getOrgs(clientKNPair);
KeyNamePair RoleKNPair = new KeyNamePair(new Integer((String)lstItemRole.getValue()), lstItemRole.getLabel());
KeyNamePair orgKNPairs[] = login.getOrgs(RoleKNPair);
if(orgKNPairs != null && orgKNPairs.length > 0)
{
for(int i = 0; i < orgKNPairs.length; i++)
@ -429,9 +449,10 @@ public class RolePanel extends Window implements EventListener, Deferrable
String eventName = event.getName();
if(eventName.equals("onSelect"))
{
if(eventCompId.equals(lstRole.getId()))
updateClientList();
else if(eventCompId.equals(lstClient.getId())) {
if(eventCompId.equals(lstClient.getId())){
updateRoleList();
}
else if(eventCompId.equals(lstRole.getId())) {
setUserID();
updateOrganisationList();
}
@ -449,10 +470,8 @@ public class RolePanel extends Window implements EventListener, Deferrable
}
private void setUserID() {
// Carlos Ruiz - globalqss - Wrong #AD_User_ID when user with the same name from two Ten.
// https://sourceforge.net/tracker/index.php?func=detail&aid=2984836&group_id=176962&atid=955896
Env.setContext(m_ctx, "#AD_Client_ID", (String) lstClient.getSelectedItem().getValue());
MUser user = MUser.get (m_ctx, m_userName, m_password);
MUser user = MUser.get (m_ctx, m_userName);
if (user != null) {
Env.setContext(m_ctx, "#AD_User_ID", user.getAD_User_ID() );
Env.setContext(m_ctx, "#SalesRep_ID", user.getAD_User_ID() );

View File

@ -30,6 +30,7 @@ import org.adempiere.webui.component.FWindow;
import org.adempiere.webui.panel.LoginPanel;
import org.adempiere.webui.panel.RolePanel;
import org.compiere.util.Env;
import org.compiere.util.KeyNamePair;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
@ -47,7 +48,7 @@ public class LoginWindow extends FWindow implements EventListener
/**
*
*/
private static final long serialVersionUID = -365979563919913804L;
private static final long serialVersionUID = -6312322926432586415L;
private IWebClient app;
private Properties ctx;
private LoginPanel pnlLogin;
@ -74,9 +75,9 @@ public class LoginWindow extends FWindow implements EventListener
pnlLogin = new LoginPanel(ctx, this);
}
public void loginOk(String userName, String password, boolean show)
public void loginOk(String userName, String password, boolean show, KeyNamePair[] clientsKNPairs)
{
pnlRole = new RolePanel(ctx, this, userName, password, show);
pnlRole = new RolePanel(ctx, this, userName, show, clientsKNPairs);
this.getChildren().clear();
this.appendChild(pnlRole);
}

View File

@ -44,6 +44,7 @@ public final class ALoginRes extends ListResourceBundle
{ "Host", "&Server" },
{ "Database", "Database" },
{ "User", "&User ID" },
{ "EMail", "EMail" },
{ "EnterUser", "Enter Application User ID" },
{ "Password", "&Password" },
{ "EnterPassword", "Enter Application Password" },

View File

@ -39,6 +39,7 @@ public class ALoginRes_ar extends ListResourceBundle
{ "Host", "\u0645\u0648\u0632\u0639" },
{ "Database", "\u0642\u0627\u0639\u062f\u0629 \u0628\u064a\u0627\u0646\u0627\u062a" },
{ "User", "\u0645\u0639\u0631\u0651\u0641 \u0627\u0644\u0645\u0633\u062a\u0639\u0645\u0644" },
{ "EMail", "\u0627\u0644\u0628\u0631\u064a\u062f \u0627\u0644\u0625\u0644\u0643\u062a\u0631\u0648\u0646\u064a" },
{ "EnterUser", "\u0623\u062f\u062e\u0644 \u0645\u0639\u0631\u0651\u0641 \u0645\u0633\u062a\u0639\u0645\u0644 \u0627\u0644\u062a\u0637\u0628\u064a\u0642" },
{ "Password", "\u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631" },
{ "EnterPassword", "\u0623\u062f\u062e\u0644 \u0643\u0644\u0645\u0629 \u0633\u0631 \u0627\u0644\u062a\u0637\u0628\u064a\u0642" },

View File

@ -40,6 +40,7 @@ public final class ALoginRes_bg extends ListResourceBundle
{ "Host", "\u0421\u044a\u0440\u0432\u0435\u0440" },
{ "Database", "\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u0438" },
{ "User", "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b" },
{ "EMail", "\u043f\u043e\u0449\u0430" },
{ "EnterUser", "\u0412\u044a\u0432\u0435\u0434\u0435\u0442\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b \u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0442\u043e" },
{ "Password", "\u041f\u0430\u0440\u043e\u043b\u0430" },
{ "EnterPassword", "\u0412\u044a\u0432\u0435\u0434\u0435\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u0430 \u0437\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f \u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0442\u043e" },

View File

@ -42,6 +42,7 @@ public final class ALoginRes_ca extends ListResourceBundle
{ "Host", "Servidor" },
{ "Database", "Base de Dades" },
{ "User", "Usuari" },
{ "EMail", "Correu" },
{ "EnterUser", "Introdu\u00efr Usuari Aplicaci\u00f3" },
{ "Password", "Contrasenya" },
{ "EnterPassword", "Entrar Contrasenya Usuari Aplicaci\u00f3" },

View File

@ -33,19 +33,20 @@ public final class ALoginRes_da extends ListResourceBundle
{
{ "Connection", "Forbindelse" },
{ "Defaults", "Basis" },
{ "Login", "ADempiere: Log på" },
{ "Login", "ADempiere: Log p\u00e5" },
{ "File", "Fil" },
{ "Exit", "Afslut" },
{ "Help", "Hjælp" },
{ "Help", "Hj\u00e6lp" },
{ "About", "Om" },
{ "Host", "Vært" },
{ "Host", "V\u00e6rt" },
{ "Database", "Database" },
{ "User", "Bruger-ID" },
{ "EMail", "EMail" },
{ "EnterUser", "Angiv bruger-ID til program" },
{ "Password", "Adgangskode" },
{ "EnterPassword", "Angiv adgangskode til program" },
{ "Language", "Sprog" },
{ "SelectLanguage", "Vælg sprog" },
{ "SelectLanguage", "V\u00e6lg sprog" },
{ "Role", "Rolle" },
{ "Client", "Firma" },
{ "Organization", "Organisation" },
@ -59,10 +60,10 @@ public final class ALoginRes_da extends ListResourceBundle
{ "RoleNotFound", "Rolle blev ikke fundet/afsluttet" },
{ "Authorized", "Tilladelse OK" },
{ "Ok", "OK" },
{ "Cancel", "Annullér" },
{ "Cancel", "Annull\u00e9r" },
{ "VersionConflict", "Konflikt:" },
{ "VersionInfo", "Server <> Klient" },
{ "PleaseUpgrade", "Kør opdateringsprogram" }
{ "PleaseUpgrade", "K\u00f8r opdateringsprogram" }
};
/**

View File

@ -41,6 +41,7 @@ public final class ALoginRes_de extends ListResourceBundle
{ "Host", "Server" },
{ "Database", "Datenbank" },
{ "User", "Nutzer" },
{ "EMail", "EMail" },
{ "EnterUser", "Nutzer eingeben" },
{ "Password", "Passwort" },
{ "EnterPassword", "Passwort eingeben" },

View File

@ -44,6 +44,7 @@ public final class ALoginRes_el extends ListResourceBundle
{ "Host", "\u0394\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae\u03c2" },
{ "Database", "\u0392\u03ac\u03c3\u03b7 \u0394\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd" },
{ "User", "\u03a7\u03c1\u03ae\u03c3\u03c4\u03b7\u03c2" },
{ "EMail", "\u03c4\u03b1\u03c7\u03c5\u03b4\u03c1\u03bf\u03bc\u03b5\u03af\u03bf\u03c5" },
{ "EnterUser", "\u039a\u03b1\u03c4\u03b1\u03c7\u03c9\u03c1\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf \u038c\u03bd\u03bf\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03a7\u03c1\u03ae\u03c3\u03c4\u03b7" },
{ "Password", "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2" },
{ "EnterPassword", "\u039a\u03b1\u03c4\u03b1\u03c7\u03c9\u03c1\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf\u03bd \u039a\u03c9\u03b4\u03b9\u03ba\u03cc \u03a0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2" },

View File

@ -41,6 +41,7 @@ public final class ALoginRes_es extends ListResourceBundle
{ "Host", "&Servidor" },
{ "Database", "Base de datos" },
{ "User", "&Usuario" },
{ "EMail", "Correo" },
{ "EnterUser", "Introduzca Usuario Aplicaci\u00f3n" },
{ "Password", "&Contrase\u00f1a" },
{ "EnterPassword", "Introduzca Contrase\u00f1a Aplicaci\u00f3n" },

View File

@ -39,6 +39,7 @@ public final class ALoginRes_fa extends ListResourceBundle
{ "Host", "\u0633\u064a\u0633\u062a\u0645 \u0645\u064a\u0632\u0628\u0627\u0646" },
{ "Database", "\u0628\u0627\u0646\u06a9 \u0627\u0637\u0644\u0627\u0639\u0627\u062a" },
{ "User", "\u0645\u0634\u062e\u0635\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0646\u062f\u0647" },
{ "EMail", "EMail" },
{ "EnterUser", "\u0645\u0634\u062e\u0635\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0646\u062f\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u064a\u062f" },
{ "Password", "\u06a9\u0644\u0645\u0647 \u0639\u0628\u0648\u0631" },
{ "EnterPassword", "\u06a9\u0644\u0645\u0647 \u0639\u0628\u0648\u0631 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u064a\u062f" },

View File

@ -41,6 +41,7 @@ public class ALoginRes_fr extends ListResourceBundle
{ "Host", "Serveur" },
{ "Database", "Base de donn\u00E9es" },
{ "User", "Utilisateur" },
{ "EMail", "Courriel" },
{ "EnterUser", "Entrer votre code utilisateur" },
{ "Password", "Mot de passe" },
{ "EnterPassword", "Entrer le mot de passe" },

View File

@ -21,7 +21,7 @@ import java.util.ListResourceBundle;
/**
* Base Resource Bundle
*
* @author Marko Bubalo, Mislav Kašner
* @author Marko Bubalo, Mislav Ka\u0161ner
* @version $Id: ALoginRes_hr.java,v 1.3 2008/01/11 00:51:27 jjanke Exp $
*/
public final class ALoginRes_hr extends ListResourceBundle
@ -41,6 +41,7 @@ public final class ALoginRes_hr extends ListResourceBundle
{ "Host", "Host" },
{ "Database", "Baza podataka" },
{ "User", "Korisnik" },
{ "EMail", "e-po\u0161ta" },
{ "EnterUser", "Unos korisnika" },
{ "Password", "Lozinka" },
{ "EnterPassword", "Unos lozinke" },

View File

@ -35,37 +35,38 @@ public final class ALoginRes_hu extends ListResourceBundle
static final Object[][] contents = new String[][]
{
{ "Connection", "Kapcsolat" },
{ "Defaults", "Alapértelmezés" },
{ "Login", "ADempiere Belépés" },
{ "File", "Fájl" },
{ "Exit", "Kilépés" },
{ "Help", "Súgó" },
{ "About", "Névjegy" },
{ "Defaults", "Alap\u00e9rtelmez\u00e9s" },
{ "Login", "ADempiere Bel\u00e9p\u00e9s" },
{ "File", "F\u00e1jl" },
{ "Exit", "Kil\u00e9p\u00e9s" },
{ "Help", "S\u00fag\u00f3" },
{ "About", "N\u00e9vjegy" },
{ "Host", "Szerver" },
{ "Database", "Adatbázis" },
{ "User", "Felhasználó ID" },
{ "EnterUser", "Írja be a felhasználó ID-t" },
{ "Password", "Jelszó" },
{ "EnterPassword", "Írja be a jelszavát" },
{ "Database", "Adatb\u00e1zis" },
{ "User", "Felhaszn\u00e1l\u00f3 ID" },
{ "EMail", "EMail" },
{ "EnterUser", "\u00cdrja be a felhaszn\u00e1l\u00f3 ID-t" },
{ "Password", "Jelsz\u00f3" },
{ "EnterPassword", "\u00cdrja be a jelszav\u00e1t" },
{ "Language", "Nyelv" },
{ "SelectLanguage", "Válasszon nyelvet" },
{ "Role", "Szerepkör" },
{ "Client", "Vállalat" },
{ "SelectLanguage", "V\u00e1lasszon nyelvet" },
{ "Role", "Szerepk\u00f6r" },
{ "Client", "V\u00e1llalat" },
{ "Organization", "Szervezet" },
{ "Date", "Dátum" },
{ "Warehouse", "Raktár" },
{ "Printer", "Nyomtató" },
{ "Date", "D\u00e1tum" },
{ "Warehouse", "Rakt\u00e1r" },
{ "Printer", "Nyomtat\u00f3" },
{ "Connected", "Csatlakoztatva" },
{ "NotConnected", "Nincs csatlakoztatva" },
{ "DatabaseNotFound", "Az adatbázis nem található" },
{ "UserPwdError", "A felhasználó vagy jelszó hibás" },
{ "RoleNotFound", "A szerepkör nem található" },
{ "Authorized", "Jogosultság ellenőrizve" },
{ "DatabaseNotFound", "Az adatb\u00e1zis nem tal\u00e1lhat\u00f3" },
{ "UserPwdError", "A felhaszn\u00e1l\u00f3 vagy jelsz\u00f3 hib\u00e1s" },
{ "RoleNotFound", "A szerepk\u00f6r nem tal\u00e1lhat\u00f3" },
{ "Authorized", "Jogosults\u00e1g ellen\u0151rizve" },
{ "Ok", "Ok" },
{ "Cancel", "Mégsem" },
{ "VersionConflict", "Verzió ütközés:" },
{ "Cancel", "M\u00e9gsem" },
{ "VersionConflict", "Verzi\u00f3 \u00fctk\u00f6z\u00e9s:" },
{ "VersionInfo", "Szerver <> Kliens" },
{ "PleaseUpgrade", "Töltse le a program új verzióját a szerverről" }
{ "PleaseUpgrade", "T\u00f6ltse le a program \u00faj verzi\u00f3j\u00e1t a szerverr\u0151l" }
};
/**

View File

@ -41,6 +41,7 @@ public final class ALoginRes_in extends ListResourceBundle
{ "Host", "Pusat" },
{ "Database", "Database" },
{ "User", "ID Pengguna" },
{ "EMail", "EMail" },
{ "EnterUser", "Masukkan ID pengguna" },
{ "Password", "Kata Sandi" },
{ "EnterPassword", "Masukkan kata sandi applikasi" },

View File

@ -27,69 +27,38 @@ import java.util.ListResourceBundle;
public final class ALoginRes_it extends ListResourceBundle
{
static final Object[][] contents = new String[][]{
//{ "Connection", "Connection" },
{ "Connection", "Connessione" },
//{ "Defaults", "Defaults" },
{ "Defaults", "Defaults" }, //Need to be checked
//{ "Login", "ADempiere Login" },
{ "Login", "ADempiere Login" },
//{ "File", "File" },
{ "File", "File" },
//{ "Exit", "Exit" },
{ "Exit", "Esci" },
//{ "Help", "Help" },
{ "Help", "Aiuto" },
//{ "About", "About" },
{ "About", "Informazioni" },
//{ "Host", "Host" },
{ "Host", "Host" },
//{ "Database", "Database" },
{ "Database", "Database" },
//{ "User", "User ID" }, //Need to be checked. Leave "User ID" ?
{ "User", "Identificativo Utente" },
//{ "EnterUser", "Enter Application User ID" },
{ "EMail", "Posta" },
{ "EnterUser", "Identificativo Utente Applicazione" },
//{ "Password", "Password" },
{ "Password", "Password" },
//{ "EnterPassword", "Enter Application password" },
{ "EnterPassword", "Inserimento password Applicazione" },
//{ "Language", "Language" },
{ "Language", "Linguaggio" },
//{ "SelectLanguage", "Select your language" },
{ "SelectLanguage", "Selezionate il vostro linguaggio" },
//{ "Role", "Role" },
{ "Role", "Ruolo" },
//{ "Client", "Client" }, //Need to be checked. Everybody agree with the SAP translation ?
{ "Client", "Mandante" },
//{ "Organization", "Organization" },
{ "Organization", "Organizzazione" },
//{ "Date", "Date" },
{ "Date", "Data" },
//{ "Warehouse", "Warehouse" },
{ "Warehouse", "Magazzino" },
//{ "Printer", "Printer" },
{ "Printer", "Stampante" },
//{ "Connected", "Connected" },
{ "Connected", "Connesso" },
//{ "NotConnected", "Not Connected" },
{ "NotConnected", "Non Connesso" },
//{ "DatabaseNotFound", "Database not found" },
{ "DatabaseNotFound", "Database non trovato" },
//{ "UserPwdError", "User does not match password" },
{ "UserPwdError", "L'Utente non corrisponde alla password" },
//{ "RoleNotFound", "Role not found" },
{ "RoleNotFound", "Ruolo non trovato" },
//{ "Authorized", "Authorized" },
{ "Authorized", "Authorizzato" },
//{ "Ok", "Ok" },
{ "Ok", "Ok" },
//{ "Cancel", "Cancel" },
{ "Cancel", "Cancella" },
//{ "VersionConflict", "Version Conflict:" },
{ "VersionConflict", "Conflitto di Versione:" },
//{ "VersionInfo", "Server <> Client" },
{ "VersionInfo", "Server <> Client" },
//{ "PleaseUpgrade", "Please run the update program" }
{ "PleaseUpgrade", "Prego lanciare il programma di update" }
};
public Object[][] getContents()

View File

@ -39,6 +39,7 @@ public final class ALoginRes_ja extends ListResourceBundle
{ "Host", "\u30b5\u30fc\u30d0\u30fc" },
{ "Database", "\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9" },
{ "User", "\u30e6\u30fc\u30b6\u30fc" },
{ "EMail", "\u96fb\u5b50\u30e1\u30fc\u30eb" },
{ "EnterUser", "\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30e6\u30fc\u30b6\u30fc\u540d\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044" },
{ "Password", "\u30d1\u30b9\u30ef\u30fc\u30c9" },
{ "EnterPassword", "\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044" },

View File

@ -39,6 +39,7 @@ public final class ALoginRes_ml extends ListResourceBundle
{ "Host", "Host" },
{ "Database", "Pengkalan Data" },
{ "User", "Pengguna" },
{ "EMail", "E-mel" },
{ "EnterUser", "Masuk Pengguna" },
{ "Password", "Kata Laluan" },
{ "EnterPassword", "Masuk Kata Laluan" },

View File

@ -39,6 +39,7 @@ public final class ALoginRes_ms extends ListResourceBundle
{ "Host", "Host" },
{ "Database", "Pengkalan Data" },
{ "User", "Pengguna" },
{ "EMail", "E-mel" },
{ "EnterUser", "Masuk Pengguna" },
{ "Password", "Kata Laluan" },
{ "EnterPassword", "Masuk Kata Laluan" },

View File

@ -39,6 +39,7 @@ public final class ALoginRes_nl extends ListResourceBundle
{ "Host", "Server" },
{ "Database", "Database" },
{ "User", "Gebruikersnaam" },
{ "EMail", "EMail" },
{ "EnterUser", "Voer uw gebruikersnaam in" },
{ "Password", "Wachtwoord" },
{ "EnterPassword", "Voer uw wachtwoord in" },

View File

@ -21,7 +21,7 @@ import java.util.ListResourceBundle;
/**
* Norwegian Base Resource Bundle Translation
*
* @author Olaf Slazak L<EFBFBD>ken
* @author Olaf Slazak L\ufffdken
* @version $Id: ALoginRes_no.java,v 1.2 2006/07/30 00:51:27 jjanke Exp $
*/
public final class ALoginRes_no extends ListResourceBundle
@ -41,11 +41,12 @@ public final class ALoginRes_no extends ListResourceBundle
{ "Host", "Maskin" },
{ "Database", "Database" },
{ "User", "Bruker ID" },
{ "EMail", "E-post" },
{ "EnterUser", "Skriv Applikasjon Bruker ID" },
{ "Password", "Passord" },
{ "EnterPassword", "Skriv Applikasjon Passordet" },
{ "Language", "Spr<EFBFBD>k" },
{ "SelectLanguage", "Velg <EFBFBD>nsket Spr<70>k" },
{ "Language", "Spr\u00e5k" },
{ "SelectLanguage", "Velg spr\u00e5k" },
{ "Role", "Rolle" },
{ "Client", "Klient" },
{ "Organization", "Organisasjon" },
@ -62,7 +63,7 @@ public final class ALoginRes_no extends ListResourceBundle
{ "Cancel", "Avbryt" },
{ "VersionConflict", "Versions Konflikt:" },
{ "VersionInfo", "Server <> Klient" },
{ "PleaseUpgrade", "Vennligst kj<EFBFBD>r oppdaterings programet" }
{ "PleaseUpgrade", "Vennligst kj\u00f8r oppdaterings programet" }
};
/**

View File

@ -39,6 +39,7 @@ public final class ALoginRes_pl extends ListResourceBundle
{ "Host", "Host" },
{ "Database", "Baza danych" },
{ "User", "U\u017cytkownik" },
{ "EMail", "EMail" },
{ "EnterUser", "Wprowad\u017a Identyfikator U\u017cytkownika Aplikacji" },
{ "Password", "Has\u0142o" },
{ "EnterPassword", "Wprowad\u017a Has\u0142o Aplikacji" },

View File

@ -42,6 +42,7 @@ public final class ALoginRes_pt extends ListResourceBundle
{ "Host", "Servidor" },
{ "Database", "Banco de Dados" },
{ "User", "Usu\u00e1rio" },
{ "EMail", "Correio" },
{ "EnterUser", "Entre com o Usu\u00e1rio da Aplica\u00e7\u00e3o" },
{ "Password", "Senha" },
{ "EnterPassword", "Entre com a senha da Aplica\u00e7\u00e3o" },

View File

@ -39,6 +39,7 @@ public final class ALoginRes_ro extends ListResourceBundle
{ "Host", "Server" },
{ "Database", "Baz\u0103 de date" },
{ "User", "Utilizator" },
{ "EMail", "Po\u015fta" },
{ "EnterUser", "Introduce\u0163i identificatorul utilizatorului" },
{ "Password", "Parol\u0103" },
{ "EnterPassword", "Introduce\u0163i parola" },

View File

@ -39,6 +39,7 @@ public final class ALoginRes_ru extends ListResourceBundle
{ "Host", "\u0425\u043e\u0441\u0442" },
{ "Database", "\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445" },
{ "User", "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c" },
{ "EMail", "\u043f\u043e\u0447\u0442\u0435" },
{ "EnterUser", "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f" },
{ "Password", "\u041f\u0430\u0440\u043e\u043b\u044c" },
{ "EnterPassword", "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c" },

View File

@ -41,6 +41,7 @@ public final class ALoginRes_sl extends ListResourceBundle
{ "Host", "Stre\u017enik" },
{ "Database", "Baza podatkov" },
{ "User", "Uporabnik" },
{ "EMail", "E-po\u0161ta" },
{ "EnterUser", "Vpi\u0161i uporabnika" },
{ "Password", "Geslo" },
{ "EnterPassword", "Vpi\u0161i geslo" },

View File

@ -9,7 +9,7 @@
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* 59 Temple Place, Suite 3OROOOOOOOO graciassssssss @marianapajon GRACIAS!!!!!!30, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
@ -41,6 +41,7 @@ public final class ALoginRes_sr extends ListResourceBundle
{ "Host", "Host" },
{ "Database", "\u0411\u0430\u0437\u0430 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430" },
{ "User", "\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u043A" },
{ "EMail", "\u0415-\u043c\u0430\u0438\u043b" },
{ "EnterUser", "\u0423\u043D\u043E\u0441 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430" },
{ "Password", "\u041B\u043E\u0437\u0438\u043D\u043A\u0430" },
{ "EnterPassword", "\u0423\u043D\u043E\u0441 \u043B\u043E\u0437\u0438\u043D\u043A\u0435" },

View File

@ -41,6 +41,7 @@ public final class ALoginRes_sv extends ListResourceBundle
{ "Host", "V\u00e4rddator" },
{ "Database", "Databas" },
{ "User", "Anv\u00e4ndarnamn" },
{ "EMail", "E-post" },
{ "EnterUser", "Ange anv\u00e4ndarnamn" },
{ "Password", "L\u00f6senord" },
{ "EnterPassword", "Ange l\u00f6senord" },

View File

@ -39,6 +39,7 @@ public final class ALoginRes_th extends ListResourceBundle
{ "Host", "\u0e42\u0e2e\u0e2a" },
{ "Database", "\u0e23\u0e30\u0e1a\u0e1a\u0e10\u0e32\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25" },
{ "User", "\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49" },
{ "EMail", "\u0e08\u0e14\u0e2b\u0e21\u0e32\u0e22\u0e2d\u0e34\u0e40\u0e25\u0e47\u0e01\u0e17\u0e23\u0e2d\u0e19\u0e34\u0e01\u0e2a\u0e4c" },
{ "EnterUser", "\u0e01\u0e23\u0e38\u0e13\u0e32\u0e43\u0e2a\u0e48\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49" },
{ "Password", "\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19" },
{ "EnterPassword", "\u0e01\u0e23\u0e38\u0e13\u0e32\u0e43\u0e2a\u0e48\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19" },

View File

@ -32,37 +32,38 @@ public final class ALoginRes_vi extends ListResourceBundle
static final Object[][] contents = new String[][]
{
{ "Connection", "K\u1EBFt n\u1ED1i" },
{ "Defaults", "M\u1EB7c nhi<68>n" },
{ "Defaults", "M\u1eb7c \u0111\u1ecbnh" },
{ "Login", "\u0110\u0103ng nh\u1EADp" },
{ "File", "H\u1EC7 th\u1ED1ng" },
{ "Exit", "Tho<EFBFBD>t" },
{ "Help", "Gi<EFBFBD>p \u0111\u1EE1" },
{ "Exit", "Tho\u00e1t" },
{ "Help", "Gi\u00fap \u0111\u1ee1" },
{ "About", "Gi\u1EDBi thi\u1EC7u" },
{ "Host", "M<EFBFBD>y ch\u1EE7" },
{ "Host", "M\u00e1y ch\u1ee7" },
{ "Database", "C\u01A1 s\u1EDF d\u1EEF li\u1EC7u" },
{ "User", "T<EFBFBD>n ng\u01B0\u1EDDi d<>ng" },
{ "EnterUser", "H<EFBFBD>y nh\u1EADp t<>n ng\u01B0\u1EDDi d<>ng" },
{ "User", "Ng\u01b0\u1eddi s\u1eed d\u1ee5ng" },
{ "EMail", "Th\u01b0 \u0111i\u1ec7n t\u1eed" },
{ "EnterUser", "H\u00e3y nh\u1EADp t\ufffdn ng\u01B0\u1EDDi d\u1ee5ng" },
{ "Password", "M\u1EADt kh\u1EA9u" },
{ "EnterPassword", "H<EFBFBD>y nh\u1EADp m\u1EADt kh\u1EA9u" },
{ "Language", "Ng<EFBFBD>n ng\u1EEF" },
{ "SelectLanguage", "H<EFBFBD>y ch\u1ECDn ng<6E>n ng\u1EEF" },
{ "Role", "Vai tr<EFBFBD>" },
{ "Client", "C<EFBFBD>ng ty" },
{ "EnterPassword", "H\u00e3y nh\u1EADp m\u1EADt kh\u1EA9u" },
{ "Language", "Ng\u00f4n ng\u1EEF" },
{ "SelectLanguage", "H\u00e3y ch\u1ECDn ng\u00f4n ng\u1EEF" },
{ "Role", "Vai tr\u00f2" },
{ "Client", "C\u1eddng ty" },
{ "Organization", "\u0110\u01A1n v\u1ECB" },
{ "Date", "Ng<EFBFBD>y" },
{ "Warehouse", "Kho h<EFBFBD>ng" },
{ "Printer", "M<EFBFBD>y in" },
{ "Connected", "\u0110<EFBFBD> k\u1EBFt n\u1ED1i" },
{ "Date", "Ng\u00e0y" },
{ "Warehouse", "Kho h\u00e0ng" },
{ "Printer", "M\u00e1y in" },
{ "Connected", "\u0111\u01b0\u1ee3c k\u1ebft n\u1ed1i" },
{ "NotConnected", "Ch\u01B0a k\u1EBFt n\u1ED1i \u0111\u01B0\u1EE3c" },
{ "DatabaseNotFound", "Kh<EFBFBD>ng t<>m th\u1EA5y CSDL" },
{ "UserPwdError", "Ng\u01B0\u1EDDi d<EFBFBD>ng v<> m\u1EADt kh\u1EA9u kh<6B>ng kh\u1EDBp nhau" },
{ "RoleNotFound", "Kh<EFBFBD>ng t<>m th\u1EA5y vai tr<74> n<>y" },
{ "Authorized", "\u0110<EFBFBD> \u0111\u01B0\u1EE3c ph<70>p" },
{ "Ok", "\u0110\u1ED3ng <20>" },
{ "DatabaseNotFound", "Kh\u00f2ng t\ufffdm th\u1EA5y CSDL" },
{ "UserPwdError", "Ng\u01B0\u1EDDi d\u1ee5ng v\ufffd m\u1EADt kh\u1EA9u kh\ufffdng kh\u1EDBp nhau" },
{ "RoleNotFound", "Kh\u00f2ng t\ufffdm th\u1EA5y vai tr\ufffd n\ufffdy" },
{ "Authorized", "\u0110\ufffd \u0111\u01B0\u1EE3c ph\ufffdp" },
{ "Ok", "\u0111\u1ed3ng \u00fd" },
{ "Cancel", "H\u1EE7y" },
{ "VersionConflict", "X\u1EA3y ra tranh ch\u1EA5p phi<EFBFBD>n b\u1EA3n:" },
{ "VersionInfo", "Th<EFBFBD>ng tin v\u1EC1 phi<68>n b\u1EA3n" },
{ "PleaseUpgrade", "Vui l<EFBFBD>ng n<>ng c\u1EA5p ch\u01B0\u01A1ng tr<74>nh" }
{ "VersionConflict", "X\u1EA3y ra tranh ch\u1EA5p phi\ufffdn b\u1EA3n:" },
{ "VersionInfo", "Th\u00f2ng tin v\u1EC1 phi\ufffdn b\u1EA3n" },
{ "PleaseUpgrade", "Vui l\ufffdng n\ufffdng c\u1EA5p ch\u01B0\u01A1ng tr\ufffdnh" }
};
/**

View File

@ -39,6 +39,7 @@ public final class ALoginRes_zh extends ListResourceBundle
{ "Host", "\u4e3b\u6a5f" },
{ "Database", "\u8cc7\u6599\u5eab" },
{ "User", "\u5e33\u865f" },
{ "EMail", "\u7535\u5b50\u90ae\u4ef6" },
{ "EnterUser", "\u8acb\u9375\u5165\u5e33\u865f" },
{ "Password", "\u5bc6\u78bc" },
{ "EnterPassword", "\u8acb\u9375\u5165\u5bc6\u78bc" },

View File

@ -39,6 +39,7 @@ public final class ALoginRes_zh_CN extends ListResourceBundle
{ "Host", "\u4e3b\u673a" },
{ "Database", "\u6570\u636e\u5e93" },
{ "User", "\u7528\u6237\u53f7" },
{ "EMail", "\u7535\u5b50\u90ae\u4ef6" },
{ "EnterUser", "\u8bf7\u8f93\u5165\u7528\u6237\u53f7" },
{ "Password", "\u53e3\u4ee4" },
{ "EnterPassword", "\u8bf7\u8f93\u5165\u53e3\u4ee4" },