//Create the request/response
SAML2HandlerRequest saml2HandlerRequest =
new DefaultSAML2HandlerRequest(protocolContext,
holder.getIssuer(), null,
HANDLER_TYPE.SP);
SAML2HandlerResponse saml2HandlerResponse = new DefaultSAML2HandlerResponse();
saml2HandlerResponse.setDestination(identityURL);
//Reset the state
try
{
for(SAML2Handler handler: handlers)
{
handler.reset();
if(saml2HandlerResponse.isInError())
{
response.sendError(saml2HandlerResponse.getErrorCode());
break;
}
saml2HandlerRequest.setTypeOfRequestToBeGenerated(GENERATE_REQUEST_TYPE.AUTH);
handler.generateSAMLRequest(saml2HandlerRequest, saml2HandlerResponse);
}
}
catch(ProcessingException pe)
{
throw new RuntimeException(pe);
}
Document samlResponseDocument = saml2HandlerResponse.getResultingDocument();
String relayState = saml2HandlerResponse.getRelayState();
String destination = saml2HandlerResponse.getDestination();
if(destination != null &&
samlResponseDocument != null)
{
try
{
this.sendToDestination(samlResponseDocument, relayState, destination, response);
}
catch (Exception e)
{
if(trace)
log.trace("Exception:",e);
throw new ServletException("Server Error");
}
return;
}
}
//See if we got a response from IDP
if(samlResponse != null && samlResponse.length() > 0 )
{
boolean isValid = false;
try
{
isValid = this.validate(request);
}
catch (Exception e)
{
throw new ServletException(e);
}
if(!isValid)
throw new ServletException("Validity check failed");
//deal with SAML response from IDP
byte[] base64DecodedResponse = PostBindingUtil.base64Decode(samlResponse);
InputStream is = new ByteArrayInputStream(base64DecodedResponse);
try
{
SAML2Response saml2Response = new SAML2Response();
SAML2Object samlObject = saml2Response.getSAML2ObjectFromStream(is);
Set<SAML2Handler> handlers = chain.handlers();
IssuerInfoHolder holder = new IssuerInfoHolder(this.serviceURL);
ProtocolContext protocolContext = new HTTPContext(request,response, context);
//Create the request/response
SAML2HandlerRequest saml2HandlerRequest =
new DefaultSAML2HandlerRequest(protocolContext,
holder.getIssuer(), samlObject,
HANDLER_TYPE.SP);
Map<String,Object> requestOptions = new HashMap<String,Object>();
requestOptions.put(GeneralConstants.CONFIGURATION, this.spConfiguration);
saml2HandlerRequest.setOptions(requestOptions);
SAML2HandlerResponse saml2HandlerResponse = new DefaultSAML2HandlerResponse();
//Deal with handler chains
for(SAML2Handler handler : handlers)
{
if(saml2HandlerResponse.isInError())
{
response.sendError(saml2HandlerResponse.getErrorCode());
break;
}
if(samlObject instanceof RequestAbstractType)
{
handler.handleRequestType(saml2HandlerRequest, saml2HandlerResponse);
}
else
{
handler.handleStatusResponseType(saml2HandlerRequest, saml2HandlerResponse);
}
}
Document samlResponseDocument = saml2HandlerResponse.getResultingDocument();
String relayState = saml2HandlerResponse.getRelayState();
String destination = saml2HandlerResponse.getDestination();
if(destination != null &&
samlResponseDocument != null)
{