diff --git a/projects/cadcAccessControl-Server/build.xml b/projects/cadcAccessControl-Server/build.xml index 39cce90c8e2f2e8c6a52777adad23ec353c5d8f0..8a87c3bca324f82a7393879f24f870c304c20d78 100644 --- a/projects/cadcAccessControl-Server/build.xml +++ b/projects/cadcAccessControl-Server/build.xml @@ -148,7 +148,7 @@ <pathelement path="${jars}:${testingJars}"/> </classpath> <sysproperty key="ca.nrc.cadc.util.PropertiesReader.dir" value="test"/> - <test name="ca.nrc.cadc.ac.server.web.users.GetUserListActionTest" /> + <test name="ca.nrc.cadc.ac.server.web.users.GetUserActionTest" /> <formatter type="plain" usefile="false" /> </junit> </target> 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 51bb809a68d44db2c3439c648cd74d5b93ab0ae4..772c6531a7cdfc147731f570795620cbde4dd3c6 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 @@ -68,20 +68,6 @@ */ package ca.nrc.cadc.ac.server.ldap; -import java.security.AccessControlException; -import java.security.Principal; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Random; - -import javax.security.auth.x500.X500Principal; - -import org.apache.log4j.Logger; - import ca.nrc.cadc.ac.PersonalDetails; import ca.nrc.cadc.ac.PosixDetails; import ca.nrc.cadc.ac.User; @@ -91,9 +77,7 @@ import ca.nrc.cadc.ac.UserNotFoundException; import ca.nrc.cadc.ac.UserRequest; import ca.nrc.cadc.auth.AuthenticationUtil; import ca.nrc.cadc.auth.HttpPrincipal; -import ca.nrc.cadc.auth.NumericPrincipal; import ca.nrc.cadc.net.TransientException; - import com.unboundid.ldap.sdk.AddRequest; import com.unboundid.ldap.sdk.Attribute; import com.unboundid.ldap.sdk.BindRequest; @@ -116,6 +100,17 @@ import com.unboundid.ldap.sdk.SimpleBindRequest; import com.unboundid.ldap.sdk.controls.ProxiedAuthorizationV2RequestControl; import com.unboundid.ldap.sdk.extensions.PasswordModifyExtendedRequest; import com.unboundid.ldap.sdk.extensions.PasswordModifyExtendedResult; +import org.apache.log4j.Logger; + +import javax.security.auth.x500.X500Principal; +import java.security.AccessControlException; +import java.security.Principal; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; public class LdapUserDAO<T extends Principal> extends LdapDAO @@ -135,7 +130,6 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO protected static final String LDAP_ENTRYDN = "entrydn"; protected static final String LDAP_COMMON_NAME = "cn"; protected static final String LDAP_DISTINGUISHED_NAME = "distinguishedName"; - protected static final String LDAP_NUMERICID = "numericid"; protected static final String LADP_USER_PASSWORD = "userPassword"; protected static final String LDAP_FIRST_NAME = "givenName"; protected static final String LDAP_LAST_NAME = "sn"; @@ -145,13 +139,12 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO protected static final String LDAP_EMAIL = "email"; protected static final String LDAP_INSTITUTE = "institute"; protected static final String LDAP_UID = "uid"; - private String[] userAttribs = new String[] { LDAP_FIRST_NAME, LDAP_LAST_NAME, LDAP_ADDRESS, LDAP_CITY, LDAP_COUNTRY, - LDAP_EMAIL, LDAP_INSTITUTE + LDAP_EMAIL, LDAP_INSTITUTE, LDAP_UID }; private String[] memberAttribs = new String[] { @@ -163,7 +156,6 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO super(config); this.userLdapAttrib.put(HttpPrincipal.class, LDAP_UID); this.userLdapAttrib.put(X500Principal.class, LDAP_DISTINGUISHED_NAME); - this.userLdapAttrib.put(NumericPrincipal.class, LDAP_NUMERICID); // add the id attributes to user and member attributes String[] princs = userLdapAttrib.values() @@ -359,26 +351,17 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO try { // add new user - - DN userX500DN = getUserRequestsDN(user.getUserID().getName()); List<Attribute> attributes = new ArrayList<Attribute>(); addAttribute(attributes, LDAP_OBJECT_CLASS, LDAP_INET_ORG_PERSON); addAttribute(attributes, LDAP_OBJECT_CLASS, LDAP_INET_USER); addAttribute(attributes, LDAP_OBJECT_CLASS, LDAP_CADC_ACCOUNT); addAttribute(attributes, LDAP_COMMON_NAME, user.getUserID() .getName()); - addAttribute(attributes, LADP_USER_PASSWORD, new String(userRequest - .getPassword())); - addAttribute(attributes, LDAP_NUMERICID, - String.valueOf(genNextNumericId())); - for (Principal princ : user.getIdentities()) - { - if (princ instanceof X500Principal) - { - addAttribute(attributes, LDAP_DISTINGUISHED_NAME, - princ.getName()); - } - } + addAttribute(attributes, LDAP_DISTINGUISHED_NAME, userDN + .toNormalizedString()); + addAttribute(attributes, LADP_USER_PASSWORD, + String.valueOf(userRequest.getPassword())); + for (UserDetails details : user.details) { if (details.getClass() == PersonalDetails.class) @@ -466,7 +449,7 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO "Unsupported principal type " + userID.getClass()); } - searchField = "(&(objectclass=inetorgperson)(objectclass=cadcaccount)(" + + searchField = "(&(objectclass=inetorgperson)(" + searchField + "=" + userID.getName() + "))"; logger.debug(searchField); @@ -476,6 +459,7 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO SearchRequest searchRequest = new SearchRequest(usersDN, SearchScope.SUB, searchField, userAttribs); + if (isSecure(usersDN)) { searchRequest.addControl( @@ -496,17 +480,10 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO logger.debug(msg); throw new UserNotFoundException(msg); } - User<T> user = new User<T>(userID); - user.getIdentities().add(new HttpPrincipal( - searchResult.getAttributeValue( - userLdapAttrib.get(HttpPrincipal.class)))); - user.getIdentities().add(new NumericPrincipal( - searchResult.getAttributeValueAsLong( - userLdapAttrib.get(NumericPrincipal.class)))); - user.getIdentities().add(new X500Principal( - searchResult.getAttributeValue( - userLdapAttrib.get(X500Principal.class)))); + user.getIdentities().add(new HttpPrincipal(searchResult.getAttributeValue( + userLdapAttrib.get(HttpPrincipal.class)))); + String fname = searchResult.getAttributeValue(LDAP_FIRST_NAME); String lname = searchResult.getAttributeValue(LDAP_LAST_NAME); PersonalDetails personaDetails = new PersonalDetails(fname, lname); @@ -816,9 +793,10 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO "Unsupported principal type " + userID.getClass()); } + User<T> user = getUser(userID); Filter filter = Filter.createANDFilter( Filter.createEqualityFilter(searchField, - userID.getName()), + user.getUserID().getName()), Filter.createEqualityFilter(LDAP_MEMBEROF, groupID)); SearchRequest searchRequest = @@ -1015,17 +993,4 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO LdapDAO.checkLdapResult(code); } } - - /** - * Method to return a randomly generated user numeric ID. The default - * implementation returns a value between 10000 and Integer.MAX_VALUE. - * Services that support a different mechanism for generating numeric - * IDs overide this method. - * @return - */ - protected int genNextNumericId() - { - Random rand = new Random(); - return rand.nextInt(Integer.MAX_VALUE - 10000) + 10000; - } } diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/GetUserAction.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/GetUserAction.java index feece385d349c6cbcdfac69778abecb0dd4c5960..92a345af5cc7383779cab27f99f37d8819dc8ee0 100644 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/GetUserAction.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/GetUserAction.java @@ -67,6 +67,7 @@ ************************************************************************ */package ca.nrc.cadc.ac.server.web.users; +import ca.nrc.cadc.ac.PersonalDetails; import ca.nrc.cadc.ac.User; import ca.nrc.cadc.ac.UserNotFoundException; import ca.nrc.cadc.ac.server.UserPersistence; @@ -75,6 +76,7 @@ import java.security.AccessControlContext; import java.security.AccessController; import java.security.Principal; import java.security.PrivilegedExceptionAction; +import java.util.Set; import javax.security.auth.Subject; @@ -85,11 +87,13 @@ public class GetUserAction extends AbstractUserAction { private static final Logger log = Logger.getLogger(GetUserAction.class); private final Principal userID; + private final String detail; - GetUserAction(Principal userID) + GetUserAction(Principal userID, String detail) { super(); this.userID = userID; + this.detail = detail; } public void doAction() throws Exception @@ -126,6 +130,32 @@ public class GetUserAction extends AbstractUserAction try { user = userPersistence.getUser(principal); + if (detail != null) + { + // Only return user principals + if (detail.equals("identity")) + { + user.details.clear(); + } + // Only return user profile info, first and last name. + else if (detail.equals("display")) + { + user.getIdentities().clear(); + Set<PersonalDetails> details = user.getDetails(PersonalDetails.class); + if (details.isEmpty()) + { + String error = principal.getName() + " missing required PersonalDetails"; + throw new IllegalStateException(error); + } + PersonalDetails pd = details.iterator().next(); + user.details.clear(); + user.details.add(new PersonalDetails(pd.getFirstName(), pd.getLastName())); + } + else + { + throw new IllegalArgumentException("Illegal detail parameter " + detail); + } + } } catch (UserNotFoundException e) { diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UserActionFactory.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UserActionFactory.java index 6982a37b96dfbd72cb1cb513605aba727dc15221..ce45a74ef77865b00d58bf256cd86428599eecab 100644 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UserActionFactory.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UserActionFactory.java @@ -111,7 +111,7 @@ public abstract class UserActionFactory else if (segments.length == 1) { User user = getUser(segments[0], request.getParameter("idType"), path); - action = new GetUserAction(user.getUserID()); + action = new GetUserAction(user.getUserID(), request.getParameter("detail")); } if (action != null) @@ -234,24 +234,24 @@ public abstract class UserActionFactory { throw new IllegalArgumentException("User endpoint missing idType parameter"); } - else if (idType.equalsIgnoreCase(IdentityType.USERNAME.getValue())) + else if (idType.equals(IdentityType.USERNAME.getValue())) { return new User<HttpPrincipal>(new HttpPrincipal(userName)); } - else if (idType.equalsIgnoreCase(IdentityType.X500.getValue())) + else if (idType.equals(IdentityType.X500.getValue())) { return new User<X500Principal>(new X500Principal(userName)); } - else if (idType.equalsIgnoreCase(IdentityType.UID.getValue())) + else if (idType.equals(IdentityType.UID.getValue())) { return new User<NumericPrincipal>(new NumericPrincipal( Long.parseLong(userName))); } - else if (idType.equalsIgnoreCase(IdentityType.OPENID.getValue())) + else if (idType.equals(IdentityType.OPENID.getValue())) { return new User<OpenIdPrincipal>(new OpenIdPrincipal(userName)); } - else if (idType.equalsIgnoreCase(IdentityType.COOKIE.getValue())) + else if (idType.equals(IdentityType.COOKIE.getValue())) { return new User<CookiePrincipal>(new CookiePrincipal(userName)); } diff --git a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAOTest.java b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAOTest.java index cb143e90e8fedc9c87677763f09ac55b3c23b67f..4226915aa1437ea3c8242be4f80753f6ee9d77e9 100644 --- a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAOTest.java +++ b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAOTest.java @@ -68,49 +68,41 @@ */ package ca.nrc.cadc.ac.server.ldap; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.security.Principal; -import java.security.PrivilegedExceptionAction; -import java.util.Collection; -import java.util.Random; - -import javax.security.auth.Subject; -import javax.security.auth.x500.X500Principal; - -import org.apache.log4j.Level; -import org.apache.log4j.Logger; -import org.junit.BeforeClass; -import org.junit.Test; - import ca.nrc.cadc.ac.PersonalDetails; import ca.nrc.cadc.ac.User; import ca.nrc.cadc.ac.UserDetails; import ca.nrc.cadc.ac.UserRequest; import ca.nrc.cadc.auth.HttpPrincipal; -import ca.nrc.cadc.auth.NumericPrincipal; import ca.nrc.cadc.net.TransientException; import ca.nrc.cadc.util.Log4jInit; - import com.unboundid.ldap.sdk.DN; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.junit.BeforeClass; +import org.junit.Test; + +import javax.security.auth.Subject; +import javax.security.auth.x500.X500Principal; +import java.security.Principal; +import java.security.PrivilegedExceptionAction; +import java.util.Collection; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; public class LdapUserDAOTest extends AbstractLdapDAOTest { private static final Logger log = Logger.getLogger(LdapUserDAOTest.class); static final String testUserX509DN = "cn=cadcdaotest1,ou=cadc,o=hia,c=ca"; - static int nextUserNumericID = 666; static String testUserDN; static User<X500Principal> testUser; - static User<X500Principal> testMember; static User<HttpPrincipal> testPendingUser; static LdapConfig config; - static Random ran = new Random(); // source of randomness for numeric ids @BeforeClass @@ -121,43 +113,23 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest // get the configuration of the development server from and config files... config = getLdapConfig(); - X500Principal testUserX500Princ = new X500Principal(testUserX509DN); - testUser = new User<X500Principal>(testUserX500Princ); testPendingUser = new User<HttpPrincipal>(new HttpPrincipal("CADCtestRequest")); testPendingUser.details.add(new PersonalDetails("CADCtest", "Request")); testPendingUser.getIdentities().add( new HttpPrincipal("CADCtestRequest")); - testPendingUser.getIdentities().add( - new X500Principal( - "uid=CADCtestRequest,ou=userrequests,ou=ds,dc=testcanfar")); - testPendingUser.getIdentities().add(new NumericPrincipal(66666)); + testUser = new User<X500Principal>(new X500Principal(testUserX509DN)); testUser.details.add(new PersonalDetails("CADC", "DAOTest1")); testUser.getIdentities().add(new HttpPrincipal("CadcDaoTest1")); - testUser.getIdentities().add(testUserX500Princ); - testUser.getIdentities().add(new NumericPrincipal(666)); testUserDN = "uid=cadcdaotest1," + config.getUsersDN(); - - - // member returned by getMember contains only the fields required by - // the GMS - testMember = new User<X500Principal>(testUserX500Princ); - testMember.details.add(new PersonalDetails("CADC", "DAOTest1")); - testMember.getIdentities().add(new HttpPrincipal("CadcDaoTest1")); - } <T extends Principal> LdapUserDAO<T> getUserDAO() throws Exception { - return new LdapUserDAO(config){ - protected int genNextNumericId() - { - return nextUserNumericID; - } - }; + return new LdapUserDAO<T>(config); } String createUserID() @@ -171,13 +143,9 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest @Test public void testAddUser() throws Exception { - String userID = createUserID(); - final User<HttpPrincipal> expected = new User<HttpPrincipal>(new HttpPrincipal(userID)); - expected.getIdentities().add(new HttpPrincipal(userID)); - expected.getIdentities().add(new X500Principal("cn=" + userID + ",ou=cadc,o=hia,c=ca")); - nextUserNumericID = ran.nextInt(Integer.MAX_VALUE); - expected.getIdentities().add(new NumericPrincipal(nextUserNumericID)); - + final User<HttpPrincipal> expected = + new User<HttpPrincipal>(new HttpPrincipal(createUserID())); + expected.getIdentities().add(new HttpPrincipal(createUserID())); expected.details.add(new PersonalDetails("foo", "bar")); final UserRequest<HttpPrincipal> userRequest = @@ -336,7 +304,6 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest Subject subject = new Subject(); subject.getPrincipals().add(testUser.getUserID()); - // do everything as owner Subject.doAs(subject, new PrivilegedExceptionAction<Object>() { @@ -345,7 +312,7 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest try { User<X500Principal> actual = getUserDAO().getX500User(new DN(testUserDN)); - check(testMember, actual); + check(testUser, actual); return null; } catch (Exception e) @@ -368,7 +335,7 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest try { User<X500Principal> actual = getUserDAO().getX500User(new DN(testUserDN)); - check(testMember, actual); + check(testUser, actual); return null; } catch (Exception e) @@ -568,10 +535,6 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest HttpPrincipal principal = new HttpPrincipal(username); testUser2 = new User<HttpPrincipal>(principal); testUser2.getIdentities().add(principal); - testUser2.getIdentities().add(new X500Principal("cn=" + username + ",ou=cadc,o=hia,c=ca")); - // update nextNumericId - nextUserNumericID = ran.nextInt(Integer.MAX_VALUE); - testUser2.getIdentities().add(new NumericPrincipal(nextUserNumericID)); testUser2.details.add(new PersonalDetails("firstName", "lastName")); final UserRequest<HttpPrincipal> userRequest = new UserRequest<HttpPrincipal>(testUser2, password); @@ -662,21 +625,9 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest assertEquals(user1, user2); assertEquals(user1.details, user2.details); assertEquals(user1.details.size(), user2.details.size()); - assertEquals(user1.getIdentities().size(), user2.getIdentities().size()); - for( Principal princ1 : user1.getIdentities()) - { - boolean found = false; - for( Principal princ2 : user2.getIdentities()) - { - if (princ2.getClass() == princ1.getClass()) - { - assertEquals(princ1, princ2); - found = true; - } - } - assertTrue(princ1.getName(), found); - } - for(UserDetails d1 : user1.details) + assertEquals("Identities don't match.", user1.getIdentities(), + user2.getIdentities()); + for (UserDetails d1 : user1.details) { assertTrue(user2.details.contains(d1)); if (d1 instanceof PersonalDetails) diff --git a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/users/GetUserActionTest.java b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/users/GetUserActionTest.java index 8fbc0a4a2ae91f65aa5507bb0ec5eb6d0f275c3b..7727194981084f8d071205b6861e394b99762e28 100644 --- a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/users/GetUserActionTest.java +++ b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/users/GetUserActionTest.java @@ -67,21 +67,29 @@ */ package ca.nrc.cadc.ac.server.web.users; +import ca.nrc.cadc.ac.PersonalDetails; +import ca.nrc.cadc.ac.PosixDetails; import ca.nrc.cadc.ac.User; import ca.nrc.cadc.ac.json.JsonUserWriter; import ca.nrc.cadc.ac.server.UserPersistence; import ca.nrc.cadc.ac.server.web.SyncOutput; import ca.nrc.cadc.ac.xml.UserWriter; import ca.nrc.cadc.auth.HttpPrincipal; +import ca.nrc.cadc.auth.NumericPrincipal; import org.junit.Test; +import javax.security.auth.x500.X500Principal; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; +import java.security.Principal; +import java.util.HashSet; +import java.util.Set; import static org.easymock.EasyMock.*; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; public class GetUserActionTest { @@ -94,7 +102,7 @@ public class GetUserActionTest createMock(UserPersistence.class); final HttpPrincipal userID = new HttpPrincipal("CADCtest"); - final GetUserAction testSubject = new GetUserAction(userID) + final GetUserAction testSubject = new GetUserAction(userID, null) { @Override UserPersistence<HttpPrincipal> getUserPersistence() @@ -125,6 +133,118 @@ public class GetUserActionTest verify(mockSyncOut, mockUserPersistence); } + @Test + public void writeUserWithDetailIdentity() throws Exception + { + final HttpServletResponse mockResponse = createMock(HttpServletResponse.class); + final UserPersistence<HttpPrincipal> mockUserPersistence = + createMock(UserPersistence.class); + final HttpPrincipal userID = new HttpPrincipal("CADCtest"); + + final GetUserAction testSubject = new GetUserAction(userID, "identity") + { + @Override + UserPersistence<HttpPrincipal> getUserPersistence() + { + return mockUserPersistence; + } + }; + + final User<HttpPrincipal> expected = new User<HttpPrincipal>(userID); + expected.getIdentities().add(new NumericPrincipal(789)); + expected.getIdentities().add(new X500Principal("cn=foo,o=bar")); + + StringBuilder sb = new StringBuilder(); + UserWriter userWriter = new UserWriter(); + userWriter.write(expected, sb); + String expectedUser = sb.toString(); + + final PersonalDetails personalDetails = new PersonalDetails("cadc", "test"); + personalDetails.city = "city"; + expected.details.add(personalDetails); + + final PosixDetails posixDetails = new PosixDetails(123L, 456L, "/dev/null"); + expected.details.add(posixDetails); + + final Writer writer = new StringWriter(); + final PrintWriter printWriter = new PrintWriter(writer); + + expect(mockUserPersistence.getUser(userID)).andReturn(expected).once(); + mockResponse.setHeader("Content-Type", "text/xml"); + expectLastCall().once(); + expect(mockResponse.getWriter()).andReturn(printWriter).once(); + + replay(mockUserPersistence, mockResponse); + + SyncOutput syncOutput = new SyncOutput(mockResponse); + testSubject.setSyncOut(syncOutput); + testSubject.doAction(); + + String actualUser = writer.toString(); + + assertEquals(expectedUser, actualUser); + + verify(mockUserPersistence, mockResponse); + } + + @Test + public void writeUserWithDetailDisplay() throws Exception + { + final HttpServletResponse mockResponse = createMock(HttpServletResponse.class); + final UserPersistence<HttpPrincipal> mockUserPersistence = + createMock(UserPersistence.class); + final HttpPrincipal userID = new HttpPrincipal("CADCtest"); + + final GetUserAction testSubject = new GetUserAction(userID, "display") + { + @Override + UserPersistence<HttpPrincipal> getUserPersistence() + { + return mockUserPersistence; + } + }; + + final User<HttpPrincipal> expected = new User<HttpPrincipal>(userID); + + final PersonalDetails personalDetails = new PersonalDetails("cadc", "test"); + expected.details.add(personalDetails); + + StringBuilder sb = new StringBuilder(); + UserWriter userWriter = new UserWriter(); + userWriter.write(expected, sb); + String expectedUser = sb.toString(); + + Set<PersonalDetails> details = expected.getDetails(PersonalDetails.class); + PersonalDetails pd = details.iterator().next(); + pd.city = "city"; + + expected.getIdentities().add(new NumericPrincipal(789)); + expected.getIdentities().add(new X500Principal("cn=foo,o=bar")); + + final PosixDetails posixDetails = new PosixDetails(123L, 456L, "/dev/null"); + expected.details.add(posixDetails); + + final Writer writer = new StringWriter(); + final PrintWriter printWriter = new PrintWriter(writer); + + expect(mockUserPersistence.getUser(userID)).andReturn(expected).once(); + mockResponse.setHeader("Content-Type", "text/xml"); + expectLastCall().once(); + expect(mockResponse.getWriter()).andReturn(printWriter).once(); + + replay(mockUserPersistence, mockResponse); + + SyncOutput syncOutput = new SyncOutput(mockResponse); + testSubject.setSyncOut(syncOutput); + testSubject.doAction(); + + String actualUser = writer.toString(); + + assertEquals(expectedUser, actualUser); + + verify(mockUserPersistence, mockResponse); + } + @Test public void writeUserJSON() throws Exception { @@ -134,7 +254,7 @@ public class GetUserActionTest createMock(UserPersistence.class); final HttpPrincipal userID = new HttpPrincipal("CADCtest"); - final GetUserAction testSubject = new GetUserAction(userID) + final GetUserAction testSubject = new GetUserAction(userID, null) { @Override UserPersistence<HttpPrincipal> getUserPersistence()