package org.jboss.seam.security.external; import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; import javax.inject.Inject; import javax.servlet.http.HttpServletResponse; import org.jboss.seam.security.external.dialogues.api.Dialogue; import org.jboss.seam.security.external.dialogues.api.DialogueManager; import org.jboss.seam.security.external.saml.SamlMessage; import org.jboss.seam.security.external.saml.SamlPostMessage; import org.jboss.seam.security.external.saml.SamlRedirectMessage; /** * @author Marcel Kolsteren */ public class ResponseHandler { @Inject private DialogueManager dialogueManager; @Inject private Dialogue dialogue; public void sendFormToUserAgent(String destination, SamlPostMessage message, HttpServletResponse response) { String key = message.getRequestOrResponse().isRequest() ? SamlMessage.QSP_SAML_REQUEST : SamlMessage.QSP_SAML_RESPONSE; if (destination == null) throw new IllegalStateException("Destination is null"); StringBuilder builder = new StringBuilder(); builder.append("<HTML>"); builder.append("<HEAD>"); if (message.getRequestOrResponse().isRequest()) builder.append("<TITLE>HTTP Post SamlBinding (Request)</TITLE>"); else builder.append("<TITLE>HTTP Post SamlBinding Response (Response)</TITLE>"); builder.append("</HEAD>"); builder.append("<BODY Onload=\"document.forms[0].submit()\">"); builder.append("<FORM METHOD=\"POST\" ACTION=\"" + destination + "\">"); builder.append("<INPUT TYPE=\"HIDDEN\" NAME=\"" + key + "\"" + " VALUE=\"" + message.getSamlMessage() + "\"/>"); if (message.getRelayState() != null) { builder.append("<INPUT TYPE=\"HIDDEN\" NAME=\"" + SamlMessage.QSP_RELAY_STATE + "\"" + " VALUE=\"" + message.getRelayState() + "\"/>"); } builder.append("</FORM></BODY></HTML>"); PrintWriter writer = getWriter(response); writer.print(builder.toString()); writer.flush(); } public void sendHttpRedirectToUserAgent(String url, HttpServletResponse response) { try { response.sendRedirect(url); } catch (IOException e) { throw new RuntimeException(e); } } public void sendHttpRedirectToUserAgent(String location, SamlRedirectMessage redirectMessage, HttpServletResponse response) { String url = location + "?" + redirectMessage.createQueryString(); sendHttpRedirectToUserAgent(url, response); } public void sendError(int statusCode, String message, HttpServletResponse response) { try { response.sendError(statusCode, message); } catch (IOException e) { throw new RuntimeException(e); } } private PrintWriter getWriter(HttpServletResponse response) { try { return response.getWriter(); } catch (IOException e) { throw new RuntimeException(e); } } public Writer getWriter(String mimeType, HttpServletResponse response) { response.setContentType(mimeType); return getWriter(response); } public ResponseHolderImpl createResponseHolder(HttpServletResponse response) { String dialogueId = null; if (dialogueManager.isAttached()) { dialogueId = dialogue.getId(); } return new ResponseHolderImpl(response, dialogueId); } }