From a26444d81b247885e7dfbb0ee4684522272fa5e1 Mon Sep 17 00:00:00 2001 From: Brian Major <major.brian@gmail.com> Date: Tue, 7 Jun 2016 12:58:28 -0700 Subject: [PATCH] s1885 - Use LocalAuthority to determine group service URI --- .../nrc/cadc/ac/server/ldap/LdapUserDAO.java | 15 ++--- .../ac/server/ldap/LdapUserPersistence.java | 62 +++++-------------- cadcAccessControl/src/ca/nrc/cadc/ac/AC.java | 7 +-- .../src/ca/nrc/cadc/ac/client/GMSClient.java | 13 +++- .../nrc/cadc/ac/client/GroupMemberships.java | 34 ++++++---- 5 files changed, 60 insertions(+), 71 deletions(-) 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 8dcebdcf..14b32069 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 @@ -86,7 +86,6 @@ import javax.security.auth.x500.X500Principal; import org.apache.log4j.Logger; -import ca.nrc.cadc.ac.AC; import ca.nrc.cadc.ac.Group; import ca.nrc.cadc.ac.InternalID; import ca.nrc.cadc.ac.PersonalDetails; @@ -101,6 +100,7 @@ import ca.nrc.cadc.auth.HttpPrincipal; import ca.nrc.cadc.auth.NumericPrincipal; import ca.nrc.cadc.net.TransientException; import ca.nrc.cadc.profiler.Profiler; +import ca.nrc.cadc.reg.client.LocalAuthority; import ca.nrc.cadc.util.ObjectUtil; import ca.nrc.cadc.util.StringUtil; @@ -140,8 +140,6 @@ public class LdapUserDAO extends LdapDAO private static final Logger logger = Logger.getLogger(LdapUserDAO.class); - private String internalIdUriPrefix = AC.USER_URI; - // Map of identity type to LDAP attribute private final Map<Class<?>, String> userLdapAttrib = new HashMap<Class<?>, String>(); @@ -740,7 +738,10 @@ public class LdapUserDAO extends LdapDAO user.getIdentities().add(new DNPrincipal(searchResult.getAttributeValue(LDAP_ENTRYDN))); // cache memberOf values in the user - GroupMemberships gms = new GroupMemberships(userID); + LocalAuthority localAuthority = new LocalAuthority(); + URI gmsServiceURI = localAuthority.getServiceURI("gms"); + + GroupMemberships gms = new GroupMemberships(gmsServiceURI.toString(), userID); user.appData = gms; // add even if empty String[] mems = searchResult.getAttributeValues(LDAP_MEMBEROF); if (mems != null && mems.length > 0) @@ -926,8 +927,6 @@ public class LdapUserDAO extends LdapDAO public User modifyUser(final User user) throws UserNotFoundException, TransientException, AccessControlException { - // Will we always have a HttpPrincipal? - User existingUser = getUser(user.getHttpPrincipal()); List<Modification> mods = new ArrayList<Modification>(); @@ -1282,7 +1281,9 @@ public class LdapUserDAO extends LdapDAO protected InternalID getInternalID(String numericID) { UUID uuid = new UUID(0L, Long.parseLong(numericID)); - String uriString = internalIdUriPrefix + "?" + uuid.toString(); + LocalAuthority localAuthority = new LocalAuthority(); + URI umsServiceURI = localAuthority.getServiceURI("ums"); + String uriString = umsServiceURI.toString() + "?" + uuid.toString(); URI uri; try { diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserPersistence.java b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserPersistence.java index 10b8448d..f6e94226 100755 --- a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserPersistence.java +++ b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserPersistence.java @@ -121,7 +121,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste LdapConnections conns = new LdapConnections(this); try { - userDAO = getLdapUserDao(conns); + userDAO = new LdapUserDAO(conns); userDAO.addUser(user); } finally @@ -146,7 +146,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste LdapConnections conns = new LdapConnections(this); try { - userDAO = getLdapUserDao(conns); + userDAO = new LdapUserDAO(conns); userDAO.addUserRequest(userRequest); } finally @@ -177,7 +177,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste LdapConnections conns = new LdapConnections(this); try { - userDAO = getLdapUserDao(conns); + userDAO = new LdapUserDAO(conns); return userDAO.getUser(userID); } finally @@ -205,7 +205,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste LdapConnections conns = new LdapConnections(this); try { - LdapUserDAO userDAO = getLdapUserDao(conns); + LdapUserDAO userDAO = new LdapUserDAO(conns); return userDAO.getUserByEmailAddress(emailAddress); } finally @@ -234,7 +234,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste LdapConnections conns = new LdapConnections(this); try { - userDAO = getLdapUserDao(conns); + userDAO = new LdapUserDAO(conns); return userDAO.getUserRequest(userID); } finally @@ -243,8 +243,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste } } - /**<<<<<<< HEAD - + /** * Get the user specified by userID with all of the users identities. * * @param userID The userID. @@ -264,7 +263,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste try { Profiler profiler = new Profiler(LdapUserPersistence.class); - userDAO = getLdapUserDao(conns); + userDAO = new LdapUserDAO(conns); profiler.checkpoint("Create LdapUserDAO"); User user = userDAO.getAugmentedUser(userID); profiler.checkpoint("getAugmentedUser"); @@ -299,7 +298,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste LdapConnections conns = new LdapConnections(this); try { - userDAO = getLdapUserDao(conns); + userDAO = new LdapUserDAO(conns); return userDAO.getUsers(); } finally @@ -323,7 +322,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste LdapConnections conns = new LdapConnections(this); try { - userDAO = getLdapUserDao(conns); + userDAO = new LdapUserDAO(conns); return userDAO.getUserRequests(); } finally @@ -353,7 +352,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste LdapConnections conns = new LdapConnections(this); try { - userDAO = getLdapUserDao(conns); + userDAO = new LdapUserDAO(conns); return userDAO.approveUserRequest(userID); } finally @@ -385,7 +384,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste LdapConnections conns = new LdapConnections(this); try { - userDAO = getLdapUserDao(conns); + userDAO = new LdapUserDAO(conns); return userDAO.modifyUser(user); } finally @@ -415,7 +414,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste LdapConnections conns = new LdapConnections(this); try { - userDAO = getLdapUserDao(conns); + userDAO = new LdapUserDAO(conns); userDAO.deleteUser(userID, true); } finally @@ -444,7 +443,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste LdapConnections conns = new LdapConnections(this); try { - userDAO = getLdapUserDao(conns); + userDAO = new LdapUserDAO(conns); userDAO.deleteUser(userID, false); } finally @@ -471,7 +470,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste LdapConnections conns = new LdapConnections(this); try { - userDAO = getLdapUserDao(conns); + userDAO = new LdapUserDAO(conns); userDAO.deleteUserRequest(userID); } finally @@ -498,7 +497,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste LdapConnections conns = new LdapConnections(this); try { - userDAO = getLdapUserDao(conns); + userDAO = new LdapUserDAO(conns); return userDAO.doLogin(userID, password); } finally @@ -510,11 +509,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste /** * Update a user's password. The given user and authenticating user must match. * -<<<<<<< HEAD * @param userID the user. -======= - * @param userID ->>>>>>> efc84b5d25584bd3014fc6cbc820c5acf0d90a2a * @param oldPassword current password. * @param newPassword new password. * @throws UserNotFoundException If the given user does not exist. @@ -532,7 +527,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste LdapConnections conns = new LdapConnections(this); try { - userDAO = getLdapUserDao(conns); + userDAO = new LdapUserDAO(conns); if (userDAO.doLogin(userID.getName(), oldPassword)) { // oldPassword is correct @@ -548,11 +543,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste /** * Reset a user's password. The given user and authenticating user must match. * -<<<<<<< HEAD * @param userID The user. -======= - * @param userID ->>>>>>> efc84b5d25584bd3014fc6cbc820c5acf0d90a2a * @param newPassword new password. * @throws UserNotFoundException If the given user does not exist. * @throws TransientException If an temporary, unexpected problem occurred. @@ -569,7 +560,7 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste LdapConnections conns = new LdapConnections(this); try { - userDAO = getLdapUserDao(conns); + userDAO = new LdapUserDAO(conns); User user = getUser(userID); if (user != null) @@ -613,23 +604,4 @@ public class LdapUserPersistence extends LdapPersistence implements UserPersiste return false; } - private LdapUserDAO getLdapUserDao(LdapConnections conn) - { - LdapUserDAO dao = new LdapUserDAO(conn); - if (getInternalIdUriPrefix() != null) - dao.setInternalIdUriPrefix(getInternalIdUriPrefix()); - return dao; - } - - /** - * Web services can override this method to change - * the user prefix used in the internal ID. - * - * By default the LdapUserDAO will use AC.USER_URI; - */ - protected String getInternalIdUriPrefix() - { - return null; - } - } diff --git a/cadcAccessControl/src/ca/nrc/cadc/ac/AC.java b/cadcAccessControl/src/ca/nrc/cadc/ac/AC.java index daa6a4cc..be1fa3be 100755 --- a/cadcAccessControl/src/ca/nrc/cadc/ac/AC.java +++ b/cadcAccessControl/src/ca/nrc/cadc/ac/AC.java @@ -85,13 +85,10 @@ public class AC // Denotes a group readable by public public static final String PROPERTY_PUBLIC = "ivo://ivoa.net/gms#public"; - public static final String UMS_SERVICE_URI = "ivo://canfar.net/ums"; - public static final String GMS_SERVICE_URI = "ivo://canfar.net/gms"; + public static final String UMS_SERVICE_URI = "ivo://cadc.nrc.ca/ums"; + public static final String GMS_SERVICE_URI = "ivo://cadc.nrc.ca/gms"; // Group URI attribute once the group name is appended public static final String GROUP_URI = "ivo://cadc.nrc.ca/gms#"; - // User URI with appended UUID represents a unique user - public static final String USER_URI = "ivo://cadc.nrc.ca/user"; - } diff --git a/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java b/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java index 00ebbc9b..3de71f50 100755 --- a/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java +++ b/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java @@ -133,6 +133,7 @@ public class GMSClient implements TransferListener private RegistryClient registryClient; + private URI gmsServiceURI; private URI groupsURI; private URI searchURI; @@ -159,6 +160,7 @@ public class GMSClient implements TransferListener try { + this.gmsServiceURI = serviceURI; this.groupsURI = new URI(serviceURI.toASCIIString() + "#" + GROUPS); this.searchURI = new URI(serviceURI.toASCIIString() + "#" + SEARCH); } @@ -1100,11 +1102,20 @@ public class GMSClient implements TransferListener Set<GroupMemberships> gset = subject.getPrivateCredentials(GroupMemberships.class); if (gset == null || gset.isEmpty()) { - GroupMemberships mems = new GroupMemberships(userID); + GroupMemberships mems = new GroupMemberships(gmsServiceURI.toString(), userID); subject.getPrivateCredentials().add(mems); return mems; } GroupMemberships mems = gset.iterator().next(); + + // check to ensure they have the same service URI + if (!gmsServiceURI.toString().equals(mems.getServiceURI())) + { + log.debug("Not using cache because of differing service URIs: " + + "[" + gmsServiceURI.toString() + "][" + mems.getServiceURI() + "]"); + return null; + } + return mems; } return null; // no cache diff --git a/cadcAccessControl/src/ca/nrc/cadc/ac/client/GroupMemberships.java b/cadcAccessControl/src/ca/nrc/cadc/ac/client/GroupMemberships.java index 9ea12933..f842e29a 100644 --- a/cadcAccessControl/src/ca/nrc/cadc/ac/client/GroupMemberships.java +++ b/cadcAccessControl/src/ca/nrc/cadc/ac/client/GroupMemberships.java @@ -69,47 +69,55 @@ package ca.nrc.cadc.ac.client; -import ca.nrc.cadc.ac.Group; -import ca.nrc.cadc.ac.Role; -import org.apache.log4j.Logger; - import java.security.Principal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.log4j.Logger; + +import ca.nrc.cadc.ac.Group; +import ca.nrc.cadc.ac.Role; + /** * Class used to hold list of groups in which a user is known to be a member. - * + * * @author pdowler */ public class GroupMemberships implements Comparable { private static final Logger log = Logger.getLogger(GroupMemberships.class); + private String serviceURI; private Principal userID; private Map<Role, List<Group>> memberships = new HashMap<Role, List<Group>>(); private Map<Role, Boolean> complete = new HashMap<Role, Boolean>(); public GroupMemberships() { init(); } - - public GroupMemberships(Principal userID) + + public GroupMemberships(String serviceURI, Principal userID) { + this.serviceURI = serviceURI; this.userID = userID; init(); } - + public boolean isComplete(Role role) { return complete.get(role); } - + + public String getServiceURI() + { + return serviceURI; + } + public List<Group> getMemberships(Role role) { return memberships.get(role); } - + private void init() { for (Role role : Role.values()) @@ -123,14 +131,14 @@ public class GroupMemberships implements Comparable { return userID; } - + public void add(Group group, Role role) { List<Group> groups = memberships.get(role); if (!groups.contains(group)) groups.add(group); } - + public void add(List<Group> groups, Role role) { List<Group> cur = memberships.get(role); @@ -141,7 +149,7 @@ public class GroupMemberships implements Comparable complete.put(role, Boolean.TRUE); } } - + // only allow one in a set - makes clearCache simple too public boolean equals(Object rhs) { -- GitLab