bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington/*
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: FSReturnSessionManager.java,v 1.4 2009/01/28 05:35:07 ww203982 Exp $
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * Portions Copyright 2015 ForgeRock AS.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpackage com.sun.identity.federation.services.logout;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.HashMap;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Map;
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunningtonimport com.sun.identity.federation.common.FSUtils;
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunningtonimport com.sun.identity.federation.common.IFSConstants;
a14393818a78c503f7715c393044b33c86e90195Phill Cunningtonimport org.forgerock.openam.ldap.LDAPUtils;
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunningtonimport org.forgerock.opendj.ldap.DN;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Contains session information for logout.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpublic final class FSReturnSessionManager{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static Map instanceMap = new HashMap();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private Map userAndProviderMap = new HashMap();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private FSReturnSessionManager() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("FSReturnSessionManager(): Called." +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster " A new instance of FSReturnSessionManager created");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns the provider info where logout was initiated for
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * a certain userDN. This is so that control of flow can be returned back to
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * that provider to display status page of that provider.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param userDN user whose provider information is to be retrieved
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return HashMap containing <code>providerId</code>,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <code>relaystate</code>, <code>sessionIndex</code>, etc.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public HashMap getUserProviderInfo(String userDN){
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("FSReturnSessionManager::getUserProviderInfo");
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington userDN = DN.valueOf(userDN).toString().toLowerCase();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return (HashMap)userAndProviderMap.get(userDN);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Set logout status so that control of flow can be returned back to
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * that provider to display status page of that provider.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param logoutStatus logout status to be saved
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param userDN user whose provider information is to be retrieved
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void setLogoutStatus(String logoutStatus,String userDN){
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("FSReturnSessionManager::setLogoutStatus");
a14393818a78c503f7715c393044b33c86e90195Phill Cunnington userDN = LDAPUtils.formatToRFC(userDN);
a14393818a78c503f7715c393044b33c86e90195Phill Cunnington HashMap userMap = (HashMap)userAndProviderMap.get(userDN);
a14393818a78c503f7715c393044b33c86e90195Phill Cunnington if (userMap != null) {
a14393818a78c503f7715c393044b33c86e90195Phill Cunnington userMap.remove(IFSConstants.LOGOUT_STATUS);
a14393818a78c503f7715c393044b33c86e90195Phill Cunnington userMap.put(IFSConstants.LOGOUT_STATUS, logoutStatus);
a14393818a78c503f7715c393044b33c86e90195Phill Cunnington removeUserProviderInfo(userDN);
a14393818a78c503f7715c393044b33c86e90195Phill Cunnington synchronized (userAndProviderMap) {
a14393818a78c503f7715c393044b33c86e90195Phill Cunnington userAndProviderMap.put(userDN, userMap);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Sets the provider info where logout was initiated
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * for a user. Other values that are needed when returning control back
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * like <code>relayState</code> is also stored.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param userDN user whose provider information is to be retrieved
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param providerId providerId where logout was initiated for this user
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param isIDP the role of the source provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param relayState url must be sent back in return
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param responseTo <code>InResponseTo</code> value
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void setUserProviderInfo(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String userDN,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String providerId,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String isIDP,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String relayState,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String responseTo)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Entered FSReturnSessionManager::setUserProviderInfo");
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington userDN = DN.valueOf(userDN).toString().toLowerCase();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HashMap valMap = new HashMap();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster valMap.put(IFSConstants.PROVIDER, providerId);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster valMap.put(IFSConstants.ROLE, isIDP);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster valMap.put(IFSConstants.LOGOUT_RELAY_STATE, relayState);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster valMap.put(IFSConstants.RESPONSE_TO, responseTo);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster removeUserProviderInfo(userDN);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster synchronized (userAndProviderMap) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userAndProviderMap.put(userDN, valMap);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Removes provider information for user. This function is called prior to
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * returning after logout.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param userDN user whose logout is being performed
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void removeUserProviderInfo(String userDN){
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Entered FSReturnSessionManager::removeUserProviderInfo");
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington userDN = DN.valueOf(userDN).toString().toLowerCase();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster synchronized (userAndProviderMap) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userAndProviderMap.remove(userDN);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Gets the singleton instance of <code>FSReturnSessionManager</code>.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * There is a single instance for each hosted provider.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return metaAlias the hosted provider whose instance needs to be
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * returned
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the singleton <code>FSReturnSessionManager</code> instance
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static FSReturnSessionManager getInstance(String metaAlias){
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("Entered FSReturnSessionManager::getInstance");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSReturnSessionManager instance = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster synchronized (FSReturnSessionManager.class) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster instance =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (FSReturnSessionManager)instanceMap.get(metaAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (instance == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (FSUtils.debug.messageEnabled() ) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FSUtils.debug.message("Constructing a new instance"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " of FSReturnSessionManager");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster instance = new FSReturnSessionManager();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster instanceMap.put(metaAlias, instance);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return (instance);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}