diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java index cec987e802b558fa6ddb4cd58b7e7e964aa1039a..e0773cefe5011fef6e490ec3792761edf3aecb22 100755 --- a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java +++ b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java @@ -195,7 +195,6 @@ public class LdapGroupDAO extends LdapDAO } else { - // add group to groups tree LDAPResult result = addGroup(getGroupDN(group.getID()), group.getID(), ownerDN, @@ -211,7 +210,6 @@ public class LdapGroupDAO extends LdapDAO group.getUserAdmins(), group.getGroupAdmins()); LdapDAO.checkLdapResult(result.getResultCode()); - } } catch (LDAPException e) @@ -231,8 +229,7 @@ public class LdapGroupDAO extends LdapDAO { // add new group List<Attribute> attributes = new ArrayList<Attribute>(); - Attribute ownerAttribute = - new Attribute(LDAP_OWNER, ownerDN.toNormalizedString()); + Attribute ownerAttribute = new Attribute(LDAP_OWNER, ownerDN.toNormalizedString()); attributes.add(ownerAttribute); attributes.add(new Attribute(LDAP_OBJECT_CLASS, LDAP_GROUP_OF_UNIQUE_NAMES)); attributes.add(new Attribute(LDAP_OBJECT_CLASS, LDAP_INET_USER)); @@ -261,16 +258,12 @@ public class LdapGroupDAO extends LdapDAO } if (!members.isEmpty()) { - attributes.add(new Attribute(LDAP_UNIQUE_MEMBER, - (String[]) members - .toArray(new String[members - .size()]))); + attributes.add( + new Attribute(LDAP_UNIQUE_MEMBER, + (String[]) members.toArray(new String[members.size()]))); } AddRequest addRequest = new AddRequest(groupDN, attributes); - //addRequest.addControl( - // new ProxiedAuthorizationV2RequestControl( - // "dn:" + getSubjectDN().toNormalizedString())); logger.debug("addGroup: " + groupDN); return getReadWriteConnection().add(addRequest); @@ -299,16 +292,11 @@ public class LdapGroupDAO extends LdapDAO DN groupDN = getGroupDN(group.getID()); SearchRequest searchRequest = - new SearchRequest(groupDN.toNormalizedString(), SearchScope.BASE, filter, - new String[]{LDAP_NSACCOUNTLOCK}); + new SearchRequest(groupDN.toNormalizedString(), SearchScope.BASE, + filter, new String[]{LDAP_NSACCOUNTLOCK}); - //searchRequest.addControl( - // new ProxiedAuthorizationV2RequestControl("dn:" + - // getSubjectDN() - // .toNormalizedString())); - - SearchResultEntry searchResult = getReadWriteConnection() - .searchForEntry(searchRequest); + SearchResultEntry searchResult = + getReadWriteConnection().searchForEntry(searchRequest); if (searchResult == null) { @@ -376,19 +364,17 @@ public class LdapGroupDAO extends LdapDAO } if ((groupNames.size() % 100) == 0) { - - logger.debug("found: " + groupNames - .size() + " " + dt + "ms"); + logger.debug("found: " + groupNames.size() + + " " + dt + "ms"); t1 = t2; } } public void searchReferenceReturned(SearchResultReference srr) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + throw new UnsupportedOperationException("Not supported yet."); } - }, config - .getGroupsDN(), SearchScope.ONE, filter, PUB_GROUP_ATTRS); + }, config.getGroupsDN(), SearchScope.ONE, filter, PUB_GROUP_ATTRS); SearchResult searchResult = null; try @@ -419,8 +405,8 @@ public class LdapGroupDAO extends LdapDAO { logger.debug("getGroupNames Exception: " + e1, e1); LdapDAO.checkLdapResult(e1.getResultCode()); - throw new IllegalStateException("Unexpected exception: " + e1 - .getMatchedDN(), e1); + throw new IllegalStateException("Unexpected exception: " + + e1.getMatchedDN(), e1); } } @@ -453,7 +439,7 @@ public class LdapGroupDAO extends LdapDAO return group; } - // groupID is here so exceptions and loggiong have plain groupID instead of DN + // groupID is here so exceptions and logging have plain groupID instead of DN private Group getGroup(final DN groupDN, final String xgroupID, String[] attributes) throws GroupNotFoundException, TransientException, AccessControlException @@ -481,8 +467,8 @@ public class LdapGroupDAO extends LdapDAO if (searchEntry == null) { - String msg = "Group not found " + loggableGroupID; - logger.debug(msg + " cause: null"); + String msg = "Group not found " + loggableGroupID + " cause: null"; + logger.debug(msg); throw new GroupNotFoundException(loggableGroupID); } @@ -499,7 +485,7 @@ public class LdapGroupDAO extends LdapDAO User user; try { - user = userDAO.getX500User(memberDN); + user = userDAO.getUser(new DNPrincipal(member)); ldapGroup.getUserMembers().add(user); } catch (UserNotFoundException e) @@ -621,34 +607,24 @@ public class LdapGroupDAO extends LdapDAO } // modify the admin group - adminMods.add(new Modification(ModificationType.REPLACE, LDAP_UNIQUE_MEMBER, - (String[]) newAdmins - .toArray(new String[newAdmins - .size()]))); + adminMods.add( + new Modification(ModificationType.REPLACE, LDAP_UNIQUE_MEMBER, + (String[]) newAdmins.toArray(new String[newAdmins.size()]))); ModifyRequest adminModify = new ModifyRequest(getAdminGroupDN(group.getID()), adminMods); - //adminModify.addControl( - // new ProxiedAuthorizationV2RequestControl( - // "dn:" + getSubjectDN().toNormalizedString())); - LdapDAO.checkLdapResult( getReadWriteConnection().modify(adminModify).getResultCode()); // modify the group itself - mods.add(new Modification(ModificationType.REPLACE, LDAP_UNIQUE_MEMBER, - (String[]) newMembers - .toArray(new String[newMembers - .size()]))); + mods.add( + new Modification(ModificationType.REPLACE, LDAP_UNIQUE_MEMBER, + (String[]) newMembers.toArray(new String[newMembers.size()]))); ModifyRequest modifyRequest = new ModifyRequest(getGroupDN(group.getID()), mods); - //modifyRequest.addControl( - // new ProxiedAuthorizationV2RequestControl( - // "dn:" + getSubjectDN().toNormalizedString())); - LdapDAO.checkLdapResult( getReadWriteConnection().modify(modifyRequest).getResultCode()); } @@ -670,8 +646,8 @@ public class LdapGroupDAO extends LdapDAO } catch (GroupNotFoundException e) { - throw new RuntimeException("BUG: modified group not found (" + group - .getID() + ")"); + throw new RuntimeException("BUG: modified group not found (" + + group.getID() + ")"); } } @@ -757,13 +733,7 @@ public class LdapGroupDAO extends LdapDAO SearchRequest searchRequest = new SearchRequest( config.getGroupsDN(), SearchScope.SUB, filter, GROUP_ATTRS); - //searchRequest.addControl( - // new ProxiedAuthorizationV2RequestControl("dn:" + - // getSubjectDN() - // .toNormalizedString())); - - SearchResult results = getReadOnlyConnection() - .search(searchRequest); + SearchResult results = getReadOnlyConnection().search(searchRequest); for (SearchResultEntry result : results.getSearchEntries()) { ret.add(createGroupFromSearchResult(result, GROUP_ATTRS)); @@ -793,26 +763,25 @@ public class LdapGroupDAO extends LdapDAO return new Group(groupName); } - DN ownerDN = result.getAttributeValueAsDN(LDAP_OWNER); + String ownerDN = result.getAttributeValue(LDAP_OWNER); if (ownerDN == null) { throw new AccessControlException(groupName); } try { - User owner = userDAO.getX500User(ownerDN); - Group g = new Group(groupName); - setField(g, owner, LDAP_OWNER); + User owner = userDAO.getUser(new DNPrincipal(ownerDN)); + Group group = new Group(groupName); + setField(group, owner, LDAP_OWNER); if (result.hasAttribute(LDAP_DESCRIPTION)) { - g.description = result.getAttributeValue(LDAP_DESCRIPTION); + group.description = result.getAttributeValue(LDAP_DESCRIPTION); } if (result.hasAttribute(LDAP_MODIFY_TIMESTAMP)) { - g.lastModified = result - .getAttributeValueAsDate(LDAP_MODIFY_TIMESTAMP); + group.lastModified = result.getAttributeValueAsDate(LDAP_MODIFY_TIMESTAMP); } - return g; + return group; } catch (UserNotFoundException ex) { diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupPersistence.java b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupPersistence.java index 306e42bfa0efcecded209baa5904eaefcde1191f..7edcb42cb6a15aa16591af6bb523311af016f376 100755 --- a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupPersistence.java +++ b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupPersistence.java @@ -175,13 +175,14 @@ public class LdapGroupPersistence extends LdapPersistence implements GroupPersis GroupNotFoundException { Subject caller = AuthenticationUtil.getCurrentSubject(); - Principal owner = getUser(caller); - setField(group, owner, "owner"); + Principal userID = getUser(caller); LdapConnections conns = new LdapConnections(this); try { LdapUserDAO userDAO = new LdapUserDAO(conns); + User owner = userDAO.getAugmentedUser(userID); + setField(group, owner, "owner"); LdapGroupDAO groupDAO = new LdapGroupDAO(conns, userDAO); groupDAO.addGroup(group); } diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAO.java b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAO.java index f13d3f53a36337759fcdc1b921b5ec1b4670ca40..c94f68747c7a16b23016bdbb908386c4eeff1ae9 100755 --- a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAO.java +++ b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAO.java @@ -186,6 +186,7 @@ public class LdapUserDAO extends LdapDAO this.userLdapAttrib.put(HttpPrincipal.class, LDAP_UID); this.userLdapAttrib.put(X500Principal.class, LDAP_DISTINGUISHED_NAME); this.userLdapAttrib.put(NumericPrincipal.class, LDAP_NUMERICID); + this.userLdapAttrib.put(DNPrincipal.class, LDAP_ENTRYDN); // add the id attributes to user and member attributes String[] princs = userLdapAttrib.values() diff --git a/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAOTest.java b/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAOTest.java index 796a493d24301ffba489cf6661c965881f5390bf..25ae567285032d61301461207259a3b6163071a5 100644 --- a/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAOTest.java +++ b/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAOTest.java @@ -80,6 +80,7 @@ import javax.security.auth.Subject; import javax.security.auth.x500.X500Principal; import ca.nrc.cadc.ac.server.TestUtil; +import ca.nrc.cadc.auth.NumericPrincipal; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.junit.Assert; @@ -98,41 +99,14 @@ public class LdapGroupDAOTest extends AbstractLdapDAOTest { private static final Logger log = Logger.getLogger(LdapGroupDAOTest.class); - static String user1Username = "CadcDaoTest1"; - static String user2Username = "CadcDaoTest2"; - static String user3Username = "CadcDaoTest3"; - - static String user1UID = "cadcdaotest1"; - static String user2UID = "cadcdaotest2"; - static String user3UID = "cadcdaotest3"; - - static String user1DN = "cn=" + user1UID + ",ou=cadc,o=hia,c=ca"; - static String user2DN = "cn=" + user2UID + ",ou=cadc,o=hia,c=ca"; - static String user3DN = "cn=" + user3UID + ",ou=cadc,o=hia,c=ca"; - static String unknownDN = "cn=foo,ou=cadc,o=hia,c=ca"; - - static String user1EntryDN = "uid=cadcdaotest1,ou=users,ou=ds,dc=testcanfar"; - static String user2EntryDN = "uid=cadcdaotest2,ou=users,ou=ds,dc=testcanfar"; - static String user3EntryDN = "uid=cadcdaotest3,ou=users,ou=ds,dc=testcanfar"; - - static HttpPrincipal user1HttpPrincipal; - static HttpPrincipal user2HttpPrincipal; - static HttpPrincipal user3HttpPrincipal; - - static DNPrincipal user1DNPrincipal; - static DNPrincipal user2DNPrincipal; - static DNPrincipal user3DNPrincipal; - - static X500Principal user1X500Principal; - static X500Principal user2X500Principal; - static X500Principal user3X500Principal; - static X500Principal unknownPrincipal; - static User daoTestUser1; static User daoTestUser2; static User daoTestUser3; static User unknownUser; + static User augmentedDaoTestUser1; + static User augmentedDaoTestUser2; + static Subject daoTestUser1Subject; static Subject daoTestUser2Subject; static Subject anonSubject; @@ -148,47 +122,36 @@ public class LdapGroupDAOTest extends AbstractLdapDAOTest // get the configuration of the development server from and config files... config = getLdapConfig(); - user1HttpPrincipal = new HttpPrincipal(user1Username); - user2HttpPrincipal = new HttpPrincipal(user2Username); - user3HttpPrincipal = new HttpPrincipal(user3Username); - - user1X500Principal = new X500Principal(user1DN); - user2X500Principal = new X500Principal(user2DN); - user3X500Principal = new X500Principal(user3DN); - unknownPrincipal = new X500Principal(unknownDN); - - user1DNPrincipal = new DNPrincipal(user1EntryDN); - user2DNPrincipal = new DNPrincipal(user2EntryDN); - - daoTestUser1 = new User(); - daoTestUser1.getIdentities().add(user1X500Principal); - daoTestUser1.getIdentities().add(user1DNPrincipal); - daoTestUser1.getIdentities().add(user1HttpPrincipal); - daoTestUser2 = new User(); - daoTestUser2.getIdentities().add(user2X500Principal); - daoTestUser2.getIdentities().add(user2DNPrincipal); - daoTestUser2.getIdentities().add(user2HttpPrincipal); - daoTestUser3 = new User(); - daoTestUser3.getIdentities().add(user3X500Principal); - daoTestUser3.getIdentities().add(user3DNPrincipal); - daoTestUser3.getIdentities().add(user3HttpPrincipal); - unknownUser = new User(); - unknownUser.getIdentities().add(unknownPrincipal); + HttpPrincipal httpPrincipal1 = new HttpPrincipal("CadcDaoTest1"); + HttpPrincipal httpPrincipal2 = new HttpPrincipal("CadcDaoTest2"); + HttpPrincipal httpPrincipal3 = new HttpPrincipal("CadcDaoTest3"); + + daoTestUser1 = getUserDAO().getUser(httpPrincipal1); + daoTestUser2 = getUserDAO().getUser(httpPrincipal2); + daoTestUser3 = getUserDAO().getUser(httpPrincipal3); + augmentedDaoTestUser1 = getUserDAO().getAugmentedUser(httpPrincipal1); daoTestUser1Subject = new Subject(); - daoTestUser1Subject.getPrincipals().add(user1X500Principal); - daoTestUser1Subject.getPrincipals().add(user1DNPrincipal); - daoTestUser1Subject.getPrincipals().add(user1HttpPrincipal); + daoTestUser1Subject.getPrincipals().addAll(augmentedDaoTestUser1.getIdentities()); + augmentedDaoTestUser2 = getUserDAO().getAugmentedUser(httpPrincipal2); daoTestUser2Subject = new Subject(); - daoTestUser2Subject.getPrincipals().add(user2X500Principal); - daoTestUser2Subject.getPrincipals().add(user2DNPrincipal); - daoTestUser2Subject.getPrincipals().add(user2HttpPrincipal); + daoTestUser2Subject.getPrincipals().addAll(augmentedDaoTestUser2.getIdentities()); + + HttpPrincipal unknownPrincipal = new HttpPrincipal("foo"); + unknownUser = new User(); + unknownUser.getIdentities().add(unknownPrincipal); anonSubject = new Subject(); anonSubject.getPrincipals().add(unknownPrincipal); } + static LdapUserDAO getUserDAO() throws Exception + { + LdapConnections connections = new LdapConnections(config); + return new LdapUserDAO(connections); + } + LdapGroupDAO getGroupDAO() throws Exception { LdapConnections connections = new LdapConnections(config); @@ -212,7 +175,7 @@ public class LdapGroupDAOTest extends AbstractLdapDAOTest try { Group expectGroup = new Group(getGroupID()); - TestUtil.setField(expectGroup, daoTestUser1, "owner"); + TestUtil.setField(expectGroup, augmentedDaoTestUser1, "owner"); getGroupDAO().addGroup(expectGroup); Group actualGroup = getGroupDAO().getGroup(expectGroup.getID(), true); log.info("addGroup: " + expectGroup.getID()); @@ -227,7 +190,7 @@ public class LdapGroupDAOTest extends AbstractLdapDAOTest assertGroupsEqual(expectGroup, actualGroup); Group otherGroup = new Group(getGroupID()); - TestUtil.setField(otherGroup, daoTestUser1, "owner"); + TestUtil.setField(otherGroup, augmentedDaoTestUser1, "owner"); getGroupDAO().addGroup(otherGroup); otherGroup = getGroupDAO().getGroup(otherGroup.getID(), true); log.info("addGroup: " + otherGroup.getID()); @@ -252,7 +215,7 @@ public class LdapGroupDAOTest extends AbstractLdapDAOTest // the the returned result should contain only // one entry (the dn one) User duplicateIdentity = new User(); - duplicateIdentity.getIdentities().add(new HttpPrincipal(user2UID)); + duplicateIdentity.getIdentities().add(daoTestUser2.getHttpPrincipal()); expectGroup.getUserMembers().add(daoTestUser2); expectGroup.getUserMembers().add(duplicateIdentity); actualGroup = getGroupDAO().modifyGroup(expectGroup); @@ -287,7 +250,7 @@ public class LdapGroupDAOTest extends AbstractLdapDAOTest // groupAdmins Group adminGroup = new Group(getGroupID()); - TestUtil.setField(adminGroup, daoTestUser1, "owner"); + TestUtil.setField(adminGroup, augmentedDaoTestUser1, "owner"); getGroupDAO().addGroup(adminGroup); adminGroup = getGroupDAO().getGroup(adminGroup.getID(), true); expectGroup.getGroupAdmins().add(adminGroup); @@ -320,6 +283,7 @@ public class LdapGroupDAOTest extends AbstractLdapDAOTest // reactivate the group Group reactGroup = new Group(expectGroup.getID()); + TestUtil.setField(reactGroup, augmentedDaoTestUser1, "owner"); getGroupDAO().addGroup(reactGroup); log.info("create (reactivate) group: " + expectGroup.getID()); actualGroup = getGroupDAO().getGroup(expectGroup.getID(), true); @@ -332,7 +296,7 @@ public class LdapGroupDAOTest extends AbstractLdapDAOTest // create another group and make expected group // member of that group. Delete expected group after Group expectGroup2 = new Group(getGroupID()); - TestUtil.setField(expectGroup, daoTestUser1, "owner"); + TestUtil.setField(expectGroup2, augmentedDaoTestUser1, "owner"); expectGroup2.getGroupAdmins().add(actualGroup); expectGroup2.getGroupMembers().add(actualGroup); getGroupDAO().addGroup(expectGroup2);