IDPSSOUtil.java revision 0cd8368ca65c58915ee90bc73d84e65f3da9e120
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright (c) 2007 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: IDPSSOUtil.java,v 1.56 2009/11/24 21:53:28 madan_ranganath Exp $
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major/*
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper * Portions Copyrighted 2010-2013 ForgeRock, Inc
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpackage com.sun.identity.saml2.profile;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Majorimport com.iplanet.dpro.session.exceptions.StoreException;
89503929c8983c48e2049c77284b52e79ad37c32jeff.schenkimport com.sun.identity.saml2.common.*;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.shared.encode.URLEncDec;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.shared.DateUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.shared.xml.XMLUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.cot.CircleOfTrustManager;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.cot.CircleOfTrustDescriptor;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.cot.COTException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.multiprotocol.MultiProtocolUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.multiprotocol.SingleLogoutManager;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml.common.SAMLUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml.xmlsig.KeyProvider;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.assertion.Assertion;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.assertion.AssertionFactory;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.assertion.Attribute;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.assertion.AttributeStatement;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.assertion.AudienceRestriction;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.assertion.AuthnContext;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.assertion.AuthnStatement;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.assertion.Conditions;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.assertion.EncryptedAssertion;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.assertion.EncryptedAttribute;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.assertion.EncryptedID;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.assertion.Issuer;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.assertion.NameID;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.assertion.Subject;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.assertion.SubjectConfirmation;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.assertion.SubjectConfirmationData;
89503929c8983c48e2049c77284b52e79ad37c32jeff.schenkimport com.sun.identity.saml2.common.SAML2RepositoryFactory;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.ecp.ECPFactory;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.ecp.ECPResponse;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.idpdiscovery.IDPDiscoveryConstants;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.jaxb.entityconfig.IDPSSOConfigElement;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.jaxb.entityconfig.SPSSOConfigElement;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.jaxb.metadata.AffiliationDescriptorType;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.jaxb.metadata.ArtifactResolutionServiceElement;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.jaxb.metadata.AssertionConsumerServiceElement;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.jaxb.metadata.IDPSSODescriptorElement;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.jaxb.metadata.SPSSODescriptorElement;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.logging.LogUtil;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.key.EncInfo;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.key.KeyUtil;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.meta.SAML2MetaException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.meta.SAML2MetaManager;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.meta.SAML2MetaUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.plugins.IDPAccountMapper;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.plugins.IDPAttributeMapper;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.plugins.IDPAuthnContextInfo;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.plugins.IDPAuthnContextMapper;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.plugins.IDPECPSessionMapper;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.protocol.Artifact;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.protocol.AuthnRequest;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.protocol.NameIDPolicy;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.protocol.ProtocolFactory;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.protocol.Response;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.protocol.Status;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.protocol.StatusCode;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.plugin.monitoring.FedMonAgent;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.plugin.monitoring.FedMonSAML2Svc;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.plugin.monitoring.MonitorManager;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.plugin.session.SessionProvider;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.plugin.session.SessionManager;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.plugin.session.SessionException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.plugins.SAML2IdentityProviderAdapter;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.io.IOException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.io.OutputStream;
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Majorimport java.io.PrintWriter;
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeperimport java.security.PrivateKey;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.logging.Level;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.ArrayList;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Date;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.HashMap;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.HashSet;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Iterator;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.List;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Map;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Set;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.servlet.http.HttpServletRequest;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.servlet.http.HttpServletResponse;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.xml.soap.SOAPMessage;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * The utility class is used by the identity provider to process
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the authentication request from a service provider and send back
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * a proper response.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The identity provider can also send unsolicited response to a service
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * provider to do single sign on and/or federation.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpublic class IDPSSOUtil {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // key name for name id format on SSOToken
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static final String NAMEID_FORMAT = "SAML2NameIDFormat";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static final String NULL = "null";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static SAML2MetaManager metaManager = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static CircleOfTrustManager cotManager = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static IDPSessionListener sessionListener = new IDPSessionListener();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static SessionProvider sessionProvider = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static FedMonAgent agent;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static FedMonSAML2Svc saml2Svc;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster metaManager = new SAML2MetaManager();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster cotManager = new CircleOfTrustManager();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (COTException ce) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error("Error retreiving circle of trust");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SAML2MetaException sme) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.error("Error retrieving metadata", sme);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sessionProvider = SessionManager.getProvider();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SessionException se) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "IDPSSOUtil static block: Error getting SessionProvider.",
80849398a45dca1fb917716907d6ec99be6222c2Peter Major se);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster agent = MonitorManager.getAgent();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster saml2Svc = MonitorManager.getSAML2Svc();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Does SSO with existing federation or new federation
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param request the <code>HttpServletRequest</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param response the <code>HttpServletResponse</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param authnReq the <code>AuthnRequest</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param spEntityID the entity id of the service provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param idpMetaAlias the meta alias of the identity provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param nameIDFormat the <code>NameIDFormat</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param relayState the relay state
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static void doSSOFederate(HttpServletRequest request,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major HttpServletResponse response,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AuthnRequest authnReq,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String spEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpMetaAlias,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String nameIDFormat,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String relayState)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster doSSOFederate(request, response, authnReq,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major spEntityID, idpMetaAlias, nameIDFormat,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major relayState, null);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Does SSO with existing federation or new federation
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param request the <code>HttpServletRequest</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param response the <code>HttpServletResponse</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param authnReq the <code>AuthnRequest</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param spEntityID the entity id of the service provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param idpMetaAlias the meta alias of the identity provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param nameIDFormat the <code>NameIDFormat</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param relayState the relay state
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param newSession Session used in IDP Proxy Case
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static void doSSOFederate(HttpServletRequest request,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major HttpServletResponse response,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AuthnRequest authnReq,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String spEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpMetaAlias,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String nameIDFormat,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String relayState,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Object newSession)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.doSSOFederate: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Object session = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (newSession != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster session = newSession;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster session = sessionProvider.getSession(request);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SessionException se) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.warningEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.warning(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major classMethod + "No session yet.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // log the authnRequest
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String authnRequestStr = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (authnReq != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster authnRequestStr = authnReq.toXMLString();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] logdata = {spEntityID, idpMetaAlias, authnRequestStr};
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.access(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.RECEIVED_AUTHN_REQUEST, logdata, session);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // retrieve IDP entity id from meta alias
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String idpEntityID = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String realm = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (metaManager == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get meta manager.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("errorMetaManager"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idpEntityID = metaManager.getEntityByMetaAlias(idpMetaAlias);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if ((idpEntityID == null)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major || (idpEntityID.trim().length() == 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get IDP Entity ID from meta.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {idpEntityID};
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.INVALID_IDP, data, session);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("metaDataError"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster realm = SAML2MetaUtils.getRealmByMetaAlias(idpMetaAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SAML2MetaException sme) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get IDP Entity ID from meta.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {idpMetaAlias};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.IDP_METADATA_ERROR, data, session);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("metaDataError"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // check if the remote provider is valid
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (authnReq == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Issuer issuer = AssertionFactory.getInstance().createIssuer();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster issuer.setValue(spEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!SAML2Utils.isSourceSiteValid(issuer, realm, idpEntityID)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.warningEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.warning(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "The remote provider is not valid.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("invalidReceiver"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major // Validate the RelayState URL.
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.validateRelayStateURL(realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major relayState,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.IDP_ROLE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((authnReq == null) && (session == null)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // idp initiated and not logged in yet, need to authenticate
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major redirectAuthentication(request, response, authnReq,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major null, realm, idpEntityID, spEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (IOException ioe) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to redirect to authentication.", ioe);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAMLUtils.sendError(request, response,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major response.SC_INTERNAL_SERVER_ERROR,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "UnableToRedirectToAuth",
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("UnableToRedirectToAuth"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Invoke the IDP Adapter
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod + " Invoking the "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "IDP Adapter");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2IdentityProviderAdapter idpAdapter =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPSSOUtil.getIDPAdapterClass(realm, idpEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (idpAdapter != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // If the preSendResponse returns true we end here
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (idpAdapter.preSendResponse(authnReq, idpEntityID,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster realm, request, response, session, null, relayState)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } // else we continue with the logic. Beware of loops
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SAML2Exception se2) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod + " There was a problem when invoking"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "the preSendResponse of the IDP Adapter: ", se2);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // End of invocation
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sendResponseToACS(request, response, session, authnReq, spEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpEntityID, idpMetaAlias, realm, nameIDFormat, relayState, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Sends <code>Response</code> containing an <code>Assertion</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * back to the requesting service provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param request the <code>HttpServletRequest</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param response the <code>HttpServletResponse</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param session user session
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param authnReq the <code>AuthnRequest</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param spEntityID the entity id of the service provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param idpEntityID the entity id of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param idpMetaAlias the meta alias of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param nameIDFormat the <code>NameIDFormat</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param relayState the relay state
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param matchingAuthnContext the <code>AuthnContext</code> used to find
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * authentication type and scheme.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static void sendResponseToACS(HttpServletRequest request,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major HttpServletResponse response, Object session, AuthnRequest authnReq,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String spEntityID, String idpEntityID, String idpMetaAlias,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm, String nameIDFormat, String relayState,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AuthnContext matchingAuthnContext)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster StringBuffer returnedBinding = new StringBuffer();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String acsURL = IDPSSOUtil.getACSurl(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major spEntityID, realm, authnReq, request, returnedBinding);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String acsBinding = returnedBinding.toString();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((acsURL == null) || (acsURL.trim().length() == 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error("IDPSSOUtil.sendResponseToACS:" +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major " no ACS URL found.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {idpMetaAlias};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.NO_ACS_URL, data, session);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("UnableTofindACSURL"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((acsBinding == null) || (acsBinding.trim().length() == 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error("IDPSSOUtil.sendResponseToACS:" +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major " no return binding found.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {idpMetaAlias};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.NO_RETURN_BINDING, data, session);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("UnableTofindBinding"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String affiliationID = request.getParameter(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.AFFILIATION_ID);
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major //check first if there is already an existing sessionindex associated with this SSOToken, if there is, then
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major //we need to redirect the request internally to the holder of the idpsession.
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major //The remoteServiceURL will be null if there is no sessionindex for this SSOToken, or there is, but it's
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major //local. If the remoteServiceURL is not null, we can start to send the request to the original server.
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major String remoteServiceURL = SAML2Utils.getRemoteServiceURL(getSessionIndex(session));
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major if (remoteServiceURL != null) {
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major remoteServiceURL += SAML2Utils.removeDeployUri(request.getRequestURI()) + "?" + request.getQueryString();
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major if (SAML2Utils.debug.messageEnabled()) {
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major SAML2Utils.debug.message("SessionIndex for this SSOToken is not local, forwarding the request to: "
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major + remoteServiceURL);
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major }
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major String redirectUrl = null;
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major String outputData = null;
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major String responseCode = null;
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major HashMap<String, String> remoteRequestData =
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major SAML2Utils.sendRequestToOrigServer(request, response, remoteServiceURL);
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major if (remoteRequestData != null && !remoteRequestData.isEmpty()) {
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major redirectUrl = remoteRequestData.get(SAML2Constants.AM_REDIRECT_URL);
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major outputData = remoteRequestData.get(SAML2Constants.OUTPUT_DATA);
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major responseCode = remoteRequestData.get(SAML2Constants.RESPONSE_CODE);
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major }
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major try {
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major if (redirectUrl != null && !redirectUrl.isEmpty()) {
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major response.sendRedirect(redirectUrl);
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major } else {
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major if (responseCode != null) {
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major response.setStatus(Integer.valueOf(responseCode));
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major }
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major // no redirect, perhaps an error page, return the content
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major if (outputData != null && !outputData.isEmpty()) {
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major SAML2Utils.debug.message("Printing the forwarded response");
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major response.setContentType("text/html; charset=UTF-8");
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major PrintWriter pw = response.getWriter();
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major pw.println(outputData);
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major return;
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major }
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major }
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major } catch (IOException ioe) {
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major if (SAML2Utils.debug.messageEnabled()) {
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major SAML2Utils.debug.message("IDPSSOUtil.sendResponseToACS() error in Request Routing", ioe);
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major }
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major }
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major return;
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major }
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major //end of request proxy
33fc82147580d6f2d1299f6282e1cf8a28212bc5Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // generate a response for the authn request
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Response res = getResponse(session, authnReq, spEntityID, idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpMetaAlias, realm, nameIDFormat, acsURL, affiliationID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major matchingAuthnContext);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (res == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error("IDPSSOUtil.sendResponseToACS:" +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major " response is null");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String errorMsg =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("UnableToCreateAssertion");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (authnReq == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //idp initiated case, will not send error response to sp
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(errorMsg);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major res = SAML2Utils.getErrorResponse(authnReq,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.RESPONDER, null, errorMsg, idpEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] values = {idpMetaAlias};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sessionProvider.setProperty(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major session, SAML2Constants.IDP_META_ALIAS, values);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SessionException e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error("IDPSSOUtil.sendResponseToACS:" +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major " error setting idpMetaAlias into the session: ", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (res != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // call multi-federation protocol to set the protocol
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster MultiProtocolUtils.addFederationProtocol(session,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SingleLogoutManager.SAML2);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // check if the COT cookie needs to be set
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (setCOTCookie(request, response, acsBinding, spEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpEntityID, idpMetaAlias, realm, relayState, acsURL, res,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major session)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message("IDPSSOUtil.sendResponseToACS:" +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major " Redirected to set COT cookie.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message("IDPSSOUtil.sendResponseToACS:" +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major " Doesn't set COT cookie.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message("IDPSSOUtil.sendResponseToACS:" +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major " Response is: " + res.toXMLString());
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sendResponse(request, response, acsBinding, spEntityID, idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpMetaAlias, realm, relayState, acsURL, res, session);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error("IDPSSOUtil.sendResponseToACS:" +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major " error response is null");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("UnableToCreateErrorResponse"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static boolean setCOTCookie(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major HttpServletRequest request,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major HttpServletResponse response,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String acsBinding,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String spEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpMetaAlias,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String relayState,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String acsURL,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Response res,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Object session) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.setCOTCookie: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String writerURL = getWriterURL(realm, idpEntityID, spEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (writerURL == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // could not find the writer URL, do not set the COT cookie
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // save the needed info into cache so they can be used later
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // when it is redirected back
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ArrayList cacheList = new ArrayList(9);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major cacheList.add(0, acsBinding);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major cacheList.add(1, spEntityID);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major cacheList.add(2, idpEntityID);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major cacheList.add(3, idpMetaAlias);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major cacheList.add(4, realm);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major cacheList.add(5, relayState);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major cacheList.add(6, acsURL);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major cacheList.add(7, res);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster cacheList.add(8, session);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String cachedResID = SAML2Utils.generateIDWithServerID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPCache.responseCache.put(cachedResID, cacheList);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // construct redirect URL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster StringBuffer retURLSB = new StringBuffer(100);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster retURLSB.append(request.getScheme()).append("://")
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append(request.getServerName()).append(":")
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append(request.getServerPort())
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append(request.getRequestURI())
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append("?")
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append(SAML2Constants.RES_INFO_ID)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append("=")
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append(cachedResID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String retURL = URLEncDec.encode(retURLSB.toString());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster StringBuffer redirectURLSB = new StringBuffer(200);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster redirectURLSB.append(writerURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (writerURL.indexOf("?") > 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster redirectURLSB.append("&");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster redirectURLSB.append("?");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster redirectURLSB.append(IDPDiscoveryConstants.SAML2_COOKIE_NAME)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append("=")
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append(idpEntityID)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append("&")
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append(SAML2Constants.RELAY_STATE)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append("=")
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append(retURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String redirectURL = redirectURLSB.toString();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Writer redirect URL: " + redirectURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major response.sendRedirect(redirectURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (IOException ioe) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to send redirect: ", ioe);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Sends a response to service provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param response the <code>HttpServletResponse</code> object
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param cachedResID the key used to retrieve response information
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * from the response information cache
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static void sendResponse(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major HttpServletRequest request,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major HttpServletResponse response,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String cachedResID)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.sendResponse: ";
80849398a45dca1fb917716907d6ec99be6222c2Peter Major ArrayList cacheList =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major (ArrayList) IDPCache.responseCache.remove(cachedResID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((cacheList != null) && (cacheList.size() == 9)) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String acsBinding = (String) cacheList.get(0);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String spEntityID = (String) cacheList.get(1);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID = (String) cacheList.get(2);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpMetaAlias = (String) cacheList.get(3);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm = (String) cacheList.get(4);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String relayState = (String) cacheList.get(5);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String acsURL = (String) cacheList.get(6);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Response res = (Response) cacheList.get(7);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Object session = cacheList.get(8);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sendResponse(request, response, acsBinding, spEntityID, idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpMetaAlias, realm, relayState, acsURL, res, session);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major } else {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "unable to get response information from cache.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "UnableToGetResponseInfoFromCache"));
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Sends a response to service provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param response the <code>HttpServletResponse</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param acsBinding the assertion consumer service binding
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param spEntityID the entity id of the service provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param idpEntityID the entity id of the identity provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param idpMetaAlias the meta alias of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param relayState the relay state
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param acsURL the assertion consumer service <code>url</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param res the <code>SAML Response</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static void sendResponse(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major HttpServletRequest request,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major HttpServletResponse response,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String acsBinding,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String spEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpMetaAlias,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String relayState,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String acsURL,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Response res,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Object session)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.sendResponse: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String nameIDString = SAML2Utils.getNameIDStringFromResponse(res);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map props = new HashMap();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster props.put(LogUtil.NAME_ID, nameIDString);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // send the response back through HTTP POST or Artifact
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (acsBinding.equals(SAML2Constants.HTTP_POST)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // check if response needs to be signed.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // if response is signed then assertion
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // will not be signed for POST Profile
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean signAssertion = true;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major boolean signResponse =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.wantPOSTResponseSigned(realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major spEntityID, SAML2Constants.SP_ROLE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // signing assertion is a must for POST profile if
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // response signing is not enabled.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // encryption is optional based on SP config settings.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster signAndEncryptResponseComponents(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster realm, spEntityID, idpEntityID, res, signAssertion);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (signResponse) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major signResponse(realm, idpEntityID, res);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String resMsg = res.toXMLString(true, true);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "SAML Response content :\n" + resMsg);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String encodedResMsg = SAML2Utils.encodeForPOST(resMsg);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] logdata1 = {spEntityID, idpMetaAlias, resMsg};
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.access(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.POST_RESPONSE, logdata1, session, props);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.postToTarget(response, "SAMLResponse",
80849398a45dca1fb917716907d6ec99be6222c2Peter Major encodedResMsg, "RelayState", relayState, acsURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "postToTarget failed.", e);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {acsURL};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.POST_TO_TARGET_FAILED, data, session, props);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("postToTargetFailed"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else if (acsBinding.equals(SAML2Constants.HTTP_ARTIFACT)) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major IDPSSOUtil.sendResponseArtifact(request, response, idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major spEntityID, realm, acsURL, relayState, res, session, props);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else if (acsBinding.equals(SAML2Constants.PAOS)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // signing assertion is a must for ECP profile.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // encryption is optional based on SP config settings.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster signAndEncryptResponseComponents(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster realm, spEntityID, idpEntityID, res, true);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major IDPSSOUtil.sendResponseECP(request, response, idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, acsURL, res);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "unsupported return binding.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("UnSupportedReturnBinding"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns a <code>SAML Response</code> object
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param session the user's session object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param authnReq the <code>AuthnRequest</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param recipientEntityID the entity id of the response recipient
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param idpEntityID the entity id of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param nameIDFormat the <code>NameIDFormat</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param acsURL the <code>ACS</code> service <code>url</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param affiliationID affiliationID for IDP initiated SSO
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param matchingAuthnContext the <code>AuthnContext</code> used to find
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * authentication type and scheme.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the <code>SAML Response</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static Response getResponse(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Object session,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AuthnRequest authnReq,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String recipientEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpMetaAlias,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String nameIDFormat,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String acsURL,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String affiliationID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AuthnContext matchingAuthnContext)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.getResponse: ";
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Response res = ProtocolFactory.getInstance().createResponse();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Status status = ProtocolFactory.getInstance().createStatus();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (status == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster StatusCode statusCode = ProtocolFactory.getInstance().
80849398a45dca1fb917716907d6ec99be6222c2Peter Major createStatusCode();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (statusCode == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List assertionList = new ArrayList();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Assertion assertion = getAssertion(session, authnReq,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major recipientEntityID, idpEntityID, idpMetaAlias, realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major nameIDFormat, acsURL, affiliationID, matchingAuthnContext);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (assertion == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major classMethod + "Unable to get Assertion.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major assertionList.add(assertion);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster res.setAssertion(assertionList);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster statusCode.setValue(SAML2Constants.SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SAML2InvalidNameIDPolicyException se) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster statusCode.setValue(SAML2Constants.REQUESTER);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster StatusCode subStatusCode = ProtocolFactory.getInstance().
80849398a45dca1fb917716907d6ec99be6222c2Peter Major createStatusCode();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster subStatusCode.setValue(SAML2Constants.INVALID_NAME_ID_POLICY);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster statusCode.setStatusCode(subStatusCode);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster status.setStatusMessage(se.getMessage());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster status.setStatusCode(statusCode);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster res.setStatus(status);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (authnReq != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // sp initiated case, need to set InResponseTo attribute
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster res.setInResponseTo(authnReq.getID());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster res.setVersion(SAML2Constants.VERSION_2_0);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster res.setIssueInstant(new Date());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster res.setID(SAML2Utils.generateID());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // set the idp entity id as the response issuer
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Issuer issuer = AssertionFactory.getInstance().createIssuer();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster issuer.setValue(idpEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster res.setIssuer(issuer);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major res.setDestination(XMLUtils.escapeSpecialCharacters(acsURL));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return res;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns a <code>SAML Assertion</code> object
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param session the user's session object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param authnReq the <code>AuthnRequest</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param recipientEntityID the entity id of the response recipient
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param idpEntityID the entity id of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param nameIDFormat the <code>NameIDFormat</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param acsURL the <code>ACS</code> service <code>url</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param affiliationID affiliationID for IDP initiated SSO
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param matchingAuthnContext the <code>AuthnContext</code> used to find
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * authentication type and scheme.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the <code>SAML Assertion</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static Assertion getAssertion(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Object session,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AuthnRequest authnReq,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String recipientEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpMetaAlias,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String nameIDFormat,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String acsURL,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String affiliationID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AuthnContext matchingAuthnContext)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.getAssertion: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Assertion assertion = AssertionFactory.getInstance().createAssertion();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String assertionID = SAML2Utils.generateID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster assertion.setID(assertionID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster assertion.setVersion(SAML2Constants.VERSION_2_0);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster assertion.setIssueInstant(new Date());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Issuer issuer = AssertionFactory.getInstance().createIssuer();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster issuer.setValue(idpEntityID);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster assertion.setIssuer(issuer);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List statementList = new ArrayList();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NewBoolean isNewSessionIndex = new NewBoolean();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AuthnStatement authnStatement = getAuthnStatement(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major session, isNewSessionIndex, authnReq, idpEntityID, realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major matchingAuthnContext);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (authnStatement == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String sessionIndex = authnStatement.getSessionIndex();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPSession idpSession = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (isNewSessionIndex.getValue()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "This is a new IDP session with sessionIndex=" +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major sessionIndex + ", and sessionID=" +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major sessionProvider.getSessionID(session));
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idpSession = (IDPSession) IDPCache.idpSessionsBySessionID.
80849398a45dca1fb917716907d6ec99be6222c2Peter Major get(sessionProvider.getSessionID(session));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (idpSession == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idpSession = new IDPSession(session);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Set the metaAlias in the IDP session object
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idpSession.setMetaAlias(idpMetaAlias);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPCache.idpSessionsByIndices.put(sessionIndex, idpSession);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((agent != null) && agent.isRunning() && (saml2Svc != null)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster saml2Svc.setIdpSessionCount(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major (long) IDPCache.idpSessionsByIndices.size());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "a new IDP session has been saved in cache, " +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "with sessionIndex=" + sessionIndex);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sessionProvider.addListener(session, sessionListener);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SessionException e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to add session listener.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpSession = (IDPSession) IDPCache.idpSessionsByIndices.
80849398a45dca1fb917716907d6ec99be6222c2Peter Major get(sessionIndex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((idpSession == null) &&
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (SAML2Utils.isSAML2FailOverEnabled())) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Read from DataBase
80849398a45dca1fb917716907d6ec99be6222c2Peter Major IDPSessionCopy idpSessionCopy = null;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major try {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpSessionCopy = (IDPSessionCopy)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2RepositoryFactory.getInstance().retrieveSAML2Token(sessionIndex);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major } catch (StoreException se) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.error("Unable to obtain the IDPSessionCopy from the CTS Repository: " + se.getMessage(), se);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Copy back to IDPSession
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (idpSessionCopy != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idpSession = new IDPSession(idpSessionCopy);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error("IDPSessionCopy is null");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("IDPSessionIsNULL"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else if ((idpSession == null) &&
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (!SAML2Utils.isSAML2FailOverEnabled())) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error("IDPSession is null; SAML2 failover" +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "is disabled");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("IDPSessionIsNULL"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "This is an existing IDP session with sessionIndex="
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + sessionIndex + ", and sessionID=" +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major sessionProvider.getSessionID(idpSession.getSession()));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster statementList.add(authnStatement);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AttributeStatement attrStatement = getAttributeStatement(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major session, idpEntityID, recipientEntityID, realm);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (attrStatement != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List attrStatementList = new ArrayList();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attrStatementList.add(attrStatement);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major assertion.setAttributeStatements(attrStatementList);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // get the assertion effective time (in seconds)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int effectiveTime = getEffectiveTime(realm, idpEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // get the NotBefore skew (in seconds)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major int notBeforeSkewTime = getNotBeforeSkewTime(realm, idpEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // get the subject element
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NewBoolean isNewFederation = new NewBoolean();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Subject subject = getSubject(session, authnReq, acsURL,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major nameIDFormat, isNewFederation, realm, idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major recipientEntityID, effectiveTime, affiliationID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // register (spEntityID, nameID) with the sso token
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // for later logout use
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String spEntityID = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (authnReq != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spEntityID = authnReq.getIssuer().getValue();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spEntityID = recipientEntityID;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NameIDandSPpair pair = new NameIDandSPpair(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major (NameID) subject.getNameID(), spEntityID);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major synchronized (IDPCache.idpSessionsByIndices) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major List list = (List) idpSession.getNameIDandSPpairs();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (isNewFederation.getValue()) { // new federation case
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster list.add(pair);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else { // existing federation case
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String id = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (authnReq != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster id = authnReq.getIssuer().getValue();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster id = spEntityID;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int n = list.size();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NameIDandSPpair p = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (int i = 0; i < n; i++) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster p = (NameIDandSPpair) list.get(i);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (p.getSPEntityID().equals(id)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster break;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster p = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (p == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster list.add(pair);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major assertion.setAuthnStatements(statementList);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster assertion.setSubject(subject);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Conditions conditions = getConditions(recipientEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major notBeforeSkewTime, effectiveTime);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster assertion.setConditions(conditions);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String discoBootstrapEnabled = getAttributeValueFromIDPSSOConfig(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, idpEntityID, SAML2Constants.DISCO_BOOTSTRAPPING_ENABLED);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((discoBootstrapEnabled != null) &&
80849398a45dca1fb917716907d6ec99be6222c2Peter Major discoBootstrapEnabled.equalsIgnoreCase("true")) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List attrStatementList = assertion.getAttributeStatements();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (attrStatementList == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attrStatementList = new ArrayList();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster assertion.setAttributeStatements(attrStatementList);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoveryBootstrap bootstrap = new DiscoveryBootstrap(session,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major subject,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major authnStatement.getAuthnContext().getAuthnContextClassRef(),
80849398a45dca1fb917716907d6ec99be6222c2Peter Major spEntityID, realm);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attrStatementList.add(bootstrap.getBootstrapStatement());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster assertion.setAdvice(bootstrap.getCredentials());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (assertionCacheEnabled(realm, idpEntityID)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String userName = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userName = sessionProvider.getPrincipalName(session);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SessionException se) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get principal name from the session.", se);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("invalidSSOToken"));
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String cacheKey = userName.toLowerCase();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major List assertions = (List) IDPCache.assertionCache.get(cacheKey);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (assertions == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster synchronized (IDPCache.assertionCache) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major assertions = (List) IDPCache.assertionCache.get(cacheKey);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (assertions == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster assertions = new ArrayList();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPCache.assertionCache.put(cacheKey, assertions);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster synchronized (assertions) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster assertions.add(assertion);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPCache.assertionByIDCache.put(assertionID, assertion);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.isSAML2FailOverEnabled()) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major try {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2RepositoryFactory.getInstance().saveSAML2Token(assertionID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major assertion.toXMLString(true, true),
80849398a45dca1fb917716907d6ec99be6222c2Peter Major conditions.getNotOnOrAfter().getTime() / 1000,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major cacheKey);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (SAML2Utils.debug.messageEnabled()) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "saving assertion to DB. ID = " + assertionID);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major } catch (StoreException se) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.error("Unable to save the Assertion to the CTS Repository: " + se.getMessage(), se);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Save to persistent datastore
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster long sessionExpireTime = System.currentTimeMillis() / 1000 +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major (sessionProvider.getTimeLeft(session));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.isSAML2FailOverEnabled()) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2RepositoryFactory.getInstance().saveSAML2Token(sessionIndex,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major new IDPSessionCopy(idpSession), sessionExpireTime, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message("SAVE IDPSession!");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SAML2Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod + "DB error!");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SessionException se) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get left-time from the session.", se);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("invalidSSOToken"));
80849398a45dca1fb917716907d6ec99be6222c2Peter Major } catch (StoreException se) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.error("Unable to save the IDPSession to the CTS Repository: "+se.getMessage(),se);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return assertion;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns a <code>SAML AuthnStatement</code> object
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param session the user's session
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param isNewSessionIndex a returned flag from which the caller
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * knows if the session index in the returned
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * <code>AuthnStatement</code> is a new session index
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param authnReq the <code>AuthnRequest</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param idpEntityID the entity id of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param matchingAuthnContext the <code>AuthnContext</code> used to find
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * authentication type and scheme.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the <code>SAML AuthnStatement</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static AuthnStatement getAuthnStatement(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Object session,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major NewBoolean isNewSessionIndex,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AuthnRequest authnReq,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AuthnContext matchingAuthnContext)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.getAuthnStatement: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AuthnStatement authnStatement =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AssertionFactory.getInstance().createAuthnStatement();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Date authInstant = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // will be used when we add SubjectLocality to the statement
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] values = sessionProvider.getProperty(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major session, SessionProvider.AUTH_INSTANT);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (values != null && values.length != 0 &&
80849398a45dca1fb917716907d6ec99be6222c2Peter Major values[0] != null && values[0].length() != 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster authInstant = DateUtils.stringToDate(values[0]);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "exception retrieving info from the session: ", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("errorGettingAuthnStatement"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (authInstant == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster authInstant = new Date();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster authnStatement.setAuthnInstant(authInstant);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AuthnContext authnContext = matchingAuthnContext;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (authnContext == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String authLevel = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] values = sessionProvider.getProperty(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major session, SessionProvider.AUTH_LEVEL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (values != null && values.length != 0 &&
80849398a45dca1fb917716907d6ec99be6222c2Peter Major values[0] != null && values[0].length() != 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster authLevel = values[0];
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "exception retrieving auth level info from the session: ",
80849398a45dca1fb917716907d6ec99be6222c2Peter Major e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("errorGettingAuthnStatement"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major IDPAuthnContextMapper idpAuthnContextMapper =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major getIDPAuthnContextMapper(realm, idpEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster authnContext =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpAuthnContextMapper.getAuthnContextFromAuthLevel(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major authLevel, realm, idpEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster authnStatement.setAuthnContext(authnContext);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String sessionIndex = getSessionIndex(session);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (sessionIndex == null) { // new sessionIndex
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sessionIndex = SAML2Utils.generateIDWithServerID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] values = {sessionIndex};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sessionProvider.setProperty(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major session,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.IDP_SESSION_INDEX,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major values);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SessionException e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "error setting session index into the session: ", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("errorGettingAuthnStatement"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isNewSessionIndex.setValue(true);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isNewSessionIndex.setValue(false);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "SessionIndex (in AuthnStatement) =" + sessionIndex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (sessionIndex != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Set authContextSet = (HashSet)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major IDPCache.authnContextCache.get(sessionIndex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (authContextSet == null || authContextSet.isEmpty()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster authContextSet = new HashSet();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster authContextSet.add(authnContext);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // cache the AuthContext to use in the case of session upgrade.
80849398a45dca1fb917716907d6ec99be6222c2Peter Major IDPCache.authnContextCache.put(sessionIndex, authContextSet);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster authnStatement.setSessionIndex(sessionIndex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return authnStatement;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns a <code>SAML AttributeStatement</code> object
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param session the user's session
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param idpEntityID the entity id of the identity provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param recipientEntityID the entity id of the response recipient
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the <code>SAML AttributeStatement</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static AttributeStatement getAttributeStatement(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Object session,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String recipientEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major IDPAttributeMapper idpAttrMapper =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major getIDPAttributeMapper(realm, idpEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List attributes = idpAttrMapper.getAttributes(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major session, idpEntityID, recipientEntityID, realm);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((attributes == null) || (attributes.isEmpty())) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AttributeStatement attrStatement =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AssertionFactory.getInstance().createAttributeStatement();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attrStatement.setAttribute(attributes);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return attrStatement;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns an <code>IDPAttributeMapper</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param idpEntityID the entity id of the identity provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the <code>IDPAttributeMapper</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static IDPAttributeMapper getIDPAttributeMapper(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm, String idpEntityID)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.getIDPAttributeMapper: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String idpAttributeMapperName = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPAttributeMapper idpAttributeMapper = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idpAttributeMapperName = getAttributeValueFromIDPSSOConfig(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, idpEntityID, SAML2Constants.IDP_ATTRIBUTE_MAPPER);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (idpAttributeMapperName == null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpAttributeMapperName =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.DEFAULT_IDP_ATTRIBUTE_MAPPER_CLASS;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.message(classMethod + "use " +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.DEFAULT_IDP_ATTRIBUTE_MAPPER_CLASS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idpAttributeMapper = (IDPAttributeMapper)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major IDPCache.idpAttributeMapperCache.get(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpAttributeMapperName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (idpAttributeMapper == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idpAttributeMapper = (IDPAttributeMapper)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Class.forName(idpAttributeMapperName).newInstance();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPCache.idpAttributeMapperCache.put(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpAttributeMapperName, idpAttributeMapper);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "got the IDPAttributeMapper from cache");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception ex) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get IDP Attribute Mapper.", ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return idpAttributeMapper;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns an <code>IDPAuthnContextMapper</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param idpEntityID the entity id of the identity provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the <code>IDPAuthnContextMapper</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static IDPAuthnContextMapper getIDPAuthnContextMapper(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm, String idpEntityID)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.getIDPAuthnContextMapper: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String idpAuthnContextMapperName = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPAuthnContextMapper idpAuthnContextMapper = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idpAuthnContextMapperName = getAttributeValueFromIDPSSOConfig(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.IDP_AUTHNCONTEXT_MAPPER_CLASS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (idpAuthnContextMapperName == null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpAuthnContextMapperName =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.DEFAULT_IDP_AUTHNCONTEXT_MAPPER_CLASS;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.message(classMethod + "use " +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.DEFAULT_IDP_AUTHNCONTEXT_MAPPER_CLASS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idpAuthnContextMapper = (IDPAuthnContextMapper)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major IDPCache.idpAuthnContextMapperCache.get(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpAuthnContextMapperName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (idpAuthnContextMapper == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idpAuthnContextMapper = (IDPAuthnContextMapper)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Class.forName(idpAuthnContextMapperName).newInstance();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPCache.idpAuthnContextMapperCache.put(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpAuthnContextMapperName, idpAuthnContextMapper);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "got the IDPAuthnContextMapper from cache");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception ex) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get IDP AuthnContext Mapper.", ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return idpAuthnContextMapper;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns an <code>IDPECPSessionMapper</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param idpEntityID the entity id of the identity provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the <code>IDPECPSessionMapper</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static IDPECPSessionMapper getIDPECPSessionMapper(String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID) throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String idpECPSessionMapperName = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPECPSessionMapper idpECPSessionMapper = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idpECPSessionMapperName = getAttributeValueFromIDPSSOConfig(realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpEntityID, SAML2Constants.IDP_ECP_SESSION_MAPPER_CLASS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (idpECPSessionMapperName == null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpECPSessionMapperName =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.DEFAULT_IDP_ECP_SESSION_MAPPER_CLASS;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "IDPSSOUtil.getIDPECPSessionMapper: use " +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.DEFAULT_IDP_ECP_SESSION_MAPPER_CLASS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idpECPSessionMapper = (IDPECPSessionMapper)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major IDPCache.idpECPSessionMapperCache.get(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpECPSessionMapperName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (idpECPSessionMapper == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idpECPSessionMapper = (IDPECPSessionMapper)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Class.forName(idpECPSessionMapperName).newInstance();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPCache.idpECPSessionMapperCache.put(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpECPSessionMapperName, idpECPSessionMapper);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "IDPSSOUtil.getIDPECPSessionMapper: " +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "got the IDPECPSessionMapper from cache");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception ex) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error("IDPSSOUtil.getIDPECPSessionMapper: " +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get IDPECPSessionMapper.", ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return idpECPSessionMapper;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns a <code>SAML Subject</code> object
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param session the user's session
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param authnReq the <code>AuthnRequest</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param acsURL the <code>ACS</code> service <code>url</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param nameIDFormat the <code>NameIDFormat</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param isNewFederation a returned flag from which the caller
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * knows if this is a new federation case
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm The realm name
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param idpEntityID the entity id of the identity provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param recipientEntityID the entity id of the response recipient
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param effectiveTime the effective time of the assertion
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param affiliationID affiliationID for IDP initiated SSO
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the <code>SAML Subject</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static Subject getSubject(Object session,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AuthnRequest authnReq,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String acsURL,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String nameIDFormat,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major NewBoolean isNewFederation,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String recipientEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major int effectiveTime,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String affiliationID)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.getSubject: ";
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Subject subject = AssertionFactory.getInstance().createSubject();
3240047b6ae47ab759fac9d4be1a597669394e46Mark de Reeper boolean ignoreProfile = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String userName = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userName = sessionProvider.getPrincipalName(session);
3240047b6ae47ab759fac9d4be1a597669394e46Mark de Reeper ignoreProfile = SAML2Utils.isIgnoreProfileSet(session);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SessionException se) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "There was a problem with the session.", se);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("invalidSSOToken"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean allowCreate = true; // allow create is the default
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String remoteEntityID = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String spNameQualifier = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean isAffiliation = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (authnReq != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster remoteEntityID = authnReq.getIssuer().getValue();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NameIDPolicy nameIDPolicy = authnReq.getNameIDPolicy();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (nameIDPolicy != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // this will take care of affiliation
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster allowCreate = nameIDPolicy.isAllowCreate();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spNameQualifier = nameIDPolicy.getSPNameQualifier();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (spNameQualifier != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AffiliationDescriptorType affiDesc = metaManager.
80849398a45dca1fb917716907d6ec99be6222c2Peter Major getAffiliationDescriptor(realm, spNameQualifier);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (affiDesc != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (affiDesc.getAffiliateMember().contains(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major remoteEntityID)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isAffiliation = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster remoteEntityID = spNameQualifier;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(SAML2Utils.bundle.
80849398a45dca1fb917716907d6ec99be6222c2Peter Major getString("spNotAffiliationMember"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // IDP initialted SSO
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (affiliationID != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AffiliationDescriptorType affiDesc = metaManager.
80849398a45dca1fb917716907d6ec99be6222c2Peter Major getAffiliationDescriptor(realm, affiliationID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (affiDesc == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(SAML2Utils.bundle.getString(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "affiliationNotFound"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (affiDesc.getAffiliateMember().contains(recipientEntityID)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isAffiliation = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster remoteEntityID = affiliationID;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spNameQualifier = affiliationID;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(SAML2Utils.bundle.getString(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "spNotAffiliationMember"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster remoteEntityID = recipientEntityID;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spNameQualifier = recipientEntityID;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SPSSODescriptorElement spsso = metaManager.getSPSSODescriptor(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, recipientEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (spsso == null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {recipientEntityID};
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.error(Level.INFO, LogUtil.SP_METADATA_ERROR, data, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(SAML2Utils.bundle.getString(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "metaDataError"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPSSODescriptorElement idpsso =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major metaManager.getIDPSSODescriptor(realm, idpEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (idpsso == null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {idpEntityID};
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.error(Level.INFO, LogUtil.IDP_METADATA_ERROR, data, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(SAML2Utils.bundle.getString(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "metaDataError"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster nameIDFormat = SAML2Utils.verifyNameIDFormat(nameIDFormat, spsso,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpsso);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
3240047b6ae47ab759fac9d4be1a597669394e46Mark de Reeper // Even if the user profile is set to ignore, we must attempt to persist
3240047b6ae47ab759fac9d4be1a597669394e46Mark de Reeper // if the NameIDFormat is set to persistent.
3240047b6ae47ab759fac9d4be1a597669394e46Mark de Reeper if (ignoreProfile && SAML2Constants.PERSISTENT.equals(nameIDFormat)) {
3240047b6ae47ab759fac9d4be1a597669394e46Mark de Reeper ignoreProfile = false;
3240047b6ae47ab759fac9d4be1a597669394e46Mark de Reeper SAML2Utils.debug.warning(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "ignoreProfile was true but NameIDFormat is Persistent => setting ignoreProfile to false");
3240047b6ae47ab759fac9d4be1a597669394e46Mark de Reeper }
3240047b6ae47ab759fac9d4be1a597669394e46Mark de Reeper
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NameIDInfo nameIDInfo = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NameID nameID = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean isTransient = nameIDFormat.equals(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.NAMEID_TRANSIENT_FORMAT);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!isTransient) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String userID = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userID = sessionProvider.getPrincipalName(session);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SessionException se) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get principal name from the session.", se);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("invalidSSOToken"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
3240047b6ae47ab759fac9d4be1a597669394e46Mark de Reeper if (!ignoreProfile) {
3240047b6ae47ab759fac9d4be1a597669394e46Mark de Reeper nameIDInfo = AccountUtils.getAccountFederation(userID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpEntityID, remoteEntityID);
3240047b6ae47ab759fac9d4be1a597669394e46Mark de Reeper }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (nameIDInfo != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster nameID = nameIDInfo.getNameID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (nameIDFormat.equals(nameID.getFormat())) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // existing federation
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isNewFederation.setValue(false);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AccountUtils.removeAccountFederation(nameIDInfo, userID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DoManageNameID.removeIDPFedSession(remoteEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major nameID.getValue());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster nameID = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (nameID == null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (!allowCreate &&
80849398a45dca1fb917716907d6ec99be6222c2Peter Major nameIDFormat.equals(SAML2Constants.PERSISTENT)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2InvalidNameIDPolicyException(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("cannotCreateNameID"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major IDPAccountMapper idpAccountMapper =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.getIDPAccountMapper(realm, idpEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster nameID = idpAccountMapper.getNameID(session, idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major spNameQualifier, realm, nameIDFormat);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // If the IdP has received a request from a remote SP for which it has
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // been configured not to persist the Federation if unspecified NameID
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Format has been set
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean spDoNotWriteFedInfoInIdP = isSPDoNotWriteFedInfoInIdP(realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major remoteEntityID, metaManager) &&
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.UNSPECIFIED.equals(nameIDFormat);
3240047b6ae47ab759fac9d4be1a597669394e46Mark de Reeper boolean writeFedInfo = !ignoreProfile && !isTransient && !spDoNotWriteFedInfoInIdP;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod + " writeFedInfo = " + writeFedInfo);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (writeFedInfo && allowCreate) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // write federation info the into persistent datastore
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (SAML2Utils.isDualRole(idpEntityID, realm)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster nameIDInfo = new NameIDInfo(idpEntityID, remoteEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major nameID, SAML2Constants.DUAL_ROLE, false);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster nameIDInfo = new NameIDInfo(idpEntityID, remoteEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major nameID, SAML2Constants.IDP_ROLE, isAffiliation);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AccountUtils.setAccountFederation(nameIDInfo, userName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (writeFedInfo) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isNewFederation.setValue(true);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isNewFederation.setValue(false);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster subject.setNameID(nameID);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (isTransient) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPCache.userIDByTransientNameIDValue.put(nameID.getValue(),
80849398a45dca1fb917716907d6ec99be6222c2Peter Major userName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String inResponseTo = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (authnReq != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster inResponseTo = authnReq.getID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SubjectConfirmation sc = getSubjectConfirmation(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major inResponseTo, acsURL, effectiveTime);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (sc == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get subject confirmation");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("noSubjectConfirmation"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List list = new ArrayList();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster list.add(sc);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster subject.setSubjectConfirmation(list);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return subject;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns a <code>SAML SubjectConfirmation</code> object
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param inResponseTo the request id of the <code>AuthnRequest</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param acsURL the <code>ACS</code> service <code>url</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param effectiveTime the effective time of the assertion
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the <code>SAML SubjectConfirmation</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static SubjectConfirmation getSubjectConfirmation(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String inResponseTo, String acsURL, int effectiveTime)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SubjectConfirmation sc = AssertionFactory.getInstance().
80849398a45dca1fb917716907d6ec99be6222c2Peter Major createSubjectConfirmation();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sc.setMethod(SAML2Constants.SUBJECT_CONFIRMATION_METHOD_BEARER);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SubjectConfirmationData scd = AssertionFactory.getInstance().
80849398a45dca1fb917716907d6ec99be6222c2Peter Major createSubjectConfirmationData();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster scd.setRecipient(XMLUtils.escapeSpecialCharacters(acsURL));
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (inResponseTo != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster scd.setInResponseTo(inResponseTo);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Date date = new Date();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster date.setTime(date.getTime() + effectiveTime * 1000);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster scd.setNotOnOrAfter(date);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sc.setSubjectConfirmationData(scd);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return sc;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns a <code>SAML Conditions</code> object
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param audienceEntityID the entity id of the audience
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param effectiveTime the effective time of the assertion
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the <code>SAML Conditions</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected static Conditions getConditions(String audienceEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major int notBeforeSkewTime, int effectiveTime) throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.getConditions: ";
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Conditions conditions = AssertionFactory.getInstance().
80849398a45dca1fb917716907d6ec99be6222c2Peter Major createConditions();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Date date = new Date();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster date.setTime(date.getTime() - notBeforeSkewTime * 1000);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster conditions.setNotBefore(date);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster date = new Date();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster date.setTime(date.getTime() + effectiveTime * 1000);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster conditions.setNotOnOrAfter(date);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List list = new ArrayList();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AudienceRestriction ar = getAudienceRestriction(audienceEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (ar == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get Audience Restriction");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("noAudienceRestriction"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster list.add(ar);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster conditions.setAudienceRestrictions(list);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return conditions;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns a <code>SAML AudienceRestriction</code> object
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param audienceEntityID the entity id of the audience
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the <code>SAML AudienceRestriction</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static AudienceRestriction getAudienceRestriction(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String audienceEntityID) throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AudienceRestriction ar = AssertionFactory.getInstance().
80849398a45dca1fb917716907d6ec99be6222c2Peter Major createAudienceRestriction();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (audienceEntityID != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List list = new ArrayList();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster list.add(audienceEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ar.setAudience(list);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return ar;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns the assertion consumer service <code>URL</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param spEntityID the entity id of the service provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param authnReq the <code>AuthnRequest</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param request the <code>HttpServletRequest</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param rBinding the binding used to send back <code>Response</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the assertion consumer service <code>URL</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static String getACSurl(String spEntityID,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String realm,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AuthnRequest authnReq,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major HttpServletRequest request,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major StringBuffer rBinding)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String acsURL = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String acsBinding = null;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (authnReq != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster acsURL = authnReq.getAssertionConsumerServiceURL();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster acsBinding = authnReq.getProtocolBinding();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster acsBinding = request.getParameter(SAML2Constants.BINDING);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((acsBinding != null) && (acsBinding.trim().length() != 0) &&
80849398a45dca1fb917716907d6ec99be6222c2Peter Major (!acsBinding.startsWith(SAML2Constants.BINDING_PREFIX))) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // convert short format binding to long format
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster acsBinding = SAML2Constants.BINDING_PREFIX + acsBinding;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (acsURL == null || acsURL.length() == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster StringBuffer returnedBinding = new StringBuffer();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((acsBinding != null) && (acsBinding.trim().length() != 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster acsURL = IDPSSOUtil.getACSurlFromMetaByBinding(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spEntityID, realm, acsBinding, returnedBinding);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int acsIndex = 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (authnReq != null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Integer acsIndexInteger =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major authnReq.getAssertionConsumerServiceIndex();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (acsIndexInteger == null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major acsURL = getDefaultACSurl(spEntityID, realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major returnedBinding);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major acsIndex = acsIndexInteger.intValue();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (acsIndex < 0 || acsIndex > 65535) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major acsIndex = 0;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major acsURL = IDPSSOUtil.getACSurlFromMetaByIndex(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spEntityID, realm, acsIndex, returnedBinding);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major acsURL = getDefaultACSurl(spEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, returnedBinding);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster acsBinding = returnedBinding.toString();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (isACSurlValidInMetadataSP(acsURL, spEntityID, realm)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (acsBinding == null || acsBinding.length() == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster acsBinding = getBindingForAcsUrl(spEntityID, realm, acsURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] args = {acsURL, spEntityID};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception("libSAML2", "invalidAssertionConsumerServiceURL", args);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster rBinding.append(acsBinding);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return acsURL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns the default assertion consumer service url and binding
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * from the metadata.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param spEntityID the entity id of the service provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name of the identity provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the assertion consumer service url with returned binding.
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
80849398a45dca1fb917716907d6ec99be6222c2Peter Major */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static String getDefaultACSurl(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String spEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major StringBuffer returnedBinding) throws SAML2Exception {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.getDefaultACSurl: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SPSSODescriptorElement spSSODescriptorElement = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (metaManager == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get meta manager.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("errorMetaManager"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spSSODescriptorElement = metaManager.getSPSSODescriptor(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, spEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (spSSODescriptorElement == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get SP SSO Descriptor from meta.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {spEntityID};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.SP_METADATA_ERROR, data, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("metaDataError"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SAML2MetaException sme) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get SP SSO Descriptor from meta.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {spEntityID};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.SP_METADATA_ERROR, data, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("metaDataError"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List acsList = spSSODescriptorElement.getAssertionConsumerService();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AssertionConsumerServiceElement acs = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String acsURL = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String binding = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String firstAcsURL = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String firstBinding = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (int i = 0; i < acsList.size(); i++) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major acs = (AssertionConsumerServiceElement) acsList.get(i);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (acs.isIsDefault()) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major acsURL = acs.getLocation();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major binding = acs.getBinding();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (i == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster firstAcsURL = acs.getLocation();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster firstBinding = acs.getBinding();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (acsURL == null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major acsURL = firstAcsURL;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major binding = firstBinding;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (binding != null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major returnedBinding.append(binding);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return acsURL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns the assertion consumer service url binding from
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the metadata.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param spEntityID the entity id of the service provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name of the identity provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the assertion consumer service url binding
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static String getBindingForAcsUrl(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String spEntityID,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String realm,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String acsURL) throws SAML2Exception {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.getBindingForAcsUrl: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SPSSODescriptorElement spSSODescriptorElement = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (metaManager == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get meta manager.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("errorMetaManager"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spSSODescriptorElement = metaManager.getSPSSODescriptor(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, spEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (spSSODescriptorElement == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get SP SSO Descriptor from meta.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {spEntityID};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.SP_METADATA_ERROR, data, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("metaDataError"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SAML2MetaException sme) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get SP SSO Descriptor from meta.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {spEntityID};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.SP_METADATA_ERROR, data, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("metaDataError"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List acsList = spSSODescriptorElement.getAssertionConsumerService();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AssertionConsumerServiceElement acs = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String binding = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (int i = 0; i < acsList.size(); i++) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major acs = (AssertionConsumerServiceElement) acsList.get(i);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String location = acs.getLocation();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (location != null && location.equals(acsURL)) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major return acs.getBinding();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns the assertion consumer service <code>URL</code> from
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * meta data by binding
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param spEntityID the entity id of the service provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param desiredBinding the desired binding
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param returnedBinding the binding used to send back
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * <code>Response</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the assertion consumer service <code>URL</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static String getACSurlFromMetaByBinding(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String spEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String desiredBinding,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major StringBuffer returnedBinding)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.getACSurlFromMetaByBinding: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SPSSODescriptorElement spSSODescriptorElement = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (metaManager == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get meta manager.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("errorMetaManager"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spSSODescriptorElement = metaManager.getSPSSODescriptor(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, spEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (spSSODescriptorElement == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get SP SSO Descriptor from meta.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {spEntityID};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.SP_METADATA_ERROR, data, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("metaDataError"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SAML2MetaException sme) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get SP SSO Descriptor from meta.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {spEntityID};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.SP_METADATA_ERROR, data, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("metaDataError"));
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List acsList = spSSODescriptorElement.getAssertionConsumerService();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String acsURL = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String binding = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String defaultAcsURL = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String defaultBinding = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String firstAcsURL = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String firstBinding = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AssertionConsumerServiceElement acs = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (int i = 0; i < acsList.size(); i++) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major acs = (AssertionConsumerServiceElement) acsList.get(i);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster binding = acs.getBinding();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (binding.equals(desiredBinding)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster acsURL = acs.getLocation();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster break;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (acs.isIsDefault()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster defaultAcsURL = acs.getLocation();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster defaultBinding = acs.getBinding();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (i == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster firstAcsURL = acs.getLocation();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster firstBinding = acs.getBinding();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (acsURL == null || acsURL.length() == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster acsURL = defaultAcsURL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (acsURL == null || acsURL.length() == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster acsURL = firstAcsURL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (acsURL == null || acsURL.length() == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster acsURL = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get valid Assertion " +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Consumer Service URL");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster returnedBinding.append(firstBinding);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster returnedBinding.append(defaultBinding);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster returnedBinding.append(binding);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return acsURL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns the assertion consumer service <code>URL</code> from
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * meta data by binding
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param spEntityID the entity id of the service provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param acsIndex the <code>ACS</code> index
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param returnedBinding the binding used to send back
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * <code>Response</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the assertion consumer service <code>URL</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static String getACSurlFromMetaByIndex(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String spEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major int acsIndex,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major StringBuffer returnedBinding)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.getACSurlFromMetaByIndex: ";
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SPSSODescriptorElement spSSODescriptorElement = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (metaManager == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get meta manager.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("errorMetaManager"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spSSODescriptorElement = metaManager.getSPSSODescriptor(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, spEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (spSSODescriptorElement == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get SP SSO Descriptor from meta.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {spEntityID};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.SP_METADATA_ERROR, data, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("metaDataError"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SAML2MetaException sme) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get SP SSO Descriptor from meta.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {spEntityID};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.SP_METADATA_ERROR, data, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("metaDataError"));
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List acsList = spSSODescriptorElement.getAssertionConsumerService();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int index;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String acsURL = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String binding = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String defaultAcsURL = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String defaultBinding = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String firstAcsURL = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String firstBinding = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AssertionConsumerServiceElement acs = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (int i = 0; i < acsList.size(); i++) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major acs = (AssertionConsumerServiceElement) acsList.get(i);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster index = acs.getIndex();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster binding = acs.getBinding();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (index == acsIndex) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster acsURL = acs.getLocation();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster binding = acs.getBinding();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster break;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (acs.isIsDefault()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster defaultAcsURL = acs.getLocation();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster defaultBinding = acs.getBinding();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (i == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster firstAcsURL = acs.getLocation();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster firstBinding = acs.getBinding();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (acsURL == null || acsURL.length() == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster acsURL = defaultAcsURL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (acsURL == null || acsURL.length() == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster acsURL = firstAcsURL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (acsURL == null || acsURL.length() == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster acsURL = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get valid Assertion " +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Consumer Service URL");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster returnedBinding.append(firstBinding);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster returnedBinding.append(defaultBinding);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster returnedBinding.append(binding);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return acsURL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * This method opens a URL connection to the target specified and
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * sends artifact response to it using the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <code>HttpServletResponse</code> object.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param response the <code>HttpServletResponse</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param idpEntityID the entity id of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param acsURL the assertion consumer service <code>URL</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param relayState the value of the <code>RelayState</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param res the <code>SAML Response</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param session user session
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param props property map including nameIDString for logging
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static void sendResponseArtifact(HttpServletRequest request,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major HttpServletResponse response,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID, String spEntityID, String realm, String acsURL,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String relayState, Response res, Object session, Map props)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.sendResponseArtifact: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPSSODescriptorElement idpSSODescriptorElement = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idpSSODescriptorElement = metaManager.getIDPSSODescriptor(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, idpEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (idpSSODescriptorElement == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get IDP SSO Descriptor from meta.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {idpEntityID};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.IDP_METADATA_ERROR, data, session, props);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("metaDataError"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SAML2MetaException sme) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get IDP SSO Descriptor from meta.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {idpEntityID};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.IDP_METADATA_ERROR, data, session, props);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("metaDataError"));
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major ArtifactResolutionServiceElement ars =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major (ArtifactResolutionServiceElement)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpSSODescriptorElement.getArtifactResolutionService().get(0);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (ars == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get ArtifactResolutionServiceElement from meta.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {idpEntityID};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.IDP_METADATA_ERROR, data, session, props);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("metaDataError"));
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Artifact art = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster art = ProtocolFactory.getInstance().createArtifact(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major null,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major ars.getIndex(),
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.generateSourceID(idpEntityID),
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.generateMessageHandleWithServerID()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster );
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SAML2Exception se) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to create artifact: ", se);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {idpEntityID};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.CANNOT_CREATE_ARTIFACT, data, session, props);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAMLUtils.sendError(request, response,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major response.SC_INTERNAL_SERVER_ERROR, "errorCreateArtifact",
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("errorCreateArtifact"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String artStr = art.getArtifactValue();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPCache.responsesByArtifacts.put(artStr, res);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.isSAML2FailOverEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster long expireTime = getValidTimeofResponse(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, idpEntityID, res);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2RepositoryFactory.getInstance().saveSAML2Token(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major artStr, res.toXMLString(true, true), expireTime / 1000,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Save Response to DB!");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String messageEncoding = SAML2Utils.getAttributeValueFromSSOConfig(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, spEntityID, SAML2Constants.SP_ROLE,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.RESPONSE_ARTIFACT_MESSAGE_ENCODING);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "messageEncoding = " + messageEncoding);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "artStr = " + artStr);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((messageEncoding != null) &&
80849398a45dca1fb917716907d6ec99be6222c2Peter Major (messageEncoding.equals(SAML2Constants.FORM_ENCODING))) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] logdata = {idpEntityID, realm, acsURL};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.access(Level.INFO, LogUtil.SEND_ARTIFACT, logdata,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major session, props);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.postToTarget(response, SAML2Constants.SAML_ART,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major artStr, "RelayState", relayState, acsURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String redirectURL = acsURL +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major (acsURL.contains("?") ? "&" : "?") + "SAMLart=" +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major URLEncDec.encode(artStr);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if ((relayState != null) && (relayState.trim().length() != 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster redirectURL += "&RelayState=" +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major URLEncDec.encode(relayState);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Redirect URL = " + redirectURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] logdata = {idpEntityID, realm, redirectURL};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.access(Level.INFO, LogUtil.SEND_ARTIFACT, logdata,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major session, props);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster response.sendRedirect(redirectURL);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (IOException ioe) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to send redirect: ", ioe);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major } catch (Exception e) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.error(classMethod + "DB Error!", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * This method sends SAML Response back to ECP.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param response the <code>HttpServletResponse</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param idpEntityID the entity id of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param acsURL the assertion consumer service <code>URL</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param res the <code>SAML Response</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static void sendResponseECP(HttpServletRequest request,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major HttpServletResponse response,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID, String realm, String acsURL,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Response res) throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major ECPFactory ecpFactory = ECPFactory.getInstance();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ECPResponse ecpResponse = ecpFactory.createECPResponse();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ecpResponse.setMustUnderstand(Boolean.TRUE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ecpResponse.setActor(SAML2Constants.SOAP_ACTOR_NEXT);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ecpResponse.setAssertionConsumerServiceURL(acsURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String header = ecpResponse.toXMLString(true, true);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String body = res.toXMLString(true, true);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SOAPMessage reply = SAML2Utils.createSOAPMessage(header, body,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major false);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] logdata = {idpEntityID, realm, acsURL, ""};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (LogUtil.isAccessLoggable(Level.FINE)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logdata[3] = SAML2Utils.soapMessageToString(reply);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.access(Level.INFO, LogUtil.SEND_ECP_RESPONSE, logdata,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Need to call saveChanges because we're
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // going to use the MimeHeaders to set HTTP
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // response information. These MimeHeaders
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // are generated as part of the save.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (reply.saveRequired()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster reply.saveChanges();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster response.setStatus(HttpServletResponse.SC_OK);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.putHeaders(reply.getMimeHeaders(), response);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Write out the message on the response stream
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster OutputStream os = response.getOutputStream();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster reply.writeTo(os);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster os.flush();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception ex) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error("IDPSSOUtil.sendResponseECP", ex);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {idpEntityID, realm, acsURL};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO, LogUtil.SEND_ECP_RESPONSE_FAILED, data,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major null);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAMLUtils.sendError(request, response,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "failedToSendECPResponse", ex.getMessage());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns the session index of an <code>IDPSession</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param session the session corresponding to the <code>IDPSession</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the session index string
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static String getSessionIndex(Object session) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.getSessionIndex: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (session == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] values = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster values = sessionProvider.getProperty(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major session, SAML2Constants.IDP_SESSION_INDEX);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SessionException e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "error retrieving session index from the session: ", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster values = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (values == null || values.length == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String index = values[0];
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (index == null || index.length() == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major classMethod + "Returning sessionIndex=" + index);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return index;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * Returns the authentication service <code>URL</code> of the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * identity provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param hostEntityId the entity id of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param request the <code>HttpServletRequest</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @return the authentication service <code>URL</code> of the
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * identity provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static String getAuthenticationServiceURL(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String hostEntityId,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major HttpServletRequest request) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.getAuthenticationServiceURL: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String authUrl = getAttributeValueFromIDPSSOConfig(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster realm, hostEntityId, SAML2Constants.AUTH_URL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((authUrl == null) || (authUrl.trim().length() == 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // need to get it from the request
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String uri = request.getRequestURI();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String deploymentURI = uri;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int firstSlashIndex = uri.indexOf("/");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major int secondSlashIndex = uri.indexOf("/", firstSlashIndex + 1);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (secondSlashIndex != -1) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster deploymentURI = uri.substring(0, secondSlashIndex);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster StringBuffer sb = new StringBuffer(100);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sb.append(request.getScheme()).append("://")
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append(request.getServerName()).append(":")
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append(request.getServerPort())
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append(deploymentURI)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major .append("/UI/Login?realm=").append(realm);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster authUrl = sb.toString();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod + "auth url=:" + authUrl);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return authUrl;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static String getAttributeValueFromIDPSSOConfig(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String hostEntityId,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String attrName) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String classMethod = "IDPSSOUtil.getAttributeValueFromIDPSSOConfig: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String result = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster IDPSSOConfigElement config = metaManager.getIDPSSOConfig(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, hostEntityId);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map attrs = SAML2MetaUtils.getAttributes(config);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List value = (List) attrs.get(attrName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (value != null && value.size() != 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster result = (String) value.get(0);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SAML2MetaException sme) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "get IDPSSOConfig failed:", sme);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster result = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return result;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Redirects to authenticate service
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param request the <code>HttpServletRequest</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param response the <code>HttpServletResponse</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param authnReq the <code>AuthnRequest</code> object
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param reqID the <code>AuthnRequest ID</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name of the identity provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param idpEntityID the entity id of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param spEntityID the entity id of the service provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static void redirectAuthentication(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major HttpServletRequest request,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major HttpServletResponse response,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AuthnRequest authnReq,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String reqID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String spEntityID)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception, IOException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.redirectAuthentication: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // get the authentication service url
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster StringBuffer newURL = new StringBuffer(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major IDPSSOUtil.getAuthenticationServiceURL(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, idpEntityID, request));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Pass spEntityID to IdP Auth Module
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (spEntityID != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (newURL.indexOf("?") == -1) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster newURL.append("?");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster newURL.append("&");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster newURL.append(SAML2Constants.SPENTITYID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster newURL.append("=");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster newURL.append(URLEncDec.encode(spEntityID));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // find out the authentication method, e.g. module=LDAP, from
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // authn context mapping
80849398a45dca1fb917716907d6ec99be6222c2Peter Major IDPAuthnContextMapper idpAuthnContextMapper =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major getIDPAuthnContextMapper(realm, idpEntityID);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major IDPAuthnContextInfo info =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpAuthnContextMapper.getIDPAuthnContextInfo(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major authnReq, idpEntityID, realm);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Set authnTypeAndValues = info.getAuthnTypeAndValues();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if ((authnTypeAndValues != null)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major && (!authnTypeAndValues.isEmpty())) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Iterator iter = authnTypeAndValues.iterator();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major StringBuffer authSB = new StringBuffer((String) iter.next());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster while (iter.hasNext()) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major authSB.append("&");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major authSB.append((String) iter.next());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (newURL.indexOf("?") == -1) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster newURL.append("?");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster newURL.append("&");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster newURL.append(authSB.toString());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "authString=" + authSB.toString());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (newURL.indexOf("?") == -1) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster newURL.append("?goto=");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster newURL.append("&goto=");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String gotoURL = request.getRequestURL().toString();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String gotoQuery = request.getQueryString();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (gotoQuery != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster gotoURL += "?" + gotoQuery;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (reqID != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster gotoURL += "&ReqID=" + reqID;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (reqID != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster gotoURL += "?ReqID=" + reqID;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "gotoURL=" + gotoURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster newURL.append(URLEncDec.encode(gotoURL));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "New URL for authentication: " + newURL.toString());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // TODO: here we should check if the new URL is one
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // the same web container, if yes, forward,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // if not, redirect
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster response.sendRedirect(newURL.toString());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Signs an <code>Assertion</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name of the identity provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param idpEntityID the entity id of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param assertion The <code>Assertion</code> to be signed
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static void signAssertion(String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Assertion assertion)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.signAssertion: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster KeyProvider kp = KeyUtil.getKeyProviderInstance();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (kp == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get a key provider instance.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("nullKeyProvider"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String idpSignCertAlias = SAML2Utils.getSigningCertAlias(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, idpEntityID, SAML2Constants.IDP_ROLE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (idpSignCertAlias == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get the hosted IDP signing certificate alias.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("missingSigningCertAlias"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper String encryptedKeyPass =
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper SAML2Utils.getSigningCertEncryptedKeyPass(realm, idpEntityID, SAML2Constants.IDP_ROLE);
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper PrivateKey key;
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper if (encryptedKeyPass == null || encryptedKeyPass.isEmpty()) {
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper key = kp.getPrivateKey(idpSignCertAlias);
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper } else {
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper key = kp.getPrivateKey(idpSignCertAlias, encryptedKeyPass);
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper }
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper assertion.sign(key, kp.getX509Certificate(idpSignCertAlias));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Signs and encrypts the components of a <code>SAML Response</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * based on the service provider meta data. If the flag of
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * encrypting <code>Assertion</code> is on, then the embedded
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <code>Assertion</code> object will be encrypted; if the flag
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * of encrypting <code>Assertion</code> is off and the flag of
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * encrypting <code>NameID</code> is on, then the <code>NameID</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * embedded in the <code>Assertion</code> will be encrypted; if the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * flag of encrypting <code>Assertion</code> is off and the flag of
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * encrypting <code>Attribute</code> is on, then the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <code>Attribute</code> embedded in the <code>Assertion</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * will be encrypted. If the flag signAssertion is on, then the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <code>Assertion</code> will be signed. It will be signed before
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * it is encrypted and after its embedded <code>NameID</code> or
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <code>Attribute</code> is encrypted.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param spEntityID the entity id of the service provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param idpEntityID the entity id of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param res The <code>Response</code> whose components may be
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * encrypted based on the service provider meta data setting
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param signAssertion A flag to indicate if <code>Assertion</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * signing is required
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static void signAndEncryptResponseComponents(String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String spEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Response res,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major boolean signAssertion)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.signAndEncryptResponseComponents: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean toEncryptAssertion = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean toEncryptNameID = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean toEncryptAttribute = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (res == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List assertions = res.getAssertion();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((assertions == null) || (assertions.size() == 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Assertion assertion = (Assertion) assertions.get(0);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // get the encryption related flags from the SP Entity Config
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String wantAssertionEncrypted =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.getAttributeValueFromSSOConfig(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, spEntityID, SAML2Constants.SP_ROLE,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.WANT_ASSERTION_ENCRYPTED);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster toEncryptAssertion = (wantAssertionEncrypted != null)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major && (wantAssertionEncrypted.equals(SAML2Constants.TRUE));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!toEncryptAssertion) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String wantNameIDEncrypted =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.getAttributeValueFromSSOConfig(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, spEntityID, SAML2Constants.SP_ROLE,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.WANT_NAMEID_ENCRYPTED);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster toEncryptNameID = (wantNameIDEncrypted != null)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major && (wantNameIDEncrypted.equals(SAML2Constants.TRUE));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String wantAttributeEncrypted =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.getAttributeValueFromSSOConfig(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, spEntityID, SAML2Constants.SP_ROLE,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.WANT_ATTRIBUTE_ENCRYPTED);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster toEncryptAttribute = (wantAttributeEncrypted != null)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major && (wantAttributeEncrypted.equals(SAML2Constants.TRUE));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if ((!toEncryptAssertion) && (!toEncryptNameID)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major && (!toEncryptAttribute)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // all encryption flags are off, no encryption needed
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (signAssertion) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster signAssertion(realm, idpEntityID, assertion);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List assertionList = new ArrayList();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster assertionList.add(assertion);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major res.setAssertion(assertionList);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SPSSODescriptorElement spSSODescriptorElement = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (metaManager == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod + "Unable to get meta manager.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("errorMetaManager"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spSSODescriptorElement = metaManager.getSPSSODescriptor(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, spEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (spSSODescriptorElement == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get SP SSO Descriptor from meta.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {spEntityID};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.SP_METADATA_ERROR, data, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("metaDataError"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SAML2MetaException sme) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get SP SSO Descriptor from meta.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String[] data = {spEntityID};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major LogUtil.SP_METADATA_ERROR, data, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("metaDataError"));
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // get the encryption information
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster EncInfo encInfo = KeyUtil.getEncInfo(spSSODescriptorElement,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major spEntityID, SAML2Constants.SP_ROLE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (encInfo == null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "failed to get service provider encryption key info.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("UnableToFindEncryptKeyInfo"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (toEncryptAssertion) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // sign assertion first, then encrypt the assertion
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (signAssertion) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster signAssertion(realm, idpEntityID, assertion);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // we only encrypt the Assertion
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster EncryptedAssertion encryptedAssertion = assertion.encrypt(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major encInfo.getWrappingKey(), encInfo.getDataEncAlgorithm(),
80849398a45dca1fb917716907d6ec99be6222c2Peter Major encInfo.getDataEncStrength(), spEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (encryptedAssertion == null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "failed to encrypt the assertion.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("FailedToEncryptAssertion"));
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List assertionList = new ArrayList();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster assertionList.add(encryptedAssertion);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster res.setEncryptedAssertion(assertionList);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster res.setAssertion(new ArrayList()); // reset assertion list
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod + "Assertion encrypted.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // we only encrypt NameID and/or Attribute.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // encrypt NameID and/or Attribute first, then sign the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // assertion if applicable
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (toEncryptNameID) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // we need to encrypt the NameID
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Subject subject = assertion.getSubject();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (subject == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NameID nameID = subject.getNameID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (nameID == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster EncryptedID encryptedNameID = nameID.encrypt(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major encInfo.getWrappingKey(),
80849398a45dca1fb917716907d6ec99be6222c2Peter Major encInfo.getDataEncAlgorithm(),
80849398a45dca1fb917716907d6ec99be6222c2Peter Major encInfo.getDataEncStrength(), spEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (encryptedNameID == null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "failed to encrypt the NameID.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "FailedToEncryptNameID"));
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster subject.setEncryptedID(encryptedNameID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster subject.setNameID(null); // reset NameID
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster assertion.setSubject(subject);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod + "NameID encrypted.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (toEncryptAttribute) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // we need to encrypt the Attribute
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List attributeStatements = assertion.getAttributeStatements();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if ((attributeStatements != null)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major && (attributeStatements.size() > 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int asSize = attributeStatements.size();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // to hold all the AttributeStatements
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List stmts = new ArrayList();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (int i = 0; i < asSize; i++) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major AttributeStatement attributeStatement =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major (AttributeStatement) attributeStatements.get(i);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List attributes = attributeStatement.getAttribute();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((attributes == null) || (attributes.size() == 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster continue;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int aSize = attributes.size();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // holds all the encrypted Attributes in this statement
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List eaList = new ArrayList();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (int j = 0; j < aSize; j++) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Attribute attribute = (Attribute) attributes.get(j);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster EncryptedAttribute encryptedAttribute =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major attribute.encrypt(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major encInfo.getWrappingKey(),
80849398a45dca1fb917716907d6ec99be6222c2Peter Major encInfo.getDataEncAlgorithm(),
80849398a45dca1fb917716907d6ec99be6222c2Peter Major encInfo.getDataEncStrength(), spEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (encryptedAttribute == null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.error(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "failed to encrypt the Attribute.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "FailedToEncryptAttribute"));
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster eaList.add(encryptedAttribute);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attributeStatement.setEncryptedAttribute(eaList);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster attributeStatement.setAttribute(new ArrayList());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster stmts.add(attributeStatement);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster assertion.setAttributeStatements(stmts);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Attribute encrypted.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (signAssertion) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster signAssertion(realm, idpEntityID, assertion);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List assertionList = new ArrayList();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster assertionList.add(assertion);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster res.setAssertion(assertionList);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major private static String getWriterURL(String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String spEntityID) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String classMethod = "IDPSSOUtil.getWriterURL: ";
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String writerURL = null;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major try {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major // get cot list of the idp
80849398a45dca1fb917716907d6ec99be6222c2Peter Major IDPSSOConfigElement idpEntityCfg =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major metaManager.getIDPSSOConfig(realm, idpEntityID);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Map idpConfigAttrsMap = null;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (idpEntityCfg != null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpConfigAttrsMap = SAML2MetaUtils.getAttributes(idpEntityCfg);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if ((idpConfigAttrsMap == null) || (idpConfigAttrsMap.size() == 0)) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major return null;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major List idpCOTList =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major (List) idpConfigAttrsMap.get(SAML2Constants.COT_LIST);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if ((idpCOTList == null) || (idpCOTList.size() == 0)) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major return null;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major // get cot list of the sp
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SPSSOConfigElement spEntityCfg =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major metaManager.getSPSSOConfig(realm, spEntityID);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Map spConfigAttrsMap = null;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (spEntityCfg != null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major spConfigAttrsMap = SAML2MetaUtils.getAttributes(spEntityCfg);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if ((spConfigAttrsMap == null) || (spConfigAttrsMap.size() == 0)) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major return null;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major List spCOTList = (List) spConfigAttrsMap.get(SAML2Constants.COT_LIST);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if ((spCOTList == null) || (spCOTList.size() == 0)) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major return null;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major // retain in the idpCOTList the intersection of two lists
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpCOTList.retainAll(spCOTList);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major for (int i = 0; i < idpCOTList.size(); i++) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String cotName = (String) idpCOTList.get(i);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major CircleOfTrustDescriptor cotDescriptor =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major cotManager.getCircleOfTrust(realm, cotName);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major writerURL = cotDescriptor.getSAML2WriterServiceURL();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if ((writerURL != null) && (writerURL.trim().length() != 0)) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major break;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major } catch (COTException ce) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (SAML2Utils.debug.messageEnabled()) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.message(classMethod + "Error retreiving of "
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "circle of trust", ce);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major } catch (SAML2Exception se) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (SAML2Utils.debug.messageEnabled()) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Not able to getting writer URL : ", se);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major } catch (Exception e) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (SAML2Utils.debug.messageEnabled()) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Not able to getting writer URL : ", e);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major return writerURL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major /**
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * Returns the effective time from the IDP
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * extended metadata . If the attreibute is not
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * defined in the metadata then defaults to
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * a value of 600 seconds (5 minutes).
80849398a45dca1fb917716907d6ec99be6222c2Peter Major *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @return the effective time value in seconds.
80849398a45dca1fb917716907d6ec99be6222c2Peter Major */
80849398a45dca1fb917716907d6ec99be6222c2Peter Major protected static int getEffectiveTime(String realm, String idpEntityID) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int effectiveTime = SAML2Constants.ASSERTION_EFFECTIVE_TIME;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String effectiveTimeStr = getAttributeValueFromIDPSSOConfig(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.ASSERTION_EFFECTIVE_TIME_ATTRIBUTE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (effectiveTimeStr != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster effectiveTime = Integer.parseInt(effectiveTimeStr);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message("IDPSSOUtil.getEffectiveTime: " +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "got effective time from config:" + effectiveTime);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (NumberFormatException nfe) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error("IDPSSOUtil.getEffectiveTime: " +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Failed to get assertion effective time from " +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "IDP SSO config: ", nfe);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster effectiveTime = SAML2Constants.ASSERTION_EFFECTIVE_TIME;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return effectiveTime;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns the NotBefore skew time from the IDP
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * extended metadata . If the attreibute is not
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * defined in the metadata then defaults to
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * a value of 600 seconds (5 minutes).
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the NotBefore skew value in seconds.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster protected static int getNotBeforeSkewTime(String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.getNotBeforeSkewTime:";
80849398a45dca1fb917716907d6ec99be6222c2Peter Major int notBeforeSkewTime =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.NOTBEFORE_ASSERTION_SKEW_DEFAULT;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // get the assertion effective time (in seconds)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String skewTimeStr = getAttributeValueFromIDPSSOConfig(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.ASSERTION_NOTBEFORE_SKEW_ATTRIBUTE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (skewTimeStr != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster notBeforeSkewTime = Integer.parseInt(skewTimeStr);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "got NotBefore skew time from config:"
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + notBeforeSkewTime);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (NumberFormatException nfe) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod + "IDP SSO config: ", nfe);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major notBeforeSkewTime =
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.NOTBEFORE_ASSERTION_SKEW_DEFAULT;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod + "NotBefore Skew time :" +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major notBeforeSkewTime);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return notBeforeSkewTime;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static boolean assertionCacheEnabled(String realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpEntityID) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String enabled = SAML2Utils.getAttributeValueFromSSOConfig(realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpEntityID, SAML2Constants.IDP_ROLE,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.ASSERTION_CACHE_ENABLED);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return "true".equalsIgnoreCase(enabled) ? true : false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static byte[] stringToByteArray(String input) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster char chars[] = input.toCharArray();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster byte bytes[] = new byte[chars.length];
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (int i = 0; i < chars.length; i++) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster bytes[i] = (byte) chars[i];
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return bytes;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major public static long getValidTimeofResponse(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm, String idpEntityID, Response response)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // in seconds
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int timeskew = SAML2Constants.ASSERTION_TIME_SKEW_DEFAULT;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String timeskewStr = getAttributeValueFromIDPSSOConfig(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Constants.ASSERTION_TIME_SKEW);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (timeskewStr != null && timeskewStr.trim().length() > 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster timeskew = Integer.parseInt(timeskewStr);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (timeskew < 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster timeskew = SAML2Constants.ASSERTION_TIME_SKEW_DEFAULT;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (SAML2Utils.debug.messageEnabled()) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.message("timeskew = " + timeskew);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major List assertions = response.getAssertion();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if ((assertions == null) || (assertions.size() == 0)) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major // failed case
80849398a45dca1fb917716907d6ec99be6222c2Peter Major return (System.currentTimeMillis()
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + getEffectiveTime(realm, idpEntityID)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + timeskew * 1000);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Assertion assertion = (Assertion) assertions.get(0);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Conditions cond = assertion.getConditions();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (cond == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception("nullConditions");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Date notOnOrAfter = cond.getNotOnOrAfter();
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
80849398a45dca1fb917716907d6ec99be6222c2Peter Major long ret = notOnOrAfter.getTime() + timeskew * 1000;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (notOnOrAfter == null ||
80849398a45dca1fb917716907d6ec99be6222c2Peter Major (ret < System.currentTimeMillis())) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (SAML2Utils.debug.messageEnabled()) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.message("Time in Assertion "
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + " is invalid.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("invalidTimeOnResponse"));
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major return ret;
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * Signs SAMLv2 Response.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param idpEntityID the identity provider entity identifier
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param response the SAMLv2 <code>Response</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws <code>SAML2Exception</code> if there is an
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * error signing the response.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
80849398a45dca1fb917716907d6ec99be6222c2Peter Major private static void signResponse(String realm, String idpEntityID,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major Response response) throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil:signResponse";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster KeyProvider kp = KeyUtil.getKeyProviderInstance();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (kp == null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get a key provider instance.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("nullKeyProvider"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String idpSignCertAlias = SAML2Utils.getSigningCertAlias(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, idpEntityID, SAML2Constants.IDP_ROLE);
80849398a45dca1fb917716907d6ec99be6222c2Peter Major if (idpSignCertAlias == null) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.debug.error(classMethod +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Unable to get the hosted IDP signing certificate alias.");
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("missingSigningCertAlias"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper String encryptedKeyPass =
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper SAML2Utils.getSigningCertEncryptedKeyPass(realm, idpEntityID, SAML2Constants.IDP_ROLE);
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper PrivateKey key;
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper if (encryptedKeyPass == null || encryptedKeyPass.isEmpty()) {
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper key = kp.getPrivateKey(idpSignCertAlias);
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper } else {
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper key = kp.getPrivateKey(idpSignCertAlias, encryptedKeyPass);
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper }
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper
0cd8368ca65c58915ee90bc73d84e65f3da9e120Mark de Reeper response.sign(key, kp.getX509Certificate(idpSignCertAlias));
80849398a45dca1fb917716907d6ec99be6222c2Peter Major }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns a <code>SAML2IdentityProviderAdapter</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param idpEntityID the entity id of the identity provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the <code>SAML2IdenityProviderAdapter</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
7da3f239ac3deab008336f663f21e82d5d01aeadJonathan Scudder static SAML2IdentityProviderAdapter getIDPAdapterClass(String realm, String idpEntityID)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
7da3f239ac3deab008336f663f21e82d5d01aeadJonathan Scudder return SAML2Utils.getIDPAdapterClass(realm, idpEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns <code>true</code> or <code>false</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * depending if the flag spDoNotWriteFederationInfo is set in the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * SP Extended metadata
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param spEntityID the entity id of the Service Provider
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param metaManager the SAML2MetaMAnager used to read the extendede metadata
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return the <code>true/false</code>
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @throws SAML2Exception if the operation is not successful
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static Boolean isSPDoNotWriteFedInfoInIdP(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String realm, String spEntityID, SAML2MetaManager metaManager)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String methodName = "isSPDoNotWriteFedInfoInIdp";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Boolean isSPDoNotWriteFedInfoEnabled = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message("IDPSSOUtil." + methodName + "Entering");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String SPDoNotWriteFedInfo = getAttributeValueFromSPSSOConfig(realm,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spEntityID, metaManager,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Constants.SP_DO_NOT_WRITE_FEDERATION_INFO);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SPDoNotWriteFedInfo != null && !SPDoNotWriteFedInfo.isEmpty()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message("IDPSSOUtil." + methodName +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major ": SPDoNotWriteFedInfo is: " + SPDoNotWriteFedInfo);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isSPDoNotWriteFedInfoEnabled = SPDoNotWriteFedInfo.equalsIgnoreCase("true");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message("IDPSSOUtil." + methodName +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ": SPDoNotWriteFedInfo is: not configured");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isSPDoNotWriteFedInfoEnabled = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception ex) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error("IDPSSOUtil." + methodName +
80849398a45dca1fb917716907d6ec99be6222c2Peter Major "Unable to get the spDoNotWriteFedInfo flag.", ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
80849398a45dca1fb917716907d6ec99be6222c2Peter Major return isSPDoNotWriteFedInfoEnabled;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Retrieves attribute value for a given attribute name from
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <code>SPSSOConfig</code>.
80849398a45dca1fb917716907d6ec99be6222c2Peter Major *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param orgName realm or organization name the service provider resides in
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param hostEntityId hosted service provider's Entity ID.
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param sm <code>SAML2MetaManager</code> instance to perform meta
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * operations.
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param attrName name of the attribute whose value ot be retrived.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return value of the attribute; or <code>null</code> if the attribute
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * if not configured, or an error occured in the process.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static String getAttributeValueFromSPSSOConfig(String orgName,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String hostEntityId,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2MetaManager sm,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String attrName) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String result = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SPSSOConfigElement config = sm.getSPSSOConfig(orgName,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major hostEntityId);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (config == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map attrs = SAML2MetaUtils.getAttributes(config);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List value = (List) attrs.get(attrName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (value != null && value.size() != 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster result = ((String) value.iterator().next()).trim();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SAML2MetaException sme) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message("IDPSSOUtil.getAttributeValueFromSPSSO"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " Config:", sme);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster result = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return result;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Validates if the Assertion Consumer Service URL acsURL exists in the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * metadata of the Service Provider spEntityID
80849398a45dca1fb917716907d6ec99be6222c2Peter Major *
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param acsURL the assertion consumer service <code>URL</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param spEntityID the entity id of the service provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @param realm the realm name of the identity provider
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * @return true if the assertion consumer service URL was found
80849398a45dca1fb917716907d6ec99be6222c2Peter Major * false otherwise
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static boolean isACSurlValidInMetadataSP(String acsURL,
80849398a45dca1fb917716907d6ec99be6222c2Peter Major String spEntityID, String realm)
80849398a45dca1fb917716907d6ec99be6222c2Peter Major throws SAML2Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean isValidACSurl = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod = "IDPSSOUtil.isACSurlValidInMetadataSP: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SPSSODescriptorElement spSSODescriptorElement = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (metaManager == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod + "Unable to get meta manager.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("errorMetaManager"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster spSSODescriptorElement = metaManager.getSPSSODescriptor(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major realm, spEntityID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (spSSODescriptorElement == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get SP SSO Descriptor from meta.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
80849398a45dca1fb917716907d6ec99be6222c2Peter Major SAML2Utils.bundle.getString("metaDataError"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SAML2MetaException sme) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.error(classMethod
80849398a45dca1fb917716907d6ec99be6222c2Peter Major + "Unable to get SP SSO Descriptor from meta.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SAML2Exception(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.bundle.getString("metaDataError"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List acsList = spSSODescriptorElement.getAssertionConsumerService();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AssertionConsumerServiceElement acs = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (int i = 0; i < acsList.size(); i++) {
80849398a45dca1fb917716907d6ec99be6222c2Peter Major acs = (AssertionConsumerServiceElement) acsList.get(i);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String acsInMeta = acs.getLocation();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (acsInMeta.equalsIgnoreCase(acsURL)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isValidACSurl = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2Utils.debug.message(classMethod + " acsURL=" + acsURL +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Found in the metadata");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster break;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
80849398a45dca1fb917716907d6ec99be6222c2Peter Major
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return isValidACSurl;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}