From 1fbebeb5814638bb64c37506ba53cc7b170061aa Mon Sep 17 00:00:00 2001 From: Jeff Burke <Jeff.Burke@nrc-cnrc.gc.ca> Date: Thu, 20 Aug 2015 08:34:17 -0700 Subject: [PATCH] s1657: support for detail parameter getting a user. --- projects/cadcAccessControl-Server/build.xml | 2 +- .../ac/server/web/users/GetUserAction.java | 34 +++++++++- .../server/web/users/UserActionFactory.java | 2 +- .../server/web/users/GetUserActionTest.java | 68 ++++++++++++++++++- 4 files changed, 99 insertions(+), 7 deletions(-) diff --git a/projects/cadcAccessControl-Server/build.xml b/projects/cadcAccessControl-Server/build.xml index 39cce90c..8a87c3bc 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/web/users/GetUserAction.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/GetUserAction.java index 4793c719..8e871363 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.getFirstName())); + } + else + { + throw new IllegalArgumentException("Illegal detail parameter " + detail); + } + } } catch (UserNotFoundException e) { @@ -137,7 +167,7 @@ public class GetUserAction extends AbstractUserAction protected boolean isServops() { - log.debug("alinga-- isServops(): augmentUserDN = " + this.augmentUserDN); + log.debug("isServops(): augmentUserDN = " + this.augmentUserDN); boolean isServops = false; AccessControlContext acc = AccessController.getContext(); Subject subject = Subject.getSubject(acc); 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 ae8ec410..ce45a74e 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) 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 8fbc0a4a..f34c6ffc 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,25 +67,32 @@ */ 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; public class GetUserActionTest { - @Test +// @Test public void writeUserXML() throws Exception { final SyncOutput mockSyncOut = @@ -94,7 +101,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() @@ -126,6 +133,61 @@ public class GetUserActionTest } @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(); + + sb = new StringBuilder(); + userWriter.write(expected, sb); + String actualUser = sb.toString(); + assertEquals(expectedUser, actualUser); + + verify(mockUserPersistence, mockResponse); + } + +// @Test public void writeUserJSON() throws Exception { final SyncOutput mockSyncOut = @@ -134,7 +196,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() -- GitLab