diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/ACSearchRunner.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/ACSearchRunner.java similarity index 99% rename from projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/ACSearchRunner.java rename to projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/ACSearchRunner.java index 80661d4573cc2e4efaac40fcbdc5e609de09053d..ae86263f837d7413bc12de9657f676aecf99a9e1 100755 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/ACSearchRunner.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/ACSearchRunner.java @@ -66,7 +66,7 @@ * ************************************************************************ */ -package ca.nrc.cadc.ac.server.web.groups; +package ca.nrc.cadc.ac.server.web; import ca.nrc.cadc.ac.Group; import ca.nrc.cadc.ac.GroupNotFoundException; diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/GroupServlet.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupServlet.java similarity index 97% rename from projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/GroupServlet.java rename to projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupServlet.java index fb9a2dbfff49f2851412f52663898931a3d5b695..d6f394f94b63221af21e4a94467b17c69736a9dc 100755 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/GroupServlet.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupServlet.java @@ -66,7 +66,7 @@ * ************************************************************************ */ -package ca.nrc.cadc.ac.server.web.groups; +package ca.nrc.cadc.ac.server.web; import java.io.IOException; import java.security.PrivilegedActionException; @@ -76,9 +76,11 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import ca.nrc.cadc.ac.server.web.groups.AbstractGroupAction; +import ca.nrc.cadc.ac.server.web.groups.GroupLogInfo; +import ca.nrc.cadc.ac.server.web.groups.GroupsActionFactory; import org.apache.log4j.Logger; -import ca.nrc.cadc.ac.server.web.SyncOutput; import ca.nrc.cadc.auth.AuthenticationUtil; /** diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/LoginServlet.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/LoginServlet.java similarity index 99% rename from projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/LoginServlet.java rename to projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/LoginServlet.java index f1daa9db4f5c8870590ca10c0698b5cbe55ce33c..9a9c28dc1c34e3c72211aaddfe52acc93a03692b 100755 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/LoginServlet.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/LoginServlet.java @@ -66,7 +66,7 @@ * ************************************************************************ */ -package ca.nrc.cadc.ac.server.web.users; +package ca.nrc.cadc.ac.server.web; import java.io.IOException; import java.security.AccessControlException; diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/PasswordServlet.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/PasswordServlet.java similarity index 97% rename from projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/PasswordServlet.java rename to projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/PasswordServlet.java index 20fca463e31263da2908a76d88fff44da3cf668e..68c5a9e81c1188b1e6e008f3731656f9ca37206b 100644 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/PasswordServlet.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/PasswordServlet.java @@ -66,33 +66,25 @@ * ************************************************************************ */ -package ca.nrc.cadc.ac.server.web.users; - -import java.io.IOException; -import java.security.AccessControlException; -import java.security.Principal; -import java.security.PrivilegedExceptionAction; -import java.util.Set; -import java.util.TreeSet; - -import javax.security.auth.Subject; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import ca.nrc.cadc.ac.UserNotFoundException; -import ca.nrc.cadc.ac.server.ldap.LdapUserDAO; -import ca.nrc.cadc.net.TransientException; -import org.apache.log4j.Logger; +package ca.nrc.cadc.ac.server.web; import ca.nrc.cadc.ac.User; +import ca.nrc.cadc.ac.UserNotFoundException; import ca.nrc.cadc.ac.server.ldap.LdapUserPersistence; import ca.nrc.cadc.auth.AuthenticationUtil; -import ca.nrc.cadc.auth.HttpPrincipal; import ca.nrc.cadc.log.ServletLogInfo; import ca.nrc.cadc.util.StringUtil; -import org.omg.CORBA.UserException; +import org.apache.log4j.Logger; +import javax.security.auth.Subject; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.security.AccessControlException; +import java.security.Principal; +import java.security.PrivilegedExceptionAction; +import java.util.TreeSet; /** * Servlet to handle password changes. Passwords are an integral part of the @@ -106,7 +98,6 @@ public class PasswordServlet extends HttpServlet { private static final Logger log = Logger.getLogger(PasswordServlet.class); - /** * Attempt to change password. * diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UserServlet.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/UserServlet.java similarity index 97% rename from projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UserServlet.java rename to projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/UserServlet.java index e73a9ae960f0fe30961108681ca9c8964c1b34b3..2d7bf6f993081c3b8d84083827263b0a501ec421 100644 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UserServlet.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/UserServlet.java @@ -66,13 +66,14 @@ * ************************************************************************ */ -package ca.nrc.cadc.ac.server.web.users; +package ca.nrc.cadc.ac.server.web; -import ca.nrc.cadc.ac.server.web.SyncOutput; +import ca.nrc.cadc.ac.server.web.users.AbstractUserAction; +import ca.nrc.cadc.ac.server.web.users.GetUserAction; +import ca.nrc.cadc.ac.server.web.users.UserActionFactory; +import ca.nrc.cadc.ac.server.web.users.UserLogInfo; import ca.nrc.cadc.auth.AuthenticationUtil; import ca.nrc.cadc.auth.ServletPrincipalExtractor; -import ca.nrc.cadc.auth.X509CertificateChain; -import ca.nrc.cadc.util.ArrayUtil; import ca.nrc.cadc.util.StringUtil; import org.apache.log4j.Logger; @@ -87,8 +88,6 @@ import java.io.IOException; import java.security.AccessController; import java.security.Principal; import java.security.PrivilegedActionException; -import java.security.cert.X509Certificate; -import java.util.Arrays; import java.util.Set; public class UserServlet extends HttpServlet diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/WhoAmIServlet.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/WhoAmIServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..20dc72d35a61db26e0d639fe23a8a286b150de69 --- /dev/null +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/WhoAmIServlet.java @@ -0,0 +1,193 @@ +/* + ************************************************************************ + ******************* CANADIAN ASTRONOMY DATA CENTRE ******************* + ************** CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES ************** + * + * (c) 2015. (c) 2015. + * Government of Canada Gouvernement du Canada + * National Research Council Conseil national de recherches + * Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6 + * All rights reserved Tous droits réservés + * + * NRC disclaims any warranties, Le CNRC dénie toute garantie + * expressed, implied, or énoncée, implicite ou légale, + * statutory, of any kind with de quelque nature que ce + * respect to the software, soit, concernant le logiciel, + * including without limitation y compris sans restriction + * any warranty of merchantability toute garantie de valeur + * or fitness for a particular marchande ou de pertinence + * purpose. NRC shall not be pour un usage particulier. + * liable in any event for any Le CNRC ne pourra en aucun cas + * damages, whether direct or être tenu responsable de tout + * indirect, special or general, dommage, direct ou indirect, + * consequential or incidental, particulier ou général, + * arising from the use of the accessoire ou fortuit, résultant + * software. Neither the name de l'utilisation du logiciel. Ni + * of the National Research le nom du Conseil National de + * Council of Canada nor the Recherches du Canada ni les noms + * names of its contributors may de ses participants ne peuvent + * be used to endorse or promote être utilisés pour approuver ou + * products derived from this promouvoir les produits dérivés + * software without specific prior de ce logiciel sans autorisation + * written permission. préalable et particulière + * par écrit. + * + * This file is part of the Ce fichier fait partie du projet + * OpenCADC project. OpenCADC. + * + * OpenCADC is free software: OpenCADC est un logiciel libre ; + * you can redistribute it and/or vous pouvez le redistribuer ou le + * modify it under the terms of modifier suivant les termes de + * the GNU Affero General Public la “GNU Affero General Public + * License as published by the License” telle que publiée + * Free Software Foundation, par la Free Software Foundation + * either version 3 of the : soit la version 3 de cette + * License, or (at your option) licence, soit (à votre gré) + * any later version. toute version ultérieure. + * + * OpenCADC is distributed in the OpenCADC est distribué + * hope that it will be useful, dans l’espoir qu’il vous + * but WITHOUT ANY WARRANTY; sera utile, mais SANS AUCUNE + * without even the implied GARANTIE : sans même la garantie + * warranty of MERCHANTABILITY implicite de COMMERCIALISABILITÉ + * or FITNESS FOR A PARTICULAR ni d’ADÉQUATION À UN OBJECTIF + * PURPOSE. See the GNU Affero PARTICULIER. Consultez la Licence + * General Public License for Générale Publique GNU Affero + * more details. pour plus de détails. + * + * You should have received Vous devriez avoir reçu une + * a copy of the GNU Affero copie de la Licence Générale + * General Public License along Publique GNU Affero avec + * with OpenCADC. If not, see OpenCADC ; si ce n’est + * <http://www.gnu.org/licenses/>. pas le cas, consultez : + * <http://www.gnu.org/licenses/>. + * + * + ************************************************************************ + */ + +package ca.nrc.cadc.ac.server.web; + +import ca.nrc.cadc.ac.AC; +import ca.nrc.cadc.auth.AuthenticationUtil; +import ca.nrc.cadc.auth.HttpPrincipal; +import ca.nrc.cadc.log.ServletLogInfo; +import ca.nrc.cadc.reg.client.RegistryClient; +import org.apache.log4j.Logger; + +import javax.security.auth.Subject; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URI; +import java.net.URL; +import java.util.Set; + +/** + * Servlet to handle GET requests asking for the current User. This servlet + * will implement the /whoami functionality to return details about the + * currently authenticated user, or rather, the user whose Subject is currently + * found in this context. + */ +public class WhoAmIServlet extends HttpServlet +{ + private static final Logger log = Logger.getLogger(WhoAmIServlet.class); + + static final String USER_GET_PATH = "/users/%s?idType=HTTP"; + + /** + * Handle a /whoami GET operation. + * + * @param request The HTTP Request. + * @param response The HTTP Response. + * @throws ServletException Anything goes wrong at the Servlet level. + * @throws IOException Any reading/writing errors. + */ + @Override + protected void doGet(final HttpServletRequest request, + final HttpServletResponse response) + throws ServletException, IOException + { + final long start = System.currentTimeMillis(); + final ServletLogInfo logInfo = new ServletLogInfo(request); + log.info(logInfo.start()); + try + { + final Subject currentSubject = getSubject(request); + final Set<HttpPrincipal> currentWebPrincipals = + currentSubject.getPrincipals(HttpPrincipal.class); + + if (currentWebPrincipals.isEmpty()) + { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + } + else + { + redirect(response, currentWebPrincipals.toArray( + new HttpPrincipal[1])[0]); + } + } + catch (IllegalArgumentException e) + { + log.debug(e.getMessage(), e); + logInfo.setMessage(e.getMessage()); + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + } + catch (Throwable t) + { + String message = "Internal Server Error: " + t.getMessage(); + log.error(message, t); + logInfo.setSuccess(false); + logInfo.setMessage(message); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + finally + { + logInfo.setElapsedTime(System.currentTimeMillis() - start); + log.info(logInfo.end()); + } + } + + /** + * Forward on to the Service's user endpoint. + * + * @param response The HTTP response. + * @param webPrincipal The HttpPrincipal instance. + */ + void redirect(final HttpServletResponse response, + final HttpPrincipal webPrincipal) throws IOException + { + final RegistryClient registryClient = getRegistryClient(); + final URL redirectURL = + registryClient.getServiceURL( + URI.create(AC.GMS_SERVICE_URI), "http", USER_GET_PATH); + + // Take the first one. + response.sendRedirect(String.format(redirectURL.toExternalForm(), + webPrincipal.getName())); + } + + /** + * Tests will need to override this method so as not to rely on the + * environment. + * + * @return Registry Client instance. + */ + RegistryClient getRegistryClient() + { + return new RegistryClient(); + } + + /** + * Get and augment the Subject. Tests can override this method. + * + * @param request Servlet request + * @return augmented Subject + */ + Subject getSubject(final HttpServletRequest request) + { + return AuthenticationUtil.getSubject(request); + } +} diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/AbstractGroupAction.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/AbstractGroupAction.java index 9a93cfecf3ead83a4ac28fe764ce58c7823470fc..11f64c0d7ee01902dd64f4116efef72558bd5b75 100755 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/AbstractGroupAction.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/AbstractGroupAction.java @@ -101,17 +101,17 @@ public abstract class AbstractGroupAction implements PrivilegedExceptionAction<O abstract void doAction() throws Exception; - void setLogInfo(GroupLogInfo logInfo) + public void setLogInfo(GroupLogInfo logInfo) { this.logInfo = logInfo; } - void setHttpServletRequest(HttpServletRequest request) + public void setHttpServletRequest(HttpServletRequest request) { this.request = request; } - void setSyncOut(SyncOutput syncOut) + public void setSyncOut(SyncOutput syncOut) { this.syncOut = syncOut; } diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/AbstractUserAction.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/AbstractUserAction.java index 0bc7392038066642dccb6dc7d7dca583a7f68042..8205ffb92de22a8a57615bf6e3d7d49d34579b65 100644 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/AbstractUserAction.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/AbstractUserAction.java @@ -105,8 +105,8 @@ import java.util.Set; public abstract class AbstractUserAction implements PrivilegedExceptionAction<Object> { private static final Logger log = Logger.getLogger(AbstractUserAction.class); - static final String DEFAULT_CONTENT_TYPE = "text/xml"; - static final String JSON_CONTENT_TYPE = "application/json"; + public static final String DEFAULT_CONTENT_TYPE = "text/xml"; + public static final String JSON_CONTENT_TYPE = "application/json"; protected boolean isAugmentUser; protected UserLogInfo logInfo; diff --git a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/users/UserServletTest.java b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/UserServletTest.java similarity index 93% rename from projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/users/UserServletTest.java rename to projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/UserServletTest.java index 3ab00e88c44a487a6367aec89f39d44ecb9142e9..e8558a79981f63228a356f12fd90055b199c94a7 100644 --- a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/users/UserServletTest.java +++ b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/UserServletTest.java @@ -1,8 +1,9 @@ -package ca.nrc.cadc.ac.server.web.users; +package ca.nrc.cadc.ac.server.web; import javax.servlet.http.HttpServletRequest; +import ca.nrc.cadc.ac.server.web.UserServlet; import org.junit.Test; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; diff --git a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/WhoAmIServletTest.java b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/WhoAmIServletTest.java new file mode 100644 index 0000000000000000000000000000000000000000..35ad6d450fc2d529e9b74f8b6ca369d8716242ba --- /dev/null +++ b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/WhoAmIServletTest.java @@ -0,0 +1,148 @@ +/* + ************************************************************************ + ******************* CANADIAN ASTRONOMY DATA CENTRE ******************* + ************** CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES ************** + * + * (c) 2015. (c) 2015. + * Government of Canada Gouvernement du Canada + * National Research Council Conseil national de recherches + * Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6 + * All rights reserved Tous droits réservés + * + * NRC disclaims any warranties, Le CNRC dénie toute garantie + * expressed, implied, or énoncée, implicite ou légale, + * statutory, of any kind with de quelque nature que ce + * respect to the software, soit, concernant le logiciel, + * including without limitation y compris sans restriction + * any warranty of merchantability toute garantie de valeur + * or fitness for a particular marchande ou de pertinence + * purpose. NRC shall not be pour un usage particulier. + * liable in any event for any Le CNRC ne pourra en aucun cas + * damages, whether direct or être tenu responsable de tout + * indirect, special or general, dommage, direct ou indirect, + * consequential or incidental, particulier ou général, + * arising from the use of the accessoire ou fortuit, résultant + * software. Neither the name de l'utilisation du logiciel. Ni + * of the National Research le nom du Conseil National de + * Council of Canada nor the Recherches du Canada ni les noms + * names of its contributors may de ses participants ne peuvent + * be used to endorse or promote être utilisés pour approuver ou + * products derived from this promouvoir les produits dérivés + * software without specific prior de ce logiciel sans autorisation + * written permission. préalable et particulière + * par écrit. + * + * This file is part of the Ce fichier fait partie du projet + * OpenCADC project. OpenCADC. + * + * OpenCADC is free software: OpenCADC est un logiciel libre ; + * you can redistribute it and/or vous pouvez le redistribuer ou le + * modify it under the terms of modifier suivant les termes de + * the GNU Affero General Public la “GNU Affero General Public + * License as published by the License” telle que publiée + * Free Software Foundation, par la Free Software Foundation + * either version 3 of the : soit la version 3 de cette + * License, or (at your option) licence, soit (à votre gré) + * any later version. toute version ultérieure. + * + * OpenCADC is distributed in the OpenCADC est distribué + * hope that it will be useful, dans l’espoir qu’il vous + * but WITHOUT ANY WARRANTY; sera utile, mais SANS AUCUNE + * without even the implied GARANTIE : sans même la garantie + * warranty of MERCHANTABILITY implicite de COMMERCIALISABILITÉ + * or FITNESS FOR A PARTICULAR ni d’ADÉQUATION À UN OBJECTIF + * PURPOSE. See the GNU Affero PARTICULIER. Consultez la Licence + * General Public License for Générale Publique GNU Affero + * more details. pour plus de détails. + * + * You should have received Vous devriez avoir reçu une + * a copy of the GNU Affero copie de la Licence Générale + * General Public License along Publique GNU Affero avec + * with OpenCADC. If not, see OpenCADC ; si ce n’est + * <http://www.gnu.org/licenses/>. pas le cas, consultez : + * <http://www.gnu.org/licenses/>. + * + * + ************************************************************************ + */ + +package ca.nrc.cadc.ac.server.web; + +import ca.nrc.cadc.ac.AC; +import ca.nrc.cadc.auth.HttpPrincipal; +import ca.nrc.cadc.reg.client.RegistryClient; +import org.junit.Test; + +import javax.security.auth.Subject; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.net.URI; +import java.net.URL; +import java.security.PrivilegedExceptionAction; + +import static org.easymock.EasyMock.*; + + +public class WhoAmIServletTest +{ + @Test + public void doGet() throws Exception + { + final Subject subject = new Subject(); + subject.getPrincipals().add(new HttpPrincipal("CADCtest")); + + final RegistryClient mockRegistry = createMock(RegistryClient.class); + final WhoAmIServlet testSubject = new WhoAmIServlet() + { + /** + * Tests will need to override this method so as not to rely on the + * environment. + * + * @return Registry Client instance. + */ + @Override + RegistryClient getRegistryClient() + { + return mockRegistry; + } + + @Override + Subject getSubject(final HttpServletRequest request) + { + return subject; + } + }; + + final HttpServletRequest mockRequest = + createMock(HttpServletRequest.class); + final HttpServletResponse mockResponse = + createMock(HttpServletResponse.class); + + expect(mockRequest.getPathInfo()).andReturn("users/CADCtest").once(); + expect(mockRequest.getMethod()).andReturn("GET").once(); + expect(mockRequest.getRemoteAddr()).andReturn("mysite.com").once(); + + mockResponse.sendRedirect("https://mysite.com/ac/users/CADCtest?idType=HTTP"); + expectLastCall().once(); + + expect(mockRegistry.getServiceURL(URI.create(AC.GMS_SERVICE_URI), + "http", "/users/%s?idType=HTTP")). + andReturn(new URL("https://mysite.com/ac/users/CADCtest?idType=HTTP")).once(); + + replay(mockRequest, mockResponse, mockRegistry); + + + Subject.doAs(subject, new PrivilegedExceptionAction<Void>() + { + @Override + public Void run() throws Exception + { + testSubject.doGet(mockRequest, mockResponse); + return null; + } + }); + + verify(mockRequest, mockResponse, mockRegistry); + } +}