From 3e46884c58cb83f5a043edad91da31e29812720a Mon Sep 17 00:00:00 2001
From: Patrick Dowler <patrick.dowler@nrc-cnrc.gc.ca>
Date: Tue, 18 Aug 2015 16:35:31 -0700
Subject: [PATCH] implemented public-attribute-only get option so caller
 doesn't need permission to get a member group

---
 .../nrc/cadc/ac/server/ldap/LdapGroupDAO.java | 49 +++++++++----------
 1 file changed, 24 insertions(+), 25 deletions(-)

diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java
index 5b9f4d72..30724be6 100755
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java
@@ -112,11 +112,15 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
 {
     private static final Logger logger = Logger.getLogger(LdapGroupDAO.class);
     
-    private static String[] GROUP_ATTRS = new String[] 
+    private static final String[] PUB_GROUP_ATTRS = new String[] 
+    { 
+        "entrydn", "cn"
+    };
+    private static final String[] GROUP_ATTRS = new String[] 
     { 
         "entrydn", "cn", "nsaccountlock", "owner", "modifytimestamp", "description"
     };
-    private static String[] GROUP_AND_MEMBER_ATTRS = new String[] 
+    private static final String[] GROUP_AND_MEMBER_ATTRS = new String[] 
     { 
         "entrydn", "cn", "nsaccountlock", "owner", "modifytimestamp", "description", "uniquemember"
     };
@@ -399,35 +403,26 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
         throws GroupNotFoundException, TransientException,
                AccessControlException
     {
-        return getGroup(groupID, true);
-    }
-    
-    private Group getGroup(final String groupID, final boolean withMembers)
-        throws GroupNotFoundException, TransientException,
-               AccessControlException
-    {
-        Group group = getGroup(getGroupDN(groupID), groupID, withMembers);
+        Group group = getGroup(getGroupDN(groupID), groupID, GROUP_AND_MEMBER_ATTRS);
         
-        Group adminGroup = getGroup(getAdminGroupDN(groupID), null, true);
+        Group adminGroup = getGroup(getAdminGroupDN(groupID), null, GROUP_AND_MEMBER_ATTRS);
         
         group.getGroupAdmins().addAll(adminGroup.getGroupMembers());
         group.getUserAdmins().addAll(adminGroup.getUserMembers());
+        
         return group;
     }
     
-    // groupID is here so eceptions and loggiong have plain groupID instead of DN
-    private Group getGroup(final DN groupDN, final String xgroupID, final boolean withMembers)
+    // groupID is here so exceptions and loggiong have plain groupID instead of DN
+    private Group getGroup(final DN groupDN, final String xgroupID, String[] attributes)
         throws GroupNotFoundException, TransientException, 
                AccessControlException
     {
-        logger.debug("getGroup: " + groupDN + " members: " + withMembers);
+        logger.debug("getGroup: " + groupDN + " attrs: " + attributes.length);
         String loggableGroupID = xgroupID;
         if (loggableGroupID == null)
             loggableGroupID = groupDN.toString(); // member or admin group: same name, internal tree
         
-        String[] attributes = GROUP_ATTRS;
-        if (withMembers)
-            attributes = GROUP_AND_MEMBER_ATTRS;
         try
         {
             Filter filter = Filter.createNOTFilter(Filter.createPresenceFilter("nsaccountlock"));
@@ -450,7 +445,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
                 throw new GroupNotFoundException(loggableGroupID);
             }
             
-            Group ldapGroup = createGroupFromEntry(searchEntry);
+            Group ldapGroup = createGroupFromEntry(searchEntry, attributes);
             
             if (searchEntry.getAttributeValues("uniquemember") != null)
             {
@@ -475,7 +470,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
                     {
                         try
                         {
-                            ldapGroup.getGroupMembers().add(getGroup(memberDN, null, false));
+                            ldapGroup.getGroupMembers().add(getGroup(memberDN, null, PUB_GROUP_ATTRS));
                         }
                         catch(GroupNotFoundException e)
                         {
@@ -673,7 +668,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
         throws GroupNotFoundException, TransientException,
                AccessControlException
     {
-        Group group = getGroup(groupDN, groupID, true);
+        Group group = getGroup(groupDN, groupID, GROUP_AND_MEMBER_ATTRS);
         List<Modification> modifs = new ArrayList<Modification>();
         modifs.add(new Modification(ModificationType.ADD, "nsaccountlock", "true"));
         
@@ -711,7 +706,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
         
         try
         {
-            getGroup(getGroupDN(group.getID()), null, false);
+            getGroup(getGroupDN(group.getID()), null, GROUP_ATTRS);
             throw new RuntimeException("BUG: group not deleted " + group.getID());
         }
         catch (GroupNotFoundException ignore) { }
@@ -778,7 +773,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
                     }
                     try
                     {
-                        Group g = getGroup(groupDN, null, false);
+                        Group g = getGroup(groupDN, null, GROUP_ATTRS);
                         logger.debug("found group: " + g.getID());
                         ret.add(g);
                     }
@@ -831,7 +826,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
             SearchResult results = getConnection().search(searchRequest);
             for (SearchResultEntry result : results.getSearchEntries())
             {
-                ret.add(createGroupFromEntry(result));
+                ret.add(createGroupFromEntry(result, GROUP_ATTRS));
             }
         }
         catch (LDAPException e1)
@@ -842,15 +837,19 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
         return ret; 
     }
     
-    private Group createGroupFromEntry(SearchResultEntry result)
+    private Group createGroupFromEntry(SearchResultEntry result, String[] attributes)
         throws LDAPException
     {
         if (result.getAttribute("nsaccountlock") != null)
         {
             throw new RuntimeException("BUG: found group with nsaccountlock set: " + result.getAttributeValue("entrydn").toString());  
         }
+        
         String entryDN = result.getAttributeValue("entrydn");
         String groupName = result.getAttributeValue("cn");
+        if (attributes == PUB_GROUP_ATTRS)
+            return new Group(groupName);
+        
         DN ownerDN = result.getAttributeValueAsDN("owner");
         if (ownerDN == null)
             throw new AccessControlException(groupName);
@@ -973,7 +972,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
     {
         try
         {
-            Group g = getGroup(groupID, false);
+            Group g = getGroup(getGroupDN(groupID), groupID, GROUP_ATTRS);
             return true;
         }
         catch(GroupNotFoundException ex)
-- 
GitLab