[cvs] expresso commit by lhamel: protect against retrieved fields not

JCorporate Ltd jcorp at jcorporate.com
Tue Jun 27 07:06:47 UTC 2006


Log Message:
-----------
protect against retrieved fields not including key(s)

Modified Files:
--------------
    expresso/expresso-web/WEB-INF/src/com/jcorporate/expresso/core/dbobj:
        RowSecuredDBObject.java

Revision Data
-------------
Index: RowSecuredDBObject.java
===================================================================
RCS file: /home/javacorp/.cvs/expresso/expresso/expresso-web/WEB-INF/src/com/jcorporate/expresso/core/dbobj/RowSecuredDBObject.java,v
retrieving revision 1.55
retrieving revision 1.56
diff -Lexpresso-web/WEB-INF/src/com/jcorporate/expresso/core/dbobj/RowSecuredDBObject.java -Lexpresso-web/WEB-INF/src/com/jcorporate/expresso/core/dbobj/RowSecuredDBObject.java -u -r1.55 -r1.56
--- expresso-web/WEB-INF/src/com/jcorporate/expresso/core/dbobj/RowSecuredDBObject.java
+++ expresso-web/WEB-INF/src/com/jcorporate/expresso/core/dbobj/RowSecuredDBObject.java
@@ -76,10 +76,7 @@
 import com.jcorporate.expresso.services.dbobj.Setup;
 import com.jcorporate.expresso.services.dbobj.UserGroup;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
 
 
 /**
@@ -1017,13 +1014,33 @@
      */
     public synchronized int count() throws DBException {
         // todo after redesign of security system, rewrite to be a join that uses SQL count
+        RowSecuredDBObject search = null;
+        if (retrieveFields == null) {
+            // signal for all fields is no fields chosen--just fine to search with this obj
+            search = this;
+        } else {
+            // do we have key fields chosen?
+            boolean willRetrieveKeys = true;
+            Set retrieved = retrieveFields.keySet();
+            for (Iterator i = getMetaData().getKeyFieldListArray().iterator(); i.hasNext();) {
+                if ( !retrieved.contains((String) i.next()) ) {
+                    willRetrieveKeys = false;
+                    break;
+                }
+            }
 
-        // set just one field to be retrieved. whatever is the first field in the list
-        DBField field = (DBField) getDef().getAllFieldsIterator().next();
-
-        RowSecuredDBObject search = (RowSecuredDBObject) getThisDBObj();
-        search.setFieldsToRetrieve(field.getName());
-        search.copyAllFields(this);
+            // keys are necessary to check permissions; must retrieve them
+            if (!willRetrieveKeys) {
+                // use a clone that retrieves all
+                try {
+                    search = (RowSecuredDBObject) clone();
+                    search.retrieveFields = null;
+                    search.setFieldsToRetrieve(null);
+                } catch (CloneNotSupportedException e) {
+                    throw new DBException(e);
+                }
+            }
+        }
 
         return search.searchAndRetrieveList().size();
     }


More information about the cvs mailing list