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
+