diff --git a/login-tool/tool/src/java/org/sakaiproject/login/tool/ContainerLogin.java b/login-tool/tool/src/java/org/sakaiproject/login/tool/ContainerLogin.java index f5ead4e..ee92b91 100644 --- a/login-tool/tool/src/java/org/sakaiproject/login/tool/ContainerLogin.java +++ b/login-tool/tool/src/java/org/sakaiproject/login/tool/ContainerLogin.java @@ -123,6 +123,9 @@ public class ContainerLogin extends HttpServlet session.removeAttribute(Tool.HELPER_MESSAGE); session.removeAttribute(Tool.HELPER_DONE_URL); + // Mark as successfully authenticated + session.setAttribute(SkinnableLogin.ATTR_CONTAINER_SUCCESS, SkinnableLogin.ATTR_CONTAINER_SUCCESS); + // redirect to the done URL res.sendRedirect(res.encodeRedirectURL(url)); @@ -134,7 +137,7 @@ public class ContainerLogin extends HttpServlet M_log.warn("Authentication Failed for: "+ remoteUser+ ". "+ ex.getMessage()); } - // mark the session and redirect (for login failuer or authentication exception) + // mark the session and redirect (for login failure or authentication exception) session.setAttribute(SkinnableLogin.ATTR_CONTAINER_CHECKED, SkinnableLogin.ATTR_CONTAINER_CHECKED); res.sendRedirect(res.encodeRedirectURL(getUrl(session, SkinnableLogin.ATTR_RETURN_URL))); } diff --git a/login-tool/tool/src/java/org/sakaiproject/login/tool/ContainerLogout.java b/login-tool/tool/src/java/org/sakaiproject/login/tool/ContainerLogout.java new file mode 100644 index 0000000..3f524ed --- /dev/null +++ b/login-tool/tool/src/java/org/sakaiproject/login/tool/ContainerLogout.java @@ -0,0 +1,95 @@ +package org.sakaiproject.login.tool; + +import java.io.IOException; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.sakaiproject.component.api.ServerConfigurationService; +import org.sakaiproject.component.cover.ComponentManager; +import org.sakaiproject.event.api.UsageSessionService; +import org.sakaiproject.tool.api.Session; +import org.sakaiproject.tool.api.Tool; +import org.sakaiproject.tool.api.SessionManager; + +/** + * This servlet is useful when you want to have another HTTP request made for logout as your container based + * authentication needs to do some cleanup and you can't do that on a normal logout. We redirect to this servlet + * so that we can be sure that we get the additional HTTP request on a known URL. + */ +public class ContainerLogout extends HttpServlet { + + /** Our log (commons). */ + private static final Log M_log = LogFactory.getLog(ContainerLogin.class); + + private ServerConfigurationService serverConfigurationService; + private UsageSessionService usageSessionService; + private SessionManager sessionManager; + + /** + * Access the Servlet's information display. + * + * @return servlet information. + */ + public String getServletInfo() + { + return "Sakai Container Logout"; + } + + /** + * Initialize the servlet. + * + * @param config + * The servlet config. + * @throws ServletException + */ + public void init(ServletConfig config) throws ServletException + { + super.init(config); + + M_log.debug("init()"); + serverConfigurationService = (ServerConfigurationService) ComponentManager.get(ServerConfigurationService.class); + usageSessionService = (UsageSessionService) ComponentManager.get(UsageSessionService.class); + sessionManager = (SessionManager) ComponentManager.get(SessionManager.class); + } + + /** + * Shutdown the servlet. + */ + public void destroy() + { + M_log.debug("destroy()"); + + super.destroy(); + } + + protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException + { + // get the session + Session session = sessionManager.getCurrentSession(); + String returnUrl = serverConfigurationService.getString("login.container.logout.url", null); + + // if we end up with nowhere to go, go to the portal + if (returnUrl == null) + { + M_log.warn("login.container.logout.url isn't set, to use container logout it should be."); + returnUrl = (String)session.getAttribute(Tool.HELPER_DONE_URL); + if (returnUrl == null || "".equals(returnUrl)) + { + M_log.debug("complete: nowhere set to go, going to portal"); + returnUrl = serverConfigurationService.getPortalUrl(); + } + } + + usageSessionService.logout(); + + // redirect to the done URL + res.sendRedirect(res.encodeRedirectURL(returnUrl)); + + } +} diff --git a/login-tool/tool/src/java/org/sakaiproject/login/tool/SkinnableLogin.java b/login-tool/tool/src/java/org/sakaiproject/login/tool/SkinnableLogin.java index a78ff72..d39497b 100644 --- a/login-tool/tool/src/java/org/sakaiproject/login/tool/SkinnableLogin.java +++ b/login-tool/tool/src/java/org/sakaiproject/login/tool/SkinnableLogin.java @@ -71,6 +71,9 @@ public class SkinnableLogin extends HttpServlet implements Login { /** Session attribute set and shared with ContainerLoginTool: if set we have failed container and need to check internal. */ public static final String ATTR_CONTAINER_CHECKED = "sakai.login.container.checked"; + /** Session attribute to show that session was successfully authenticated through the container. */ + public static final String ATTR_CONTAINER_SUCCESS = "sakai.login.container.success"; + /** Marker to indicate we are logging in the PDA Portal and should put out abbreviated HTML */ public static final String PDA_PORTAL_SUFFIX = "/pda/"; @@ -169,12 +172,20 @@ public class SkinnableLogin extends HttpServlet implements Login { if (parts[1].equals("logout")) { // get the session info complete needs, since the logout will invalidate and clear the session - String returnUrl = (String) session.getAttribute(Tool.HELPER_DONE_URL); - - // logout the user - UsageSessionService.logout(); - - complete(returnUrl, null, tool, res); + String containerLogoutUrl = serverConfigurationService.getString("login.container.logout.url", null); + String containerLogout = getServletConfig().getInitParameter("container-logout"); + if ( containerLogoutUrl != null && session.getAttribute(ATTR_CONTAINER_SUCCESS) != null && + containerLogout != null) + { + res.sendRedirect(res.encodeRedirectURL(containerLogout)); + } + else + { + String returnUrl = (String) session.getAttribute(Tool.HELPER_DONE_URL); + // logout the user + UsageSessionService.logout(); + complete(returnUrl, null, tool, res); + } return; } diff --git a/login-tool/tool/src/webapp/WEB-INF/web.xml b/login-tool/tool/src/webapp/WEB-INF/web.xml index 0fbc85e..fd52ea8 100644 --- a/login-tool/tool/src/webapp/WEB-INF/web.xml +++ b/login-tool/tool/src/webapp/WEB-INF/web.xml @@ -53,6 +53,13 @@ sakai.login.container REQUEST + + + sakai.request.container + sakai.logout.container + REQUEST + + sakai.login @@ -61,6 +68,10 @@ container /sakai-login-tool/container + + container-logout + /sakai-login-tool/container/logout + 1 @@ -69,12 +80,23 @@ org.sakaiproject.login.tool.ContainerLogin 1 + + + sakai.logout.container + org.sakaiproject.login.tool.ContainerLogout + sakai.login.container /container/* + + + + sakai.logout.container + /container/logout +