IDEMPIERE-358 Login- how to make unique and safe
This commit is contained in:
parent
3d8114fd41
commit
85abedd47f
|
@ -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
|
||||
;
|
||||
|
|
@ -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
|
||||
;
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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() );
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" }
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" }
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" }
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" }
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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" },
|
||||
|
|
Loading…
Reference in New Issue