a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The contents of this file are subject to the terms
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * of the Common Development and Distribution License
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * (the License). You may not use this file except in
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * compliance with the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * You can obtain a copy of the License at
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * https://opensso.dev.java.net/public/CDDLv1.0.html or
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * opensso/legal/CDDLv1.0.txt
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * See the License for the specific language governing
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * permission and limitations under the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * When distributing Covered Code, include this CDDL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Header Notice in each file and include the License file
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * at opensso/legal/CDDLv1.0.txt.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * If applicable, add the following below the CDDL Header,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * with the fields enclosed by brackets [] replaced by
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * your own identifying information:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * "Portions Copyrighted [year] [name of copyright owner]"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * $Id: FSSingleLogoutServlet.java,v 1.5 2008/12/19 06:50:47 exu Exp $
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpackage com.sun.identity.federation.services.logout;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.io.IOException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.servlet.ServletConfig;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.servlet.ServletException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.servlet.RequestDispatcher;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.servlet.http.HttpServlet;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.servlet.http.HttpServletRequest;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.servlet.http.HttpServletResponse;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.common.FSUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.common.IFSConstants;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.services.util.FSServiceUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.logging.Level;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Initiates <code>ID-FF</code> Single Logout.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpublic class FSSingleLogoutServlet extends HttpServlet {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Initiates the servlet.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param config the <code>ServletConfig</code> object that contains
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * configutation information for this servlet.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception ServletException if an exception occurs that interrupts
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the servlet's normal operation.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void init(ServletConfig config)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws ServletException
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster super.init(config);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("FSSingleLogoutServlet Initializing...");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Handles the HTTP GET request.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param request an <code>HttpServletRequest</code> object that contains
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the request the client has made of the servlet.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param response an <code>HttpServletResponse</code> object that contains
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the response the servlet sends to the client.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception ServletException if an input or output error is detected when
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the servlet handles the GET request
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception IOException if the request for the GET could not be handled
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void doGet(HttpServletRequest request,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletResponse response)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws ServletException, IOException
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster doGetPost(request, response);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Handles the HTTP POST request.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param request an <code>HttpServletRequest</code> object that contains
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the request the client has made of the servlet.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param response an <code>HttpServletResponse</code> object that contains
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the response the servlet sends to the client.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception ServletException if an input or output error is detected when
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the servlet handles the POST request
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception IOException if the request for the POST could not be handled
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void doPost(HttpServletRequest request,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletResponse response)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws ServletException, IOException
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster doGetPost(request, response);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Redirects the slo request to process logout servlet.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param request an <code>HttpServletRequest</code> object that contains
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the request the client has made of the servlet.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param response an <code>HttpServletResponse</code> object that contains
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the response the servlet sends to the client.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception ServletException if an input or output error is detected when
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the servlet handles the request
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception IOException if the request could not be handled
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private void doGetPost(HttpServletRequest request,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletResponse response)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws ServletException, IOException
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("FSSingleLogoutServlet doGetPost...");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Alias processing
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String providerAlias = request.getParameter(IFSConstants.META_ALIAS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (providerAlias == null || providerAlias.length() < 1) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster providerAlias = FSServiceUtils.getMetaAlias(request);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (providerAlias == null || providerAlias.length() < 1) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.error("Unable to retrieve alias, Hosted" +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster " Provider. Cannot process request");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster response.sendError(response.SC_INTERNAL_SERVER_ERROR,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.bundle.getString("aliasNotFound"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster request.setAttribute("logoutSource", "local");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster StringBuffer processLogout = new StringBuffer();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster processLogout.append(IFSConstants.SLO_VALUE)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .append("/")
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .append(IFSConstants.META_ALIAS)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .append(providerAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("About to get RequestDispatcher for " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster processLogout.toString());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RequestDispatcher dispatcher =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster getServletConfig().getServletContext().getRequestDispatcher(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster processLogout.toString()) ;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ( dispatcher == null ) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "RequestDispatcher is null.\nUnable to find " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster processLogout);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("calling sendErrorPage ");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSLogoutUtil.sendErrorPage(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster request,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster response,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster providerAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster dispatcher.forward(request, response);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster} // FSSingleLogoutServlet