Ravi Nori has uploaded a new change for review. Change subject: aaa: Add SSO UI for Changing expired user passwd ......................................................................
aaa: Add SSO UI for Changing expired user passwd Add Change Password page and sso service to handle the request. The backend code is not yet in place Change-Id: I9923114954737ea49b8ccd3d8ee69072cb5e01d9 Bug-Url: https://bugzilla.redhat.com/1092744 Signed-off-by: Ravi Nori <rn...@redhat.com> --- A backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/servlets/LoginChangePasswdServlet.java M backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/servlets/LoginPhase3Servlet.java M backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/AuthenticationUtils.java M backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/AuthnMessageMapper.java M backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/Credentials.java M backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/SSOUtils.java A backend/manager/modules/enginesso/src/main/webapp/WEB-INF/changePasswd.jsp M backend/manager/modules/enginesso/src/main/webapp/WEB-INF/login.jsp M backend/manager/modules/enginesso/src/main/webapp/WEB-INF/web.xml 9 files changed, 203 insertions(+), 17 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/45/40445/1 diff --git a/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/servlets/LoginChangePasswdServlet.java b/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/servlets/LoginChangePasswdServlet.java new file mode 100644 index 0000000..11bc5cd --- /dev/null +++ b/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/servlets/LoginChangePasswdServlet.java @@ -0,0 +1,62 @@ +package org.ovirt.engine.core.sso.servlets; + +import org.ovirt.engine.core.sso.utils.AuthenticationException; +import org.ovirt.engine.core.sso.utils.Credentials; +import org.ovirt.engine.core.sso.utils.SSOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.util.Map; + +public class LoginChangePasswdServlet extends HttpServlet { + + private static final long serialVersionUID = -88168919566901736L; + private static final String USERNAME = "username"; + private static final String OLD_PASSWORD = "oldPassword"; + private static final String NEW_PASSWORD1 = "newPassword1"; + private static final String NEW_PASSWORD2 = "newPassword2"; + private static final String PROFILE = "profile"; + + private static Logger log = LoggerFactory.getLogger(LoginChangePasswdServlet.class); + + @Override + protected void service(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + HttpSession session = request.getSession(true); + try { + if (SSOUtils.isUserAuthenticated(session)) { + changeUserPasswd(request); + } + } catch (AuthenticationException ex) { + log.error("Password Change failed", ex.getMessage()); + log.debug("Password Change failed", ex); + request.getSession(true).setAttribute(SSOUtils.LOGIN_MSG, ex.getMessage()); + response.sendRedirect(request.getContextPath() + SSOUtils.PASSWORD_CHANGE_FORM_URI); + } finally { + session.removeAttribute(SSOUtils.PASSWD_EXPIRED_USER_NAME); + session.removeAttribute(SSOUtils.PASSWD_EXPIRED_USER_PROFILE); + } + } + + private void changeUserPasswd(HttpServletRequest request) throws AuthenticationException { + Credentials userCredentials = getUserCredentials(request); + if (userCredentials == null) { + throw new AuthenticationException(""); + } + // call to change passwd + } + + private Credentials getUserCredentials(HttpServletRequest request) { + Map<String, String[]> paramMap = request.getParameterMap(); + return paramMap.containsKey(USERNAME) && paramMap.containsKey(OLD_PASSWORD) && paramMap.containsKey(NEW_PASSWORD1) && paramMap.containsKey(NEW_PASSWORD2) && paramMap.containsKey(PROFILE) ? + new Credentials(request.getParameter(USERNAME), request.getParameter(OLD_PASSWORD), request.getParameter(NEW_PASSWORD1), request.getParameter(NEW_PASSWORD2), request.getParameter(PROFILE)) : + null; + } + +} diff --git a/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/servlets/LoginPhase3Servlet.java b/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/servlets/LoginPhase3Servlet.java index 46cb903..97d9062 100644 --- a/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/servlets/LoginPhase3Servlet.java +++ b/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/servlets/LoginPhase3Servlet.java @@ -31,6 +31,8 @@ throws ServletException, IOException { HttpSession session = request.getSession(true); try { + request.getSession(true).removeAttribute(SSOUtils.LOGIN_MSG); + request.getSession(true).removeAttribute(SSOUtils.LOGIN_PASSWD_CHANGE_URI_MSG); if (SSOUtils.isUserAuthenticated(session)) { request.getRequestDispatcher(SSOUtils.LOGIN_PHASE4_URI).forward(request, response); } else { @@ -53,6 +55,7 @@ throw new AuthenticationException(""); } try { + request.getSession().setAttribute(SSOUtils.USER_CREDENTIALS, userCredentials); AuthenticationUtils.handleCredentials( session, userCredentials.getUsername(), diff --git a/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/AuthenticationUtils.java b/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/AuthenticationUtils.java index 429fc33..937664f9 100644 --- a/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/AuthenticationUtils.java +++ b/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/AuthenticationUtils.java @@ -68,6 +68,13 @@ ); if (outputMap.<Integer>get(Base.InvokeKeys.RESULT) != Base.InvokeResult.SUCCESS || outputMap.<Integer>get(Authn.InvokeKeys.RESULT) != Authn.AuthResult.SUCCESS) { + int authResult = outputMap.<Integer>get(Authn.InvokeKeys.RESULT); + if (authResult == Authn.AuthResult.CREDENTIALS_EXPIRED) { + Credentials userCredentials = (Credentials) session.getAttribute(SSOUtils.USER_CREDENTIALS); + session.setAttribute(SSOUtils.LOGIN_PASSWD_CHANGE_URI_MSG, session.getServletContext().getContextPath() + SSOUtils.PASSWORD_CHANGE_FORM_URI); + session.setAttribute(SSOUtils.PASSWD_EXPIRED_USER_NAME, userCredentials.getUsername()); + session.setAttribute(SSOUtils.PASSWD_EXPIRED_USER_PROFILE, userCredentials.getProfile()); + } throw new AuthenticationException(AuthnMessageMapper.mapMessageErrorCode(outputMap)); } diff --git a/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/AuthnMessageMapper.java b/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/AuthnMessageMapper.java index b806583..701955d 100644 --- a/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/AuthnMessageMapper.java +++ b/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/AuthnMessageMapper.java @@ -4,29 +4,14 @@ import org.ovirt.engine.api.extensions.aaa.Authn; public class AuthnMessageMapper { - public static final String USER_PASSWORD_EXPIRED_CHANGE_URL_PROVIDED = "Cannot Login. User Password has expired. Use the following URL to change the password: %s"; - public static final String USER_PASSWORD_EXPIRED_CHANGE_MSG_PROVIDED = "Cannot Login. User Password has expired. Use the following URL to change the password: %s"; - public static final String USER_PASSWORD_EXPIRED = "Cannot Login. User Password has expired, Please change your password."; + public static final String USER_PASSWORD_EXPIRED_CHANGE_URL_PROVIDED = "Cannot Login. User Password has expired."; public static final String USER_FAILED_TO_AUTHENTICATE = "Login failed. Please verify your login information or contact the system administrator."; public static final String mapMessageErrorCode(ExtMap outputMap) { String msg = USER_FAILED_TO_AUTHENTICATE; int authResult = outputMap.<Integer>get(Authn.InvokeKeys.RESULT); if (authResult == Authn.AuthResult.CREDENTIALS_EXPIRED) { - boolean addedUserPasswordExpired = false; - if (outputMap.<String> get(Authn.InvokeKeys.CREDENTIALS_CHANGE_URL) != null) { - msg = String.format(USER_PASSWORD_EXPIRED_CHANGE_URL_PROVIDED, - outputMap.<String>get(Authn.InvokeKeys.CREDENTIALS_CHANGE_URL)); - addedUserPasswordExpired = true; - } - if (outputMap.<String> get(Authn.InvokeKeys.USER_MESSAGE) != null) { - msg = String.format(USER_PASSWORD_EXPIRED_CHANGE_MSG_PROVIDED, - outputMap.<String>get(Authn.InvokeKeys.USER_MESSAGE)); - addedUserPasswordExpired = true; - } - if (!addedUserPasswordExpired) { - msg = USER_PASSWORD_EXPIRED; - } + msg = USER_PASSWORD_EXPIRED_CHANGE_URL_PROVIDED; } return msg; } diff --git a/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/Credentials.java b/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/Credentials.java index 559f356..845bc55 100644 --- a/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/Credentials.java +++ b/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/Credentials.java @@ -4,6 +4,8 @@ private String username; private String password; private String profile; + private String newPassword1; + private String newPassword2; public Credentials() { } @@ -11,6 +13,14 @@ public Credentials(String username, String password, String profile) { setUsername(username); setPassword(password); + setProfile(profile); + } + + public Credentials(String username, String password, String newPassword1, String newPassword2, String profile) { + setUsername(username); + setPassword(password); + setNewPassword1(newPassword1); + setNewPassword2(newPassword2); setProfile(profile); } @@ -37,4 +47,20 @@ public void setProfile(String profile) { this.profile = profile; } + + public String getNewPassword1() { + return newPassword1; + } + + public void setNewPassword1(String newPassword1) { + this.newPassword1 = newPassword1; + } + + public String getNewPassword2() { + return newPassword2; + } + + public void setNewPassword2(String newPassword2) { + this.newPassword2 = newPassword2; + } } diff --git a/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/SSOUtils.java b/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/SSOUtils.java index 9062413..605769a 100644 --- a/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/SSOUtils.java +++ b/backend/manager/modules/enginesso/src/main/java/org/ovirt/engine/core/sso/utils/SSOUtils.java @@ -26,6 +26,7 @@ public class SSOUtils { public static final String LOGIN_MSG = "loginMsg"; + public static final String LOGIN_PASSWD_CHANGE_URI_MSG = "passwordChangeUri"; public static final String PARAMS_MAP = "paramsMap"; public static final String SSO_AUTHZ_ATTR_NAME = "AUTHZ_NAME"; public static final String SSO_PROFILE_ATTR_NAME = "PROFILE_NAME"; @@ -49,6 +50,9 @@ public static final String LOGIN_PHASE3_URI = "/login-phase3"; public static final String LOGIN_PHASE4_URI = "/login-phase4"; public static final String LOGIN_FORM_URI = "/login.html"; + public static final String PASSWORD_CHANGE_FORM_URI = "/changePasswd.html"; + public static final String PASSWD_EXPIRED_USER_NAME = "username"; + public static final String PASSWD_EXPIRED_USER_PROFILE = "profile"; public static boolean isUserAuthenticated(HttpSession session) { Map<String, Object> sessionData = SSOUtils.getSessionData(session.getServletContext(), session.getId()); diff --git a/backend/manager/modules/enginesso/src/main/webapp/WEB-INF/changePasswd.jsp b/backend/manager/modules/enginesso/src/main/webapp/WEB-INF/changePasswd.jsp new file mode 100644 index 0000000..b8b33ec --- /dev/null +++ b/backend/manager/modules/enginesso/src/main/webapp/WEB-INF/changePasswd.jsp @@ -0,0 +1,75 @@ +<%@ page pageEncoding="UTF-8" session="true" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="obrand" uri="obrand" %> +<fmt:setLocale value="${locale}" /> +<!DOCTYPE html> +<html> +<head> + <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> + <obrand:favicon /> + <title>Login Page</title> + <obrand:stylesheets /> +</head> +<body> +<div class="obrand_loginPageBackground"> + <a href="<obrand:messages key="obrand.common.vendor_url"/>" class="obrand_loginPageLogoImageLink"> + <span class="obrand_loginPageLogoImage"></span> + </a> + <div class="login-pf"> + <div class="container"> + <div class="row"> + + <div class="col-sm-12"> + <div id="brand"> + <div class="obrand_loginFormLogoImage"></div> + </div> + </div> + <div class="col-sm-12"> + <div style="width:300px;"> + <form id="login_form" name="login_form" method="post" + action="${pageContext.request.contextPath}/login-changePasswd" enctype="application/x-www-form-urlencoded"> + <center> + <p>Please login to proceed.</p> + </center> + <c:if test="${sessionScope.loginMsg != null}"> + <center> + <p style="color: red"><c:out value="${sessionScope.loginMsg}" /></p> + </center> + </c:if> + <div style="margin-left: 15px;width:250px;"> + <p> + <label for="username" style="width:120px;"> Username</label><input id="username" + type="text" name="username" size="20" style="color:black;" value="${sessionScope.username}" readonly/> + </p> + <p> + <label for="oldPassword" style="width:120px;">Old Password</label><input id="oldPassword" + type="password" name="oldPassword" value="" size="20" style="color:black;"/> + </p> + <p> + <label for="newPassword1" style="width:120px;">New Password</label><input id="newPassword1" + type="password" name="newPassword1" value="" size="20" style="color:black;"/> + </p> + <p> + <label for="newPassword2" style="width:120px;">Retype Password</label><input id="newPassword2" + type="password" name="newPassword2" value="" size="20" style="color:black;"/> + </p> + <p> + <label for="profile" style="width:120px;"> Profile</label><input id="profile" + type="text" name="profile" size="20" style="color:black;" value="${sessionScope.profile}" readonly/> + </p> + + <center> + <input id="submit" type="submit" name="submit" value="Submit" + class="buttonmed" /> + </center> + </div> + </form> + </div> + </div> + </div> + </div> + </div> + </div> +</body> +</html> diff --git a/backend/manager/modules/enginesso/src/main/webapp/WEB-INF/login.jsp b/backend/manager/modules/enginesso/src/main/webapp/WEB-INF/login.jsp index 4d3552c..01f0f4a 100644 --- a/backend/manager/modules/enginesso/src/main/webapp/WEB-INF/login.jsp +++ b/backend/manager/modules/enginesso/src/main/webapp/WEB-INF/login.jsp @@ -37,6 +37,11 @@ <center> <p style="color: red"><c:out value="${sessionScope.loginMsg}" /></p> </center> + <c:if test="${sessionScope.passwordChangeUri != null}"> + <center> + <p style="color: red">Use the following <a href='<c:out value="${sessionScope.passwordChangeUri}"/>' > URL </a> to change password.</p> + </center> + </c:if> </c:if> <div style="margin-left: 15px;width:250px;"> <p> diff --git a/backend/manager/modules/enginesso/src/main/webapp/WEB-INF/web.xml b/backend/manager/modules/enginesso/src/main/webapp/WEB-INF/web.xml index a06c372..cadcd62 100644 --- a/backend/manager/modules/enginesso/src/main/webapp/WEB-INF/web.xml +++ b/backend/manager/modules/enginesso/src/main/webapp/WEB-INF/web.xml @@ -122,6 +122,15 @@ </servlet-mapping> <servlet> + <servlet-name>LoginChangePasswdServlet</servlet-name> + <servlet-class>org.ovirt.engine.core.sso.servlets.LoginChangePasswdServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>LoginChangePasswdServlet</servlet-name> + <url-pattern>/login-changePasswd</url-pattern> + </servlet-mapping> + + <servlet> <servlet-name>BasicAuthServlet</servlet-name> <servlet-class>org.ovirt.engine.core.sso.servlets.BasicAuthServlet</servlet-class> </servlet> @@ -181,6 +190,16 @@ <url-pattern>/login.html</url-pattern> </servlet-mapping> + <servlet> + <servlet-name>ChangePasswdForm</servlet-name> + <jsp-file>/WEB-INF/changePasswd.jsp</jsp-file> + </servlet> + + <servlet-mapping> + <servlet-name>ChangePasswdForm</servlet-name> + <url-pattern>/changePasswd.html</url-pattern> + </servlet-mapping> + <welcome-file-list> <welcome-file>login</welcome-file> </welcome-file-list> -- To view, visit https://gerrit.ovirt.org/40445 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I9923114954737ea49b8ccd3d8ee69072cb5e01d9 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Ravi Nori <rn...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches