package org.atricore.idbus.capabilities.sso.main.sp.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.support.binding.SSOBinding;
import org.atricore.idbus.common.sso._1_0.protocol.CredentialType;
import org.atricore.idbus.common.sso._1_0.protocol.SPCredentialsCallbackRequestType;
import org.atricore.idbus.common.sso._1_0.protocol.SPCredentialsCallbackResponseType;
import org.atricore.idbus.common.sso._1_0.protocol.SPInitiatedAuthnRequestType;
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.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.util.UUIDGenerator;
import java.util.List;
/**
* @author <a href=mailto:sgonzalez@atricore.org>Sebastian Gonzalez Oyuela</a>
*/
public class SPCredentialsCallbackProducer extends SSOProducer {
private static final Log logger = LogFactory.getLog(SPCredentialsCallbackProducer.class);
protected UUIDGenerator uuidGenerator = new UUIDGenerator();
public SPCredentialsCallbackProducer( AbstractCamelEndpoint<CamelMediationExchange> endpoint ) throws Exception {
super( endpoint );
}
@Override
protected void doProcess(CamelMediationExchange exchange) throws Exception {
// Get credentials from provider state and send them back!
CamelMediationMessage in = (CamelMediationMessage) exchange.getIn();
SPCredentialsCallbackRequestType ssoCcReq =
(SPCredentialsCallbackRequestType) in.getMessage().getContent();
SPInitiatedAuthnRequestType ssoRequest =
(SPInitiatedAuthnRequestType) in.getMessage().getState().
getLocalVariable("urn:org:atricore:idbus:sso:protocol:SPInitiatedAuthnRequest");
if (logger.isDebugEnabled())
logger.debug("Providing credentials for SP Initiated SSO AuthnRequest " + ssoRequest.getID());
SPCredentialsCallbackResponseType ssoCredResp = new SPCredentialsCallbackResponseType();
ssoCredResp.setID(uuidGenerator.generateId());
ssoCredResp.setInReplayTo(ssoCcReq.getID());
ssoCredResp.setIssuer(getProvider().getName());
if (logger.isTraceEnabled())
logger.trace("Adding received " + ssoRequest.getCredentials().size() + " credentials.");
ssoCredResp.getCredentials().addAll(ssoRequest.getCredentials());
if (!endpoint.getBinding().equals(SSOBinding.SSO_LOCAL.toString())) {
logger.error("Unsupported binding " + endpoint.getBinding());
}
EndpointDescriptor destination =
new EndpointDescriptorImpl("EmbeddedSPAcs",
"CredentialsCallbackService",
null,
null,
null);
logger.debug("Sending SSO Credentials Callback Response through LOCAL binding");
CamelMediationMessage out = (CamelMediationMessage) exchange.getOut();
out.setMessage(new MediationMessageImpl(ssoCredResp.getID(),
ssoCredResp, "SPCredentialsCallbackResponse", null, destination, in.getMessage().getState()));
exchange.setOut(out);
}
}