/** * 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.knowcenter.wag.egov.egiz.web; 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.utils.WebUtils; import at.gv.egiz.pdfas.web.CurrentLocalOperation; import at.gv.egiz.pdfas.web.SignSessionInformation; import at.gv.egiz.pdfas.web.VerifySessionInformation; import at.knowcenter.wag.egov.egiz.PdfAS; import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; 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; import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder; import at.knowcenter.wag.egov.egiz.sig.SignatureData; import at.knowcenter.wag.egov.egiz.sig.SignatureObject; import at.knowcenter.wag.egov.egiz.sig.connectors.ConnectorChooser; import at.knowcenter.wag.egov.egiz.sig.connectors.LocalConnector; import at.knowcenter.wag.egov.egiz.sig.connectors.bku.SignSignatureObject; import at.knowcenter.wag.egov.egiz.sig.signatureobject.SignatureObjectHelper; /** * 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(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()); LocalConnector c = ConnectorChooser.chooseLocalConnectorForSign(si.connector, si.type, loc_ref_url); String sign_request = c.prepareSignRequest(si.si.getSignatureData()); 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 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(VerifySessionInformation si, List holders_to_verify, HttpServletRequest request, HttpServletResponse response) throws SignatureException, NormalizeException, IOException, ConnectorFactoryException, SettingsException, ConnectorException { si.currentLocalOperation = new CurrentLocalOperation(); si.currentLocalOperation.holders_to_be_verified = holders_to_verify; si.currentLocalOperation.requests = new LocalRequest[holders_to_verify.size()]; si.currentLocalOperation.response_properties = new Properties[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++) { SignatureHolder holder = (SignatureHolder) holders_to_verify.get(i); SignatureObject s = holder.getSignatureObject(); SignatureData sd = PdfAS.convertSignatureHolderToSignatureData(holder); // if (holder.getSignatureObject().isBinary()) // { // BinarySignatureHolder bsh = (BinarySignatureHolder) holder; // // byte[] data = CodingHelper.decodeBase64(text_to_be_verified); // // TODO what about the length of the PDF? is this correct - already deprecated // sd = new SignatureDataImpl(bsh.getSignedPdf(), "application/pdf"); // } // else // { // String text_to_be_verified = holder.getSignedText(); // DataSource ds = new TextDataSourceImpl(text_to_be_verified); // sd = new SignatureDataImpl(ds, "text/plain", "UTF-8"); // } SignSignatureObject so = SignatureObjectHelper.convertSignatureObjectToSignSignatureObject(s); LocalConnector local_conn = ConnectorChooser.chooseLocalConnectorForVerify(si.connector, s.getKZ(), so.id, si.type, loc_ref_url); String request_string = local_conn.prepareVerifyRequest(sd, so, null); LocalRequest local_request = new LocalRequest("not-needed", request_string); si.currentLocalOperation.requests[i] = local_request; si.currentLocalOperation.response_properties[i] = null; } String local_request_url = 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; // si.requests = new LocalRequest[holders_to_verify.size()]; // si.response_properties = new Properties[si.requests.length]; // si.current_operation = 0; // si.finished = false; // // request.getSession().setAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION, // si); // // SessionTable.put(si); // // LocalConnector local_conn = (LocalConnector) // ConnectorFactory.createConnector(si.connector); // // for (int i = 0; i < si.requests.length; i++) // { // SignatureHolder holder = (SignatureHolder) holders_to_verify.get(i); // // String text_to_be_verified = holder.getSignedText(); // // Normalizer normalizer = new Normalizer(); // // String normalized = normalizer.normalize(holder.signed_text); // // String request_string = // local_conn.prepareVerifyRequest(text_to_be_verified, // holder.getSignatureObject()); // // LocalRequest local_request = new // LocalRequest(local_conn.getVerifyURL(holder.getSignatureObject().getSignationType()), // request_string); // si.requests[i] = local_request; // si.response_properties[i] = null; // } // // // ByteArrayOutputStream baos = new ByteArrayOutputStream(); // // ObjectOutputStream oos = new ObjectOutputStream(baos); // // oos.writeObject(local_requests); // // oos.close(); // // baos.close(); // // // byte [] requests_bytes = baos.toByteArray(); // // String base64 = CodingHelper.encodeBase64(requests_bytes); // // prepareDispatchToLocalConnectionPage(si.requests[0], request, response); } // what is this for? // /** // * Sets up the local verify procedure. // * // * @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 Forwarded exception. // */ // public static String processLocalVerifyForSingleSignature(VerifySessionInformation si, List holders_to_verify, HttpServletRequest request, HttpServletResponse response) throws SignatureException, // NormalizeException, IOException, ConnectorFactoryException, SettingsException // { // si.requests = new LocalRequest[1]; // si.response_properties = new Properties[1]; // si.current_operation = 0; // si.finished = false; // // String host = request.getServerName(); // URL loc_ref_URL = new URL(request.getScheme(), host, request.getServerPort(), request.getContextPath() + "/RetrieveSignatureData"); // String loc_ref_url = response.encodeURL(loc_ref_URL.toString()); // // SignatureHolder holder = (SignatureHolder) holders_to_verify.get(0); // // SignatureObject s = holder.getSignatureObject(); // // // TODO This whole processing is unnecessary here because only the mime type is used. - already deprecated // // String text_to_be_verified = holder.getSignedText(); // SignatureData sd = null; // // if (holder.getSignatureObject().isBinary()) // { // BinarySignatureHolder bsh = (BinarySignatureHolder) holder; // // byte[] data = CodingHelper.decodeBase64(text_to_be_verified); // sd = new SignatureDataImpl(bsh.getSignedPdf(), "application/pdf"); // } // else // { // String text_to_be_verified = holder.getSignedText(); // DataSource ds = new TextDataSourceImpl(text_to_be_verified); // sd = new SignatureDataImpl(ds, "text/plain", "UTF-8"); // } // // SignSignatureObject so = SignatureObjectHelper.convertSignatureObjectToSignSignatureObject(s); // // LocalConnector local_conn = ConnectorChooser.chooseLocalConnectorForVerify(si.connector, s.getKZ(), so.id, si.type, loc_ref_url); // String request_string = local_conn.prepareVerifyRequest(sd, so); // // LocalRequest local_request = new LocalRequest("not-needed", request_string); // si.requests[0] = local_request; // si.response_properties[0] = null; // // // TODO read from config - already deprecated // String local_request_url = getLocalServiceAddress(si.type, si.connector); // // URL data_URL = new URL(request.getScheme(), host, request.getServerPort(), request.getContextPath() + "/DataURL"); // 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; } /** * Returns the URL for accessing the local service. *

* This information is taken from the profile and if not defined from the * defaults. *

*

* E.g. http://127.0.0.1:3495/http-security-layer-request *

* * @param profile * The profile to take the data from. * @param device * The service device to be accessed. E.g. bku. * @return Returns the URL for accessing the local service. * @throws SettingsException F.e. */ public static String getLocalServiceAddress(String profile, String device) throws SettingsException { SettingsReader settings = SettingsReader.getInstance(); String url = getConnectorValueFromProfile(settings, profile, device + ".sign.url"); return url; //"http://127.0.0.1:3495/http-security-layer-request"; } /** * Reads the configuration entry given by the key, first from the given * profile, if not found from the defaults. * * @param settings * The settings. * @param profile * The profile. * @param key * The configuration key. * @return Returns the configuration entry. */ public static String getConnectorValueFromProfile(SettingsReader settings, String profile, String key) { String value = settings.getValueFromKey("sig_obj." + profile + "." + key); //$NON-NLS-1$//$NON-NLS-2$ if (value == null) { value = settings.getValueFromKey(key); } return value; } }