diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/UserPersistence.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/UserPersistence.java index 380961d8e65420b6822e7f689e6d39829bd6bcdd..1b369f709fc643f55e6713dfe80fcee4cdc38cbe 100755 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/UserPersistence.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/UserPersistence.java @@ -120,6 +120,22 @@ public interface UserPersistence<T extends Principal> throws UserNotFoundException, TransientException, AccessControlException; + /** + * Attempt to login the specified user. + * + * @param userID The userID. + * @param password The password. + * + * @return Boolean + * + * @throws UserNotFoundException when the user is not found. + * @throws TransientException If an temporary, unexpected problem occurred. + * @throws AccessControlException If the operation is not permitted. + */ + Boolean loginUser(String userID, String password) + throws UserNotFoundException, TransientException, + AccessControlException; + /** * Updated the user specified by User. * 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 b133948eb0ef553f34d805512682f339d7b4cce4..5e0b281b83bf3451473c1aae836f2abb3857497d 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 @@ -177,11 +177,11 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO * * @param username username to verify. * @param password password to verify. - * @return User + * @return Boolean * @throws TransientException * @throws UserNotFoundException */ - public User<T> loginUser(final String username, final String password) + public Boolean loginUser(final String username, final String password) throws TransientException, UserNotFoundException { try @@ -191,7 +191,7 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO if (bindResult != null && bindResult.getResultCode() == ResultCode.SUCCESS) { - return getUser((T) new HttpPrincipal(username)); + return Boolean.TRUE; } else { @@ -200,7 +200,16 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO } catch (LDAPException e) { - logger.debug("addUser Exception: " + e, e); + logger.debug("loginUser Exception: " + e, e); + + if (e.getResultCode() == ResultCode.INVALID_CREDENTIALS) + { + throw new AccessControlException("Invalid password"); + } + else if (e.getResultCode() == ResultCode.NO_SUCH_OBJECT) + { + throw new AccessControlException("Invalid username"); + } throw new RuntimeException("Unexpected LDAP exception", e); } diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserPersistence.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserPersistence.java index af7662460e342b8ae107af471b1b57bf0aa8d019..05aedbac0b4c6e4eaae1f4cfbd1e09b7ebcf568f 100755 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserPersistence.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserPersistence.java @@ -175,7 +175,36 @@ public class LdapUserPersistence<T extends Principal> } } } - + + /** + * Get the user specified by userID. + * + * @param userID The userID. + * + * @return Boolean. + * + * @throws UserNotFoundException when the user is not found. + * @throws TransientException If an temporary, unexpected problem occurred. + * @throws AccessControlException If the operation is not permitted. + */ + public Boolean loginUser(String userID, String password) + throws UserNotFoundException, TransientException, AccessControlException + { + LdapUserDAO<T> userDAO = null; + try + { + userDAO = new LdapUserDAO<T>(this.config); + return userDAO.loginUser(userID, password); + } + finally + { + if (userDAO != null) + { + userDAO.close(); + } + } + } + /** * Updated the user specified by User. * diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UsersServlet.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/LoginServlet.java old mode 100644 new mode 100755 similarity index 69% rename from projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UsersServlet.java rename to projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/LoginServlet.java index 926ce997fb15e7cd01df865088749b3f82c429e1..927031daa00b3c59c117b859cbc4d156fe16520e --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UsersServlet.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/LoginServlet.java @@ -3,7 +3,7 @@ ******************* CANADIAN ASTRONOMY DATA CENTRE ******************* ************** CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES ************** * - * (c) 2015. (c) 2015. + * (c) 2014. (c) 2014. * Government of Canada Gouvernement du Canada * National Research Council Conseil national de recherches * Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6 @@ -69,55 +69,84 @@ package ca.nrc.cadc.ac.server.web.users; import java.io.IOException; +import java.security.AccessControlException; -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.UserAlreadyExistsException; -import ca.nrc.cadc.util.StringUtil; import org.apache.log4j.Logger; -import ca.nrc.cadc.auth.AuthenticationUtil; +import ca.nrc.cadc.ac.server.ldap.LdapUserPersistence; +import ca.nrc.cadc.auth.HttpPrincipal; +import ca.nrc.cadc.auth.SSOCookieManager; +import ca.nrc.cadc.log.ServletLogInfo; +import ca.nrc.cadc.util.StringUtil; -public class UsersServlet extends HttpServlet +@SuppressWarnings("serial") +public class LoginServlet extends HttpServlet { - private static final Logger log = Logger.getLogger(UsersServlet.class); - - + private static final Logger log = Logger.getLogger(LoginServlet.class); + private static final String CONTENT_TYPE = "text/plain"; /** - * Create a UserAction and run the action safely. + * Attempt to login for userid/password. */ - private void doAction(HttpServletRequest request, HttpServletResponse response) + @SuppressWarnings("rawtypes") + public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { long start = System.currentTimeMillis(); - UserLogInfo logInfo = new UserLogInfo(request); - + ServletLogInfo logInfo = new ServletLogInfo(request); try { log.info(logInfo.start()); - Subject subject = AuthenticationUtil.getSubject(request); - logInfo.setSubject(subject); - UsersAction action = UsersActionFactory.getUsersAction(request, logInfo); - action.setAcceptedContentType(getAcceptedContentType(request)); - action.doAction(subject, response); + String userID = request.getParameter("userid"); + String password = request.getParameter("password"); + if (StringUtil.hasText(userID)) + { + if (StringUtil.hasText(password)) + { + if (new LdapUserPersistence().loginUser(userID, password)) + { + String token = new SSOCookieManager().generate(new HttpPrincipal(userID)); + response.setContentType(CONTENT_TYPE); + response.setContentLength(token.length()); + response.getWriter().write(token); + } + } + else + { + throw new IllegalArgumentException("Missing password"); + } + } + else + { + throw new IllegalArgumentException("Missing userid"); + } } catch (IllegalArgumentException e) { log.debug(e.getMessage(), e); logInfo.setMessage(e.getMessage()); - logInfo.setSuccess(false); + response.setContentType(CONTENT_TYPE); response.getWriter().write(e.getMessage()); response.setStatus(400); } + catch (AccessControlException e) + { + log.debug(e.getMessage(), e); + logInfo.setMessage(e.getMessage()); + response.setContentType(CONTENT_TYPE); + response.getWriter().write(e.getMessage()); + response.setStatus(401); + } catch (Throwable t) { String message = "Internal Server Error: " + t.getMessage(); log.error(message, t); logInfo.setSuccess(false); logInfo.setMessage(message); + response.setContentType(CONTENT_TYPE); response.getWriter().write(message); response.setStatus(500); } @@ -127,59 +156,4 @@ public class UsersServlet extends HttpServlet log.info(logInfo.end()); } } - - @Override - public void doGet(HttpServletRequest request, HttpServletResponse response) - throws IOException - { - doAction(request, response); - } - - @Override - public void doPost(HttpServletRequest request, HttpServletResponse response) - throws IOException - { - doAction(request, response); - } - - @Override - public void doDelete(HttpServletRequest request, HttpServletResponse response) - throws IOException - { - doAction(request, response); - } - - @Override - public void doPut(HttpServletRequest request, HttpServletResponse response) - throws IOException - { - doAction(request, response); - } - - @Override - public void doHead(HttpServletRequest request, HttpServletResponse response) - throws IOException - { - doAction(request, response); - } - - /** - * Obtain the requested (Accept) content type. - * - * @param request The HTTP Request. - * @return String content type. - */ - String getAcceptedContentType(final HttpServletRequest request) - { - final String requestedContentType = request.getHeader("Accept"); - - if (!UsersAction.JSON_CONTENT_TYPE.equals(requestedContentType)) - { - return UsersAction.DEFAULT_CONTENT_TYPE; - } - else - { - return requestedContentType; - } - } }