package org.atricore.idbus.capabilities.sso.main.idp.producers; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.atricore.idbus.capabilities.sso.main.common.producers.SSOProducer; import org.atricore.idbus.capabilities.sso.main.idp.IdPSecurityContext; import org.atricore.idbus.capabilities.sso.support.core.StatusCode; import org.atricore.idbus.capabilities.sso.support.core.StatusDetails; import org.atricore.idbus.common.sso._1_0.protocol.IDPSessionHeartBeatRequestType; import org.atricore.idbus.common.sso._1_0.protocol.IDPSessionHeartBeatResponseType; import org.atricore.idbus.kernel.main.federation.metadata.EndpointDescriptor; import org.atricore.idbus.kernel.main.federation.metadata.EndpointDescriptorImpl; import org.atricore.idbus.kernel.main.mediation.IdentityMediationFault; import org.atricore.idbus.kernel.main.mediation.MediationMessageImpl; import org.atricore.idbus.kernel.main.mediation.camel.AbstractCamelEndpoint; import org.atricore.idbus.kernel.main.mediation.camel.component.binding.CamelMediationExchange; import org.atricore.idbus.kernel.main.mediation.camel.component.binding.CamelMediationMessage; import org.atricore.idbus.kernel.main.mediation.channel.SPChannel; import org.atricore.idbus.kernel.main.session.SSOSessionManager; import org.atricore.idbus.kernel.main.session.exceptions.NoSuchSessionException; import org.atricore.idbus.kernel.main.session.exceptions.SSOSessionException; import org.atricore.idbus.kernel.main.util.UUIDGenerator; /** * @author <a href="mailto:sgonzalez@atricore.org">Sebastian Gonzalez Oyuela</a> * @version $Id$ */ public class SessionHeartBeatProducer extends SSOProducer { private UUIDGenerator uuidGenerator = new UUIDGenerator(); private static final Log logger = LogFactory.getLog( SessionHeartBeatProducer.class ); public SessionHeartBeatProducer( AbstractCamelEndpoint<CamelMediationExchange> endpoint ) throws Exception { super( endpoint ); } @Override protected void doProcess( CamelMediationExchange exchange ) throws Exception { CamelMediationMessage in = (CamelMediationMessage) exchange.getIn(); Object content = in.getMessage().getContent(); if (content instanceof IDPSessionHeartBeatRequestType) { doProcessSessionHeartBeat(exchange, (IDPSessionHeartBeatRequestType) content); } else { throw new IdentityMediationFault(StatusCode.TOP_RESPONDER.getValue(), null, StatusDetails.UNKNOWN_REQUEST.getValue(), content.getClass().getName(), null); } } protected void doProcessSessionHeartBeat(CamelMediationExchange exchange, IDPSessionHeartBeatRequestType request) throws SSOSessionException { CamelMediationMessage in = (CamelMediationMessage) exchange.getIn(); CamelMediationMessage out = (CamelMediationMessage) exchange.getOut(); // Recover local session information IdPSecurityContext secCtx = (IdPSecurityContext) in.getMessage().getState().getLocalVariable(getProvider().getName().toUpperCase() + "_SECURITY_CTX"); IDPSessionHeartBeatResponseType response = new IDPSessionHeartBeatResponseType(); response.setID(uuidGenerator.generateId()); response.setInReplayTo(request.getID()); response.setSsoSessionId(request.getSsoSessionId()); response.setIssuer(getProvider().getName()); if (secCtx == null || secCtx.getSessionIndex() == null) { if (logger.isDebugEnabled()) logger.debug("No Security Context found for " + getProvider().getName().toUpperCase() + "_SECURITY_CTX: " + secCtx); // No SSO Session available, send response. response.setValid(false); } else { if (logger.isDebugEnabled()) logger.debug("Security Context found " + secCtx); try { updateIDPSecurityContext(secCtx); if (logger.isTraceEnabled()) logger.trace("SSO Session is valid: " + secCtx.getSessionIndex()); response.setValid(true); } catch (NoSuchSessionException e) { if (logger.isDebugEnabled()) logger.debug("SSO Session not found or invalid: " + secCtx.getSessionIndex()); response.setValid(false); } } // Send response back EndpointDescriptor destination = new EndpointDescriptorImpl("IDPSessionHeartBeatService", "IDPSessionHeartBeatService", endpoint.getBinding(), null, null); out.setMessage(new MediationMessageImpl(uuidGenerator.generateId(), response, "IDPSessionHeartBeatResponse", null, destination, in.getMessage().getState())); } protected void updateIDPSecurityContext(IdPSecurityContext secCtx) throws SSOSessionException { if (logger.isDebugEnabled()) logger.debug("Updating IDP Security Context for " + secCtx.getSessionIndex()); SPChannel spChannel = (SPChannel) channel; SSOSessionManager ssoSessionManager = spChannel.getSessionManager(); ssoSessionManager.accessSession(secCtx.getSessionIndex()); } }