a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The contents of this file are subject to the terms
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * of the Common Development and Distribution License
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * (the License). You may not use this file except in
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * compliance with the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * You can obtain a copy of the License at
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * https://opensso.dev.java.net/public/CDDLv1.0.html or
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * opensso/legal/CDDLv1.0.txt
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * See the License for the specific language governing
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * permission and limitations under the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * When distributing Covered Code, include this CDDL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Header Notice in each file and include the License file
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * at opensso/legal/CDDLv1.0.txt.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * If applicable, add the following below the CDDL Header,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * with the fields enclosed by brackets [] replaced by
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * your own identifying information:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * "Portions Copyrighted [year] [name of copyright owner]"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * $Id: WSPRedirectHandlerServlet.java,v 1.6 2008/08/06 17:28:10 exu Exp $
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
23e304384f98fca4ab2e6f9f07a53465c1bfc645Peter Major/**
564945e59b60a40c3b9458177b2ff63e2947686cPeter Major * Portions Copyrighted 2012-2014 ForgeRock AS
23e304384f98fca4ab2e6f9f07a53465c1bfc645Peter Major */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpackage com.sun.identity.liberty.ws.interaction;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.common.HttpURLConnectionManager;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.shared.debug.Debug;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.common.LogUtil;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.interaction.jaxb.InquiryElement;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.interaction.jaxb.InteractionResponseElement;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.interaction.jaxb.ParameterType;
23e304384f98fca4ab2e6f9f07a53465c1bfc645Peter Majorimport com.sun.identity.shared.xml.XMLUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.io.BufferedInputStream;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.io.BufferedOutputStream;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.io.File;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.io.IOException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.io.InputStream;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.io.OutputStream;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.io.PrintWriter;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.net.URL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.net.URLConnection;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.net.HttpURLConnection;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.net.MalformedURLException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Enumeration;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Iterator;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.List;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Locale;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Map;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.ResourceBundle;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Set;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.logging.Level;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.servlet.http.HttpServlet;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.servlet.http.HttpServletRequest;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.servlet.http.HttpServletResponse;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.servlet.ServletConfig;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.servlet.ServletException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.xml.bind.JAXBContext;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.xml.bind.JAXBException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.xml.bind.Marshaller;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.xml.parsers.DocumentBuilder;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.xml.parsers.ParserConfigurationException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.xml.transform.Transformer;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.xml.transform.TransformerFactory;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.xml.transform.dom.DOMSource;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.xml.transform.stream.StreamResult;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.xml.transform.TransformerException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.xml.sax.SAXException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.w3c.dom.Document;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.w3c.dom.Element;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Class that works in conjection with InteractionManager to facilitate
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * WSP- resource owner interactions
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpublic class WSPRedirectHandlerServlet extends HttpServlet {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static Debug debug = Debug.getInstance("libIDWSF");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static ResourceBundle i18n =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ResourceBundle.getBundle("libInteraction");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static String PARAMETER_PREFIX = "isparam_";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static String TRUE_LABEL = "trueLabel";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static String FALSE_LABEL = "falseLabel";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static String HELP_LABEL = "helpLabel";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static String HINT_LABEL = "hintLabel";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static String LINK_LABEL = "linkLabel";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static String MORE_LINK_LABEL = "moreLinkLabel";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static String DEFAULT_TRUE_LABEL = "true";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static String DEFAULT_FALSE_LABEL = "false";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static String DEFAULT_HELP_LABEL = "help";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static String DEFAULT_HINT_LABEL = "hint";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static String DEFAULT_LINK_LABEL = "link";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static String DEFAULT_MORE_LINK_LABEL = "moreLink";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static int CONNECT_TIMEOUT = 5000; // 5 seconds
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static int READ_TIMEOUT = 5000; // 5 seconds
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private DOMSource htmlStyleSource = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private DOMSource wmlStyleSource = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static String WML_CLIENT = "WML";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void init(ServletConfig servletConfig)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws ServletException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster super.init(servletConfig);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String htmlStyleSheetLocation
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster = InteractionConfig.getInstance()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .getHTMLStyleSheetLocation();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String wmlStyleSheetLocation
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster = InteractionConfig.getInstance()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .getWMLStyleSheetLocation();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
23e304384f98fca4ab2e6f9f07a53465c1bfc645Peter Major DocumentBuilder db = XMLUtils.getSafeDocumentBuilder(false);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Document doc = db.parse(new File(htmlStyleSheetLocation));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster htmlStyleSource = new DOMSource(doc);
23e304384f98fca4ab2e6f9f07a53465c1bfc645Peter Major db = XMLUtils.getSafeDocumentBuilder(false);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster doc = db.parse(new File(wmlStyleSheetLocation));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster wmlStyleSource = new DOMSource(doc);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (ParserConfigurationException pce) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error("WSPRedirectHandlerServlet.init()", pce);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new ServletException(pce);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SAXException se) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error("WSPRedirectHandlerServlet.init()", se);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new ServletException(se);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (IOException ioe) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error("WSPRedirectHandlerServlet.init()", ioe);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new ServletException(ioe);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message("WSPRedirectHandlerServlet.init():initialized");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void doGet(HttpServletRequest httpRequest,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletResponse httpResponse)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws IOException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handleRequest(httpRequest, httpResponse);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //testXSL(httpRequest, httpResponse);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void doPost(HttpServletRequest httpRequest,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletResponse httpResponse)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws IOException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handleRequest(httpRequest, httpResponse);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private void handleRequest(HttpServletRequest httpRequest,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletResponse httpResponse)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws IOException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String wspRedirectHandler =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster InteractionConfig.getInstance().getWSPRedirectHandler();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String lbWspRedirectHandler =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster InteractionConfig.getInstance().getLbWSPRedirectHandler();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String queryString = httpRequest.getQueryString();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String handlerHostId = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (queryString != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int i = queryString.indexOf(InteractionConfig.HANDLER_HOST_ID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (i != -1) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerHostId = queryString.substring(i +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster InteractionConfig.HANDLER_HOST_ID.length() + 1);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int j = handlerHostId.indexOf("&");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (j != -1) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerHostId = handlerHostId.substring(0, j);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirectHandlerServlet.handleRequest():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "queryString: " + queryString
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " : wspRedirectHandler:" + wspRedirectHandler
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " : handlerHostId:" + handlerHostId
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " : lbWspRedirectHandler:" + lbWspRedirectHandler);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (handlerHostId != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //check for trusted handlers
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map trustedRedirectHandlers =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster InteractionConfig.getInstance().getTrustedWSPRedirectHandlers();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(!trustedRedirectHandlers.containsKey(handlerHostId)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sendErrorPageUntrustedHost(httpRequest, httpResponse,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster handlerHostId);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.warningEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.warning(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirectHandlerServlet.handleRequest():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "denied attempt to forward to untrusted host id:"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + handlerHostId);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String localServerId =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster InteractionConfig.getInstance().getLocalServerId();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(!handlerHostId.equals(localServerId)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String handlerHostUrl
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster = (String)trustedRedirectHandlers.get(handlerHostId);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String forwardToUrl = handlerHostUrl + "?" + queryString;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirectHandlerServlet.handleRequest()"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":localServerId=" + localServerId
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":handlerHostId=" + handlerHostId
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":forwarding request to " + forwardToUrl);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster forwardRequest(forwardToUrl, httpRequest, httpResponse);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirectHandlerServlet.handleRequest():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "no need to forward, "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "processing request in the local server");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String requestURL = getRequestURL(httpRequest);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String messageID = httpRequest.getParameter(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster InteractionManager.TRANS_ID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String returnToURL = httpRequest.getParameter(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster InteractionManager.RETURN_TO_URL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirectHandlerServlet.handleRequest():entering "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "with requestURL=" + requestURL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":messageID=" + messageID
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":returnToURL=" + returnToURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (messageID != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (returnToURL != null) { //initial request, render query
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirecthandlerServlet.handleRequest():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " entering with returnToRL=" + returnToURL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " :a new request");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //returnToURL should not have ResendMessage parameter
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!(returnToURL.indexOf(InteractionManager.RESEND_MESSAGE
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "=") == -1)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirecthandlerServlet.handleRequest():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "invalid Request - illegal parameter:"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + InteractionManager.RESEND_MESSAGE
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":returnToURL=" + returnToURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster showErrorPage(httpRequest, httpResponse,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Invalid Request - illegal parameter:"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + InteractionManager.RESEND_MESSAGE
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":returnToURL=" + returnToURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //returnToURL should be https
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (InteractionConfig.getInstance().wspEnforcesHttpsCheck()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster && (returnToURL.indexOf("https") != 0) ) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirecthandlerServlet.handleRequest():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "Invalid Request "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + InteractionManager.RETURN_TO_URL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " not https"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":returnToURL=" + returnToURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster showErrorPage(httpRequest, httpResponse,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Invalid Request "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + InteractionManager.RETURN_TO_URL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " not https"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":returnToURL=" + returnToURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //returnToURL should point to requestHost
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (InteractionConfig.getInstance()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .wspEnforcesReturnToHostEqualsRequestHost()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster && !checkReturnToHost(messageID, returnToURL)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirecthandlerServlet.handleRequest():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "Invalid Request ReturnToHost differs from "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " RequestHost"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":returnToURL=" + returnToURL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":requestHost="
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + InteractionManager.getInstance()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .getRequestHost(messageID));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster showErrorPage(httpRequest, httpResponse,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Invalid Request ReturnToHost differs from "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " RequestHost"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":returnToURL=" + returnToURL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":requestHost="
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + InteractionManager.getInstance()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .getRequestHost(messageID));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //save returnToURL against messageID in InteractionManager
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster InteractionManager.getInstance().setReturnToURL(messageID,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster returnToURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sendInteractionRequestPage(messageID,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster httpRequest, httpResponse);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else { //no returnToURL, response submission
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirecthandlerServlet.handleRequest():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " entering without retunrnToRL:"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " response for query");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //get returnToURL against messageID in InteractionManager
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster returnToURL = InteractionManager.getInstance()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .getReturnToURL(messageID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (returnToURL == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirecthandlerServlet.handleRequest():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " returnToURL, cacheEntry "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " not found to redirect, for TransactionID : "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + messageID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster showErrorPage(httpRequest, httpResponse,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster " returnToURL not found in cache");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sendInteractionResponsePage(messageID,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster httpRequest, httpResponse, returnToURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirecthandlerServlet.handleRequest():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "request without messageID"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":requestURL=" + requestURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //show some error page
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster showErrorPage(httpRequest, httpResponse,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Invalid Request - missing messageID"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":requestURL=" + requestURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirecthandlerServlet.handleRequest():returning");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Constructs an HTML/WML page from InteractionQuery using
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * an XSL stylesheet and sends the page to browser.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private void sendInteractionRequestPage(String messageID,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletRequest httpRequest,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletResponse httpResponse)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws IOException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster InquiryElement inquiryElement
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster = InteractionManager.getInstance().
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster getInquiryElement(messageID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // generate html page, with action url pointing back to this servlet
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // set query parameters transID and responseID
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String wspRedirectHandler =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster InteractionConfig.getInstance().getWSPRedirectHandler();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String lbWspRedirectHandler =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster InteractionConfig.getInstance().getLbWSPRedirectHandler();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String action = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (lbWspRedirectHandler == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster action = httpRequest.getRequestURL().toString() +"?"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + InteractionManager.TRANS_ID + "=" + messageID;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String localServerId =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster InteractionConfig.getInstance().getLocalServerId();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster action = lbWspRedirectHandler +"?"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + InteractionManager.TRANS_ID + "=" + messageID
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "&" + InteractionConfig.HANDLER_HOST_ID
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "=" + localServerId;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirectHandlerServlet.sendInteractionRequestPage():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "action=" + action);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DOMSource styleSource = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean wmlClient = isWMLClient(httpRequest);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster PrintWriter out = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!wmlClient) { //not a wmlClient, assume html client
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message( "WSPRedirectHandlerServlet."
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "sendInteractionRequestPage():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "clientType=html");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster styleSource = htmlStyleSource;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster httpResponse.setContentType("text/html");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out = httpResponse.getWriter();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else { //a wml client
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message( "WSPRedirectHandlerServlet."
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "sendInteractionRequestPage():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "clientType=wml");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster styleSource = wmlStyleSource;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster httpResponse.setContentType("text/vnd.wap.wml");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out = httpResponse.getWriter();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("<?xml version=\"1.0\"?>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\"");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println(" \"http://www.wapforum.org/DTD/wml_1.1.xml\">");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //style inquiryElement and send it to browser
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster JAXBContext jaxbContext =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster JAXBContext.newInstance(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "com.sun.identity.liberty.ws.interaction.jaxb");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Marshaller marshaller = jaxbContext.createMarshaller();
23e304384f98fca4ab2e6f9f07a53465c1bfc645Peter Major DocumentBuilder db = XMLUtils.getSafeDocumentBuilder(false);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Document doc = db.newDocument();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster marshaller.marshal(inquiryElement, doc);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster doc.getDocumentElement().setAttribute("action", action);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String trueLabel = DEFAULT_TRUE_LABEL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String falseLabel = DEFAULT_FALSE_LABEL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String helpLabel = DEFAULT_HELP_LABEL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String hintLabel = DEFAULT_HINT_LABEL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String linkLabel = DEFAULT_LINK_LABEL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String moreLinkLabel = DEFAULT_MORE_LINK_LABEL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String language = InteractionManager.getInstance().
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster getLanguage(messageID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (language == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster trueLabel = i18n.getString(TRUE_LABEL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster falseLabel = i18n.getString(FALSE_LABEL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster helpLabel = i18n.getString(HELP_LABEL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster hintLabel = i18n.getString(HINT_LABEL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster linkLabel = i18n.getString(LINK_LABEL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster moreLinkLabel = i18n.getString(MORE_LINK_LABEL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Locale locale = new Locale(language);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ResourceBundle bundle =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ResourceBundle.getBundle("libInteraction", locale);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster trueLabel = bundle.getString(TRUE_LABEL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster falseLabel = bundle.getString(FALSE_LABEL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster helpLabel = bundle.getString(HELP_LABEL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster hintLabel = bundle.getString(HINT_LABEL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster linkLabel = bundle.getString(LINK_LABEL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster moreLinkLabel = bundle.getString(MORE_LINK_LABEL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Element documentElement = doc.getDocumentElement();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster documentElement.setAttribute(TRUE_LABEL, trueLabel);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster documentElement.setAttribute(FALSE_LABEL, falseLabel);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster documentElement.setAttribute(HELP_LABEL, helpLabel);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster documentElement.setAttribute(HINT_LABEL, hintLabel);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster documentElement.setAttribute(LINK_LABEL, linkLabel);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster documentElement.setAttribute(MORE_LINK_LABEL, moreLinkLabel);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
564945e59b60a40c3b9458177b2ff63e2947686cPeter Major TransformerFactory transformerFactory = XMLUtils.getTransformerFactory();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DOMSource domSource = new DOMSource(doc);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster StreamResult streamResult = new StreamResult(out);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Transformer transformer
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster = transformerFactory.newTransformer(styleSource);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster transformer.transform(domSource, streamResult);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (LogUtil.isLogEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] objs = new String[1];
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster objs[0] = messageID;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.access(Level.INFO,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.IS_PRESENTED_QUERY_TO_USER_AGENT,objs);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (JAXBException je) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirectHandlerServlet.sendInteractionRequestPage():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "catching JAXBException =", je);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster showErrorPage(httpRequest, httpResponse,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Error creating JAXBObject:"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + je.getMessage());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (ParserConfigurationException pce) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirectHandlerServlet.sendInteractionRequestPage():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "catching ParserConfigurationException =", pce);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster showErrorPage(httpRequest, httpResponse,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Error creating interaction request page:"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + pce.getMessage());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (TransformerException tce) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirectHandlerServlet.sendInteractionRequestPage():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "catching TransformerException =", tce);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster showErrorPage(httpRequest, httpResponse,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Error creating interaction request page:"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + tce.getMessage());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private void sendInteractionResponsePage(String messageID,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletRequest httpRequest,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletResponse httpResponse, String returnToURL)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws IOException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirectHandlerServlet.sendInteractionResponsePage():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster +"entering");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //read and save query parameters;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster InteractionResponseElement interactionResponseElement
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster = JAXBObjectFactory.getObjectFactory()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .createInteractionResponseElement();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List list = interactionResponseElement.getParameter();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Enumeration parameterNames = httpRequest.getParameterNames();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster while ( parameterNames.hasMoreElements()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String parameterName
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster = (String)parameterNames.nextElement();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ParameterType parameterType
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster = JAXBObjectFactory.getObjectFactory()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .createParameterType();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String parameterValue
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster = httpRequest.getParameter(parameterName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message("WSPRedirectHandlerServlet"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ".sendInteractionResponsePage():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "parameterName=" + parameterName
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ", parameterValue=" + parameterValue);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int index = parameterName.indexOf(PARAMETER_PREFIX);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (index != -1) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ParameterType parameterType
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster = JAXBObjectFactory.getObjectFactory()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .createParameterType();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster parameterName = parameterName.substring(index
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + PARAMETER_PREFIX.length());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster parameterType.setName(parameterName);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster parameterType.setValue(parameterValue);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster list.add(parameterType);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (LogUtil.isLogEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] objs = new String[1];
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster objs[0] = messageID;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.access(Level.INFO,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.IS_COLLECTED_RESPONSE_FROM_USER_AGENT,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster objs);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //store InteractionResponse in interaction manager;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster InteractionManager.getInstance().setInteractionResponseElement(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster messageID, interactionResponseElement);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (returnToURL.indexOf("?") != -1) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster returnToURL = returnToURL + "&"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + InteractionManager.RESEND_MESSAGE + "="
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + InteractionManager.getInstance()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .getRequestMessageID(messageID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster returnToURL = returnToURL + "?"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + InteractionManager.RESEND_MESSAGE + "=" + messageID;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirectHandlerServlet."
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " sendInteractionResponsePage():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "redirecting user agent to returnToURL="
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + returnToURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster httpResponse.sendRedirect(returnToURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (LogUtil.isLogEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] objs = new String[1];
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster objs[0] = messageID;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.access(Level.INFO,LogUtil.IS_REDIRECTED_USER_AGENT_BACK,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster objs);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (JAXBException je) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirectHandlerServlet.sendInteractionResponsePage():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "catching JAXBException =", je);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster showErrorPage(httpRequest, httpResponse,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Error createing JAXBObject:"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + je.getMessage());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirectHandlerServlet.sendInteractionResponsePage():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "catching Exception =", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private String getRequestURL(HttpServletRequest httpRequest) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return httpRequest.getRequestURL().append("?")
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .append(httpRequest.getQueryString()).toString();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private void showErrorPage(HttpServletRequest httpRequest,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletResponse httpResponse, String message)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws IOException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean wmlClient = isWMLClient(httpRequest);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!wmlClient) { //not a wml client
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster httpResponse.setContentType("text/plain");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster PrintWriter out = httpResponse.getWriter();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("<html>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("<head><title>WSPRedirectHandler</title></head>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("<body>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("WSPRedirectHandler - Interaction Error");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println(message);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("</body>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("</html>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else { //a wml client
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster httpResponse.setContentType("text/vnd.wap.wml");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster PrintWriter out = httpResponse.getWriter();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("<wml>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("<card>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("<p>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("WSPRediretHandler - encountered error");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("</p>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("</card>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("</wml>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private boolean checkReturnToHost(String messageID, String returnToURL) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean answer = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String requestHost = InteractionManager.getInstance()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .getRequestHost(messageID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster URL url = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (requestHost != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster url = new URL(returnToURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String returnToHost = url.getHost();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (requestHost.equals(returnToHost)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster answer = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (MalformedURLException mfe) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirecthandlerServlet.handleRequest():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "malformed "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + InteractionManager.RETURN_TO_URL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "=" + returnToURL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String returnToHost = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (url != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster returnToHost = url.getHost();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster answer = requestHost.equalsIgnoreCase(returnToHost);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //requestHost does not include domain under jdk1.3
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ( (answer == false)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster && (returnToHost.indexOf(requestHost + ".") == 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster answer =true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirectHandlerServlet.checkReturnToHost():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " returning: "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":requestHost=" + requestHost
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":returnToHost=" + returnToHost
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ":returnValue=" + answer);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return answer;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private boolean isWMLClient(HttpServletRequest httpRequest) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // TODO: need to find a way to detect client
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private void forwardRequest(String forwardToUrl,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletRequest request,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletResponse response)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws IOException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirectHandlerServlet.forwardRequest():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "forwardToUrl:" + forwardToUrl);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster InputStream clientIn = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster OutputStream serverOut = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster InputStream serverIn = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster OutputStream clientOut = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster URL url = new URL(forwardToUrl);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpURLConnection urlConnection =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpURLConnectionManager.getConnection(url);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster urlConnection.setDoInput(true);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster urlConnection.setDoOutput(true);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster urlConnection.setUseCaches(false);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster urlConnection.setConnectTimeout(CONNECT_TIMEOUT); //hard coding for 5seconds
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster urlConnection.setReadTimeout(READ_TIMEOUT); //hard coding for 5seconds
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster urlConnection.setInstanceFollowRedirects(false);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Enumeration enumer = request.getHeaderNames();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster while (enumer.hasMoreElements()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String name = (String)enumer.nextElement();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String value = request.getHeader(name);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster urlConnection.addRequestProperty(name, value);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster urlConnection.connect();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster clientIn = new BufferedInputStream(request.getInputStream());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster serverOut = new BufferedOutputStream(urlConnection.getOutputStream());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster byte[] buffer = new byte[1024];
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int len = 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster while ( (len = clientIn.read(buffer)) != -1) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster serverOut.write(buffer, 0, len);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster serverOut.flush();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String statusLine = urlConnection.getHeaderField(null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (statusLine != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message("WSPRedirectHandlerServlet.forwardRequest():"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " status line:" + statusLine);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int i = statusLine.indexOf(" ");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int j = -1;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (i != -1) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster j = statusLine.indexOf(" ", i + 1);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ( (i != -1) && (j !=-1) ) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String status = statusLine.substring(i+1, j);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster response.setStatus(Integer.valueOf(status).intValue());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map headersMap = urlConnection.getHeaderFields();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Set keySet = headersMap.keySet();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Iterator iter = keySet.iterator();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster while (iter.hasNext()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String name = (String)iter.next();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String value = urlConnection.getHeaderField(name);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((name != null) && (value != null) ) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster response.addHeader(name, value);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster serverIn = new BufferedInputStream(urlConnection.getInputStream());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster clientOut = new BufferedOutputStream(response.getOutputStream());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster while ( (len = serverIn.read(buffer)) != -1) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster clientOut.write(buffer, 0, len);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } finally {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (clientIn != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster clientIn.close();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (serverIn != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster serverIn.close();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (clientOut != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster clientOut.close();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (serverOut != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster serverOut.close();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.warningEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.warning("WSPRedirectHandlerServlet.forwardRequest()"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "exception in finally block:", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private void sendErrorPageUntrustedHost(HttpServletRequest request,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster HttpServletResponse response, String handlerHostUrl)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws IOException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "WSPRedirectHandlerServlet.sendErrorPageUntrustedHost()");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster response.setStatus(HttpServletResponse.SC_FORBIDDEN);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster response.setContentType("text/html;charset=UTF-8");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster PrintWriter out = response.getWriter();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("<html>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("<head>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("<title>Denied attempt to forward to untrusted server"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "</title>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("<body>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("<h1>"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + i18n.getString("denied_attemtpt_to_forward_to_untrusted_server")
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "</h1>");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("</body>\n");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster out.println("</html>\n");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}