Commit 1fbebeb5 authored by Jeff Burke's avatar Jeff Burke
Browse files

s1657: support for detail parameter getting a user.

parent 57295495
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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>
+32 −2
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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)
+65 −3
Original line number Diff line number Diff line
@@ -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()