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

Reply via email to