details: /erp/devel/pi/rev/120af24b8412
changeset: 8577:120af24b8412
user: Adrián Romero <adrianromero <at> openbravo.com>
date: Wed Oct 20 18:35:09 2010 +0200
summary: Fixes issue 0014750: I can not access to the application when there
are many organizations.
It has been modified the logic that builds the list of organizations reading
directly the table AD_ROLE_ORGACCESS instead the ORGLIST and CLIENTLIST fields
The fields ORGLIST and CLIENTLIST has been marked as deprecated
The AD_ROLE_ORG_ACCESS has been shielded if the organizations list or clients
list is too long
diffstat:
src-db/database/model/triggers/AD_ROLE_ORGACCESS_TRG.xml | 18 ++-
src-db/database/sourcedata/AD_COLUMN.xml | 4 +-
src-db/database/sourcedata/AD_VAL_RULE.xml | 2 +-
src/org/openbravo/base/secureApp/DefaultOptions_data.xsql | 2 +-
src/org/openbravo/base/secureApp/LoginUtils.java | 57 +++++++++++-
src/org/openbravo/base/secureApp/Seguridad_data.xsql | 9 +-
src/org/openbravo/erpCommon/ad_forms/Role.java | 4 +-
src/org/openbravo/erpCommon/ad_forms/RoleCombo_data.xsql | 4 +-
src/org/openbravo/erpCommon/ad_process/ClientCombo_data.xsql | 5 +-
9 files changed, 84 insertions(+), 21 deletions(-)
diffs (242 lines):
diff -r f1e98b6f7415 -r 120af24b8412
src-db/database/model/triggers/AD_ROLE_ORGACCESS_TRG.xml
--- a/src-db/database/model/triggers/AD_ROLE_ORGACCESS_TRG.xml Wed Oct 20
16:55:10 2010 +0200
+++ b/src-db/database/model/triggers/AD_ROLE_ORGACCESS_TRG.xml Wed Oct 20
18:35:09 2010 +0200
@@ -61,17 +61,21 @@
)
LOOP
IF(v_Client_ID <> Cur_Org.AD_Client_ID) THEN
- v_Client_ID:=Cur_Org.AD_Client_ID;
- IF(LENGTH(v_ClientList) <> 0) THEN
- v_ClientList:=v_ClientList || ',';
+ IF (v_ClientList IS NULL OR (LENGTH(v_ClientList) +
LENGTH(Cur_Org.AD_Client_ID) + 1 < 2000)) THEN
+ v_Client_ID:=Cur_Org.AD_Client_ID;
+ IF(LENGTH(v_ClientList) <> 0) THEN
+ v_ClientList:=v_ClientList || ',';
+ END IF;
+ v_ClientList:=v_ClientList || Cur_Org.AD_Client_ID;
END IF;
- v_ClientList:=v_ClientList || Cur_Org.AD_Client_ID;
END IF;
-- Org
- IF(LENGTH(v_OrgList) <> 0) THEN
- v_OrgList:=v_OrgList || ',';
+ IF (v_OrgList IS NULL OR (LENGTH(v_OrgList) + LENGTH(Cur_Org.AD_Org_ID)
+ 1 < 2000)) THEN
+ IF(LENGTH(v_OrgList) <> 0) THEN
+ v_OrgList:=v_OrgList || ',';
+ END IF;
+ v_OrgList:=v_OrgList || Cur_Org.AD_Org_ID;
END IF;
- v_OrgList:=v_OrgList || Cur_Org.AD_Org_ID;
END LOOP;
-- Org
--
diff -r f1e98b6f7415 -r 120af24b8412 src-db/database/sourcedata/AD_COLUMN.xml
--- a/src-db/database/sourcedata/AD_COLUMN.xml Wed Oct 20 16:55:10 2010 +0200
+++ b/src-db/database/sourcedata/AD_COLUMN.xml Wed Oct 20 18:35:09 2010 +0200
@@ -8113,7 +8113,7 @@
<!--535--> <ISSESSIONATTR><![CDATA[N]]></ISSESSIONATTR>
<!--535--> <ISSECONDARYKEY><![CDATA[N]]></ISSECONDARYKEY>
<!--535--> <ISDESENCRYPTABLE><![CDATA[N]]></ISDESENCRYPTABLE>
-<!--535--> <DEVELOPMENTSTATUS><![CDATA[RE]]></DEVELOPMENTSTATUS>
+<!--535--> <DEVELOPMENTSTATUS><![CDATA[DP]]></DEVELOPMENTSTATUS>
<!--535--> <AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID>
<!--535--> <POSITION><![CDATA[12]]></POSITION>
<!--535--> <ISTRANSIENT><![CDATA[N]]></ISTRANSIENT>
@@ -8146,7 +8146,7 @@
<!--536--> <ISSESSIONATTR><![CDATA[N]]></ISSESSIONATTR>
<!--536--> <ISSECONDARYKEY><![CDATA[N]]></ISSECONDARYKEY>
<!--536--> <ISDESENCRYPTABLE><![CDATA[N]]></ISDESENCRYPTABLE>
-<!--536--> <DEVELOPMENTSTATUS><![CDATA[RE]]></DEVELOPMENTSTATUS>
+<!--536--> <DEVELOPMENTSTATUS><![CDATA[DP]]></DEVELOPMENTSTATUS>
<!--536--> <AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID>
<!--536--> <POSITION><![CDATA[13]]></POSITION>
<!--536--> <ISTRANSIENT><![CDATA[N]]></ISTRANSIENT>
diff -r f1e98b6f7415 -r 120af24b8412 src-db/database/sourcedata/AD_VAL_RULE.xml
--- a/src-db/database/sourcedata/AD_VAL_RULE.xml Wed Oct 20 16:55:10
2010 +0200
+++ b/src-db/database/sourcedata/AD_VAL_RULE.xml Wed Oct 20 18:35:09
2010 +0200
@@ -1055,7 +1055,7 @@
<!--800022--> <NAME><![CDATA[AD_Client of Role]]></NAME>
<!--800022--> <DESCRIPTION><![CDATA[Filter Role's Clients]]></DESCRIPTION>
<!--800022--> <TYPE><![CDATA[S]]></TYPE>
-<!--800022--> <CODE><![CDATA[AD_CLIENT.AD_CLIENT_ID IN (SELECT CLIENTLIST
FROM AD_ROLE WHERE AD_ROLE_ID = @Default_AD_Role_ID@)]]></CODE>
+<!--800022--> <CODE><![CDATA[AD_CLIENT.ISACTIVE = 'Y' AND EXISTS (SELECT 1
FROM AD_ROLE_ORGACCESS WHERE AD_ROLE_ORGACCESS.AD_CLIENT_ID =
AD_CLIENT.AD_CLIENT_ID AND AD_ROLE_ORGACCESS.AD_ROLE_ID = @Default_AD_Role_ID@
AND AD_ROLE_ORGACCESS.ISACTIVE = 'Y')]]></CODE>
<!--800022--> <AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID>
<!--800022--></AD_VAL_RULE>
diff -r f1e98b6f7415 -r 120af24b8412
src/org/openbravo/base/secureApp/DefaultOptions_data.xsql
--- a/src/org/openbravo/base/secureApp/DefaultOptions_data.xsql Wed Oct 20
16:55:10 2010 +0200
+++ b/src/org/openbravo/base/secureApp/DefaultOptions_data.xsql Wed Oct 20
18:35:09 2010 +0200
@@ -151,7 +151,7 @@
<SqlMethod name="getDefaultClient" type="preparedStatement" return="string">
<SqlMethodComment></SqlMethodComment>
<Sql><![CDATA[
- SELECT CLIENTLIST AS DEFAULT_AD_CLIENT_ID
+ SELECT role.AD_CLIENT_ID AS DEFAULT_AD_CLIENT_ID
FROM AD_ROLE role
INNER JOIN AD_CLIENT client
ON role.AD_CLIENT_ID = client.AD_CLIENT_ID
diff -r f1e98b6f7415 -r 120af24b8412
src/org/openbravo/base/secureApp/LoginUtils.java
--- a/src/org/openbravo/base/secureApp/LoginUtils.java Wed Oct 20 16:55:10
2010 +0200
+++ b/src/org/openbravo/base/secureApp/LoginUtils.java Wed Oct 20 18:35:09
2010 +0200
@@ -11,6 +11,7 @@
*/
package org.openbravo.base.secureApp;
+import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
@@ -19,9 +20,12 @@
import org.openbravo.base.exception.OBException;
import org.openbravo.base.exception.OBSecurityException;
import org.openbravo.dal.core.OBContext;
+import org.openbravo.dal.service.OBDal;
+import org.openbravo.dal.service.OBQuery;
import org.openbravo.database.ConnectionProvider;
import org.openbravo.erpCommon.businessUtility.Preferences;
import org.openbravo.erpCommon.utility.Utility;
+import org.openbravo.model.ad.access.RoleOrganization;
import org.openbravo.model.ad.domain.Preference;
import org.openbravo.service.db.DalConnectionProvider;
import org.openbravo.utils.FormatUtilities;
@@ -121,6 +125,52 @@
return valid;
}
+ public static List<RoleOrganization> loadRoleOrganization(String strRol) {
+
+ OBContext.setAdminMode();
+ try {
+ List parameters = new ArrayList();
+ parameters.add(strRol);
+ OBQuery query = OBDal.getInstance().createQuery(RoleOrganization.class,
+ "WHERE role.id = ? ORDER BY client.id, organization.id", parameters);
+ query.setFilterOnReadableClients(false);
+ query.setFilterOnReadableOrganization(false);
+ return query.list();
+ } finally {
+ OBContext.restorePreviousMode();
+ }
+ }
+
+ public static String buildClientList(List<RoleOrganization> roleorglist) {
+ StringBuilder clientlist = new StringBuilder();
+ String currentclient = null;
+ for (RoleOrganization roleorg : roleorglist) {
+ if (currentclient == null ||
!currentclient.equals(roleorg.getClient().getId())) {
+ currentclient = roleorg.getClient().getId();
+ if (clientlist.length() > 0) {
+ clientlist.append(',');
+ }
+ clientlist.append('\'');
+ clientlist.append(roleorg.getClient().getId());
+ clientlist.append('\'');
+ }
+ }
+ return clientlist.toString();
+ }
+
+ public static String buildOrgList(List<RoleOrganization> roleorglist) {
+ StringBuilder orglist = new StringBuilder();
+ for (RoleOrganization roleorg : roleorglist) {
+ if (orglist.length() > 0) {
+ orglist.append(',');
+ }
+ orglist.append('\'');
+ orglist.append(roleorg.getOrganization().getId());
+ orglist.append('\'');
+ }
+ return orglist.toString();
+ }
+
public static boolean fillSessionArguments(ConnectionProvider conn,
VariablesSecureApp vars,
String strUserAuth, String strLanguage, String strIsRTL, String strRol,
String strCliente,
String strOrg, String strAlmacen) throws ServletException {
@@ -174,9 +224,12 @@
OBContext.setOBContext(currentContext);
return false;
}
+
+ List<RoleOrganization> datarolelist = loadRoleOrganization(strRol);
+
vars.setSessionValue("#User_Level", data[0].userlevel);
- vars.setSessionValue("#User_Client", data[0].clientlist);
- vars.setSessionValue("#User_Org", data[0].orglist);
+ vars.setSessionValue("#User_Client", buildClientList(datarolelist));
+ vars.setSessionValue("#User_Org", buildOrgList(datarolelist));
vars.setSessionValue("#Approval_C_Currency_ID", data[0].cCurrencyId);
vars.setSessionValue("#Approval_Amt", data[0].amtapproval);
vars.setSessionValue("#Client_Value", data[0].value);
diff -r f1e98b6f7415 -r 120af24b8412
src/org/openbravo/base/secureApp/Seguridad_data.xsql
--- a/src/org/openbravo/base/secureApp/Seguridad_data.xsql Wed Oct 20
16:55:10 2010 +0200
+++ b/src/org/openbravo/base/secureApp/Seguridad_data.xsql Wed Oct 20
18:35:09 2010 +0200
@@ -72,9 +72,12 @@
<SqlMethodComment></SqlMethodComment>
<Sql>
SELECT COUNT(*) AS TOTAL
- FROM AD_CLIENT A_C
- WHERE A_C.AD_CLIENT_ID IN (SELECT CLIENTLIST FROM AD_ROLE WHERE
AD_ROLE_ID = ?)
- AND A_C.AD_CLIENT_ID = ?
+ FROM AD_ROLE_ORGACCESS, AD_CLIENT
+ WHERE AD_ROLE_ORGACCESS.AD_CLIENT_ID = AD_CLIENT.AD_CLIENT_ID
+ AND AD_ROLE_ORGACCESS.AD_ROLE_ID = ?
+ AND AD_ROLE_ORGACCESS.AD_CLIENT_ID = ?
+ AND AD_ROLE_ORGACCESS.ISACTIVE = 'Y'
+ AND AD_CLIENT.ISACTIVE ='Y'
</Sql>
<Parameter name="rol"/>
<Parameter name="client"/>
diff -r f1e98b6f7415 -r 120af24b8412
src/org/openbravo/erpCommon/ad_forms/Role.java
--- a/src/org/openbravo/erpCommon/ad_forms/Role.java Wed Oct 20 16:55:10
2010 +0200
+++ b/src/org/openbravo/erpCommon/ad_forms/Role.java Wed Oct 20 18:35:09
2010 +0200
@@ -217,10 +217,12 @@
if (plaindataclient != null) {
for (int i = 0; i < datarole.length; i++) {
- StringTokenizer st = new StringTokenizer(datarole[i].clientlist, ",",
false);
+ String clientlist =
LoginUtils.buildClientList(LoginUtils.loadRoleOrganization(datarole[i].adRoleId));
+ StringTokenizer st = new StringTokenizer(clientlist, ",", false);
while (st.hasMoreTokens()) {
String token = st.nextToken().trim();
+ token = token.substring(1, token.length() -1); // remove quotes
ClientData auxClient = new ClientData();
auxClient.padre = datarole[i].adRoleId;
auxClient.id = token;
diff -r f1e98b6f7415 -r 120af24b8412
src/org/openbravo/erpCommon/ad_forms/RoleCombo_data.xsql
--- a/src/org/openbravo/erpCommon/ad_forms/RoleCombo_data.xsql Wed Oct 20
16:55:10 2010 +0200
+++ b/src/org/openbravo/erpCommon/ad_forms/RoleCombo_data.xsql Wed Oct 20
18:35:09 2010 +0200
@@ -27,7 +27,7 @@
<SqlMethod name="select" type="preparedStatement" return="multiple">
<SqlMethodComment></SqlMethodComment>
<Sql>
- SELECT A_R.AD_ROLE_ID, A_R.NAME, A_R.AD_CLIENT_ID, A_R.CLIENTLIST
+ SELECT A_R.AD_ROLE_ID, A_R.NAME, A_R.AD_CLIENT_ID
FROM AD_ROLE A_R, AD_USER_ROLES A_U_R
WHERE A_R.AD_ROLE_ID = A_U_R.AD_ROLE_ID
AND A_U_R.ISACTIVE = 'Y'
@@ -40,7 +40,7 @@
<SqlMethod name="selectSystem" type="preparedStatement" return="multiple">
<Sql>
- SELECT A_R.AD_ROLE_ID, A_R.NAME, A_R.AD_CLIENT_ID, A_R.CLIENTLIST
+ SELECT A_R.AD_ROLE_ID, A_R.NAME, A_R.AD_CLIENT_ID
FROM AD_ROLE A_R, AD_USER_ROLES A_U_R
WHERE A_R.AD_ROLE_ID = A_U_R.AD_ROLE_ID
AND A_U_R.ISACTIVE = 'Y'
diff -r f1e98b6f7415 -r 120af24b8412
src/org/openbravo/erpCommon/ad_process/ClientCombo_data.xsql
--- a/src/org/openbravo/erpCommon/ad_process/ClientCombo_data.xsql Wed Oct
20 16:55:10 2010 +0200
+++ b/src/org/openbravo/erpCommon/ad_process/ClientCombo_data.xsql Wed Oct
20 18:35:09 2010 +0200
@@ -27,9 +27,10 @@
<SqlMethod name="select" type="preparedStatement" return="multiple">
<SqlMethodComment></SqlMethodComment>
<Sql>
- SELECT A_C.AD_CLIENT_ID, A_C.NAME, '' AS ID
+ SELECT A_C.AD_CLIENT_ID, A_C.NAME, '' AS ID
FROM AD_CLIENT A_C
- WHERE A_C.AD_CLIENT_ID IN (SELECT CLIENTLIST FROM AD_ROLE WHERE
AD_ROLE_ID = ?)
+ WHERE A_C.ISACTIVE = 'Y'
+ AND EXISTS (SELECT 1 FROM AD_ROLE_ORGACCESS WHERE
AD_ROLE_ORGACCESS.AD_CLIENT_ID = A_C.AD_CLIENT_ID AND
AD_ROLE_ORGACCESS.AD_ROLE_ID = ? AND AD_ROLE_ORGACCESS.ISACTIVE = 'Y')
ORDER BY A_C.NAME
</Sql>
<Parameter name="rol"/>
------------------------------------------------------------------------------
Nokia and AT&T present the 2010 Calling All Innovators-North America contest
Create new apps & games for the Nokia N8 for consumers in U.S. and Canada
$10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing
Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store
http://p.sf.net/sfu/nokia-dev2dev
_______________________________________________
Openbravo-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbravo-commits