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: FSPreLogoutHandler.java,v 1.11 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 com.sun.identity.federation.services.FSSessionPartner;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.services.FSSession;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.services.FSSessionManager;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.services.util.FSServiceUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.services.util.FSSignatureUtil;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.common.FSUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.common.IFSConstants;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.common.LogUtil;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.jaxb.entityconfig.BaseConfigType;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.message.FSLogoutResponse;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.message.FSLogoutNotification;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.meta.IDFFMetaException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.meta.IDFFMetaManager;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.meta.IDFFMetaUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.federation.plugins.FederationSPAdapter;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.meta.jaxb.ProviderDescriptorType;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.multiprotocol.MultiProtocolUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.multiprotocol.SingleLogoutManager;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.plugin.session.SessionException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.plugin.session.SessionManager;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml.common.SAMLResponderException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.servlet.http.HttpServletRequest;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.servlet.http.HttpServletResponse;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.io.IOException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.HashMap;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.HashSet;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.logging.Level;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.List;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Iterator;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Set;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Pre logout handling.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpublic class FSPreLogoutHandler {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected HttpServletResponse response = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected HttpServletRequest request = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected String locale = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected Object ssoToken = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected String userID = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected IDFFMetaManager metaManager = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected ProviderDescriptorType hostedDescriptor = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected BaseConfigType hostedConfig = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected String currentEntityId = "";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected boolean isCurrentProviderIDPRole = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected FSLogoutNotification reqLogout = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected boolean isWMLAgent = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected static String LOGOUT_DONE_URL = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected static String COMMON_ERROR_URL = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected ProviderDescriptorType remoteDescriptor = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected String remoteEntityID = "";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected String realm = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected String hostedEntityId = "";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected String hostedRole = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected String metaAlias = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected String relayState = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Constructor.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Initializes FSAccountManager, IDFFMetaManager instance.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public FSPreLogoutHandler() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "FSPreLogoutHandler::FSPreLogoutHandler Constructor");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster metaManager = FSUtils.getIDFFMetaManager();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Invoked to set some commonly used URLs based on hosted provider.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected void setLogoutURL() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LOGOUT_DONE_URL = FSServiceUtils.getLogoutDonePageURL(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster request, hostedConfig, metaAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster COMMON_ERROR_URL = FSServiceUtils.getErrorPageURL(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster request, hostedConfig, metaAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("LOGOUT_DONE_URL : " + LOGOUT_DONE_URL +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "\nCOMMON_ERROR_URL : " + COMMON_ERROR_URL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Sets the value of <code>RelayState</code> attribute.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param relayState the value of <code>RelayState</code> attribute.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void setRelayState(String relayState) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.relayState = relayState;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Sets the hosted provider details.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param hostedProviderDesc the descriptor of the hosted provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * handling logout
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void setHostedDescriptor(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ProviderDescriptorType hostedProviderDesc)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.hostedDescriptor = hostedProviderDesc;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Sets hosted provider's realm.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param realm the realm in which the provider resides
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void setRealm(String realm) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.realm = realm;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Sets hosted provider entity id.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param hostedEntityId hosted provider's entity id to be set
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void setHostedEntityId(String hostedEntityId) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.hostedEntityId = hostedEntityId;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Sets hosted provider's extended meta config.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param hostedConfig hosted provider's extended meta
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void setHostedDescriptorConfig(BaseConfigType hostedConfig) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.hostedConfig = hostedConfig;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Sets hosted provider's meta alias.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param metaAlias hosted provider's meta alias to be set
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void setMetaAlias(String metaAlias) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.metaAlias = metaAlias;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Sets hosted provider's role.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param hostedRole hosted provider's role.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void setHostedProviderRole(String hostedRole) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.hostedRole = hostedRole;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Sets remote provider's entity id.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void setRemoteEntityId(String remoteEntityId) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster remoteEntityID = remoteEntityId;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Sets the Remote Descriptor.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param remoteDesc Remote Provider Descriptor.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void setRemoteDescriptor(ProviderDescriptorType remoteDesc) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.remoteDescriptor = remoteDesc;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Sets the logout request received from remote provider.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param reqLogout the <code>FSLogoutNotification</code> request from
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * remote provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void setLogoutRequest(FSLogoutNotification reqLogout) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.reqLogout = reqLogout;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Initiates logout at this provider when the user has clicked on the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * logout option.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param request <code>HttPServletRequest</code> object from the user agent
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param response <code>HttPServletRsponse</code> to be sent back to the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * user agent
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param ssoToken used to identify the principal who wants to logout
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param sourceCheck where the logout coming from
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return <code>true</code> if the logout is successful; <code>false</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * otherwise.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public FSLogoutStatus handleSingleLogout(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletRequest request,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletResponse response,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Object ssoToken,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String sourceCheck)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.request = request;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster setLogoutURL();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Entered FSPreLogoutHandler::handleSingleLogout");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.response = response;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.ssoToken = ssoToken;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.userID =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SessionManager.getProvider().getPrincipalName(ssoToken);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String acceptString = request.getHeader("Accept");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((acceptString != null) &&
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (acceptString.indexOf("text/vnd.wap.wml") != -1))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isWMLAgent = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSSessionManager sMgr = FSSessionManager.getInstance(metaAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSSession session = sMgr.getSession(ssoToken);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String sessionIndex = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List partners = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (session != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sessionIndex = session.getSessionIndex();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster partners = session.getSessionPartners();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (partners != null && partners.size() != 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Iterator iter = partners.iterator();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster while(iter.hasNext()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSSessionPartner partner =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (FSSessionPartner)iter.next();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "PARTNER:" + partner.getPartner());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSLogoutUtil.liveConnectionsExist(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userID, metaAlias))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HashMap providerMap = FSLogoutUtil.getCurrentProvider(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userID, metaAlias, ssoToken);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (providerMap != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSSessionPartner currentSessionProvider =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (FSSessionPartner)providerMap.get(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IFSConstants.PARTNER_SESSION);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sessionIndex =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (String)providerMap.get(IFSConstants.SESSION_INDEX);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (currentSessionProvider != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // this is IDP initiated based single logout
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // HTTP or SOAP is based on metadata
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("creating IDP handler");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSSingleLogoutHandler handlerObj =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster new FSSingleLogoutHandler();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setHostedDescriptor(hostedDescriptor);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setHostedDescriptorConfig(hostedConfig);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setRealm(realm);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setHostedEntityId(hostedEntityId);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setHostedProviderRole(hostedRole);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setMetaAlias(metaAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setRelayState(relayState);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return handlerObj.handleSingleLogout(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster response, request, currentSessionProvider, userID,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sessionIndex, isWMLAgent, ssoToken);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "No more providers, nothing to broadcast " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "\ndestroy user session call destroyPrincipalSession");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSLogoutUtil.destroyPrincipalSession(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userID, metaAlias, sessionIndex, request, response);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // control could come here when local login has happened
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // In this FSSessionmap will not have anything and so we destroy
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // the session based on ssoToken
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSLogoutUtil.destroyLocalSession(ssoToken, request, response);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster returnToPostLogout(IFSConstants.SAML_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return new FSLogoutStatus(IFSConstants.SAML_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("No live connections, destroy user" +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster " session call destroyPrincipalSession. source=" +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sourceCheck);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSLogoutResponse logoutResponse = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FederationSPAdapter spAdapter = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Call SP Adapter preSingleLogoutProcess for SP/HTTP
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (hostedRole != null &&
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster hostedRole.equalsIgnoreCase(IFSConstants.SP) &&
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sourceCheck.equals("remote"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spAdapter = FSServiceUtils.getSPAdapter(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster hostedEntityId, hostedConfig);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (spAdapter != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("FSPreLogoutHandler, " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "call preSingleLogoutProcess, SP/HTTP");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logoutResponse = FSLogoutResponse.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster parseURLEncodedRequest(request);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster relayState = logoutResponse.getRelayState();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // unabled to access logoutRequest here
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spAdapter.preSingleLogoutProcess(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster hostedEntityId,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster request, response, userID, null, logoutResponse,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IFSConstants.LOGOUT_SP_REDIRECT_PROFILE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // ignore adapter error
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "preSingleLogoutProcess.SP/HTTP", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSLogoutUtil.destroyPrincipalSession(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userID, metaAlias, sessionIndex, request, response);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // control will come here when local login has happened
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // In this FSSessionmap will not have anything and so we destroy
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // the session based on ssoToken
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SessionManager.getProvider().isValid(ssoToken)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSLogoutUtil.destroyLocalSession(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ssoToken, request, response);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Call SP Adapter postSingleLogoutProcess for SP/HTTP
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (hostedRole != null &&
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster hostedRole.equalsIgnoreCase(IFSConstants.SP) &&
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sourceCheck.equals("remote"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (spAdapter != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("FSPreLogoutHandler, " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "call postSingleLogoutProcess, SP/HTTP");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spAdapter.postSingleLogoutSuccess(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster hostedEntityId,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster request, response, userID, null, logoutResponse,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IFSConstants.LOGOUT_SP_REDIRECT_PROFILE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // ignore adapter exception
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "postSingleLogoutSuccess.SP/HTTP:", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster returnToPostLogout(IFSConstants.SAML_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return new FSLogoutStatus(IFSConstants.SAML_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch(SessionException e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.error("SessionException in liveConnectionsExist"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " So destroy self and exit");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSLogoutUtil.destroyPrincipalSession(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userID, metaAlias, null, request, response);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // cannot call FSLogoutUtil.destroyLocalSession(ssoToken)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // since session exception has occurred
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster returnToPostLogout(IFSConstants.SAML_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return new FSLogoutStatus(IFSConstants.SAML_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Processes logout request received via HTTP redirect/GET.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param request <code>HttpServletRequest</code> object from the user agent
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param response <code>HttpServletRsponse</code> to be sent back to the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * user agent
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param ssoToken used to identify the principal who wants to logout
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return <code>FSLogoutStatus</code> object to indicate the status of
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the logout process.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public FSLogoutStatus processHttpSingleLogoutRequest(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletRequest request,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletResponse response,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Object ssoToken)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("Entered FSPrelogoutHandler::" +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "processSingleLogoutRequest HTTP Redirect");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.request = request;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.locale = FSServiceUtils.getLocale(request);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster setLogoutURL();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.response = response;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.ssoToken = ssoToken;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSSessionManager sMgr = FSSessionManager.getInstance(metaAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSSession session = sMgr.getSession(ssoToken);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String sessionIndex = session.getSessionIndex();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (session!=null && session.getOneTime()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.userID =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SessionManager.getProvider().getPrincipalName(ssoToken);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("FSPH:processSingleLogout: Onetime case");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.userID = FSLogoutUtil.getUserFromRequest(reqLogout,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster realm, hostedEntityId, hostedRole, hostedConfig, metaAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SessionException se) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.error("processSingleLogoutRequest", se);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.userID = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (userID == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("FSPrelogoutHandler::User Not found");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSLogoutUtil.returnToSource(response,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster remoteDescriptor,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IFSConstants.SAML_RESPONDER,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster COMMON_ERROR_URL,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster reqLogout.getMinorVersion(),
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster hostedConfig,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster hostedEntityId,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return new FSLogoutStatus(IFSConstants.SAML_RESPONDER);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String acceptString = request.getHeader("Accept");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((acceptString != null) &&
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (acceptString.indexOf("text/vnd.wap.wml") != -1))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isWMLAgent = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String relayState = reqLogout.getRelayState();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSLogoutUtil.cleanSessionMapPartnerList(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userID, remoteEntityID, metaAlias, session);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("FSPrelogoutHandler::calling getCurrentProvider");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean bHasAnyOtherProvider = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HashMap providerMap = new HashMap();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSSessionPartner sessionPartner = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster providerMap = FSLogoutUtil.getCurrentProvider(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userID, metaAlias, ssoToken);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (providerMap != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sessionPartner = (FSSessionPartner)providerMap.get(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IFSConstants.PARTNER_SESSION);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sessionIndex = (String)providerMap.get(IFSConstants.SESSION_INDEX);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (sessionPartner != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster bHasAnyOtherProvider = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("bHasAnyOtherProvider = " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster bHasAnyOtherProvider);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster currentEntityId = sessionPartner.getPartner();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("bHasAnyOtherProvider other than source : " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster bHasAnyOtherProvider);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // this is SP initiated HTTP based single logout
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("FSPreLogout::creating FSSingleLogoutHandler");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSSingleLogoutHandler handlerObj = new FSSingleLogoutHandler();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setHostedDescriptor(hostedDescriptor);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setHostedDescriptorConfig(hostedConfig);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setRealm(realm);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setHostedEntityId(hostedEntityId);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setHostedProviderRole(hostedRole);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setMetaAlias(metaAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setSingleLogoutProtocol(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IFSConstants.LOGOUT_SP_REDIRECT_PROFILE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //handlerObj.setRemoteDescriptor(remoteDescriptor);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //handlerObj.setRemoteEntityId(remoteEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return handlerObj.processHttpSingleLogoutRequest(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster response, request, reqLogout,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sessionPartner, userID, ssoToken, remoteEntityID, sessionIndex,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isWMLAgent, relayState,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (hostedRole.equals(IFSConstants.SP) ?
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IFSConstants.IDP : IFSConstants.SP));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Processes logout request received via SOAP profile.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param reqLogout <code>FSLogoutNotification</code> request received from
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * remote provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return <code>FSLogoutStatus</code> object indicates the status of
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the logout process
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public FSLogoutStatus processSingleLogoutRequest(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSLogoutNotification reqLogout)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("Entered FSPreLogoutHandler::" +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster " processSingleLogoutRequest SOAP Profile");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // User DN needs to be figured from logout request
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userID = FSLogoutUtil.getUserFromRequest(reqLogout, realm,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster hostedEntityId, hostedRole, hostedConfig, metaAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (userID == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.error("User does not exist. Invalid request");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return new FSLogoutStatus(IFSConstants.SAML_REQUESTER);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSSessionManager sessionManager =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSSessionManager.getInstance(metaAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String sessionIndex = reqLogout.getSessionIndex();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSSession session = sessionManager.getSession(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sessionManager.getSessionList(userID), sessionIndex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSLogoutUtil.cleanSessionMapPartnerList(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userID, remoteEntityID, metaAlias, session);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean bHasAnyOtherProvider = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HashMap providerMap = new HashMap();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSSessionPartner sessionPartner = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster providerMap = FSLogoutUtil.getCurrentProvider(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userID, metaAlias, ssoToken, session);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (providerMap != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sessionPartner = (FSSessionPartner)providerMap.get(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IFSConstants.PARTNER_SESSION);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sessionIndex = (String)providerMap.get(IFSConstants.SESSION_INDEX);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (sessionPartner != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster bHasAnyOtherProvider = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("bHasAnyOtherProvider = " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster bHasAnyOtherProvider);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster currentEntityId = sessionPartner.getPartner();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("bHasAnyOtherProvider other than source : " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster bHasAnyOtherProvider);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // this is SP initiated SOAP based single logout
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("creating FSSingleLogoutHandler");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSSingleLogoutHandler handlerObj = new FSSingleLogoutHandler();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setHostedDescriptor(hostedDescriptor);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setHostedDescriptorConfig(hostedConfig);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setRealm(realm);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setHostedEntityId(hostedEntityId);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setHostedProviderRole(hostedRole);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setMetaAlias(metaAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerObj.setSingleLogoutProtocol(IFSConstants.LOGOUT_SP_SOAP_PROFILE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //handlerObj.setRemoteDescriptor(remoteDescriptor);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //handlerObj.setRemoteEntityId(remoteEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return handlerObj.processSingleLogoutRequest(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster reqLogout,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sessionPartner,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userID,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster remoteEntityID,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sessionIndex,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isWMLAgent,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (hostedRole.equals(IFSConstants.SP)?
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IFSConstants.IDP : IFSConstants.SP));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Determines the return location and redirects based on
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * logout Return URL of the provider that initially sent the logout request.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * If request was not sent by remote provider then the local logout-done
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * page is thrown back to the user
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private void returnToPostLogout(String logoutStatus) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("Entered FSPreLogoutHandler::returnToPostLogout");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean error = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean logoutSuccess = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!logoutStatus.equals(IFSConstants.SAML_SUCCESS)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logoutSuccess = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean multiProtocolInvoked = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean toInvokeMultiProtocol = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (MultiProtocolUtils.isMultipleProtocolSession(request,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SingleLogoutManager.IDFF) &&
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster hostedRole.equalsIgnoreCase(IFSConstants.IDP) &&
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster !MultiProtocolUtils.isMultiProtocolRelayState(relayState)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster toInvokeMultiProtocol = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String returnProviderId = "";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String relayState = "";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String gLogoutStatus = "";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String inResponseTo = "";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String retURL = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSLogoutResponse responseLogout = new FSLogoutResponse();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSReturnSessionManager mngInst =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSReturnSessionManager.getInstance(metaAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HashMap providerMap = new HashMap();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (mngInst != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster providerMap = mngInst.getUserProviderInfo(userID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (providerMap == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Return URL based on local postlogout URL" +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "\nNo Source in ReturnMAP : rs=" + this.relayState);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (toInvokeMultiProtocol) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("FSPreLogHandler.retToPostLogout:"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " call MP HTTP, status=" + logoutStatus);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster multiProtocolInvoked = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int retStatus =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handleMultiProtocolLogout(logoutStatus, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (retStatus ==
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SingleLogoutManager.LOGOUT_REDIRECTED_STATUS) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((retStatus ==
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SingleLogoutManager.LOGOUT_FAILED_STATUS) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (retStatus ==
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SingleLogoutManager.LOGOUT_PARTIAL_STATUS)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logoutSuccess = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((this.relayState == null) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (this.relayState.length() == 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSServiceUtils.returnLocallyAfterOperation(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster response, LOGOUT_DONE_URL, logoutSuccess,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IFSConstants.LOGOUT_SUCCESS,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IFSConstants.LOGOUT_FAILURE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSServiceUtils.returnLocallyAfterOperation(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster response, this.relayState, logoutSuccess,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IFSConstants.LOGOUT_SUCCESS,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IFSConstants.LOGOUT_FAILURE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster returnProviderId = (String) providerMap.get(IFSConstants.PROVIDER);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ProviderDescriptorType descriptor = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (hostedRole.equalsIgnoreCase(IFSConstants.IDP)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster descriptor = metaManager.getSPDescriptor(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster realm, returnProviderId);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster descriptor = metaManager.getIDPDescriptor(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster realm, returnProviderId);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster retURL = descriptor.getSingleLogoutServiceReturnURL();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster relayState =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (String) providerMap.get(IFSConstants.LOGOUT_RELAY_STATE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster gLogoutStatus =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (String) providerMap.get(IFSConstants.LOGOUT_STATUS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster inResponseTo =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (String) providerMap.get(IFSConstants.RESPONSE_TO);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster mngInst.removeUserProviderInfo(userID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("Deleted " + userID +" from return list");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster responseLogout.setResponseTo(inResponseTo);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster responseLogout.setRelayState(relayState);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster responseLogout.setProviderId(hostedEntityId);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (gLogoutStatus != null ) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster responseLogout.setStatus(logoutStatus);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster responseLogout.setID(IFSConstants.LOGOUTID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster responseLogout.setMinorVersion(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSServiceUtils.getMinorVersion(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster descriptor.getProtocolSupportEnumeration()));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // call multi-federation protocol processing
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (toInvokeMultiProtocol) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("FSPreLogHandler.retToPostLogout:"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " call MP HTTP, response="
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + responseLogout.toXMLString());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster multiProtocolInvoked = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int retStatus = handleMultiProtocolLogout(logoutStatus,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster responseLogout.toXMLString(true, true));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (retStatus ==
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SingleLogoutManager.LOGOUT_REDIRECTED_STATUS) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((retStatus ==
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SingleLogoutManager.LOGOUT_FAILED_STATUS) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (retStatus ==
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SingleLogoutManager.LOGOUT_PARTIAL_STATUS)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logoutSuccess = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster responseLogout.setStatus(IFSConstants.SAML_RESPONDER);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String urlEncodedResponse =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster responseLogout.toURLEncodedQueryString();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Sign the request querystring
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSServiceUtils.isSigningOn()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String certAlias =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDFFMetaUtils.getFirstAttributeValueFromConfig(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster hostedConfig, IFSConstants.SIGNING_CERT_ALIAS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (certAlias == null || certAlias.length() == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "FSBrowserArtifactConsumerHandler:: " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "signSAMLRequest:" +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "couldn't obtain this site's cert alias.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAMLResponderException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.bundle.getString(IFSConstants.NO_CERT_ALIAS));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster urlEncodedResponse = FSSignatureUtil.signAndReturnQueryString(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster urlEncodedResponse, certAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster StringBuffer redirectURL = new StringBuffer();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster redirectURL.append(retURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (retURL.indexOf(IFSConstants.QUESTION_MARK) == -1) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster redirectURL.append(IFSConstants.QUESTION_MARK);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster redirectURL.append(IFSConstants.AMPERSAND);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster redirectURL.append(urlEncodedResponse);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("Response to be sent (3) : " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster redirectURL.toString());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster response.sendRedirect(redirectURL.toString());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (IOException e){
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Unable to get LRURL. No location to redirect." +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "processing completed:", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster error = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (IDFFMetaException e){
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.error("Unable to get LRURL. No location to redirect" +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster " processing completed:", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster error = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "FSPreLogoutHandler::General exception thrown :", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster error = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (error) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] data =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {FSUtils.bundle.getString(IFSConstants.LOGOUT_REDIRECT_FAILED)};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,LogUtil.LOGOUT_REDIRECT_FAILED,data,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ssoToken);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logoutSuccess = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // call multi-federation protocol processing
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (toInvokeMultiProtocol && !multiProtocolInvoked) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // invoke multiple federation protocol in exception case
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("FSPreLogHandler.retToPostLogout:"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " call MP HTTP, error=" + error);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster multiProtocolInvoked = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int retStatus = handleMultiProtocolLogout(logoutStatus, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (retStatus == SingleLogoutManager.LOGOUT_REDIRECTED_STATUS) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((retStatus == SingleLogoutManager.LOGOUT_FAILED_STATUS) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (retStatus == SingleLogoutManager.LOGOUT_PARTIAL_STATUS)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logoutSuccess = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSServiceUtils.returnLocallyAfterOperation(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster response, LOGOUT_DONE_URL, logoutSuccess,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IFSConstants.LOGOUT_SUCCESS, IFSConstants.LOGOUT_FAILURE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private int handleMultiProtocolLogout(String status, String responseXML) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int currentStatus = SingleLogoutManager.LOGOUT_FAILED_STATUS;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((status != null) && status.equals(IFSConstants.SAML_SUCCESS)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster currentStatus = SingleLogoutManager.LOGOUT_SUCCEEDED_STATUS;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Set set = new HashSet();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster set.add(ssoToken);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int retStatus = SingleLogoutManager.LOGOUT_SUCCEEDED_STATUS;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String requestXML = (reqLogout == null) ?
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster null : reqLogout.toXMLString(true, true);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean isSOAPProfile = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] propVals = SessionManager.getProvider()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .getProperty(ssoToken, IFSConstants.IS_SOAP_PROFILE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((propVals != null) && (propVals.length != 0) &&
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (propVals[0].equals("false"))) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isSOAPProfile = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String finalRelayState = relayState;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((finalRelayState == null) || (finalRelayState.length() == 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster finalRelayState = LOGOUT_DONE_URL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster retStatus = SingleLogoutManager.getInstance().
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster doIDPSingleLogout(set, userID, request, response, isSOAPProfile,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster true, SingleLogoutManager.IDFF, realm, hostedEntityId,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster remoteEntityID, finalRelayState, requestXML, responseXML,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster currentStatus);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.error("FSSLOHandler.doIDPProfile: MP/SOAP", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster retStatus = SingleLogoutManager.LOGOUT_FAILED_STATUS;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("FSSLOHandler.doIDPSoapProfile: "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "return status = " + retStatus);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return retStatus;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}