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 abd19b24bde0eda15142be362587d4b22241b26a..9c3b3c87f54844a9b5410c20e5b316154746fedc 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 @@ -69,18 +69,16 @@ package ca.nrc.cadc.ac.server.ldap; import javax.net.SocketFactory; -import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.security.auth.Subject; import javax.security.auth.x500.X500Principal; -import java.io.File; -import java.net.MalformedURLException; + +import org.apache.log4j.Logger; + import java.security.*; -import java.security.cert.CertificateException; import java.util.Set; import com.unboundid.ldap.sdk.*; -import com.unboundid.util.ssl.*; import ca.nrc.cadc.auth.*; import ca.nrc.cadc.net.TransientException; @@ -88,6 +86,8 @@ import ca.nrc.cadc.net.TransientException; public abstract class LdapDAO { + private static final Logger logger = Logger.getLogger(LdapDAO.class); + private LDAPConnection conn; LdapConfig config; @@ -226,6 +226,8 @@ public abstract class LdapDAO protected static void checkLdapResult(ResultCode code) throws TransientException { + logger.debug("Ldap result: " + code); + if (code == ResultCode.INSUFFICIENT_ACCESS_RIGHTS) { throw new AccessControlException("Not authorized "); 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 d4b7a3b6395e465a01251d9370d6279f26aacac3..23ad3b9a6cbc0728423df19a7028ffb58b24baa3 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 @@ -200,6 +200,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e) { + logger.debug("addGroup Exception: " + e, e); LdapDAO.checkLdapResult(e.getResultCode()); throw new RuntimeException("Unexpected LDAP exception", e); } @@ -295,14 +296,13 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO if (searchResult.getAttributeValue("nsaccountlock") == null) { - throw new - GroupAlreadyExistsException("Group already exists " + group.getID()); + throw new GroupAlreadyExistsException("Group already exists " + group.getID()); } // activate group try { - return modifyGroup(group, true); + return modifyGroup(null, group, true); } catch (GroupNotFoundException e) { @@ -312,6 +312,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e) { + logger.debug("reactivateGroup Exception: " + e, e); LdapDAO.checkLdapResult(e.getResultCode()); throw new RuntimeException("Unexpected LDAP exception", e); } @@ -365,6 +366,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e1) { + logger.debug("getGroupNames Exception: " + e1, e1); LdapDAO.checkLdapResult(e1.getResultCode()); throw new IllegalStateException("Unexpected exception: " + e1.getMatchedDN(), e1); } @@ -561,6 +563,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e1) { + logger.debug("getGroup Exception: " + e1, e1); LdapDAO.checkLdapResult(e1.getResultCode()); throw new GroupNotFoundException("Not found " + groupID); } @@ -582,11 +585,11 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO throws GroupNotFoundException, TransientException, AccessControlException, UserNotFoundException { - getGroup(group.getID()); //group must exists first - return modifyGroup(group, false); + Group existing = getGroup(group.getID()); //group must exists first + return modifyGroup(existing, group, false); } - private Group modifyGroup(final Group group, boolean withActivate) + private Group modifyGroup(final Group existing, final Group group, boolean withActivate) throws UserNotFoundException, TransientException, AccessControlException, GroupNotFoundException { @@ -595,6 +598,8 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO throw new UnsupportedOperationException( "Support for groups properties not available"); } + + boolean adminChanges = false; List<Modification> mods = new ArrayList<Modification>(); List<Modification> adminMods = new ArrayList<Modification>(); @@ -602,6 +607,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO { mods.add(new Modification(ModificationType.DELETE, "nsaccountlock")); adminMods.add(new Modification(ModificationType.DELETE, "nsaccountlock")); + adminChanges = true; } if (group.description == null) @@ -612,7 +618,6 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO { mods.add(new Modification(ModificationType.REPLACE, "description", group.description)); } - Set<String> newMembers = new HashSet<String>(); for (User<?> member : group.getUserMembers()) @@ -629,11 +634,27 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO DN grDN = getGroupDN(gr.getID()); newMembers.add(grDN.toNormalizedString()); } + Set<String> newAdmins = new HashSet<String>(); + Set<User<? extends Principal>> existingUserAdmins = new HashSet<User<? extends Principal>>(0); + if (existing != null) + { + existingUserAdmins = existing.getUserAdmins(); + } for (User<?> member : group.getUserAdmins()) { - DN memberDN = userPersist.getUserDN(member); - newAdmins.add(memberDN.toNormalizedString()); + DN memberDN = userPersist.getUserDN(member); + newAdmins.add(memberDN.toNormalizedString()); + if (!existingUserAdmins.contains(member)) + { + adminChanges = true; + } + } + + Set<Group> existingGroupAdmins = new HashSet<Group>(0); + if (existing != null) + { + existingGroupAdmins = existing.getGroupAdmins(); } for (Group gr : group.getGroupAdmins()) { @@ -641,8 +662,13 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO { throw new GroupNotFoundException(gr.getID()); } - DN grDN = getGroupDN(gr.getID()); - newAdmins.add(grDN.toNormalizedString()); + + DN grDN = getGroupDN(gr.getID()); + newAdmins.add(grDN.toNormalizedString()); + if (!existingGroupAdmins.contains(gr)) + { + adminChanges = true; + } } mods.add(new Modification(ModificationType.REPLACE, "uniquemember", @@ -650,18 +676,22 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO adminMods.add(new Modification(ModificationType.REPLACE, "uniquemember", (String[]) newAdmins.toArray(new String[newAdmins.size()]))); - // modify admin group first - ModifyRequest modifyRequest = new ModifyRequest(getAdminGroupDN(group.getID()), adminMods); try { - modifyRequest.addControl( - new ProxiedAuthorizationV2RequestControl( - "dn:" + getSubjectDN().toNormalizedString())); - LdapDAO.checkLdapResult(getConnection(). - modify(modifyRequest).getResultCode()); + // modify admin group first (if necessary) + if (adminChanges) + { + ModifyRequest modifyRequest = new ModifyRequest(getAdminGroupDN(group.getID()), adminMods); + + modifyRequest.addControl( + new ProxiedAuthorizationV2RequestControl( + "dn:" + getSubjectDN().toNormalizedString())); + LdapDAO.checkLdapResult(getConnection(). + modify(modifyRequest).getResultCode()); + } // modify the group itself now - modifyRequest = new ModifyRequest(getGroupDN(group.getID()), mods); + ModifyRequest modifyRequest = new ModifyRequest(getGroupDN(group.getID()), mods); modifyRequest.addControl( new ProxiedAuthorizationV2RequestControl( @@ -671,6 +701,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e1) { + logger.debug("Modify Exception: " + e1, e1); LdapDAO.checkLdapResult(e1.getResultCode()); } try @@ -744,6 +775,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e1) { + logger.debug("Delete Exception: " + e1, e1); LdapDAO.checkLdapResult(e1.getResultCode()); } @@ -835,6 +867,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e) { + logger.debug("getGroups Exception: " + e, e); throw new TransientException("Error getting group", e); } return groups; @@ -879,6 +912,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e1) { + logger.debug("getOwnerGroups Exception: " + e1, e1); LdapDAO.checkLdapResult(e1.getResultCode()); } return groupDNs; @@ -1028,6 +1062,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e) { + logger.debug("getGroupDN Exception: " + e, e); LdapDAO.checkLdapResult(e.getResultCode()); } throw new IllegalArgumentException(groupID + " not a valid group ID"); @@ -1046,6 +1081,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e) { + logger.debug("getAdminGroupDN Exception: " + e, e); LdapDAO.checkLdapResult(e.getResultCode()); } throw new IllegalArgumentException(groupID + " not a valid group ID"); @@ -1072,6 +1108,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO } catch (LDAPException e) { + logger.debug("isCreatorOwner Exception: " + e, e); throw new RuntimeException(e); } }