package org.atricore.idbus.capabilities.sso.main.select.selectors; import org.apache.commons.codec.binary.Base64; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.atricore.idbus.capabilities.sso.main.SSOException; import org.atricore.idbus.capabilities.sso.main.select.spi.AbstractEntitySelector; import org.atricore.idbus.capabilities.sso.main.select.spi.EntitySelectionContext; import org.atricore.idbus.kernel.main.federation.metadata.CircleOfTrustMemberDescriptor; import org.atricore.idbus.kernel.main.mediation.select.SelectorChannel; /** * Created by sgonzalez on 12/23/14. */ public class PreviouslySelectedIdPEntitySelector extends AbstractEntitySelector { private static final Log logger = LogFactory.getLog(RequestedIdPEntitySelector.class); @Override public boolean canHandle(EntitySelectionContext ctx) { return true; } @Override public CircleOfTrustMemberDescriptor selectCotMember(EntitySelectionContext ctx, SelectorChannel channel) throws SSOException { CircleOfTrustMemberDescriptor idp = (CircleOfTrustMemberDescriptor) ctx.getMediationState().getLocalVariable("urn:org:atricore:idbus:capabilities:sso:select:usr:cotMember"); // TODO : Consider that the previous selection may not be trusted/available for the current SP! if (idp != null) { if (logger.isDebugEnabled()) { logger.debug("Using previously selected COT member : " + idp); return idp; } } // Try previous COT member { String idpAliasValue = ctx.getSelectionState().getPreviousCotMember(); if (idpAliasValue != null) { if (logger.isDebugEnabled()) logger.debug("Using IdP alias " + idpAliasValue); // Support both encoded and decoded IDP alias values idp = ctx.getCotManager().lookupMemberByAlias(idpAliasValue); if (idp == null) { String decodedIdpAlias = new String(Base64.decodeBase64(idpAliasValue.getBytes())); idp = ctx.getCotManager().lookupMemberByAlias(decodedIdpAlias); } } } return idp; } }