details:   /erp/devel/pi/rev/1f1c212343cc
changeset: 7429:1f1c212343cc
user:      Martin Taal <martin.taal <at> openbravo.com>
date:      Wed May 26 07:52:02 2010 +0200
summary:   fixes issue 13350: The entity access checker is initialized in the 
context of the user, gives access denied exception

diffstat:

 src/org/openbravo/dal/security/EntityAccessChecker.java |  135 ++++++++-------
 1 files changed, 70 insertions(+), 65 deletions(-)

diffs (157 lines):

diff -r a7646b38b75a -r 1f1c212343cc 
src/org/openbravo/dal/security/EntityAccessChecker.java
--- a/src/org/openbravo/dal/security/EntityAccessChecker.java   Tue May 25 
21:08:27 2010 +0200
+++ b/src/org/openbravo/dal/security/EntityAccessChecker.java   Wed May 26 
07:52:02 2010 +0200
@@ -100,83 +100,88 @@
    */
   public void initialize() {
 
-    final ModelProvider mp = ModelProvider.getInstance();
-    final String userLevel = obContext.getUserLevel();
+    OBContext.setAdminMode();
+    try {
+      final ModelProvider mp = ModelProvider.getInstance();
+      final String userLevel = obContext.getUserLevel();
 
-    // Don't use dal because otherwise we can end up in infinite loops
-    final String qryStr = "select wa from " + WindowAccess.class.getName() + " 
wa where role.id='"
-        + getRoleId() + "'";
-    final Query qry = SessionHandler.getInstance().createQuery(qryStr);
-    @SuppressWarnings("unchecked")
-    final List<WindowAccess> was = qry.list();
-    for (final WindowAccess wa : was) {
-      final Window w = wa.getWindow();
-      final boolean writeAccess = wa.isEditableField();
-      // get the ttabs
-      final String tfQryStr = "select t from " + Tab.class.getName() + " t 
where window.id='"
-          + w.getId() + "'";
+      // Don't use dal because otherwise we can end up in infinite loops
+      final String qryStr = "select wa from " + WindowAccess.class.getName()
+          + " wa where role.id='" + getRoleId() + "'";
+      final Query qry = SessionHandler.getInstance().createQuery(qryStr);
       @SuppressWarnings("unchecked")
-      final List<Tab> ts = 
SessionHandler.getInstance().createQuery(tfQryStr).list();
-      for (final Tab t : ts) {
-        final String tableName = t.getTable().getDBTableName();
-        final Entity e = mp.getEntityByTableName(tableName);
-        if (e == null) { // happens for AD_Client_Info and views
-          continue;
-        }
+      final List<WindowAccess> was = qry.list();
+      for (final WindowAccess wa : was) {
+        final Window w = wa.getWindow();
+        final boolean writeAccess = wa.isEditableField();
+        // get the ttabs
+        final String tfQryStr = "select t from " + Tab.class.getName() + " t 
where window.id='"
+            + w.getId() + "'";
+        @SuppressWarnings("unchecked")
+        final List<Tab> ts = 
SessionHandler.getInstance().createQuery(tfQryStr).list();
+        for (final Tab t : ts) {
+          final String tableName = t.getTable().getDBTableName();
+          final Entity e = mp.getEntityByTableName(tableName);
+          if (e == null) { // happens for AD_Client_Info and views
+            continue;
+          }
 
-        final String accessLevel = t.getTable().getDataAccessLevel();
-        if (!hasCorrectAccessLevel(userLevel, accessLevel)) {
-          continue;
-        }
+          final String accessLevel = t.getTable().getDataAccessLevel();
+          if (!hasCorrectAccessLevel(userLevel, accessLevel)) {
+            continue;
+          }
 
-        if (writeAccess) {
-          writableEntities.add(e);
-          readableEntities.add(e);
-        } else {
-          readableEntities.add(e);
+          if (writeAccess) {
+            writableEntities.add(e);
+            readableEntities.add(e);
+          } else {
+            readableEntities.add(e);
+          }
         }
       }
-    }
 
-    // and take into account table access
-    final String tafQryStr = "select ta from " + TableAccess.class.getName()
-        + " ta where role.id='" + getRoleId() + "'";
-    @SuppressWarnings("unchecked")
-    final List<TableAccess> tas = 
SessionHandler.getInstance().createQuery(tafQryStr).list();
-    for (final TableAccess ta : tas) {
-      final String tableName = ta.getTable().getName();
-      final Entity e = mp.getEntity(tableName);
+      // and take into account table access
+      final String tafQryStr = "select ta from " + TableAccess.class.getName()
+          + " ta where role.id='" + getRoleId() + "'";
+      @SuppressWarnings("unchecked")
+      final List<TableAccess> tas = 
SessionHandler.getInstance().createQuery(tafQryStr).list();
+      for (final TableAccess ta : tas) {
+        final String tableName = ta.getTable().getName();
+        final Entity e = mp.getEntity(tableName);
 
-      if (ta.isExclude()) {
-        readableEntities.remove(e);
-        writableEntities.remove(e);
-        nonReadableEntities.add(e);
-      } else if (ta.isReadOnly()) {
-        writableEntities.remove(e);
-        readableEntities.add(e);
-        nonReadableEntities.remove(e);
-      } else {
-        if (!writableEntities.contains(e)) {
-          writableEntities.add(e);
-        }
-        if (!readableEntities.contains(e)) {
+        if (ta.isExclude()) {
+          readableEntities.remove(e);
+          writableEntities.remove(e);
+          nonReadableEntities.add(e);
+        } else if (ta.isReadOnly()) {
+          writableEntities.remove(e);
           readableEntities.add(e);
-        }
-        nonReadableEntities.remove(e);
-      }
-    }
-
-    // and compute the derived readable
-    for (final Entity e : readableEntities) {
-      for (final Property p : e.getProperties()) {
-        if (p.getTargetEntity() != null && 
!readableEntities.contains(p.getTargetEntity())) {
-          derivedReadableEntities.add(p.getTargetEntity());
-          addDerivedReadableIdentifierProperties(p.getTargetEntity());
+          nonReadableEntities.remove(e);
+        } else {
+          if (!writableEntities.contains(e)) {
+            writableEntities.add(e);
+          }
+          if (!readableEntities.contains(e)) {
+            readableEntities.add(e);
+          }
+          nonReadableEntities.remove(e);
         }
       }
+
+      // and compute the derived readable
+      for (final Entity e : readableEntities) {
+        for (final Property p : e.getProperties()) {
+          if (p.getTargetEntity() != null && 
!readableEntities.contains(p.getTargetEntity())) {
+            derivedReadableEntities.add(p.getTargetEntity());
+            addDerivedReadableIdentifierProperties(p.getTargetEntity());
+          }
+        }
+      }
+
+      isInitialized = true;
+    } finally {
+      OBContext.restorePreviousMode();
     }
-
-    isInitialized = true;
   }
 
   /**

------------------------------------------------------------------------------

_______________________________________________
Openbravo-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to