/**
* Copyright 2006 by Know-Center, Graz, Austria
* PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a
* joint initiative of the Federal Chancellery Austria and Graz University of
* Technology.
*
* Licensed under the EUPL, Version 1.1 or - as soon they will be approved by
* the European Commission - subsequent versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
* http://www.osor.eu/eupl/
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*
* This product combines work with different licenses. See the "NOTICE" text
* file for details on the various modules and licenses.
* The "NOTICE" text file is part of the distribution. Any derivative works
* that you distribute must include a readable copy of the "NOTICE" text file.
*
* $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 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.buildRetrieveSignatureDataURL(request, response));
String loc_ref_url = response.encodeURL(loc_ref_URL.toString());
String sign_request = pdfAsInternal.prepareLocalSignRequest(si.signParameters, false, loc_ref_url, si.sdi);
String local_request_url = pdfAsInternal.getLocalServiceAddress(si.type, si.connector);
si.localRequest = new LocalRequest(local_request_url, sign_request);
si.outputAvailable = false;
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;
}
/**
* 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;
String host = request.getServerName();
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("");
}
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
{
//rpiazzi added signature devices mobile and mobiletest
return connector_identifier.equals(Constants.SIGNATURE_DEVICE_BKU) || connector_identifier.equals(Constants.SIGNATURE_DEVICE_A1) || connector_identifier.equals(Constants.SIGNATURE_DEVICE_MOC) || connector_identifier.equals(Constants.SIGNATURE_DEVICE_MOBILE) || connector_identifier.equals(Constants.SIGNATURE_DEVICE_MOBILETEST);
}
}