From eb68e29e371ef3e944f682239e6f3f92cb084697 Mon Sep 17 00:00:00 2001 From: tknall Date: Mon, 9 Jun 2008 15:27:50 +0000 Subject: Web-Application: Configuration may be declared via system property "pdf-as.work-dir" or via Servlet-Init-Parameter "work-dir". Bug fixed in RetrieveSignatureDataServlet: Response header didn't contain a content length attribute. The ITS Mac BKU rejects those requests. Workaround for ITS Mac BKU integrated. A redirect via response does only work if the response contains a valid SL request (e.g. a NullOperationRequest). API: The configuration folder may be omitted at instantiating the api. Configuration may be set via system property "pdf-as.work-dir". If no configuration is given at all, the current user's home directory is searched for a folder "PDF-AS". If not found a default configuration is created. If the configuration is explicitely given than the temporary folder is located within the given directory otherwise within the user's temporary directory. Declaring the configuration folder, replacements for system properties like "${catalina.base}/conf/pdfas" may be used. Web-Application: Session is now being invalidated after download of the signed pdf file. Web-Application: Every hardcoded context "pdf-as" has been replaced. git-svn-id: https://joinup.ec.europa.eu/svn/pdf-as/trunk@277 7b5415b0-85f9-ee4d-85bd-d5d0c3b42d1c --- .../java/at/knowcenter/wag/egov/egiz/PdfAS.java | 7 +- .../wag/egov/egiz/cfg/SettingsReader.java | 165 +++++++++++++++------ .../wag/egov/egiz/pdf/PDFSignatureObjectIText.java | 3 + .../at/knowcenter/wag/egov/egiz/pdf/Utils.java | 22 ++- .../sig/connectors/bku/DetachedBKUConnector.java | 5 +- .../knowcenter/wag/egov/egiz/tools/FileHelper.java | 1 + .../wag/egov/egiz/web/LocalRequestHelper.java | 23 ++- .../egov/egiz/web/PdfASServletContextListener.java | 42 ++++-- .../wag/egov/egiz/web/servlets/DataURLServlet.java | 42 +++++- .../egov/egiz/web/servlets/ProvidePDFServlet.java | 4 +- .../web/servlets/RetrieveSignatureDataServlet.java | 22 +-- .../wag/egov/egiz/web/servlets/SignServlet.java | 3 +- .../egiz/web/servlets/VerifyPreviewServlet.java | 10 +- .../wag/egov/egiz/web/servlets/VerifyServlet.java | 2 +- 14 files changed, 257 insertions(+), 94 deletions(-) (limited to 'src/main/java/at/knowcenter/wag') diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java b/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java index c0e340c..5dbc7fb 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java @@ -92,7 +92,12 @@ import com.lowagie.text.pdf.PdfReader; public abstract class PdfAS { - public static final String PDFAS_VERSION = "3.0.5-20080529"; + /** + * The current version of the pdf-as library. This version string is logged on every invocation + * of the api or the web application. + */ + public static final String PDFAS_VERSION = "3.0.5-20080603"; + /** * The key of the strict mode setting. */ diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/cfg/SettingsReader.java b/src/main/java/at/knowcenter/wag/egov/egiz/cfg/SettingsReader.java index 1fa3ad6..231da06 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/cfg/SettingsReader.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/cfg/SettingsReader.java @@ -33,12 +33,18 @@ import java.util.Properties; import java.util.Vector; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.text.StrSubstitutor; 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.exceptions.ConfigUtilsException; +import at.gv.egiz.pdfas.utils.ConfigUtils; +import at.gv.egiz.pdfas.web.helper.TempDirHelper; import at.knowcenter.wag.egov.egiz.PdfAS; import at.knowcenter.wag.egov.egiz.exceptions.SettingNotFoundException; import at.knowcenter.wag.egov.egiz.exceptions.SettingsException; +import at.knowcenter.wag.egov.egiz.pdf.Utils; /** * The SettingsReader reads the settings.txt file. The @@ -186,6 +192,11 @@ public class SettingsReader implements Serializable *

*/ public static String RESOURCES_PATH = null; + + /** + * The path for temporary files. + */ + public static String TMP_PATH = null; /** * The path of the configuration directory. @@ -197,11 +208,6 @@ public class SettingsReader implements Serializable */ public static String CERT_PATH = null; - /** - * The name of the directory, where temporary files are stored. - */ - protected static String TEMP_DIR_NAME = "pdfastmp"; - // /** // * The application config path for the command line tool // */ @@ -386,6 +392,14 @@ public class SettingsReader implements Serializable { if (instance_ == null) { + int length = Utils.max(new int[] { RESOURCES_PATH.length(), TMP_PATH.length(), CONFIG_PATH.length(), CERT_PATH.length() }); + + logger_.info(StringUtils.repeat("*", length + 25)); + logger_.info(" resources path = \"" + RESOURCES_PATH + "\""); + logger_.info(" configuration path = \"" + CONFIG_PATH + "\""); + logger_.info(" certstore path = \"" + CERT_PATH + "\""); + logger_.info(" temporary path = \"" + TMP_PATH + "\""); + logger_.info(StringUtils.repeat("*", length + 25)); instance_ = new SettingsReader(settingsFile); } return instance_; @@ -631,11 +645,11 @@ public class SettingsReader implements Serializable /** * Assembles the File of the temporary directory without checking if it really * exists. + * @see TempDirHelper#assembleTemporaryDirectoryFile() */ protected static File assembleTemporaryDirectoryFile() { - File temp_dir = new File(RESOURCES_PATH + TEMP_DIR_NAME); - return temp_dir; + return TempDirHelper.assembleTemporaryDirectoryFile(); } /** @@ -646,15 +660,11 @@ public class SettingsReader implements Serializable *

* * @return Returns the directory where temporary files should be stored. + * @see TempDirHelper#getTemporaryDirectory() */ public static File getTemporaryDirectory() { - File temp_dir = assembleTemporaryDirectoryFile(); - if (!temp_dir.exists()) - { - temp_dir.mkdirs(); - } - return temp_dir; + return TempDirHelper.getTemporaryDirectory(); } /** @@ -664,38 +674,109 @@ public class SettingsReader implements Serializable * This should be used to clear temporary files when the application shuts * down. *

+ * @see TempDirHelper#clearTemporaryDirectory() */ public static void clearTemporaryDirectory() { - File temp_dir = assembleTemporaryDirectoryFile(); - logger_.debug("Clearing temporary directory: " + temp_dir); - - if (!temp_dir.exists()) - { - return; - } - - File[] files = temp_dir.listFiles(); - for (int i = 0; i < files.length; i++) - { - // added by tknall: do not try to remove svn-metadata - if (files[i].getName().endsWith(".svn")) { - continue; - } - logger_.debug(" Clearing temporary file: " + files[i]); - boolean delete_success = files[i].delete(); - if (!delete_success) - { - logger_.error("Couldn't delete the temporary file: " + files[i]); + TempDirHelper.clearTemporaryDirectory(); + } + + private static String assertFileSeparator(String path) { + if (path == null) { + throw new NullPointerException("Path must not be null."); + } + if (path.endsWith(File.separator) || path.endsWith("/") || path.endsWith("\\")) { + return path; + } else { + return (path + File.separator); + } + } + + public static synchronized void initialize(String configdir, String tmpdir) { + + boolean defaultConfigDeployed = false; + // resolve work directory + // configuration explicitely given ? + if (configdir == null) { + + // configuration via system property ? + logger_.debug("No configuration directory given. Looking for system property \"" + Constants.CONFIG_SYSTEM_PROPERTY + "\"."); + configdir = System.getProperty(Constants.CONFIG_SYSTEM_PROPERTY); + if (configdir == null) { + + // configuration via user's home directory ? + logger_.debug("System property not set. Trying to locate configuration within the user's home directory."); + String userHome = System.getProperty("user.home"); + if (userHome == null || userHome.length() == 0) { + throw new RuntimeException("Unable to resolve user's home directory."); + } + configdir = assertFileSeparator(userHome) + Constants.USERHOME_CONFIG_FOLDER; + try { + defaultConfigDeployed = ConfigUtils.deployDefaultConfiguration(configdir, false); + } catch (ConfigUtilsException e) { + throw new RuntimeException(e); + } + if (defaultConfigDeployed) { + logger_.info("** Default configuration successfully deployed to the current user's home. **"); + } else { + logger_.debug("Default configuration NOT deployed because to the current user's home because it already exists."); + } + } else { + logger_.debug("Configuration set by system property."); + } + } else { + logger_.debug("Configuration path explicitely set."); + } + File configdirFile = new File(StrSubstitutor.replaceSystemProperties(configdir)); + try { + configdir = assertFileSeparator(configdirFile.getCanonicalPath()); + } catch (IOException e) { + configdir = assertFileSeparator(configdirFile.getPath()); } - } + if (!configdirFile.isDirectory()) + { + throw new IllegalArgumentException("The config directory \"" + configdir + "\" does not exist or is not a directory."); + } + + // resolve temporary dir + if (tmpdir == null) { + logger_.debug("Temporary directory not explicitely set. Looking for user's temp directory."); + tmpdir = System.getProperty("java.io.tmpdir"); + if (tmpdir == null) { + logger_.debug("Unable to resolve user's temporary directory. Assuming temporary directory located within config dir."); + tmpdir = configdir; + } + } else { + logger_.debug("Temporary directory explicitely set."); + } + File tmpdirFile = new File(StrSubstitutor.replaceSystemProperties(assertFileSeparator(tmpdir) + Constants.TEMP_DIR_NAME)); + try { + tmpdir = assertFileSeparator(tmpdirFile.getCanonicalPath()); + } catch (IOException e) { + tmpdir = assertFileSeparator(tmpdirFile.getPath()); + } + + RESOURCES_PATH = configdir; + TMP_PATH = tmpdir; + CONFIG_PATH = RESOURCES_PATH + CFG + FILE_SEP; + CERT_PATH = RESOURCES_PATH + CERT + FILE_SEP; + + int length = Utils.max(new int[] { RESOURCES_PATH.length(), TMP_PATH.length(), CONFIG_PATH.length(), CERT_PATH.length() }); + + logger_.debug(StringUtils.repeat("*", length + 25)); + logger_.debug(" resources path = \"" + RESOURCES_PATH + "\""); + logger_.debug(" configuration path = \"" + CONFIG_PATH + "\""); + logger_.debug(" certstore path = \"" + CERT_PATH + "\""); + logger_.debug(" temporary path = \"" + TMP_PATH + "\""); + if (defaultConfigDeployed) { + logger_.debug(" default configuration was deployed to the current user's home directory "); + } + logger_.debug(StringUtils.repeat("*", length + 25)); } public static void initialize(String base_dir) { - RESOURCES_PATH = base_dir + FILE_SEP; //CATALINA_HOME + FILE_SEP + WEB_APPL_DIR; - CONFIG_PATH = RESOURCES_PATH + CFG + FILE_SEP; - CERT_PATH = RESOURCES_PATH + CERT + FILE_SEP; + initialize(base_dir, null); } /** @@ -707,10 +788,7 @@ public class SettingsReader implements Serializable */ public static void initializeForWeb(String base_dir) { - initialize(base_dir); -// RESOURCES_PATH = base_dir + FILE_SEP; //CATALINA_HOME + FILE_SEP + WEB_APPL_DIR; -// CONFIG_PATH = RESOURCES_PATH + CFG + FILE_SEP; -// CERT_PATH = RESOURCES_PATH + CERT + FILE_SEP; + initialize(base_dir, base_dir); } /** @@ -718,10 +796,7 @@ public class SettingsReader implements Serializable */ public static void initializeForCommandLine() { - initialize(USER_DIR); -// RESOURCES_PATH = USER_DIR + FILE_SEP; -// CONFIG_PATH = RESOURCES_PATH + CFG + FILE_SEP; -// CERT_PATH = RESOURCES_PATH + CERT + FILE_SEP; + initialize(null); } static { diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFSignatureObjectIText.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFSignatureObjectIText.java index c03db24..ad3a24c 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFSignatureObjectIText.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFSignatureObjectIText.java @@ -309,6 +309,9 @@ public class PDFSignatureObjectIText implements PDFSignatureObject throw new PDFDocumentException(220, "Image file \"" + img_file.getCanonicalPath() + "\" doesn't exist."); } Image image = Image.getInstance(img_file.getCanonicalPath()); + logger_.debug("Using image file \"" + img_file.getCanonicalPath() + "\"."); + + // TODO[tknall]: enable image scaling defined by configuration image.scaleToFit(80.0f, 80.0f); // tknall end boolean fit = true; diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/Utils.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/Utils.java index c075d45..39d353b 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/Utils.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/Utils.java @@ -17,6 +17,7 @@ */ package at.knowcenter.wag.egov.egiz.pdf; +import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; @@ -92,5 +93,24 @@ public abstract class Utils return signature_text; } - + + public static int max(int[] ints) { + int max = Integer.MIN_VALUE; + for (int i = 0; i < ints.length; i++) { + if (ints[i] > max) { + max = ints[i]; + } + } + return max; + } + + public static String resolveCanonical(String path) { + File file = new File(path); + try { + return file.getCanonicalPath(); + } catch (IOException e) { + return file.getPath(); + } + } + } diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/DetachedBKUConnector.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/DetachedBKUConnector.java index f1896d7..5dbc0a6 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/DetachedBKUConnector.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/DetachedBKUConnector.java @@ -3,7 +3,6 @@ */ package at.knowcenter.wag.egov.egiz.sig.connectors.bku; -import java.io.File; import java.security.cert.X509Certificate; import java.util.Properties; @@ -73,7 +72,7 @@ public class DetachedBKUConnector implements Connector, LocalConnector this.params = connectorParameters; this.environment = new Environment(this.params.getProfileId(), loc_ref_content); } - + /** * Prepares the sign request xml to be sent using the sign request template. * @@ -92,6 +91,7 @@ public class DetachedBKUConnector implements Connector, LocalConnector String sign_keybox_identifier = this.environment.getSignKeyboxIdentifier(); String mime_type = data.getMimeType(); String loc_ref_content = this.environment.getLocRefContent(); + if (log.isDebugEnabled()) { log.debug("sign keybox identifier = " + sign_keybox_identifier); //$NON-NLS-1$ @@ -103,6 +103,7 @@ public class DetachedBKUConnector implements Connector, LocalConnector sign_request_xml = sign_request_xml.replaceFirst(TemplateReplaces.MIME_TYPE_REPLACE, mime_type); sign_request_xml = sign_request_xml.replaceFirst(TemplateReplaces.LOC_REF_CONTENT_REPLACE, loc_ref_content); + log.debug("sign_request_xml = " + sign_request_xml); log.debug("prepareSignRequestDetached finished."); //$NON-NLS-1$ return sign_request_xml; } diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/tools/FileHelper.java b/src/main/java/at/knowcenter/wag/egov/egiz/tools/FileHelper.java index 53ac7cf..50b7bad 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/tools/FileHelper.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/tools/FileHelper.java @@ -21,6 +21,7 @@ package at.knowcenter.wag.egov.egiz.tools; import java.io.BufferedReader; import java.io.BufferedWriter; +import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.FileReader; diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/LocalRequestHelper.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/LocalRequestHelper.java index 8ee09dc..2f02944 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/web/LocalRequestHelper.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/LocalRequestHelper.java @@ -84,7 +84,7 @@ public abstract class LocalRequestHelper public static String processLocalSign(SignSessionInformation si, HttpServletRequest request, HttpServletResponse response) throws IOException, PresentableException { String host = request.getServerName(); // "129.27.153.77" - URL loc_ref_URL = new URL(request.getScheme(), host, request.getServerPort(), request.getContextPath() + "/RetrieveSignatureData"); + URL loc_ref_URL = new URL(getLocalContextAddress(request, response) + "/RetrieveSignatureData"); String loc_ref_url = response.encodeURL(loc_ref_URL.toString()); LocalConnector c = ConnectorChooser.chooseLocalConnectorForSign(si.connector, si.type, loc_ref_url); @@ -175,7 +175,7 @@ public abstract class LocalRequestHelper // si.finished = false; String host = request.getServerName(); - URL loc_ref_URL = new URL(request.getScheme(), host, request.getServerPort(), request.getContextPath() + "/RetrieveSignatureData"); + URL loc_ref_URL = new URL(getLocalContextAddress(request, response) + "/RetrieveSignatureData"); String loc_ref_url = response.encodeURL(loc_ref_URL.toString()); for (int i = 0; i < si.currentLocalOperation.requests.length; i++) @@ -414,7 +414,15 @@ public abstract class LocalRequestHelper URL local_server = null; try { - local_server = new URL(request.getScheme(), host, request.getServerPort(), "/"); + 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) { @@ -424,6 +432,15 @@ public abstract class LocalRequestHelper 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. diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/PdfASServletContextListener.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/PdfASServletContextListener.java index adb31be..e33a5ec 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/web/PdfASServletContextListener.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/PdfASServletContextListener.java @@ -17,15 +17,13 @@ */ package at.knowcenter.wag.egov.egiz.web; -import java.io.File; -import java.io.IOException; - import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; +import at.gv.egiz.pdfas.api.commons.Constants; import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger; import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; @@ -44,6 +42,14 @@ public class PdfASServletContextListener implements ServletContextListener * The logger. */ private static final Logger logger = ConfigLogger.getLogger(PdfASServletContextListener.class); + + + /** + * The servlet init parameter that may be used to declare the pdf-as configuration folder. The + * init parameter may be set in web.xml or in META-INF/context.xml resp. + * conf/Catalina/localhost/pdf-as.xml if deployed. + */ + private final static String CONFIG_SERVLET_INIT_PARAMETER = "work-dir"; /** * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent) @@ -52,19 +58,28 @@ public class PdfASServletContextListener implements ServletContextListener { logger.info("PDF-AS Context init"); //$NON-NLS-1$ - String sysPropWorkdir = System.getProperty("pdf-as.work-dir"); + String sysPropWorkdir = System.getProperty(Constants.CONFIG_SYSTEM_PROPERTY); + String scWorkdir = sce.getServletContext().getInitParameter(CONFIG_SERVLET_INIT_PARAMETER); + String work_dir; + + // search for system property if (sysPropWorkdir != null && sysPropWorkdir.length() > 0) { work_dir = sysPropWorkdir; - logger.info("Work-dir configuration via system property."); - logger.info("PDF-AS work-dir via system property = " + work_dir); //$NON-NLS-1$ + logger.debug("Work-dir configuration via system property \"" + Constants.CONFIG_SYSTEM_PROPERTY + "\" = \"" + sysPropWorkdir + "\"."); + + // search for servlet parameter + } else if (scWorkdir != null && scWorkdir.length() > 0){ + work_dir = scWorkdir; + logger.debug("Work-dir configuration via servlet init parameter \"" + CONFIG_SERVLET_INIT_PARAMETER + "\" = \"" + scWorkdir + "\"."); + + // assume configuration to be located in webapp path } else { - work_dir = sce.getServletContext().getInitParameter("work-dir"); //$NON-NLS-1$ - logger.info("PDF-AS work-dir context parameter = " + work_dir); //$NON-NLS-1$ + work_dir = sce.getServletContext().getRealPath("/"); + logger.debug("PDF-AS work-dir not explicitely given. Assuming configuration is located in webapp folder \"" + work_dir + "\"."); } - String base_dir = sce.getServletContext().getRealPath("/"); //$NON-NLS-1$ - logger.info("PDF-AS real path = " + base_dir); //$NON-NLS-1$ + logger.info("PDF-AS configuration location = \"" + work_dir + "\""); // try // { @@ -76,13 +91,8 @@ public class PdfASServletContextListener implements ServletContextListener // e.printStackTrace(); // } - if (work_dir != null && work_dir.length() > 0) - { - base_dir = work_dir; - } - logger.info("The PDF-AS application will be initialized for the directory: " + base_dir); - SettingsReader.initializeForWeb(base_dir); + SettingsReader.initializeForWeb(work_dir); PropertyConfigurator.configure(SettingsReader.CONFIG_PATH + "log4j.properties"); SettingsReader.clearTemporaryDirectory(); diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/DataURLServlet.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/DataURLServlet.java index 3c2ba28..cbb33ba 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/DataURLServlet.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/DataURLServlet.java @@ -4,6 +4,7 @@ package at.knowcenter.wag.egov.egiz.web.servlets; import java.io.IOException; +import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.URL; import java.util.ArrayList; @@ -41,6 +42,7 @@ import at.knowcenter.wag.egov.egiz.sig.connectors.LocalConnector; import at.knowcenter.wag.egov.egiz.sig.connectors.bku.BKUPostConnection; import at.knowcenter.wag.egov.egiz.web.FormFields; import at.knowcenter.wag.egov.egiz.web.LocalRequest; +import at.knowcenter.wag.egov.egiz.web.LocalRequestHelper; import at.knowcenter.wag.egov.egiz.web.SessionAttributes; /** @@ -84,7 +86,26 @@ public class DataURLServlet extends HttpServlet dispatch(request, response, "/jsp/results.jsp"); } - /** + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + this.doPost(req, resp); + } + + private static void temporaryRedirect(String redirectURL, HttpServletResponse response) throws IOException { + String encodedRedirect = response.encodeRedirectURL(redirectURL); + response.addHeader("Location", encodedRedirect); + response.setContentType("text/xml"); + response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT); + String nop = ""; + PrintWriter pw = response.getWriter(); + response.setCharacterEncoding("UTF-8"); + response.setContentLength(nop.getBytes("UTF-8").length); + log.debug("Redirecting via NullOperationRequest to " + encodedRedirect + "."); + pw.println(nop); + pw.flush(); + pw.close(); + } + +/** * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse) */ @@ -148,7 +169,7 @@ public class DataURLServlet extends HttpServlet if (isNullResponse(xml_response)) { log.debug("Received a NullOperationResponse -> answering with the first request."); //$NON-NLS-1$ - + assert si.outputAvailable == false; assert si.response_properties == null; @@ -158,6 +179,7 @@ public class DataURLServlet extends HttpServlet String request_string = local_request.getRequestString(); + log.debug("request = " + request_string); response.setContentType("text/xml"); response.setCharacterEncoding("UTF-8"); response.getWriter().println(request_string); @@ -208,10 +230,16 @@ public class DataURLServlet extends HttpServlet HttpSession session = request.getSession(true); log.debug("Putting signed document into session (" + session.getId() + ")."); session.setAttribute(SessionAttributes.SIGNED_PDF_DOCUMENT, si); - session.setAttribute(SessionAttributes.DOWNLOAD_URL_FOR_SIGNED_PDF_DOCUMENT, response.encodeRedirectURL("/pdf-as/ProvidePDF")); - String redirectURL = response.encodeRedirectURL("/pdf-as/jsp/download.jsp"); - log.debug("Redirecting to " + redirectURL + "."); - response.sendRedirect(redirectURL); +// String serverURL = LocalRequestHelper.getLocalServerAddress(request, response); + String downloadURL = response.encodeRedirectURL(LocalRequestHelper.getLocalContextAddress(request, response) + "/ProvidePDF"); + log.debug("Creating download URL \"" + downloadURL + "\"."); + session.setAttribute(SessionAttributes.DOWNLOAD_URL_FOR_SIGNED_PDF_DOCUMENT, downloadURL); + +// String redirectURL = response.encodeRedirectURL("/pdf-as/jsp/download.jsp"); +// log.debug("Redirecting to " + redirectURL + "."); +// response.sendRedirect(redirectURL); + temporaryRedirect(LocalRequestHelper.getLocalContextAddress(request, response) + "/jsp/download.jsp", response); + return; // SignServletHelper.returnSignResponse(si, response); } @@ -275,7 +303,7 @@ public class DataURLServlet extends HttpServlet si.currentLocalOperation = null; - URL btlURL = new URL(request.getScheme(), request.getServerName(), request.getServerPort(), request.getContextPath() + "/jsp/verifylist.jsp"); + URL btlURL = new URL(LocalRequestHelper.getLocalContextAddress(request, response) + "/jsp/verifylist.jsp"); String backToListURL = response.encodeURL(btlURL.toString()); dispatchToResults(results, request, response, backToListURL); diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/ProvidePDFServlet.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/ProvidePDFServlet.java index 6d486a5..03bd074 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/ProvidePDFServlet.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/ProvidePDFServlet.java @@ -56,9 +56,11 @@ public class ProvidePDFServlet extends HttpServlet { disp.forward(request, response); return; } else { - log.debug("Signed pdf found. Removing from session."); + log.debug("Signed pdf found."); session.removeAttribute(SessionAttributes.SIGNED_PDF_DOCUMENT); log.debug("Returning signed pdf to browser."); + log.debug("Invalidating session."); + session.invalidate(); SignServletHelper.returnSignResponse(si, response); return; } diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/RetrieveSignatureDataServlet.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/RetrieveSignatureDataServlet.java index 6653a60..61996da 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/RetrieveSignatureDataServlet.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/RetrieveSignatureDataServlet.java @@ -12,22 +12,17 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import at.gv.egiz.pdfas.impl.input.TextDataSourceImpl; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import at.gv.egiz.pdfas.exceptions.web.SessionExpiredException; -import at.gv.egiz.pdfas.framework.input.DataSource; +import at.gv.egiz.pdfas.utils.StreamUtils; import at.gv.egiz.pdfas.web.SignSessionInformation; import at.gv.egiz.pdfas.web.VerifySessionInformation; import at.gv.egiz.pdfas.web.helper.SessionHelper; -import at.gv.egiz.pdfas.utils.StreamUtils; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import at.knowcenter.wag.egov.egiz.PdfAS; -import at.knowcenter.wag.egov.egiz.pdf.BinarySignatureHolder; import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder; import at.knowcenter.wag.egov.egiz.sig.SignatureData; -import at.knowcenter.wag.egov.egiz.sig.SignatureDataImpl; /** * Retrieves the Signature Data from the session and returns it. @@ -63,13 +58,16 @@ public class RetrieveSignatureDataServlet extends HttpServlet disp.forward(request, response); } - /** +/** * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - log.debug("Request for receiving signature data."); //$NON-NLS-1$ + if (log.isDebugEnabled()) { + log.debug("Request for receiving signature data."); //$NON-NLS-1$ + log.debug("Requested session id is = " + request.getRequestedSessionId()); + } try { @@ -141,6 +139,8 @@ public class RetrieveSignatureDataServlet extends HttpServlet response.setContentType(sd.getMimeType()); response.setCharacterEncoding(sd.getCharacterEncoding()); + // [tknall] content length must be set, otherwise ITS BKU for Mac rejects the request. + response.setContentLength(sd.getDataSource().getLength()); StreamUtils.writeInputStreamToOutputStream(sd.getDataSource().createInputStream(), response.getOutputStream()); // response.getOutputStream().write(sd.getData()); diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignServlet.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignServlet.java index e2de8ae..a608b74 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignServlet.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignServlet.java @@ -299,7 +299,8 @@ public class SignServlet extends HttpServlet // for performance measurement if (log.isInfoEnabled()) { long endTime = System.currentTimeMillis(); - String toReport = "SIGN;" + si.mode + ";" + si.filename + ";"+ fileSize + ";" + +// String toReport = "SIGN;" + si.mode + ";" + si.filename + ";"+ fileSize + ";" + + String toReport = "SIGN;" + si.mode + ";XXX;"+ fileSize + ";" + (endTime - startTime); log.info(toReport); diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/VerifyPreviewServlet.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/VerifyPreviewServlet.java index 571a8e1..9a91567 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/VerifyPreviewServlet.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/VerifyPreviewServlet.java @@ -101,7 +101,7 @@ public class VerifyPreviewServlet extends HttpServlet protected String formBackToListURL(HttpServletRequest request, HttpServletResponse response) throws MalformedURLException { - URL btlURL = new URL(request.getScheme(), request.getServerName(), request.getServerPort(), request.getContextPath() + "/jsp/verifylist.jsp"); + URL btlURL = new URL(LocalRequestHelper.getLocalContextAddress(request, response) + "/jsp/verifylist.jsp"); String backToListURL = response.encodeURL(btlURL.toString()); return backToListURL; @@ -566,7 +566,7 @@ public class VerifyPreviewServlet extends HttpServlet } String host = request.getServerName(); - URL loc_ref_URL = new URL(request.getScheme(), host, request.getServerPort(), request.getContextPath() + "/RetrieveSignatureData"); + URL loc_ref_URL = new URL(LocalRequestHelper.getLocalContextAddress(request, response) + "/RetrieveSignatureData"); String loc_ref_url = response.encodeURL(loc_ref_URL.toString()); List results = PdfAS.verifySignatureHoldersWeb(holders_to_verify, si, loc_ref_url); @@ -575,7 +575,7 @@ public class VerifyPreviewServlet extends HttpServlet { backbutton = false; } - URL btlURL = new URL(request.getScheme(), request.getServerName(), request.getServerPort(), request.getContextPath() + "/jsp/verifylist.jsp"); + URL btlURL = new URL(LocalRequestHelper.getLocalContextAddress(request, response) + "/jsp/verifylist.jsp"); String backToListURL = response.encodeURL(btlURL.toString()); dispatchToResults(results, request, response, backbutton, backToListURL); @@ -685,12 +685,12 @@ public class VerifyPreviewServlet extends HttpServlet } String host = request.getServerName(); - URL loc_ref_URL = new URL(request.getScheme(), host, request.getServerPort(), request.getContextPath() + "/RetrieveSignatureData"); + URL loc_ref_URL = new URL(LocalRequestHelper.getLocalContextAddress(request, response) + "/RetrieveSignatureData"); String loc_ref_url = response.encodeURL(loc_ref_URL.toString()); List results = PdfAS.verifySignatureHoldersWeb(holders_to_verify, si, loc_ref_url); - URL btlURL = new URL(request.getScheme(), request.getServerName(), request.getServerPort(), request.getContextPath() + "/jsp/verifylist.jsp"); + URL btlURL = new URL(LocalRequestHelper.getLocalContextAddress(request, response) + "/jsp/verifylist.jsp"); String backToListURL = response.encodeURL(btlURL.toString()); dispatchToResults(results, request, response, true, backToListURL); } diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/VerifyServlet.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/VerifyServlet.java index c9ed314..97a1e6f 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/VerifyServlet.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/VerifyServlet.java @@ -151,7 +151,7 @@ public class VerifyServlet extends HttpServlet String host = request.getServerName(); // TODO still required for old communication with MOA-SS/SP - URL loc_ref_URL = new URL(request.getScheme(), host, request.getServerPort(), request.getContextPath() + "/RetrieveSignatureData"); + URL loc_ref_URL = new URL(LocalRequestHelper.getLocalContextAddress(request, response) + "/RetrieveSignatureData"); String loc_ref_url = response.encodeURL(loc_ref_URL.toString()); List results = PdfAS.verifySignatureHoldersWeb(signature_holders, si, loc_ref_url); -- cgit v1.2.3