From 611cf34e5ed5668d67ebbad2b258f518d35e97de Mon Sep 17 00:00:00 2001 From: Dustin Jenkins <Dustin.Jenkins@nrc-cnrc.gc.ca> Date: Mon, 10 Aug 2015 14:09:16 -0700 Subject: [PATCH] Story 1731: Re-use the AccessControlFilter for the password change servlet. --- .../ac/server/web/users/PasswordServlet.java | 113 ++++++++++-------- 1 file changed, 60 insertions(+), 53 deletions(-) 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/users/PasswordServlet.java index a7979bbd..499b1f5f 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/users/PasswordServlet.java @@ -70,7 +70,6 @@ package ca.nrc.cadc.ac.server.web.users; import java.io.IOException; import java.security.AccessControlException; -import java.security.PrivilegedAction; import java.util.Set; import javax.security.auth.Subject; @@ -87,15 +86,30 @@ import ca.nrc.cadc.auth.HttpPrincipal; import ca.nrc.cadc.log.ServletLogInfo; import ca.nrc.cadc.util.StringUtil; -@SuppressWarnings("serial") + +/** + * Servlet to handle password changes. Passwords are an integral part of the + * access control system and are handled differently to accommodate stricter + * guidelines. + * <p/> + * This servlet handles POST only. It relies on the Subject being set higher + * up by the AccessControlFilter as configured in the web descriptor. + */ public class PasswordServlet extends HttpServlet { private static final Logger log = Logger.getLogger(PasswordServlet.class); + + /** * Attempt to change password. + * + * @param request The HTTP Request. + * @param response The HTTP Response. + * @throws IOException Any errors that are not expected. */ - public void doPost(final HttpServletRequest request, final HttpServletResponse response) - throws IOException + public void doPost(final HttpServletRequest request, + final HttpServletResponse response) + throws IOException { response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); final long start = System.currentTimeMillis(); @@ -104,68 +118,61 @@ public class PasswordServlet extends HttpServlet try { final Subject subject = AuthenticationUtil.getSubject(request); - if ((subject == null) || (subject.getPrincipals(HttpPrincipal.class).isEmpty())) + if ((subject == null) + || (subject.getPrincipals(HttpPrincipal.class).isEmpty())) { logInfo.setMessage("Missing subject"); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); } else { - logInfo.setSubject(subject); - Subject.doAs(subject, new PrivilegedAction<Void>() + logInfo.setSubject(subject); + try { - @Override - public Void run() - { - try - { - response.setStatus(HttpServletResponse.SC_OK); - final Set<HttpPrincipal> webPrincipals = + response.setStatus(HttpServletResponse.SC_OK); + final Set<HttpPrincipal> webPrincipals = subject.getPrincipals(HttpPrincipal.class); - - User<HttpPrincipal> user = new User<HttpPrincipal>(webPrincipals.iterator().next()); - String oldPassword = request.getParameter("old_password"); - String newPassword = request.getParameter("new_password"); - if (StringUtil.hasText(oldPassword)) - { - if (StringUtil.hasText(newPassword)) - { - (new LdapUserPersistence<HttpPrincipal>()).setPassword(user, oldPassword, newPassword); - } - else - { - throw new IllegalArgumentException("Missing new password"); - } - } - else - { - throw new IllegalArgumentException("Missing old password"); - } - } - catch (IllegalArgumentException e) - { - log.debug(e.getMessage(), e); - logInfo.setMessage(e.getMessage()); - response.setStatus(HttpServletResponse.SC_BAD_REQUEST); - } - catch (AccessControlException e) + final User<HttpPrincipal> user = + new User<HttpPrincipal>(webPrincipals.iterator().next()); + String oldPassword = request.getParameter("old_password"); + String newPassword = request.getParameter("new_password"); + if (StringUtil.hasText(oldPassword)) + { + if (StringUtil.hasText(newPassword)) { - log.debug(e.getMessage(), e); - logInfo.setMessage(e.getMessage()); - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + (new LdapUserPersistence<HttpPrincipal>()) + .setPassword(user, oldPassword, newPassword); } - catch (Throwable t) + else { - String message = "Internal Server Error: " + t.getMessage(); - log.error(message, t); - logInfo.setSuccess(false); - logInfo.setMessage(message); - response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + throw new IllegalArgumentException("Missing new password"); } - - return null; } - }); + else + { + throw new IllegalArgumentException("Missing old password"); + } + } + catch (IllegalArgumentException e) + { + log.debug(e.getMessage(), e); + logInfo.setMessage(e.getMessage()); + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + } + catch (AccessControlException e) + { + log.debug(e.getMessage(), e); + logInfo.setMessage(e.getMessage()); + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + } + 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); + } } } catch (Throwable t) -- GitLab