diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapConfig.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapConfig.java index 9157966d3b1ca264d9575daf7ad5aca5a5889adf..17bd814f4431099e7c30f708ea4770c19e03f31f 100755 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapConfig.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapConfig.java @@ -68,12 +68,14 @@ */ package ca.nrc.cadc.ac.server.ldap; -import ca.nrc.cadc.util.StringUtil; import java.io.IOException; import java.net.URL; import java.util.Properties; + import org.apache.log4j.Logger; +import ca.nrc.cadc.util.StringUtil; + public class LdapConfig { private static final Logger logger = Logger.getLogger(LdapConfig.class); @@ -87,6 +89,9 @@ public class LdapConfig public static final String LDAP_USERS_DN = "usersDn"; public static final String LDAP_GROUPS_DN = "groupsDn"; public static final String LDAP_ADMIN_GROUPS_DN = "adminGroupsDn"; + + public static final String LDAP_AVAIL_TEST_GROUP = "availabilityTestGroup"; + public static final String LDAP_AVAIL_TEST_CALLING_USER_DN = "availabilityTestCallingUserDN"; private String usersDN; private String groupsDN; @@ -95,6 +100,9 @@ public class LdapConfig private int port; private String adminUserDN; private String adminPasswd; + + private String availabilityTestGroup; + private String availabilityTestCallingUserDN; public static LdapConfig getLdapConfig() { @@ -165,15 +173,36 @@ public class LdapConfig throw new RuntimeException("failed to read property " + LDAP_ADMIN_GROUPS_DN); } + + String availGroup = config.getProperty(LDAP_AVAIL_TEST_GROUP); + if (!StringUtil.hasText(availGroup)) + { + throw new RuntimeException("failed to read property " + + LDAP_AVAIL_TEST_GROUP); + } + + String availUser = config.getProperty(LDAP_AVAIL_TEST_CALLING_USER_DN); + if (!StringUtil.hasText(availUser)) + { + throw new RuntimeException("failed to read property " + + LDAP_AVAIL_TEST_CALLING_USER_DN); + } return new LdapConfig(server, Integer.valueOf(port), ldapAdmin, ldapPasswd, ldapUsersDn, ldapGroupsDn, - ldapAdminGroupsDn); + ldapAdminGroupsDn, availGroup, availUser); + } + + public LdapConfig(String server, int port, String adminUserDN, + String adminPasswd, String usersDN, String groupsDN, + String adminGroupsDN) + { + this(server, port, adminUserDN, adminPasswd, usersDN, groupsDN, adminGroupsDN, null, null); } public LdapConfig(String server, int port, String adminUserDN, String adminPasswd, String usersDN, String groupsDN, - String adminGroupsDN) + String adminGroupsDN, String availGroup, String availUser) { if (!StringUtil.hasText(server)) { @@ -204,6 +233,7 @@ public class LdapConfig { throw new IllegalArgumentException("Illegal admin groups LDAP DN"); } + this.server = server; this.port = port; @@ -212,6 +242,8 @@ public class LdapConfig this.usersDN = usersDN; this.groupsDN = groupsDN; this.adminGroupsDN = adminGroupsDN; + this.availabilityTestGroup = availGroup; + this.availabilityTestCallingUserDN = availUser; } public String getUsersDN() @@ -248,5 +280,15 @@ public class LdapConfig { return this.adminPasswd; } + + public String getAvailabilityTestGroup() + { + return this.availabilityTestGroup; + } + + public String getAvailabilityTestCallingUserDN() + { + return this.availabilityTestCallingUserDN; + } } diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapDAO.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapDAO.java index 287f9d283ad1eb6714cb695e648b76e0b9e7bb3d..c33961f36a8119f28f915b2405a4375127044558 100755 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapDAO.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapDAO.java @@ -196,21 +196,16 @@ public abstract class LdapDAO * @param errorMsg * @throws TransientException */ - protected static void checkLdapResult(ResultCode code, String errorMsg) + protected static void checkLdapResult(ResultCode code) throws TransientException { - String msg = ""; - if (errorMsg != null) - { - msg = "(" + errorMsg + ")"; - } if (code == ResultCode.INSUFFICIENT_ACCESS_RIGHTS) { - throw new AccessControlException("Not authorized " + msg); + throw new AccessControlException("Not authorized "); } else if (code == ResultCode.INVALID_CREDENTIALS) { - throw new AccessControlException("Invalid credentials " + msg); + throw new AccessControlException("Invalid credentials "); } else if ((code == ResultCode.SUCCESS) || (code == ResultCode.NO_SUCH_OBJECT) ) { @@ -218,16 +213,16 @@ public abstract class LdapDAO } else if (code == ResultCode.PARAM_ERROR) { - throw new IllegalArgumentException("Error in Ldap parameters " + msg); + throw new IllegalArgumentException("Error in Ldap parameters "); } else if (code == ResultCode.BUSY || code == ResultCode.CONNECT_ERROR ) { - throw new TransientException("Connection problems " + msg ); + throw new TransientException("Connection problems "); } else { - throw new RuntimeException("Ldap error" + msg); + throw new RuntimeException("Ldap error (" + code.getName() + ")"); } } 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 3223b21b7053126f0e58b7e646ee00b00e16eec2..6b0566c6a2f3580ce607e4e1aed6652a87a2dd0d 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 @@ -173,7 +173,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO group.description, group.getUserMembers(), group.getGroupMembers()); - LdapDAO.checkLdapResult(result.getResultCode(), null); + LdapDAO.checkLdapResult(result.getResultCode()); // add group to admin groups tree result = addGroup(getAdminGroupDN(group.getID()), @@ -181,7 +181,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO group.description, group.getUserAdmins(), group.getGroupAdmins()); - LdapDAO.checkLdapResult(result.getResultCode(), null); + LdapDAO.checkLdapResult(result.getResultCode()); try { @@ -195,8 +195,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e) { - LdapDAO.checkLdapResult(e.getResultCode(), - e.getDiagnosticMessage()); + LdapDAO.checkLdapResult(e.getResultCode()); throw new RuntimeException("Unexpected LDAP exception", e); } } @@ -302,7 +301,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e) { - LdapDAO.checkLdapResult(e.getResultCode(), e.getDiagnosticMessage()); + LdapDAO.checkLdapResult(e.getResultCode()); throw new RuntimeException("Unexpected LDAP exception", e); } } @@ -391,13 +390,13 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } else { - LdapDAO.checkLdapResult(e.getResultCode(), e.getMessage()); + LdapDAO.checkLdapResult(e.getResultCode()); } } if (searchResult.getEntryCount() == 0) { - LdapDAO.checkLdapResult(searchResult.getResultCode(), null); + LdapDAO.checkLdapResult(searchResult.getResultCode()); //access denied String msg = "Not authorized to access " + groupID; logger.debug(msg); @@ -485,7 +484,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e1) { - LdapDAO.checkLdapResult(e1.getResultCode(), e1.getDiagnosticMessage()); + LdapDAO.checkLdapResult(e1.getResultCode()); throw new GroupNotFoundException("Not found " + groupID); } } @@ -573,7 +572,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO new ProxiedAuthorizationV2RequestControl( "dn:" + getSubjectDN().toNormalizedString())); LdapDAO.checkLdapResult(getConnection(). - modify(modifyRequest).getResultCode(), null); + modify(modifyRequest).getResultCode()); // modify the group itself now modifyRequest = new ModifyRequest(getGroupDN(group.getID()), mods); @@ -582,11 +581,11 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO new ProxiedAuthorizationV2RequestControl( "dn:" + getSubjectDN().toNormalizedString())); LdapDAO.checkLdapResult(getConnection(). - modify(modifyRequest).getResultCode(), null); + modify(modifyRequest).getResultCode()); } catch (LDAPException e1) { - LdapDAO.checkLdapResult(e1.getResultCode(), e1.getDiagnosticMessage()); + LdapDAO.checkLdapResult(e1.getResultCode()); } try { @@ -655,11 +654,11 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO new ProxiedAuthorizationV2RequestControl( "dn:" + getSubjectDN().toNormalizedString())); LDAPResult result = getConnection().modify(modifyRequest); - LdapDAO.checkLdapResult(result.getResultCode(), null); + LdapDAO.checkLdapResult(result.getResultCode()); } catch (LDAPException e1) { - LdapDAO.checkLdapResult(e1.getResultCode(), e1.getDiagnosticMessage()); + LdapDAO.checkLdapResult(e1.getResultCode()); } try @@ -761,7 +760,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e1) { - LdapDAO.checkLdapResult(e1.getResultCode(), e1.getDiagnosticMessage()); + LdapDAO.checkLdapResult(e1.getResultCode()); } return groupDNs; } @@ -851,7 +850,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e) { - LdapDAO.checkLdapResult(e.getResultCode(), e.getDiagnosticMessage()); + LdapDAO.checkLdapResult(e.getResultCode()); } throw new IllegalArgumentException(groupID + " not a valid group ID"); } @@ -869,7 +868,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e) { - LdapDAO.checkLdapResult(e.getResultCode(), e.getDiagnosticMessage()); + LdapDAO.checkLdapResult(e.getResultCode()); } throw new IllegalArgumentException(groupID + " not a valid group ID"); } diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupPersistence.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupPersistence.java index 8bdb18d2383a88625c172fb2f183df69410c6cff..4ef7ef53f58a5bcfa7346d972499ce736633e0fa 100755 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupPersistence.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupPersistence.java @@ -68,18 +68,19 @@ */ package ca.nrc.cadc.ac.server.ldap; +import java.security.AccessControlException; +import java.security.Principal; +import java.util.Collection; + +import org.apache.log4j.Logger; + import ca.nrc.cadc.ac.Group; import ca.nrc.cadc.ac.GroupAlreadyExistsException; import ca.nrc.cadc.ac.GroupNotFoundException; -import ca.nrc.cadc.ac.IdentityType; import ca.nrc.cadc.ac.Role; import ca.nrc.cadc.ac.UserNotFoundException; import ca.nrc.cadc.ac.server.GroupPersistence; import ca.nrc.cadc.net.TransientException; -import java.security.AccessControlException; -import java.security.Principal; -import java.util.Collection; -import org.apache.log4j.Logger; public class LdapGroupPersistence<T extends Principal> implements GroupPersistence<T> @@ -98,9 +99,11 @@ public class LdapGroupPersistence<T extends Principal> AccessControlException { LdapGroupDAO<T> groupDAO = null; + LdapUserDAO<T> userDAO = null; try { - groupDAO = new LdapGroupDAO<T>(config, new LdapUserDAO<T>(config)); + userDAO = new LdapUserDAO<T>(config); + groupDAO = new LdapGroupDAO<T>(config, userDAO); Group ret = groupDAO.getGroup(groupName); return ret; } @@ -110,6 +113,10 @@ public class LdapGroupPersistence<T extends Principal> { groupDAO.close(); } + if (userDAO != null) + { + userDAO.close(); + } } } @@ -118,9 +125,11 @@ public class LdapGroupPersistence<T extends Principal> AccessControlException, UserNotFoundException { LdapGroupDAO<T> groupDAO = null; + LdapUserDAO<T> userDAO = null; try { - groupDAO = new LdapGroupDAO<T>(config, new LdapUserDAO<T>(config)); + userDAO = new LdapUserDAO<T>(config); + groupDAO = new LdapGroupDAO<T>(config, userDAO); Group ret = groupDAO.addGroup(group); return ret; } @@ -130,6 +139,10 @@ public class LdapGroupPersistence<T extends Principal> { groupDAO.close(); } + if (userDAO != null) + { + userDAO.close(); + } } } @@ -138,9 +151,11 @@ public class LdapGroupPersistence<T extends Principal> AccessControlException { LdapGroupDAO<T> groupDAO = null; + LdapUserDAO<T> userDAO = null; try { - groupDAO = new LdapGroupDAO<T>(config, new LdapUserDAO<T>(config)); + userDAO = new LdapUserDAO<T>(config); + groupDAO = new LdapGroupDAO<T>(config, userDAO); groupDAO.deleteGroup(groupName); } finally @@ -149,6 +164,10 @@ public class LdapGroupPersistence<T extends Principal> { groupDAO.close(); } + if (userDAO != null) + { + userDAO.close(); + } } } @@ -157,9 +176,11 @@ public class LdapGroupPersistence<T extends Principal> AccessControlException, UserNotFoundException { LdapGroupDAO<T> groupDAO = null; + LdapUserDAO<T> userDAO = null; try { - groupDAO = new LdapGroupDAO<T>(config, new LdapUserDAO<T>(config)); + userDAO = new LdapUserDAO<T>(config); + groupDAO = new LdapGroupDAO<T>(config, userDAO); Group ret = groupDAO.modifyGroup(group); return ret; } @@ -169,6 +190,10 @@ public class LdapGroupPersistence<T extends Principal> { groupDAO.close(); } + if (userDAO != null) + { + userDAO.close(); + } } } @@ -177,9 +202,11 @@ public class LdapGroupPersistence<T extends Principal> TransientException, AccessControlException { LdapGroupDAO<T> groupDAO = null; + LdapUserDAO<T> userDAO = null; try { - groupDAO = new LdapGroupDAO<T>(config, new LdapUserDAO<T>(config)); + userDAO = new LdapUserDAO<T>(config); + groupDAO = new LdapGroupDAO<T>(config, userDAO); Collection<Group> ret = groupDAO.getGroups(userID, role, groupID); return ret; } @@ -189,6 +216,10 @@ public class LdapGroupPersistence<T extends Principal> { groupDAO.close(); } + if (userDAO != null) + { + userDAO.close(); + } } } diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAO.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAO.java index 88e16fee18d8e8cd6d322219532a948a57a1118f..c6b9221c59c58a15699d495f1239b43d2fc30683 100755 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAO.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAO.java @@ -166,7 +166,7 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO } catch (LDAPException e) { - LdapDAO.checkLdapResult(e.getResultCode(), e.getDiagnosticMessage()); + LdapDAO.checkLdapResult(e.getResultCode()); } if (searchResult == null) @@ -196,7 +196,7 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO * @return Collection of Group instances. * * @throws UserNotFoundException when the user is not found. - * @throws TransientException If an temporary, unexpected problem occurred. + * @throws TransientException If an temporary, unexpected problem occurred., e.getMessage( * @throws AccessControlException If the operation is not permitted. */ public Collection<DN> getUserGroups(final T userID, final boolean isAdmin) @@ -257,7 +257,7 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO } catch (LDAPException e) { - LdapDAO.checkLdapResult(e.getResultCode(), e.getDiagnosticMessage()); + LdapDAO.checkLdapResult(e.getResultCode()); } return groupDNs; } @@ -312,7 +312,7 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO } catch (LDAPException e) { - LdapDAO.checkLdapResult(e.getResultCode(), e.getDiagnosticMessage()); + LdapDAO.checkLdapResult(e.getResultCode()); } return false; } @@ -347,7 +347,7 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO // } // catch (LDAPException e) // { -// LdapDAO.checkLdapResult(e.getResultCode(), e.getDiagnosticMessage()); +// LdapDAO.checkLdapResult(e.getResultCode()); // throw new RuntimeException("Unexpected LDAP exception", e); // } // } @@ -423,7 +423,7 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO } catch (LDAPException e) { - LdapDAO.checkLdapResult(e.getResultCode(), e.getDiagnosticMessage()); + LdapDAO.checkLdapResult(e.getResultCode()); } diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/DeleteGroupAction.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/DeleteGroupAction.java index 8850463290fc20f21ed8b5a7fcc807f9732df12c..8f619fa381cc12469cf9ff0b196c280364d22571 100755 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/DeleteGroupAction.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/DeleteGroupAction.java @@ -68,13 +68,11 @@ */ package ca.nrc.cadc.ac.server.web; +import java.util.ArrayList; + import ca.nrc.cadc.ac.Group; import ca.nrc.cadc.ac.User; import ca.nrc.cadc.ac.server.GroupPersistence; -import java.security.Principal; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; public class DeleteGroupAction extends GroupsAction { @@ -94,7 +92,7 @@ public class DeleteGroupAction extends GroupsAction groupPersistence.deleteGroup(this.groupName); if ((deletedGroup.getUserMembers().size() > 0) || (deletedGroup.getGroupMembers().size() > 0)) { - this.logInfo.addedMembers = new ArrayList<String>(); + this.logInfo.deletedMembers = new ArrayList<String>(); for (Group gr : deletedGroup.getGroupMembers()) { this.logInfo.deletedMembers.add(gr.getID()); diff --git a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAOTest.java b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAOTest.java index 7914b36762bd6bc64ff33594991fddfb3b73971d..e29da595b841c4ee6651ae5a5c1c1a3bb780082e 100644 --- a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAOTest.java +++ b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAOTest.java @@ -292,6 +292,7 @@ public class LdapGroupDAOTest testGroup2.getUserMembers().add(daoTestUser2); testGroup2 = getGroupDAO().addGroup(testGroup2); log.debug("add group: " + testGroup2ID); + Thread.sleep(1000); //sleep to let memberof plugin in LDAP do its work } catch (Exception e) { @@ -392,6 +393,7 @@ public class LdapGroupDAOTest testGroup2.getUserAdmins().add(daoTestUser2); testGroup2 = getGroupDAO().addGroup(testGroup2); log.debug("add group: " + testGroup2ID); + Thread.sleep(1000); // sleep to let memberof plugin do its work } catch (Exception e) { @@ -406,7 +408,7 @@ public class LdapGroupDAOTest public Object run() throws Exception { try - { + { Collection<Group> groups = getGroupDAO().getGroups(daoTestUser2.getUserID(), Role.ADMIN, null); diff --git a/projects/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java b/projects/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java index 00af73879e6dbdad4170573724ed246a9eb6575e..f7d868887f58c310f1ce3ba1cd7816cd3affcdf5 100755 --- a/projects/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java +++ b/projects/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java @@ -410,7 +410,7 @@ public class GMSClient { throw new GroupNotFoundException(errMessage); } - throw new IOException(errMessage); + throw new IOException("HttpResponse (" + responseCode + ") - " + errMessage); } }