/** * Copyright (c) 2006 by Know-Center, Graz, Austria * * This software is the confidential and proprietary information of Know-Center, * Graz, Austria. You shall not disclose such Confidential Information and shall * use it only in accordance with the terms of the license agreement you entered * into with Know-Center. * * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. * * $Id: LocalRequestHelper.java,v 1.6 2006/10/31 08:22:04 wprinz Exp $ */ package at.gv.egiz.pdfas.web.helper; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.List; import java.util.Properties; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import at.gv.egiz.pdfas.api.commons.Constants; import at.gv.egiz.pdfas.api.commons.SignatureInformation; import at.gv.egiz.pdfas.api.internal.PdfAsInternal; import at.gv.egiz.pdfas.web.CurrentLocalOperation; import at.gv.egiz.pdfas.web.LocalRequest; import at.gv.egiz.pdfas.web.session.SignSessionInformation; import at.gv.egiz.pdfas.web.session.VerifySessionInformation; import at.knowcenter.wag.egov.egiz.exceptions.ConnectorException; import at.knowcenter.wag.egov.egiz.exceptions.ConnectorFactoryException; import at.knowcenter.wag.egov.egiz.exceptions.NormalizeException; import at.knowcenter.wag.egov.egiz.exceptions.PresentableException; import at.knowcenter.wag.egov.egiz.exceptions.SettingsException; import at.knowcenter.wag.egov.egiz.exceptions.SignatureException; /** * Contains commonly used helper functions for the local request procedure. * * @author wprinz */ public abstract class LocalRequestHelper { /** * The logger. */ protected static Log logger = LogFactory.getLog(LocalRequestHelper.class); /** * The resource of the null request page jsp. */ public static final String NULL_REQUEST_PAGE_JSP = "/jsp/null_request_page.jsp"; /** * The resource of the local connection page jsp. */ public static final String LOCAL_CONNECTION_PAGE_JSP = "/jsp/local_connection_page.jsp"; /** * The resource of the redirect refresh page jsp. */ public static final String REDIRECT_REFRESH_PAGE_JSP = "/jsp/redirect_refresh_page.jsp"; /** * Sets up the local sign procedure. * * @param response * The HttpServletResponse the local request page is written to. * @throws IOException * Forwarded exception. * @throws PresentableException * Forwarded exception. */ public static String processLocalSign(PdfAsInternal pdfAsInternal, SignSessionInformation si, HttpServletRequest request, HttpServletResponse response) throws IOException, PresentableException { String host = request.getServerName(); // URL loc_ref_URL = new URL(WebUtils.addJSessionID(getLocalContextAddress(request, response) + "/RetrieveSignatureData", request)); URL loc_ref_URL = new URL(WebUtils.buildRetrieveSignatureDataURL(request, response)); String loc_ref_url = response.encodeURL(loc_ref_URL.toString()); String sign_request = pdfAsInternal.prepareLocalSignRequest(si.signParameters, loc_ref_url, si.sdi); // LocalConnector c = ConnectorChooser.chooseLocalConnectorForSign(si.connector, si.type, loc_ref_url); // String sign_request = c.prepareSignRequest(si.si.getSignatureData()); String local_request_url = pdfAsInternal.getLocalServiceAddress(si.type, si.connector); // String local_request_url = getLocalServiceAddress(si.type, si.connector); si.localRequest = new LocalRequest(local_request_url, sign_request); si.outputAvailable = false; // si.response_properties = null; URL data_URL = new URL(request.getScheme(), host, request.getServerPort(), WebUtils.addJSessionID(request.getContextPath() + "/DataURL", request)); String data_url = response.encodeURL(data_URL.toString()); logger.debug("data_url = " + data_url); request.setAttribute("local_request_url", local_request_url); request.setAttribute("data_url", data_url); return NULL_REQUEST_PAGE_JSP; // TODO old code - remove // // LocalConnector local_conn = (LocalConnector) // ConnectorFactory.createConnector(si.connector); // // // // refactor WEB // String document_text = "fixme"; //si.iui.document_text; // String request_string = local_conn.prepareSignRequest(si.user_name, // document_text, si.type); // String request_url = local_conn.getSignURL(si.type); // // LocalRequest local_request = new LocalRequest(request_url, // request_string); // List local_requests = new ArrayList(); // local_requests.add(local_request); // // // ByteArrayOutputStream baos = new ByteArrayOutputStream(); // // ObjectOutputStream oos = new ObjectOutputStream(baos); // // oos.writeObject(local_requests); // // oos.close(); // // baos.close(); // // si.requests = new LocalRequest[1]; // si.requests[0] = new LocalRequest(local_conn.getSignURL(si.type), // request_string); // si.current_operation = 0; // si.response_properties = new Properties[1]; // si.response_properties[0] = null; // // // SessionTable.put(si); // request.getSession().setAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION, // si); // // // byte [] requests_bytes = baos.toByteArray(); // // String base64 = CodingHelper.encodeBase64(requests_bytes); // // LocalRequestHelper.prepareDispatchToLocalConnectionPage(si.requests[0], // request, response); } /** * Sets up the local verify procedure. * @param list * * @param response * The HttpServletResponse the local request page is written to. * @return Returns the JSP location where the calling servlet should dispatch * to. * @throws SignatureException * Forwarded exception. * @throws NormalizeException * Forwarded exception. * @throws IOException * Forwarded exception. * @throws ConnectorFactoryException * Forwarded exception. * @throws SettingsException * @throws ConnectorException */ public static String processLocalVerify(PdfAsInternal pdfAsInternal, VerifySessionInformation si, List signaturesToBeverified, HttpServletRequest request, HttpServletResponse response) throws SignatureException, NormalizeException, IOException, ConnectorFactoryException, SettingsException, ConnectorException { si.currentLocalOperation = new CurrentLocalOperation(); si.currentLocalOperation.signaturesToBeverified = signaturesToBeverified; // SignatureInformation si.currentLocalOperation.requests = new LocalRequest[signaturesToBeverified.size()]; si.currentLocalOperation.response_xmls = new String[si.currentLocalOperation.requests.length]; si.currentLocalOperation.current_operation = 0; // si.finished = false; String host = request.getServerName(); // URL loc_ref_URL = new URL(WebUtils.addJSessionID(getLocalContextAddress(request, response) + "/RetrieveSignatureData", request)); URL loc_ref_URL = new URL(WebUtils.buildRetrieveSignatureDataURL(request, response)); String loc_ref_url = response.encodeURL(loc_ref_URL.toString()); for (int i = 0; i < si.currentLocalOperation.requests.length; i++) { SignatureInformation sigInfo = (SignatureInformation) signaturesToBeverified.get(i); String request_string = pdfAsInternal.prepareLocalVerifyRequest(sigInfo, si.connector, si.type, loc_ref_url); LocalRequest local_request = new LocalRequest("not-needed", request_string); si.currentLocalOperation.requests[i] = local_request; si.currentLocalOperation.response_xmls[i] = null; } String local_request_url = pdfAsInternal.getLocalServiceAddress(si.type, si.connector); URL data_URL = new URL(request.getScheme(), host, request.getServerPort(), WebUtils.addJSessionID(request.getContextPath() + "/DataURL", request)); String data_url = response.encodeURL(data_URL.toString()); request.setAttribute("local_request_url", local_request_url); request.setAttribute("data_url", data_url); return NULL_REQUEST_PAGE_JSP; } /** * Formats the OK response from the web application back to the local BKU. * *

* As stated in the BKU tutorial, this response must be plain text "". * Otherwise BKU will assume a failure. *

* * @param response * The HttpServletResponse to answer to. * @throws IOException * Forwarded exception. */ protected static void formatBKUOkResponse(HttpServletResponse response) throws IOException { response.setContentType("text/plain"); response.setCharacterEncoding("ISO-8859-1"); response.getWriter().println(""); } /** * Prepares the dispatch to the local data connection page. * *

* The calling servlet just has to dispatch to the jsp after calling this * method. *

* * @param local_request * The local request. Basically this contains the local service's * target URL and the XML request string. * @param response * The HttpServletResponse to write this page to. * @throws IOException * Forwarded exception. * @throws SignatureException * Forwarded exception. * @throws NormalizeException * Forwarded exception. */ public static void prepareDispatchToLocalConnectionPage(LocalRequest local_request, HttpServletRequest request, HttpServletResponse response) throws IOException, SignatureException, NormalizeException { response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); String local_request_url = local_request.getUrl(); String quoted_request = makeStringHTMLReady(local_request.getRequestString()); String host = request.getServerName(); // "129.27.153.77" URL data_URL = new URL(request.getScheme(), host, request.getServerPort(), request.getContextPath() + "/AsynchronousDataResponder"); String data_url = response.encodeURL(data_URL.toString()); URL redirect_URL = new URL(request.getScheme(), host, request.getServerPort(), request.getContextPath() + "/AsynchronousRedirectResponder"); String redirect_url = response.encodeURL(redirect_URL.toString()); request.setAttribute("local_request_url", local_request_url); request.setAttribute("quoted_request", quoted_request); request.setAttribute("data_url", data_url); request.setAttribute("redirect_url", redirect_url); } public static String makeStringHTMLReady(String input) { String output = input; output = output.replaceAll("&", "&"); output = output.replaceAll("\"", """); output = output.replaceAll("<", "<"); output = output.replaceAll(">", ">"); return output; } public static String getLocalServerAddress(HttpServletRequest request, HttpServletResponse response) { String host = request.getServerName(); URL local_server = null; try { String scheme = request.getScheme(); int port = request.getServerPort(); if ("http".equalsIgnoreCase(scheme) && port == 80) { local_server = new URL(scheme, host, "/"); } else if ("https".equalsIgnoreCase(scheme) && port == 443) { local_server = new URL(scheme, host, "/"); } else { local_server = new URL(scheme, host, port, "/"); } } catch (MalformedURLException e) { logger.error(e.getMessage(), e); } String loc_server = response.encodeURL(local_server.toString()); return loc_server; } public static String getLocalContextAddress(HttpServletRequest request, HttpServletResponse response) { String serverURL = getLocalServerAddress(request, response); String context = request.getContextPath(); if (serverURL.endsWith("/") && context.startsWith("/")) { context = context.substring(1); } return serverURL + context; } /** * Tells, if the given connector is local. * * @param connector_identifier * The connector. * @return Returns true, if the given connector is local, false otherwise. * @throws ConnectorFactoryException * F.e. */ public static boolean isConnectorLocal(String connector_identifier) throws ConnectorFactoryException { return connector_identifier.equals(Constants.SIGNATURE_DEVICE_BKU) || connector_identifier.equals(Constants.SIGNATURE_DEVICE_A1) || connector_identifier.equals(Constants.SIGNATURE_DEVICE_MOC); } }