From 527484bcc0a65c61d50209849f7b3db34f0128f7 Mon Sep 17 00:00:00 2001 From: knowcenter Date: Thu, 17 May 2007 15:28:32 +0000 Subject: web git-svn-id: https://joinup.ec.europa.eu/svn/pdf-as/trunk@87 7b5415b0-85f9-ee4d-85bd-d5d0c3b42d1c --- .../java/at/knowcenter/wag/egov/egiz/PdfAS.java | 5 +- .../knowcenter/wag/egov/egiz/commandline/Main.java | 4 +- .../egov/egiz/sig/connectors/LocalConnector.java | 66 ++ .../egov/egiz/sig/connectors/bku/BKUHelper.java | 33 +- .../sig/connectors/bku/DetachedBKUConnector.java | 679 ++++++++++++++++++++ .../bku/DetachedMultipartBKUConnector.java | 661 ------------------- .../bku/EnvelopedBase64BKUConnector.java | 25 +- .../connectors/bku/LocRefDetachedBKUConnector.java | 25 + .../bku/MultipartDetachedBKUConnector.java | 21 + .../connectors/moa/DetachedLocRefMOAConnector.java | 178 ++++-- .../moa/EnvelopingBase64MOAConnector.java | 166 +---- .../egov/egiz/sig/connectors/moa/MOAHelper.java | 190 ++++++ .../sig/sigid/DetachedLocRefMOAIdFormatter.java | 25 + .../wag/egov/egiz/sig/sigid/OldMOAIdFormatter.java | 21 + .../wag/egov/egiz/tools/DebugHelper.java | 70 ++ .../egiz/web/AsynchronousRedirectResponder.java | 7 +- .../knowcenter/wag/egov/egiz/web/FormFields.java | 2 +- .../wag/egov/egiz/web/LocalRequestHelper.java | 191 ++++-- .../egov/egiz/web/PdfASServletContextListener.java | 4 +- .../java/at/knowcenter/wag/egov/egiz/web/Sign.java | 544 ---------------- .../knowcenter/wag/egov/egiz/web/SignPreview.java | 105 --- .../at/knowcenter/wag/egov/egiz/web/Verify.java | 285 --------- .../wag/egov/egiz/web/VerifyPreview.java | 704 -------------------- .../wag/egov/egiz/web/servlets/DataURLServlet.java | 199 ++++++ .../web/servlets/RetrieveSignatureDataServlet.java | 100 +++ .../egov/egiz/web/servlets/SignPreviewServlet.java | 94 +++ .../wag/egov/egiz/web/servlets/SignServlet.java | 576 +++++++++++++++++ .../egiz/web/servlets/VerifyPreviewServlet.java | 708 +++++++++++++++++++++ .../wag/egov/egiz/web/servlets/VerifyServlet.java | 334 ++++++++++ 29 files changed, 3439 insertions(+), 2583 deletions(-) create mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/LocalConnector.java create mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/DetachedBKUConnector.java delete mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/DetachedMultipartBKUConnector.java create mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/LocRefDetachedBKUConnector.java create mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/MultipartDetachedBKUConnector.java create mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/MOAHelper.java create mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/sig/sigid/DetachedLocRefMOAIdFormatter.java create mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/sig/sigid/OldMOAIdFormatter.java create mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/tools/DebugHelper.java delete mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/web/Sign.java delete mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/web/SignPreview.java delete mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/web/Verify.java delete mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/web/VerifyPreview.java create mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/DataURLServlet.java create mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/RetrieveSignatureDataServlet.java create mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignPreviewServlet.java create mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignServlet.java create mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/VerifyPreviewServlet.java create mode 100644 src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/VerifyServlet.java (limited to 'src') 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 4f31d14..9359c96 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java @@ -60,8 +60,9 @@ import at.knowcenter.wag.egov.egiz.sig.SignatureResponse; import at.knowcenter.wag.egov.egiz.sig.SignatureTypeDefinition; import at.knowcenter.wag.egov.egiz.sig.SignatureTypes; import at.knowcenter.wag.egov.egiz.sig.connectors.Connector; -import at.knowcenter.wag.egov.egiz.sig.connectors.bku.DetachedMultipartBKUConnector; +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.DetachedBKUConnector; import at.knowcenter.wag.egov.egiz.sig.connectors.bku.EnvelopedBase64BKUConnector; +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.MultipartDetachedBKUConnector; import at.knowcenter.wag.egov.egiz.sig.connectors.bku.SignSignatureObject; import at.knowcenter.wag.egov.egiz.sig.connectors.moa.EnvelopingBase64MOAConnector; import at.knowcenter.wag.egov.egiz.tools.CodingHelper; @@ -1407,7 +1408,7 @@ public abstract class PdfAS { log.debug("sig_app is BKU ==> DetachedMultipartBKUConnector"); //$NON-NLS-1$ - return new DetachedMultipartBKUConnector(profile); + return new MultipartDetachedBKUConnector(profile); } if (sig_app.equals(MOA)) { diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/commandline/Main.java b/src/main/java/at/knowcenter/wag/egov/egiz/commandline/Main.java index e1284ce..614005e 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/commandline/Main.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/commandline/Main.java @@ -52,7 +52,7 @@ import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory; import at.knowcenter.wag.egov.egiz.sig.ConnectorInformation; import at.knowcenter.wag.egov.egiz.sig.SignatureResponse; import at.knowcenter.wag.egov.egiz.sig.SignatureTypes; -import at.knowcenter.wag.egov.egiz.web.Verify; +import at.knowcenter.wag.egov.egiz.web.servlets.VerifyServlet; /** * The main program entry point of the commandline tool. @@ -498,7 +498,7 @@ public abstract class Main List signature_holders = null; - String extension = Verify.extractExtension(input); + String extension = VerifyServlet.extractExtension(input); if (extension != null && extension.equals("txt")) { try diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/LocalConnector.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/LocalConnector.java new file mode 100644 index 0000000..05f8149 --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/LocalConnector.java @@ -0,0 +1,66 @@ +/** + * + */ +package at.knowcenter.wag.egov.egiz.sig.connectors; + +import java.util.Properties; + +import at.knowcenter.wag.egov.egiz.exceptions.ConnectorException; +import at.knowcenter.wag.egov.egiz.sig.SignatureData; +import at.knowcenter.wag.egov.egiz.sig.SignatureResponse; +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.SignSignatureObject; + +/** + * @author wprinz + */ +public interface LocalConnector +{ + /** + * Prepares the sign request xml to be sent using the sign request template. + * + * @param data + * The SignatureData. + * @return Returns the sign request xml to be sent. + * @throws ConnectorException + * f.e. + */ + public String prepareSignRequest(SignatureData data) throws ConnectorException; + + /** + * Analyzes the sign response xml and extracts the signature data. + * + * @param response_properties + * The response properties containing the response String and + * transport related information. + * @return Returns the extracted data encapsulated in a SignatureObject. + * @throws ConnectorException + * f.e. + */ + public SignSignatureObject analyzeSignResponse(Properties response_properties) throws ConnectorException; + + /** + * Prepares the verify request xml to be sent using the verify request + * template. + * + * @param data + * The SignatureData. + * @param so + * The signature information object. + * @return Returns the verify request xml to be sent. + * @throws ConnectorException + * f.e. + */ + public String prepareVerifyRequest(SignatureData data, SignSignatureObject so) throws ConnectorException; + + /** + * Analyzes the verify response string. + * + * @param response_properties + * The response properties containing the response XML. + * @return Returns the SignatureResponse containing the verification result. + * @throws ConnectorException + * f.e. + */ + public SignatureResponse analyzeVerifyResponse(Properties response_properties) throws ConnectorException; + +} diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/BKUHelper.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/BKUHelper.java index 78165c2..c05c688 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/BKUHelper.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/BKUHelper.java @@ -50,10 +50,41 @@ public final class BKUHelper String base64 = CodingHelper.encodeBase64(data.getData()); if (data.getMimeType().equals("application/pdf")) //$NON-NLS-1$ { - log.debug("The data is application/pdf - so it is Base64 encoded again."); //$NON-NLS-1$ + log.debug("The data is application/pdf - so the binary data is Base64 encoded."); //$NON-NLS-1$ base64 = CodingHelper.encodeUTF8AsBase64(base64); } return base64; + + } + + /** + * Prepares the enveloping data. + *

+ * This is useful for building the hash. + *

+ * + * @param data + * The data to be prepared. + * @return Returns the prepared data. + */ + public static byte[] prepareEnvelopingData(SignatureData data) + { + byte[] enc = data.getData(); + if (data.getMimeType().equals("application/pdf")) //$NON-NLS-1$ + { + log.debug("The data is application/pdf - so the binary data is Base64 encoded."); //$NON-NLS-1$ + String base64 = CodingHelper.encodeBase64(enc); + try + { + enc = base64.getBytes("US-ASCII"); //$NON-NLS-1$ + } + catch (UnsupportedEncodingException e) + { + e.printStackTrace(); + throw new RuntimeException("Very Strange: US-ASCII encoding not supported???", e); //$NON-NLS-1$ + } + } + return enc; } /** 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 new file mode 100644 index 0000000..44beb40 --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/DetachedBKUConnector.java @@ -0,0 +1,679 @@ +/** + * + */ +package at.knowcenter.wag.egov.egiz.sig.connectors.bku; + +import java.security.cert.X509Certificate; +import java.util.Properties; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; +import at.knowcenter.wag.egov.egiz.exceptions.ConnectorException; +import at.knowcenter.wag.egov.egiz.exceptions.SettingsException; +import at.knowcenter.wag.egov.egiz.sig.SignatureData; +import at.knowcenter.wag.egov.egiz.sig.SignatureObject; +import at.knowcenter.wag.egov.egiz.sig.SignatureResponse; +import at.knowcenter.wag.egov.egiz.sig.connectors.Connector; +import at.knowcenter.wag.egov.egiz.sig.connectors.LocalConnector; +import at.knowcenter.wag.egov.egiz.sig.connectors.TemplateReplaces; +import at.knowcenter.wag.egov.egiz.sig.sigid.DetachedIdFormatter; +import at.knowcenter.wag.egov.egiz.tools.CodingHelper; +import at.knowcenter.wag.egov.egiz.tools.FileHelper; + +/** + * Connects to the BKU using the detached multipart/formdata requests. + * + *

+ * This feature is available since BKU version 2.7.4. + *

+ * + * @author wprinz + */ +public class DetachedBKUConnector implements Connector, LocalConnector +{ + /** + * The log. + */ + private static Log log = LogFactory.getLog(DetachedBKUConnector.class); + + /** + * The environemnt configuration of this connector containing templates and + * other configurable elements. + */ + protected Environment environment = null; + + /** + * Constructor that builds the configuration environment for this connector + * according to the given profile. + * + *

+ * If confuguration parameters are not defined on that profile, the default + * parameters defined in the configuration are used. + *

+ * + * @param profile + * The profile from which the Environment should be assembled. + * @throws ConnectorException + * f.e. + */ + public DetachedBKUConnector(String profile, String loc_ref_content) throws ConnectorException + { + this.environment = new Environment(profile, loc_ref_content); + } + + /** + * Prepares the sign request xml to be sent using the sign request template. + * + * @param data + * The SignatureData. + * @return Returns the sign request xml to be sent. + * @throws ConnectorException + * f.e. + */ + public String prepareSignRequest(SignatureData data) throws ConnectorException + { + log.debug("prepareSignRequestDetached:"); //$NON-NLS-1$ + + String sign_request_template = this.environment.getSignRequestTemplate(); + + 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$ + log.debug("mime type = " + mime_type); //$NON-NLS-1$ + log.debug("loc_ref_content = " + loc_ref_content); //$NON-NLS-1$ + } + + String sign_request_xml = sign_request_template.replaceFirst(TemplateReplaces.KEYBOX_IDENTIFIER_REPLACE, sign_keybox_identifier); + 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("prepareSignRequestDetached finished."); //$NON-NLS-1$ + return sign_request_xml; + } + + /** + * Analyzes the sign response xml and extracts the signature data. + * + * @param response_properties + * The response properties containing the response String and + * transport related information. + * @return Returns the extracted data encapsulated in a SignatureObject. + * @throws ConnectorException + * f.e. + */ + public SignSignatureObject analyzeSignResponse(Properties response_properties) throws ConnectorException + { + log.debug("analyzeSignResponse:"); //$NON-NLS-1$ + + String response_string = response_properties.getProperty(BKUPostConnection.RESPONSE_STRING_KEY); + + BKUHelper.checkResponseForError(response_string); + + SignSignatureObject so = BKUHelper.parseCreateXMLResponse(response_string, new DetachedIdFormatter()); + + log.debug("analyzeSignResponse finished."); //$NON-NLS-1$ + return so; + } + + + + + + public static String[] parseSigIds(String sig_ids) + { + if (sig_ids == null || sig_ids.length() == 0) + { + return null; + } + + // int index = sig_ids.indexOf(PdfAS.IDS); + // if (index < 0) + // { + // return null; + // } + // sig_ids = sig_ids.substring(index + PdfAS.IDS.length()); + // + // if (sig_ids == null || sig_ids.length() == 0) + // { + // return null; + // } + + String[] ids_str = sig_ids.split("@"); + + String etsi_string = null; + if (ids_str.length == 3) + { + etsi_string = ids_str[0]; + String[] rest_ids = new String[] { ids_str[1], ids_str[2] }; + ids_str = rest_ids; + } + + String base = ids_str[0]; + String[] ids = ids_str[1].split("-"); + String[] real_ids = new String[6]; // the last one contains the etsi string + real_ids[0] = base + "-" + ids[0]; + real_ids[1] = "0-" + base + "-" + ids[1]; + real_ids[2] = "0-" + base + "-" + ids[2]; + real_ids[3] = "0-" + base + "-" + ids[3]; + real_ids[4] = "0-" + base + "-" + ids[4]; + real_ids[5] = etsi_string; + + if (log.isDebugEnabled()) + { + for (int id_idx = 0; id_idx < real_ids.length; id_idx++) + { + log.debug("real_ids[" + id_idx + "] = " + real_ids[id_idx]); + } + } + + return real_ids; + } + + /** + * Sends the request and data to the given URL. + * + *

+ * This method mainly handles communication exceptions. The actual send work + * is done by doPostRequestMultipart. + *

+ * + * @see BKUPostConnection#doPostRequestMultipart(String, String, + * SignatureData) + * + * @param url + * The URL to send the request to. + * @param request_string + * The request XML. + * @param data + * The data. + * @return Returns the response properties containing among others the + * response XML. + * @throws ConnectorException + * f.e. + */ + protected Properties sendRequest(String url, String request_string, + SignatureData data) throws ConnectorException + { + try + { + Properties response_properties = BKUPostConnection.doPostRequestMultipart(url, request_string, data); + return response_properties; + } + catch (Exception e) + { + ConnectorException se = new ConnectorException(320, e); + throw se; + } + } + + /** + * Performs a sign. + * + * @param data + * The data to be signed. + * @return Returns the signature object containing the signature data. + * @throws ConnectorException + * f.e. + */ + public SignSignatureObject doSign(SignatureData data) throws ConnectorException + { + log.debug("doSign:"); //$NON-NLS-1$ + + String sign_request_xml = prepareSignRequest(data); + log.debug("sign_request_xml = " + sign_request_xml); //$NON-NLS-1$ + + String url = this.environment.getSignURL(); + Properties response_properties = sendRequest(url, sign_request_xml, data); + + SignSignatureObject sso = analyzeSignResponse(response_properties); + + // TODO this could be made more generic + sso.response_properties = response_properties; + + log.debug("doSign finished."); //$NON-NLS-1$ + return sso; + } + + /** + * Performs a verification. + * + * @param data + * The data to be verified. + * @param so + * The signature object with the signature information. + * @return Returns the SignatureResponse with the result of the verification. + * @throws ConnectorException + * f.e. + */ + public SignatureResponse doVerify(SignatureData data, SignSignatureObject so) throws ConnectorException + { + log.debug("doVerify:"); //$NON-NLS-1$ + + String verify_request_xml = prepareVerifyRequest(data, so); + log.debug("verify_request_xml = " + verify_request_xml); //$NON-NLS-1$ + + // TODO debug + // try + // { + // FileOutputStream fos = new + // FileOutputStream("C:\\wprinz\\Filer\\egiz2\\verify_request.utf8.xml"); + // //$NON-NLS-1$ + // fos.write(verify_request_xml.getBytes("UTF-8")); //$NON-NLS-1$ + // fos.close(); + // } + // catch (Exception e) + // { + // log.error(e); + // } + + String url = this.environment.getVerifyURL(); + Properties response_properties = sendRequest(url, verify_request_xml, data); + + SignatureResponse signature_response = analyzeVerifyResponse(response_properties); + + log.debug("doVerify finished."); //$NON-NLS-1$ + return signature_response; + } + + /** + * Prepares the verify request xml to be sent using the verify request + * template. + * + * @param data + * The SignatureData. + * @param so + * The signature information object. + * @return Returns the verify request xml to be sent. + * @throws ConnectorException + * f.e. + */ + public String prepareVerifyRequest(SignatureData data, + SignSignatureObject so) throws ConnectorException + { + String verify_request_template = this.environment.getVerifyRequestTemplate(); + + String xml_content = null; + // TODO implement MOA + // if (sigObject.isMOASigned()) + // { + // MOAConnector moa_conn = new MOAConnector(); + // // get the MOA-template + // verify_template_str = moa_conn.getVerifyTemplate(normalizedText, + // sigObject); + // } + // else + // { + // get the BKU-template + xml_content = prepareXMLContent(data, so); + // } + + String verify_request_xml = verify_request_template.replaceFirst(TemplateReplaces.XML_CONTENT_REPLACE, xml_content); + verify_request_xml = verify_request_xml.replaceFirst(TemplateReplaces.LOC_REF_CONTENT_REPLACE, this.environment.getLocRefContent()); + + return verify_request_xml; + } + + /** + * Prepares the XML content the holds the actual signature data. + * + *

+ * This strongly rebuilds the XML content as retuned from a sign request. + *

+ * + * @param data + * The data. + * @param so + * The signature object containing the signature information. + * @return Returns the XML content. + * @throws ConnectorException + * f.e. + */ + public String prepareXMLContent(SignatureData data, SignSignatureObject so) throws ConnectorException + { + log.debug("prepareXMLContent:"); //$NON-NLS-1$ + try + { + + String verify_template = this.environment.getVerifyTemplate(); + + String ids_string = so.getSigID(); + String[] ids = SignatureObject.parseSigIds(ids_string); + + X509Certificate cert = so.getX509Certificate(); + String cert_alg = this.environment.getCertAlgEcdsa(); + if (cert.getPublicKey().getAlgorithm().indexOf("RSA") >= 0) //$NON-NLS-1$ + { + cert_alg = this.environment.getCertAlgRsa(); + } + + // cert alg replace + String verify_xml = verify_template.replaceFirst(TemplateReplaces.CERT_ALG_REPLACE, cert_alg); + + // data digest replace + { + byte[] data_value = data.getData(); + byte[] data_value_hash = CodingHelper.buildDigest(data_value); + String object_data_hash = CodingHelper.encodeBase64(data_value_hash); + + verify_xml = verify_xml.replaceFirst(TemplateReplaces.DIGEST_VALUE_SIGNED_DATA_REPLACE, object_data_hash); + } + + // SIG id replaces + verify_xml = verify_xml.replaceAll(TemplateReplaces.SIG_DATA_REF_REPLACE, ids[1]); + verify_xml = verify_xml.replaceAll(TemplateReplaces.ETSI_DATA_REF_REPLACE, ids[3]); + verify_xml = verify_xml.replaceAll(TemplateReplaces.SIG_DATA_OBJ_URI_REPLACE, ids[2]); + + verify_xml = verify_xml.replaceFirst(TemplateReplaces.SIGNATURE_VALUE_REPLACE, so.getSignatureValue()); + + // X.509 Certificate replace + byte[] der = cert.getEncoded(); + byte[] cert_hash = CodingHelper.buildDigest(der); + String certDigest = CodingHelper.encodeBase64(cert_hash); + String x509_cert_string = CodingHelper.encodeBase64(der); + verify_xml = verify_xml.replaceFirst(TemplateReplaces.X509_CERTIFICATE_REPLACE, x509_cert_string); + + // Qualified Properties replaces + verify_xml = verify_xml.replaceAll(TemplateReplaces.ETSI_DATA_OBJ_URI_REPLACE, ids[4]); + verify_xml = verify_xml.replaceAll(TemplateReplaces.SIG_ID_REPLACE, ids[0]); + verify_xml = verify_xml.replaceFirst(TemplateReplaces.SIGNING_TIME_REPLACE, so.getDate()); + verify_xml = verify_xml.replaceFirst(TemplateReplaces.DIGEST_VALUE_CERTIFICATE_REPLACE, certDigest); + verify_xml = verify_xml.replaceFirst(TemplateReplaces.X509_ISSUER_NAME_REPLACE, so.getIssuer()); + verify_xml = verify_xml.replaceFirst(TemplateReplaces.X509_SERIAL_NUMBER_REPLACE, so.getSerialNumber()); + // SigDataRefReplace already done above + verify_xml = verify_xml.replaceFirst(TemplateReplaces.MIME_TYPE_REPLACE, data.getMimeType()); + + // Signed Properties hash + { + final String ETSI_SIGNED_PROPERTIES_START_TAG = "= 0; + final int hash_end = verify_xml.indexOf(ETSI_SIGNED_PROPERTIES_END_TAG, hash_start) + ETSI_SIGNED_PROPERTIES_END_TAG.length(); + assert hash_end - ETSI_SIGNED_PROPERTIES_END_TAG.length() >= 0; + assert hash_end > hash_start; + + final String string_to_be_hashed = verify_xml.substring(hash_start, hash_end); + log.debug("etsi:SignedProperties string to be hashed: " + string_to_be_hashed); //$NON-NLS-1$ + + final byte[] bytes_to_be_hashed = string_to_be_hashed.getBytes("UTF-8"); //$NON-NLS-1$ + byte[] sig_prop_code = CodingHelper.buildDigest(bytes_to_be_hashed); + String sig_prop_hash = CodingHelper.encodeBase64(sig_prop_code); + + verify_xml = verify_xml.replaceFirst(TemplateReplaces.DIGEST_VALUE_SIGNED_PROPERTIES_REPLACE, sig_prop_hash); + } + + log.debug("prepareXMLContent finished."); //$NON-NLS-1$ + return verify_xml; + } + catch (Exception e) + { + log.debug(e); + throw new ConnectorException(310, e); + } + } + + /** + * Analyzes the verify response string. + * + * @param response_properties + * The response properties containing the response XML. + * @return Returns the SignatureResponse containing the verification result. + * @throws ConnectorException + * f.e. + */ + public SignatureResponse analyzeVerifyResponse(Properties response_properties) throws ConnectorException + { + log.debug("analyzeVerifyResponse:"); //$NON-NLS-1$ + + String response_string = response_properties.getProperty(BKUPostConnection.RESPONSE_STRING_KEY); + + BKUHelper.checkResponseForError(response_string); + + SignatureResponse signature_response = BKUHelper.parseVerifyXMLResponse(response_string); + + log.debug("analyzeVerifyResponse finished."); //$NON-NLS-1$ + return signature_response; + } + + + /** + * Holds environment configuration information like templates. + * + * @author wprinz + */ + public static class Environment + { + /** + * The configuration key of the sign keybox identifier. + */ + protected static final String SIGN_KEYBOX_IDENTIFIER_KEY = "bku.sign.KeyboxIdentifier"; //$NON-NLS-1$ + + /** + * The configuration key of the sign request template. + */ + protected static final String SIGN_REQUEST_TEMPLATE_KEY = "bku.sign.request.detached"; //$NON-NLS-1$ + + /** + * The configuration key of the sign URL. + */ + protected static final String SIGN_URL_KEY = "bku.sign.url"; //$NON-NLS-1$ + + /** + * The configuration key of the verify request template. + */ + protected static final String VERIFY_REQUEST_TEMPLATE_KEY = "bku.verify.request.detached"; //$NON-NLS-1$ + + /** + * The configuration key of the verify template. + */ + protected static final String VERIFY_TEMPLATE_KEY = "bku.verify.template.detached"; //$NON-NLS-1$ + + /** + * The configuration key of the verify URL. + */ + protected static final String VERIFY_URL_KEY = "bku.verify.url"; //$NON-NLS-1$ + + /** + * The configuration key for the ECDSA cert alg property. + */ + protected static final String ECDSA_CERT_ALG_KEY = "cert.alg.ecdsa"; //$NON-NLS-1$ + + /** + * The configuration key for the RSA cert alg property. + */ + protected static final String RSA_CERT_ALG_KEY = "cert.alg.rsa"; //$NON-NLS-1$ + + protected String loc_ref_content = null; + + protected String sign_keybox_identifier = null; + + protected String sign_request_template = null; + + protected String sign_url = null; + + protected String verify_request_template = null; + + protected String verify_template = null; + + protected String verify_url = null; + + protected String cert_alg_ecdsa = null; + + protected String cert_alg_rsa = null; + + /** + * Initializes the environment with a given profile. + * + * @param profile + * The configuration profile. + * @throws ConnectorException + * f.e. + */ + public Environment(String profile, String loc_ref_content) throws ConnectorException + { + this.loc_ref_content = loc_ref_content; + + SettingsReader settings = null; + try + { + settings = SettingsReader.getInstance(); + } + catch (SettingsException e) + { + throw new ConnectorException(300, e); + } + + this.sign_keybox_identifier = getConnectorValueFromProfile(settings, profile, SIGN_KEYBOX_IDENTIFIER_KEY); + + String sign_request_filename = getConnectorValueFromProfile(settings, profile, SIGN_REQUEST_TEMPLATE_KEY); + this.sign_request_template = FileHelper.readFromFile(SettingsReader.relocateFile(sign_request_filename)); + if (this.sign_request_template == null) + { + throw new ConnectorException(300, "Can not read the create xml request template"); //$NON-NLS-1$ + } + + this.sign_url = getConnectorValueFromProfile(settings, profile, SIGN_URL_KEY); + + String verify_request_filename = getConnectorValueFromProfile(settings, profile, VERIFY_REQUEST_TEMPLATE_KEY); + this.verify_request_template = FileHelper.readFromFile(SettingsReader.relocateFile(verify_request_filename)); + if (this.verify_request_template == null) + { + // TODO make this a settings exception + throw new ConnectorException(300, "Can not read the verify xml request template"); //$NON-NLS-1$ + } + + String verify_filename = getConnectorValueFromProfile(settings, profile, VERIFY_TEMPLATE_KEY); + this.verify_template = FileHelper.readFromFile(SettingsReader.relocateFile(verify_filename)); + if (this.verify_template == null) + { + // TODO make this a settings exception + throw new ConnectorException(300, "Can not read the verify template"); //$NON-NLS-1$ + } + + this.verify_url = getConnectorValueFromProfile(settings, profile, VERIFY_URL_KEY); + + this.cert_alg_ecdsa = settings.getValueFromKey(ECDSA_CERT_ALG_KEY); + + this.cert_alg_rsa = settings.getValueFromKey(RSA_CERT_ALG_KEY); + + } + + /** + * Returns the LocRef content. + * @return Returns the LocRef content. + */ + public String getLocRefContent() + { + return this.loc_ref_content; + } + + /** + * Returns the sign keybox identifier. + * + * @return Returns the sign keybox identifier. + */ + public String getSignKeyboxIdentifier() + { + return this.sign_keybox_identifier; + } + + /** + * Returns the sign request template. + * + * @return Returns the sign request template. + */ + public String getSignRequestTemplate() + { + return this.sign_request_template; + } + + /** + * Returns the sign URL. + * + * @return Returns the sign URL. + */ + public String getSignURL() + { + return this.sign_url; + } + + /** + * Returns the verify request template. + * + * @return Returns the verify request template. + */ + public String getVerifyRequestTemplate() + { + return this.verify_request_template; + } + + /** + * Returns the verify template. + * + * @return Returns the verify template. + */ + public String getVerifyTemplate() + { + return this.verify_template; + } + + /** + * Returns the verify URL. + * + * @return Returns the verify URL. + */ + public String getVerifyURL() + { + return this.verify_url; + } + + /** + * Returns the ecdsa cert alg property. + * + * @return Returns the ecdsa cert alg property. + */ + public String getCertAlgEcdsa() + { + return this.cert_alg_ecdsa; + } + + /** + * Returns the rsa cert alg property. + * + * @return Returns the rsa cert alg property. + */ + public String getCertAlgRsa() + { + return this.cert_alg_rsa; + } + + /** + * 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; + } + } +} diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/DetachedMultipartBKUConnector.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/DetachedMultipartBKUConnector.java deleted file mode 100644 index 68ff62e..0000000 --- a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/DetachedMultipartBKUConnector.java +++ /dev/null @@ -1,661 +0,0 @@ -/** - * - */ -package at.knowcenter.wag.egov.egiz.sig.connectors.bku; - -import java.security.cert.X509Certificate; -import java.util.Properties; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; -import at.knowcenter.wag.egov.egiz.exceptions.ConnectorException; -import at.knowcenter.wag.egov.egiz.exceptions.SettingsException; -import at.knowcenter.wag.egov.egiz.sig.SignatureData; -import at.knowcenter.wag.egov.egiz.sig.SignatureObject; -import at.knowcenter.wag.egov.egiz.sig.SignatureResponse; -import at.knowcenter.wag.egov.egiz.sig.connectors.Connector; -import at.knowcenter.wag.egov.egiz.sig.connectors.TemplateReplaces; -import at.knowcenter.wag.egov.egiz.sig.sigid.DetachedIdFormatter; -import at.knowcenter.wag.egov.egiz.tools.CodingHelper; -import at.knowcenter.wag.egov.egiz.tools.FileHelper; - -/** - * Connects to the BKU using the detached multipart/formdata requests. - * - *

- * This feature is available since BKU version 2.7.4. - *

- * - * @author wprinz - */ -public class DetachedMultipartBKUConnector implements Connector -{ - /** - * The log. - */ - private static Log log = LogFactory.getLog(DetachedMultipartBKUConnector.class); - - /** - * The environemnt configuration of this connector containing templates and - * other configurable elements. - */ - protected Environment environment = null; - - /** - * Constructor that builds the configuration environment for this connector - * according to the given profile. - * - *

- * If confuguration parameters are not defined on that profile, the default - * parameters defined in the configuration are used. - *

- * - * @param profile - * The profile from which the Environment should be assembled. - * @throws ConnectorException - * f.e. - */ - public DetachedMultipartBKUConnector(String profile) throws ConnectorException - { - this.environment = new Environment(profile); - } - - /** - * Prepares the sign request xml to be sent using the sign request template. - * - * @param data - * The SignatureData. - * @return Returns the sign request xml to be sent. - * @throws ConnectorException - * f.e. - */ - protected String prepareSignRequestDetached(SignatureData data) throws ConnectorException - { - log.debug("prepareSignRequestDetached:"); //$NON-NLS-1$ - - String sign_request_template = this.environment.getSignRequestTemplate(); - - String sign_keybox_identifier = this.environment.getSignKeyboxIdentifier(); - String mime_type = data.getMimeType(); - if (log.isDebugEnabled()) - { - log.debug("sign keybox identifier = " + sign_keybox_identifier); //$NON-NLS-1$ - log.debug("mime type = " + mime_type); //$NON-NLS-1$ - } - - String sign_request_xml = sign_request_template.replaceFirst(TemplateReplaces.KEYBOX_IDENTIFIER_REPLACE, sign_keybox_identifier); - sign_request_xml = sign_request_xml.replaceFirst(TemplateReplaces.MIME_TYPE_REPLACE, mime_type); - - log.debug("prepareSignRequestDetached finished."); //$NON-NLS-1$ - return sign_request_xml; - } - - /** - * Analyzes the sign response xml and extracts the signature data. - * - * @param response_properties - * The response properties containing the response String and - * transport related information. - * @return Returns the extracted data encapsulated in a SignatureObject. - * @throws ConnectorException - * f.e. - */ - public SignSignatureObject analyzeSignResponse(Properties response_properties) throws ConnectorException - { - log.debug("analyzeSignResponse:"); //$NON-NLS-1$ - - String response_string = response_properties.getProperty(BKUPostConnection.RESPONSE_STRING_KEY); - - BKUHelper.checkResponseForError(response_string); - - SignSignatureObject so = BKUHelper.parseCreateXMLResponse(response_string, new DetachedIdFormatter()); - - log.debug("analyzeSignResponse finished."); //$NON-NLS-1$ - return so; - } - - - - - - public static String[] parseSigIds(String sig_ids) - { - if (sig_ids == null || sig_ids.length() == 0) - { - return null; - } - - // int index = sig_ids.indexOf(PdfAS.IDS); - // if (index < 0) - // { - // return null; - // } - // sig_ids = sig_ids.substring(index + PdfAS.IDS.length()); - // - // if (sig_ids == null || sig_ids.length() == 0) - // { - // return null; - // } - - String[] ids_str = sig_ids.split("@"); - - String etsi_string = null; - if (ids_str.length == 3) - { - etsi_string = ids_str[0]; - String[] rest_ids = new String[] { ids_str[1], ids_str[2] }; - ids_str = rest_ids; - } - - String base = ids_str[0]; - String[] ids = ids_str[1].split("-"); - String[] real_ids = new String[6]; // the last one contains the etsi string - real_ids[0] = base + "-" + ids[0]; - real_ids[1] = "0-" + base + "-" + ids[1]; - real_ids[2] = "0-" + base + "-" + ids[2]; - real_ids[3] = "0-" + base + "-" + ids[3]; - real_ids[4] = "0-" + base + "-" + ids[4]; - real_ids[5] = etsi_string; - - if (log.isDebugEnabled()) - { - for (int id_idx = 0; id_idx < real_ids.length; id_idx++) - { - log.debug("real_ids[" + id_idx + "] = " + real_ids[id_idx]); - } - } - - return real_ids; - } - - /** - * Sends the request and data to the given URL. - * - *

- * This method mainly handles communication exceptions. The actual send work - * is done by doPostRequestMultipart. - *

- * - * @see BKUPostConnection#doPostRequestMultipart(String, String, - * SignatureData) - * - * @param url - * The URL to send the request to. - * @param request_string - * The request XML. - * @param data - * The data. - * @return Returns the response properties containing among others the - * response XML. - * @throws ConnectorException - * f.e. - */ - protected Properties sendRequest(String url, String request_string, - SignatureData data) throws ConnectorException - { - try - { - Properties response_properties = BKUPostConnection.doPostRequestMultipart(url, request_string, data); - return response_properties; - } - catch (Exception e) - { - ConnectorException se = new ConnectorException(320, e); - throw se; - } - } - - /** - * Performs a sign. - * - * @param data - * The data to be signed. - * @return Returns the signature object containing the signature data. - * @throws ConnectorException - * f.e. - */ - public SignSignatureObject doSign(SignatureData data) throws ConnectorException - { - log.debug("doSign:"); //$NON-NLS-1$ - - String sign_request_xml = prepareSignRequestDetached(data); - log.debug("sign_request_xml = " + sign_request_xml); //$NON-NLS-1$ - - String url = this.environment.getSignURL(); - Properties response_properties = sendRequest(url, sign_request_xml, data); - - SignSignatureObject sso = analyzeSignResponse(response_properties); - - // TODO this could be made more generic - sso.response_properties = response_properties; - - log.debug("doSign finished."); //$NON-NLS-1$ - return sso; - } - - /** - * Performs a verification. - * - * @param data - * The data to be verified. - * @param so - * The signature object with the signature information. - * @return Returns the SignatureResponse with the result of the verification. - * @throws ConnectorException - * f.e. - */ - public SignatureResponse doVerify(SignatureData data, SignSignatureObject so) throws ConnectorException - { - log.debug("doVerify:"); //$NON-NLS-1$ - - String verify_request_xml = prepareVerifyRequestDetached(data, so); - log.debug("verify_request_xml = " + verify_request_xml); //$NON-NLS-1$ - - // TODO debug - // try - // { - // FileOutputStream fos = new - // FileOutputStream("C:\\wprinz\\Filer\\egiz2\\verify_request.utf8.xml"); - // //$NON-NLS-1$ - // fos.write(verify_request_xml.getBytes("UTF-8")); //$NON-NLS-1$ - // fos.close(); - // } - // catch (Exception e) - // { - // log.error(e); - // } - - String url = this.environment.getVerifyURL(); - Properties response_properties = sendRequest(url, verify_request_xml, data); - - SignatureResponse signature_response = analyzeVerifyResponse(response_properties); - - log.debug("doVerify finished."); //$NON-NLS-1$ - return signature_response; - } - - /** - * Prepares the verify request xml to be sent using the verify request - * template. - * - * @param data - * The SignatureData. - * @param so - * The signature information object. - * @return Returns the verify request xml to be sent. - * @throws ConnectorException - * f.e. - */ - public String prepareVerifyRequestDetached(SignatureData data, - SignSignatureObject so) throws ConnectorException - { - String verify_request_template = this.environment.getVerifyRequestTemplate(); - - String xml_content = null; - // TODO implement MOA - // if (sigObject.isMOASigned()) - // { - // MOAConnector moa_conn = new MOAConnector(); - // // get the MOA-template - // verify_template_str = moa_conn.getVerifyTemplate(normalizedText, - // sigObject); - // } - // else - // { - // get the BKU-template - xml_content = prepareXMLContent(data, so); - // } - - String verify_request_xml = verify_request_template.replaceFirst(TemplateReplaces.XML_CONTENT_REPLACE, xml_content); - - return verify_request_xml; - } - - /** - * Prepares the XML content the holds the actual signature data. - * - *

- * This strongly rebuilds the XML content as retuned from a sign request. - *

- * - * @param data - * The data. - * @param so - * The signature object containing the signature information. - * @return Returns the XML content. - * @throws ConnectorException - * f.e. - */ - public String prepareXMLContent(SignatureData data, SignSignatureObject so) throws ConnectorException - { - log.debug("prepareXMLContent:"); //$NON-NLS-1$ - try - { - - String verify_template = this.environment.getVerifyTemplate(); - - String ids_string = so.getSigID(); - String[] ids = SignatureObject.parseSigIds(ids_string); - - X509Certificate cert = so.getX509Certificate(); - String cert_alg = this.environment.getCertAlgEcdsa(); - if (cert.getPublicKey().getAlgorithm().indexOf("RSA") >= 0) //$NON-NLS-1$ - { - cert_alg = this.environment.getCertAlgRsa(); - } - - // cert alg replace - String verify_xml = verify_template.replaceFirst(TemplateReplaces.CERT_ALG_REPLACE, cert_alg); - - // data digest replace - { - byte[] data_value = data.getData(); - byte[] data_value_hash = CodingHelper.buildDigest(data_value); - String object_data_hash = CodingHelper.encodeBase64(data_value_hash); - - verify_xml = verify_xml.replaceFirst(TemplateReplaces.DIGEST_VALUE_SIGNED_DATA_REPLACE, object_data_hash); - } - - // SIG id replaces - verify_xml = verify_xml.replaceAll(TemplateReplaces.SIG_DATA_REF_REPLACE, ids[1]); - verify_xml = verify_xml.replaceAll(TemplateReplaces.ETSI_DATA_REF_REPLACE, ids[3]); - verify_xml = verify_xml.replaceAll(TemplateReplaces.SIG_DATA_OBJ_URI_REPLACE, ids[2]); - - verify_xml = verify_xml.replaceFirst(TemplateReplaces.SIGNATURE_VALUE_REPLACE, so.getSignatureValue()); - - // X.509 Certificate replace - byte[] der = cert.getEncoded(); - byte[] cert_hash = CodingHelper.buildDigest(der); - String certDigest = CodingHelper.encodeBase64(cert_hash); - String x509_cert_string = CodingHelper.encodeBase64(der); - verify_xml = verify_xml.replaceFirst(TemplateReplaces.X509_CERTIFICATE_REPLACE, x509_cert_string); - - // Qualified Properties replaces - verify_xml = verify_xml.replaceAll(TemplateReplaces.ETSI_DATA_OBJ_URI_REPLACE, ids[4]); - verify_xml = verify_xml.replaceAll(TemplateReplaces.SIG_ID_REPLACE, ids[0]); - verify_xml = verify_xml.replaceFirst(TemplateReplaces.SIGNING_TIME_REPLACE, so.getDate()); - verify_xml = verify_xml.replaceFirst(TemplateReplaces.DIGEST_VALUE_CERTIFICATE_REPLACE, certDigest); - verify_xml = verify_xml.replaceFirst(TemplateReplaces.X509_ISSUER_NAME_REPLACE, so.getIssuer()); - verify_xml = verify_xml.replaceFirst(TemplateReplaces.X509_SERIAL_NUMBER_REPLACE, so.getSerialNumber()); - // SigDataRefReplace already done above - verify_xml = verify_xml.replaceFirst(TemplateReplaces.MIME_TYPE_REPLACE, data.getMimeType()); - - // Signed Properties hash - { - final String ETSI_SIGNED_PROPERTIES_START_TAG = "= 0; - final int hash_end = verify_xml.indexOf(ETSI_SIGNED_PROPERTIES_END_TAG, hash_start) + ETSI_SIGNED_PROPERTIES_END_TAG.length(); - assert hash_end - ETSI_SIGNED_PROPERTIES_END_TAG.length() >= 0; - assert hash_end > hash_start; - - final String string_to_be_hashed = verify_xml.substring(hash_start, hash_end); - log.debug("etsi:SignedProperties string to be hashed: " + string_to_be_hashed); //$NON-NLS-1$ - - final byte[] bytes_to_be_hashed = string_to_be_hashed.getBytes("UTF-8"); //$NON-NLS-1$ - byte[] sig_prop_code = CodingHelper.buildDigest(bytes_to_be_hashed); - String sig_prop_hash = CodingHelper.encodeBase64(sig_prop_code); - - verify_xml = verify_xml.replaceFirst(TemplateReplaces.DIGEST_VALUE_SIGNED_PROPERTIES_REPLACE, sig_prop_hash); - } - - log.debug("prepareXMLContent finished."); //$NON-NLS-1$ - return verify_xml; - } - catch (Exception e) - { - log.debug(e); - throw new ConnectorException(310, e); - } - } - - /** - * Analyzes the verify response string. - * - * @param response_properties - * The response properties containing the response XML. - * @return Returns the SignatureResponse containing the verification result. - * @throws ConnectorException - * f.e. - */ - public SignatureResponse analyzeVerifyResponse(Properties response_properties) throws ConnectorException - { - log.debug("analyzeVerifyResponse:"); //$NON-NLS-1$ - - String response_string = response_properties.getProperty(BKUPostConnection.RESPONSE_STRING_KEY); - - BKUHelper.checkResponseForError(response_string); - - SignatureResponse signature_response = BKUHelper.parseVerifyXMLResponse(response_string); - - log.debug("analyzeVerifyResponse finished."); //$NON-NLS-1$ - return signature_response; - } - - - /** - * Holds environment configuration information like templates. - * - * @author wprinz - */ - public static class Environment - { - /** - * The configuration key of the sign keybox identifier. - */ - protected static final String SIGN_KEYBOX_IDENTIFIER_KEY = "bku.sign.KeyboxIdentifier"; //$NON-NLS-1$ - - /** - * The configuration key of the sign request template. - */ - protected static final String SIGN_REQUEST_TEMPLATE_KEY = "bku.sign.request.detached"; //$NON-NLS-1$ - - /** - * The configuration key of the sign URL. - */ - protected static final String SIGN_URL_KEY = "bku.sign.url"; //$NON-NLS-1$ - - /** - * The configuration key of the verify request template. - */ - protected static final String VERIFY_REQUEST_TEMPLATE_KEY = "bku.verify.request.detached"; //$NON-NLS-1$ - - /** - * The configuration key of the verify template. - */ - protected static final String VERIFY_TEMPLATE_KEY = "bku.verify.template.detached"; //$NON-NLS-1$ - - /** - * The configuration key of the verify URL. - */ - protected static final String VERIFY_URL_KEY = "bku.verify.url"; //$NON-NLS-1$ - - /** - * The configuration key for the ECDSA cert alg property. - */ - protected static final String ECDSA_CERT_ALG_KEY = "cert.alg.ecdsa"; //$NON-NLS-1$ - - /** - * The configuration key for the RSA cert alg property. - */ - protected static final String RSA_CERT_ALG_KEY = "cert.alg.rsa"; //$NON-NLS-1$ - - protected String sign_keybox_identifier = null; - - protected String sign_request_template = null; - - protected String sign_url = null; - - protected String verify_request_template = null; - - protected String verify_template = null; - - protected String verify_url = null; - - protected String cert_alg_ecdsa = null; - - protected String cert_alg_rsa = null; - - /** - * Initializes the environment with a given profile. - * - * @param profile - * The configuration profile. - * @throws ConnectorException - * f.e. - */ - public Environment(String profile) throws ConnectorException - { - SettingsReader settings = null; - try - { - settings = SettingsReader.getInstance(); - } - catch (SettingsException e) - { - throw new ConnectorException(300, e); - } - - this.sign_keybox_identifier = getConnectorValueFromProfile(settings, profile, SIGN_KEYBOX_IDENTIFIER_KEY); - - String sign_request_filename = getConnectorValueFromProfile(settings, profile, SIGN_REQUEST_TEMPLATE_KEY); - this.sign_request_template = FileHelper.readFromFile(SettingsReader.relocateFile(sign_request_filename)); - if (this.sign_request_template == null) - { - throw new ConnectorException(300, "Can not read the create xml request template"); //$NON-NLS-1$ - } - - this.sign_url = getConnectorValueFromProfile(settings, profile, SIGN_URL_KEY); - - String verify_request_filename = getConnectorValueFromProfile(settings, profile, VERIFY_REQUEST_TEMPLATE_KEY); - this.verify_request_template = FileHelper.readFromFile(SettingsReader.relocateFile(verify_request_filename)); - if (this.verify_request_template == null) - { - // TODO make this a settings exception - throw new ConnectorException(300, "Can not read the verify xml request template"); //$NON-NLS-1$ - } - - String verify_filename = getConnectorValueFromProfile(settings, profile, VERIFY_TEMPLATE_KEY); - this.verify_template = FileHelper.readFromFile(SettingsReader.relocateFile(verify_filename)); - if (this.verify_template == null) - { - // TODO make this a settings exception - throw new ConnectorException(300, "Can not read the verify template"); //$NON-NLS-1$ - } - - this.verify_url = getConnectorValueFromProfile(settings, profile, VERIFY_URL_KEY); - - this.cert_alg_ecdsa = settings.getValueFromKey(ECDSA_CERT_ALG_KEY); - - this.cert_alg_rsa = settings.getValueFromKey(RSA_CERT_ALG_KEY); - - } - - /** - * Returns the sign keybox identifier. - * - * @return Returns the sign keybox identifier. - */ - public String getSignKeyboxIdentifier() - { - return this.sign_keybox_identifier; - } - - /** - * Returns the sign request template. - * - * @return Returns the sign request template. - */ - public String getSignRequestTemplate() - { - return this.sign_request_template; - } - - /** - * Returns the sign URL. - * - * @return Returns the sign URL. - */ - public String getSignURL() - { - return this.sign_url; - } - - /** - * Returns the verify request template. - * - * @return Returns the verify request template. - */ - public String getVerifyRequestTemplate() - { - return this.verify_request_template; - } - - /** - * Returns the verify template. - * - * @return Returns the verify template. - */ - public String getVerifyTemplate() - { - return this.verify_template; - } - - /** - * Returns the verify URL. - * - * @return Returns the verify URL. - */ - public String getVerifyURL() - { - return this.verify_url; - } - - /** - * Returns the ecdsa cert alg property. - * - * @return Returns the ecdsa cert alg property. - */ - public String getCertAlgEcdsa() - { - return this.cert_alg_ecdsa; - } - - /** - * Returns the rsa cert alg property. - * - * @return Returns the rsa cert alg property. - */ - public String getCertAlgRsa() - { - return this.cert_alg_rsa; - } - - /** - * 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; - } - } -} diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/EnvelopedBase64BKUConnector.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/EnvelopedBase64BKUConnector.java index cabfe92..1c628b1 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/EnvelopedBase64BKUConnector.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/EnvelopedBase64BKUConnector.java @@ -19,6 +19,7 @@ import at.knowcenter.wag.egov.egiz.sig.connectors.Connector; import at.knowcenter.wag.egov.egiz.sig.connectors.TemplateReplaces; import at.knowcenter.wag.egov.egiz.sig.sigid.HotfixIdFormatter; import at.knowcenter.wag.egov.egiz.tools.CodingHelper; +import at.knowcenter.wag.egov.egiz.tools.DebugHelper; import at.knowcenter.wag.egov.egiz.tools.FileHelper; /** @@ -66,11 +67,12 @@ public class EnvelopedBase64BKUConnector implements Connector log.debug("doSign:"); //$NON-NLS-1$ String sign_request_xml = prepareSignRequest(data); - log.debug("sign_request_xml = " + sign_request_xml); //$NON-NLS-1$ + DebugHelper.debugStringToFile(sign_request_xml, "BKU_EnvB64_sign_request.xml"); //$NON-NLS-1$ String url = this.environment.getSignURL(); Properties response_properties = sendRequest(url, sign_request_xml); + DebugHelper.debugStringToFile(response_properties.getProperty(BKUPostConnection.RESPONSE_STRING_KEY), "BKU_EnvB64_sign_response.xml"); //$NON-NLS-1$ SignSignatureObject sso = analyzeSignResponse(response_properties); // TODO this could be made more generic @@ -89,25 +91,12 @@ public class EnvelopedBase64BKUConnector implements Connector log.debug("doVerify:"); //$NON-NLS-1$ String verify_request_xml = prepareVerifyRequest(data, so); - log.debug("verify_request_xml = " + verify_request_xml); //$NON-NLS-1$ - - // TODO debug - // try - // { - // FileOutputStream fos = new - // FileOutputStream("C:\\wprinz\\Filer\\egiz2\\verify_request.utf8.xml"); - // //$NON-NLS-1$ - // fos.write(verify_request_xml.getBytes("UTF-8")); //$NON-NLS-1$ - // fos.close(); - // } - // catch (Exception e) - // { - // log.error(e); - // } + DebugHelper.debugStringToFile(verify_request_xml, "BKU_EnvB64_verify_request.xml"); //$NON-NLS-1$ String url = this.environment.getVerifyURL(); Properties response_properties = sendRequest(url, verify_request_xml); + DebugHelper.debugStringToFile(response_properties.getProperty(BKUPostConnection.RESPONSE_STRING_KEY), "BKU_EnvB64_verify_response.xml"); //$NON-NLS-1$ SignatureResponse signature_response = analyzeVerifyResponse(response_properties); log.debug("doVerify finished."); //$NON-NLS-1$ @@ -180,8 +169,8 @@ public class EnvelopedBase64BKUConnector implements Connector String verify_xml = verify_template.replaceFirst(TemplateReplaces.CERT_ALG_REPLACE, cert_alg); // data digest replace + byte [] data_value = BKUHelper.prepareEnvelopingData(data); { - byte[] data_value = data.getData(); byte[] data_value_hash = CodingHelper.buildDigest(data_value); String object_data_hash = CodingHelper.encodeBase64(data_value_hash); @@ -203,7 +192,7 @@ public class EnvelopedBase64BKUConnector implements Connector verify_xml = verify_xml.replaceFirst(TemplateReplaces.X509_CERTIFICATE_REPLACE, x509_cert_string); // Base64 content replace - String base64 = BKUHelper.prepareBase64Content(data); + String base64 = CodingHelper.encodeBase64(data_value); verify_xml = verify_xml.replaceFirst(TemplateReplaces.BASE64_CONTENT_REPLACE, base64); // Qualified Properties replaces diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/LocRefDetachedBKUConnector.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/LocRefDetachedBKUConnector.java new file mode 100644 index 0000000..92b7b91 --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/LocRefDetachedBKUConnector.java @@ -0,0 +1,25 @@ +/** + * + */ +package at.knowcenter.wag.egov.egiz.sig.connectors.bku; + +import at.knowcenter.wag.egov.egiz.exceptions.ConnectorException; + +/** + * @author wprinz + * + */ +public class LocRefDetachedBKUConnector extends DetachedBKUConnector +{ + + /** + * @param profile + * @param loc_ref_content + * @throws ConnectorException + */ + public LocRefDetachedBKUConnector(String profile, String loc_ref_content) throws ConnectorException + { + super(profile, loc_ref_content); + } + +} diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/MultipartDetachedBKUConnector.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/MultipartDetachedBKUConnector.java new file mode 100644 index 0000000..a2d4dc0 --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/bku/MultipartDetachedBKUConnector.java @@ -0,0 +1,21 @@ +/** + * + */ +package at.knowcenter.wag.egov.egiz.sig.connectors.bku; + +import at.knowcenter.wag.egov.egiz.exceptions.ConnectorException; + +/** + * @author wprinz + * + */ +public class MultipartDetachedBKUConnector extends DetachedBKUConnector +{ + protected static final String MULTIPART_LOC_REF_CONTENT = "formdata:fileupload"; //$NON-NLS-1$ + + public MultipartDetachedBKUConnector(String profile) throws ConnectorException + { + super(profile, MULTIPART_LOC_REF_CONTENT); + } + +} diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/DetachedLocRefMOAConnector.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/DetachedLocRefMOAConnector.java index e5278b9..220a3d0 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/DetachedLocRefMOAConnector.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/DetachedLocRefMOAConnector.java @@ -4,21 +4,23 @@ package at.knowcenter.wag.egov.egiz.sig.connectors.moa; import java.util.Properties; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; +import at.knowcenter.wag.egov.egiz.exceptions.ConnectorException; import at.knowcenter.wag.egov.egiz.exceptions.SettingsException; import at.knowcenter.wag.egov.egiz.exceptions.SignatureException; -import at.knowcenter.wag.egov.egiz.exceptions.WebException; import at.knowcenter.wag.egov.egiz.sig.SignatureData; +import at.knowcenter.wag.egov.egiz.sig.SignatureResponse; +import at.knowcenter.wag.egov.egiz.sig.connectors.Connector; import at.knowcenter.wag.egov.egiz.sig.connectors.TemplateReplaces; import at.knowcenter.wag.egov.egiz.sig.connectors.bku.BKUHelper; import at.knowcenter.wag.egov.egiz.sig.connectors.bku.BKUPostConnection; import at.knowcenter.wag.egov.egiz.sig.connectors.bku.SignSignatureObject; +import at.knowcenter.wag.egov.egiz.sig.sigid.DetachedLocRefMOAIdFormatter; +import at.knowcenter.wag.egov.egiz.tools.DebugHelper; import at.knowcenter.wag.egov.egiz.tools.FileHelper; /** @@ -26,7 +28,7 @@ import at.knowcenter.wag.egov.egiz.tools.FileHelper; * * @author wprinz */ -public class DetachedLocRefMOAConnector +public class DetachedLocRefMOAConnector implements Connector { /** * The SIG_ID prefix. @@ -60,31 +62,19 @@ public class DetachedLocRefMOAConnector * @throws SignatureException * f.e. */ - public DetachedLocRefMOAConnector(String profile) throws SignatureException, SettingsException + public DetachedLocRefMOAConnector(String profile, String signature_data_url) throws SignatureException, SettingsException { - this.environment = new Environment(profile); + this.environment = new Environment(profile, signature_data_url); } - /** - * Prepares the sign request xml to be sent using the sign request template. - * - * @param data - * The SignatureData. - * @return Returns the sign request xml to be sent. - * @throws SignatureException - * f.e. - */ - protected String prepareSignRequest(SignatureData data) throws SignatureException + protected String prepareSignRequest(SignatureData data) throws ConnectorException { log.debug("prepareSignRequestDetached:"); //$NON-NLS-1$ String sign_request_template = this.environment.getSignRequestTemplate(); String sign_key_identifier = this.environment.getSignKeyIdentifier(); - String loc_ref_content = // "http://wwwx.google.at"; - // this doesn't work - MOA always complains that file system access is - // forbidden - "file:///C:/wprinz/Filer/egiz2/test.utf8.txt"; + String loc_ref_content = this.environment.getSignatureDataUrl(); String mime_type = data.getMimeType(); if (log.isDebugEnabled()) { @@ -102,16 +92,9 @@ public class DetachedLocRefMOAConnector } /** - * Analyzes the sign response xml and extracts the signature data. - * - * @param response_properties - * The response properties containing the response String and - * transport related information. - * @return Returns the extracted data encapsulated in a SignatureObject. - * @throws SignatureException - * f.e. + * @see at.knowcenter.wag.egov.egiz.sig.connectors.LocalConnector#analyzeSignResponse(java.util.Properties) */ - public SignSignatureObject analyzeSignResponse(Properties response_properties) throws SignatureException + public SignSignatureObject analyzeSignResponse(Properties response_properties) throws ConnectorException { log.debug("analyzeSignResponse:"); //$NON-NLS-1$ @@ -119,33 +102,26 @@ public class DetachedLocRefMOAConnector BKUHelper.checkResponseForError(response_string); - // SignSignatureObject so = parseCreateXMLResponse(response_string); + SignSignatureObject so = MOAHelper.parseCreateXMLResponse(response_string, new DetachedLocRefMOAIdFormatter()); log.debug("analyzeSignResponse finished."); //$NON-NLS-1$ - return null;// so; + return so; } /** - * Performs a sign. - * - * @param data - * The data to be signed. - * @return Returns the signature object containing the signature data. - * @throws SignatureException - * f.e. - * @throws WebException + * @see at.knowcenter.wag.egov.egiz.sig.connectors.Connector#doSign(at.knowcenter.wag.egov.egiz.sig.SignatureData) */ - public SignSignatureObject doSign(SignatureData data) throws SignatureException, WebException + public SignSignatureObject doSign(SignatureData data) throws ConnectorException { log.debug("doSign:"); //$NON-NLS-1$ String sign_request_xml = prepareSignRequest(data); - log.debug("sign_request_xml = " + sign_request_xml); //$NON-NLS-1$ + DebugHelper.debugStringToFile(sign_request_xml, "MOA_DetLocRef_sign_request.xml"); //$NON-NLS-1$ String url = this.environment.getSignURL(); - Properties response_properties = sendRequest(url, MOASoapConnection.SERVICE_SIGN, sign_request_xml, data); + Properties response_properties = sendRequest(url, MOASoapConnection.SERVICE_SIGN, sign_request_xml); - log.debug("response_string = " + response_properties.getProperty(BKUPostConnection.RESPONSE_STRING_KEY));; //$NON-NLS-1$ + DebugHelper.debugStringToFile(response_properties.getProperty(BKUPostConnection.RESPONSE_STRING_KEY), "MOA_DetLocRef_sign_response.xml"); //$NON-NLS-1$ SignSignatureObject sso = analyzeSignResponse(response_properties); // TODO this could be made more generic @@ -155,8 +131,66 @@ public class DetachedLocRefMOAConnector return sso; } + /** + * @see at.knowcenter.wag.egov.egiz.sig.connectors.Connector#doVerify(at.knowcenter.wag.egov.egiz.sig.SignatureData, + * at.knowcenter.wag.egov.egiz.sig.connectors.bku.SignSignatureObject) + */ + public SignatureResponse doVerify(SignatureData data, SignSignatureObject so) throws ConnectorException + { + log.debug("doVerify:"); //$NON-NLS-1$ + + String verify_request_xml = prepareVerifyRequest(data, so); + log.debug("verify_request_xml = " + verify_request_xml); //$NON-NLS-1$ + + String url = this.environment.getVerifyURL(); + Properties response_properties = sendRequest(url, MOASoapConnection.SERVICE_VERIFY, verify_request_xml); + + // SignatureResponse signature_response = + // analyzeVerifyResponse(response_properties); + + log.debug("doVerify finished."); //$NON-NLS-1$ + return null; // signature_response; + } + + /** + * Prepares the verify request xml to be sent using the verify request + * template. + * + * @param data + * The SignatureData. + * @param so + * The signature information object. + * @return Returns the verify request xml to be sent. + * @throws ConnectorException + * f.e. + */ + public String prepareVerifyRequest(SignatureData data, SignSignatureObject so) throws ConnectorException + { + String verify_request_template = this.environment.getVerifyRequestTemplate(); + + String xml_content = null; + // TODO implement BKU + // if (sigObject.isMOASigned()) + // { + // MOAConnector moa_conn = new MOAConnector(); + // // get the MOA-template + // verify_template_str = moa_conn.getVerifyTemplate(normalizedText, + // sigObject); + // } + // else + // { + // get the BKU-template +// xml_content = prepareXMLContent(data, so); + // } + + String verify_request_xml = verify_request_template.replaceFirst(TemplateReplaces.XML_CONTENT_REPLACE, xml_content); + verify_request_xml = verify_request_xml.replaceFirst(TemplateReplaces.TRUST_PROFILE_ID_REPLACE, this.environment.getVerifyTrustProfileId()); + + return verify_request_xml; + } + protected Properties sendRequest(String url, String mode, - String request_string, SignatureData data) throws SignatureException + String request_string) throws ConnectorException { try { @@ -165,8 +199,7 @@ public class DetachedLocRefMOAConnector } catch (Exception e) { - SignatureException se = new SignatureException(320, e); - throw se; + throw new ConnectorException(320, e); } } @@ -207,6 +240,11 @@ public class DetachedLocRefMOAConnector */ protected static final String VERIFY_URL_KEY = "moa.verify.url"; //$NON-NLS-1$ + /** + * The configuration key of the trust profile id. + */ + protected static final String VERIFY_TRUST_PROFILE_ID = "moa.verify.TrustProfileID"; //$NON-NLS-1$ + /** * The configuration key for the ECDSA cert alg property. */ @@ -217,6 +255,8 @@ public class DetachedLocRefMOAConnector */ protected static final String RSA_CERT_ALG_KEY = "cert.alg.rsa"; //$NON-NLS-1$ + protected String signature_data_url = null; + protected String sign_key_identifier = null; protected String sign_request_template = null; @@ -229,6 +269,8 @@ public class DetachedLocRefMOAConnector protected String verify_url = null; + protected String verify_trust_profile_id = null; + protected String cert_alg_ecdsa = null; protected String cert_alg_rsa = null; @@ -240,12 +282,22 @@ public class DetachedLocRefMOAConnector * The configuration profile. * @throws SettingsException * f.e. - * @throws SignatureException + * @throws ConnectorException * f.e. */ - public Environment(String profile) throws SettingsException, SignatureException + public Environment(String profile, String signature_data_url) throws ConnectorException { - SettingsReader settings = SettingsReader.getInstance(); + this.signature_data_url = signature_data_url; + + SettingsReader settings = null; + try + { + settings = SettingsReader.getInstance(); + } + catch (SettingsException e) + { + throw new ConnectorException(300, e); + } this.sign_key_identifier = getConnectorValueFromProfile(settings, profile, SIGN_KEY_IDENTIFIER_KEY); @@ -254,7 +306,7 @@ public class DetachedLocRefMOAConnector if (this.sign_request_template == null) { // TODO make this a settings exception - throw new SignatureException(300, "Can not read the create xml request template"); //$NON-NLS-1$ + throw new ConnectorException(300, "Can not read the create xml request template"); //$NON-NLS-1$ } this.sign_url = getConnectorValueFromProfile(settings, profile, SIGN_URL_KEY); @@ -264,7 +316,7 @@ public class DetachedLocRefMOAConnector if (this.verify_request_template == null) { // TODO make this a settings exception - throw new SignatureException(300, "Can not read the verify xml request template"); //$NON-NLS-1$ + throw new ConnectorException(300, "Can not read the verify xml request template"); //$NON-NLS-1$ } String verify_filename = getConnectorValueFromProfile(settings, profile, VERIFY_TEMPLATE_KEY); @@ -272,17 +324,29 @@ public class DetachedLocRefMOAConnector if (this.verify_template == null) { // TODO make this a settings exception - throw new SignatureException(300, "Can not read the verify template"); //$NON-NLS-1$ + throw new ConnectorException(300, "Can not read the verify template"); //$NON-NLS-1$ } this.verify_url = getConnectorValueFromProfile(settings, profile, VERIFY_URL_KEY); + this.verify_trust_profile_id = settings.getValueFromKey(VERIFY_TRUST_PROFILE_ID); + this.cert_alg_ecdsa = settings.getValueFromKey(ECDSA_CERT_ALG_KEY); this.cert_alg_rsa = settings.getValueFromKey(RSA_CERT_ALG_KEY); } + /** + * Returns the URL where to load the detached data from. + * + * @return Returns the URL where to load the detached data from. + */ + public String getSignatureDataUrl() + { + return this.signature_data_url; + } + /** * Returns the sign key identifier. * @@ -343,6 +407,16 @@ public class DetachedLocRefMOAConnector return this.verify_url; } + /** + * Returns the verify trust profile id. + * + * @return Returns the verify trust profile id. + */ + public String getVerifyTrustProfileId() + { + return this.verify_trust_profile_id; + } + /** * Returns the ecdsa cert alg property. * diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/EnvelopingBase64MOAConnector.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/EnvelopingBase64MOAConnector.java index 4e9dd04..f6580af 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/EnvelopingBase64MOAConnector.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/EnvelopingBase64MOAConnector.java @@ -3,15 +3,8 @@ */ package at.knowcenter.wag.egov.egiz.sig.connectors.moa; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.Properties; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -20,14 +13,13 @@ import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; import at.knowcenter.wag.egov.egiz.exceptions.ConnectorException; import at.knowcenter.wag.egov.egiz.exceptions.SettingsException; import at.knowcenter.wag.egov.egiz.sig.SignatureData; -import at.knowcenter.wag.egov.egiz.sig.SignatureObject; import at.knowcenter.wag.egov.egiz.sig.SignatureResponse; -import at.knowcenter.wag.egov.egiz.sig.X509Cert; import at.knowcenter.wag.egov.egiz.sig.connectors.Connector; import at.knowcenter.wag.egov.egiz.sig.connectors.TemplateReplaces; import at.knowcenter.wag.egov.egiz.sig.connectors.bku.BKUHelper; import at.knowcenter.wag.egov.egiz.sig.connectors.bku.BKUPostConnection; import at.knowcenter.wag.egov.egiz.sig.connectors.bku.SignSignatureObject; +import at.knowcenter.wag.egov.egiz.sig.sigid.OldMOAIdFormatter; import at.knowcenter.wag.egov.egiz.tools.CodingHelper; import at.knowcenter.wag.egov.egiz.tools.FileHelper; @@ -205,7 +197,7 @@ public class EnvelopingBase64MOAConnector implements Connector BKUHelper.checkResponseForError(response_string); - SignSignatureObject so = parseCreateXMLResponse(response_string); + SignSignatureObject so = MOAHelper.parseCreateXMLResponse(response_string, new OldMOAIdFormatter()); log.debug("analyzeSignResponse finished."); //$NON-NLS-1$ return so; @@ -268,8 +260,8 @@ public class EnvelopingBase64MOAConnector implements Connector String verify_xml = verify_template.replaceFirst(TemplateReplaces.CERT_ALG_REPLACE, cert_alg); // data digest replace + byte[] data_value = BKUHelper.prepareEnvelopingData(data); { - byte[] data_value = data.getData(); byte[] data_value_hash = CodingHelper.buildDigest(data_value); String object_data_hash = CodingHelper.encodeBase64(data_value_hash); @@ -286,7 +278,7 @@ public class EnvelopingBase64MOAConnector implements Connector verify_xml = verify_xml.replaceFirst(TemplateReplaces.X509_CERTIFICATE_REPLACE, x509_cert_string); // Base64 content replace - String base64 = BKUHelper.prepareBase64Content(data); + String base64 = CodingHelper.encodeBase64(data_value); verify_xml = verify_xml.replaceFirst(TemplateReplaces.BASE64_CONTENT_REPLACE, base64); // Qualified Properties replaces @@ -327,156 +319,6 @@ public class EnvelopingBase64MOAConnector implements Connector } } - - /** - * This method parses the MOA-Response string. It separates the - * SignatureValue, X509IssuerName, SigningTime, X509SerialNumber, - * X509Certificate, CertDigest and DigestValues. If the X509Certificate is - * extracted it would be stored in the certificates directory. - * - * @param xmlResponse - * the response string from the MOA sign-request - * @throws ConnectorException - * ErrorCode (303, 304) - * @see SignatureObject - * @see CodingHelper - * @see X509Cert - */ - public static SignSignatureObject parseCreateXMLResponse(String xmlResponse) throws ConnectorException - { - Pattern sig_val_p_s = Pattern.compile("<[\\w]*:?SignatureValue>"); //$NON-NLS-1$ - Pattern sig_val_p_e = Pattern.compile(""); //$NON-NLS-1$ - Pattern iss_nam_p_s = Pattern.compile("<[\\w]*:?X509IssuerName>"); //$NON-NLS-1$ - Pattern iss_nam_p_e = Pattern.compile(""); //$NON-NLS-1$ - Pattern sig_tim_p_s = Pattern.compile("<[\\w]*:?SigningTime>"); //$NON-NLS-1$ - Pattern sig_tim_p_e = Pattern.compile(""); //$NON-NLS-1$ - Pattern ser_num_p_s = Pattern.compile("<[\\w]*:?X509SerialNumber>"); //$NON-NLS-1$ - Pattern ser_num_p_e = Pattern.compile(""); //$NON-NLS-1$ - Pattern sig_cer_p_s = Pattern.compile("<[\\w]*:?X509Certificate>"); //$NON-NLS-1$ - Pattern sig_cer_p_e = Pattern.compile(""); //$NON-NLS-1$ - - // Pattern sig_cer_d_p_s = Pattern.compile("<[\\w]*:?CertDigest>"); - // //$NON-NLS-1$ - // Pattern sig_cer_d_p_e = Pattern.compile(""); - // //$NON-NLS-1$ - // Pattern dig_val_p_s = Pattern.compile("<[\\w]*:?DigestValue>"); - // //$NON-NLS-1$ - // Pattern dig_val_p_e = Pattern.compile(""); - // //$NON-NLS-1$ - - Matcher sig_val_m_s = sig_val_p_s.matcher(xmlResponse); - Matcher sig_val_m_e = sig_val_p_e.matcher(xmlResponse); - Matcher iss_nam_m_s = iss_nam_p_s.matcher(xmlResponse); - Matcher iss_nam_m_e = iss_nam_p_e.matcher(xmlResponse); - Matcher sig_tim_m_s = sig_tim_p_s.matcher(xmlResponse); - Matcher sig_tim_m_e = sig_tim_p_e.matcher(xmlResponse); - Matcher ser_num_m_s = ser_num_p_s.matcher(xmlResponse); - Matcher ser_num_m_e = ser_num_p_e.matcher(xmlResponse); - Matcher sig_cer_m_s = sig_cer_p_s.matcher(xmlResponse); - Matcher sig_cer_m_e = sig_cer_p_e.matcher(xmlResponse); - - // Matcher sig_cer_d_m_s = sig_cer_d_p_s.matcher(xmlResponse); - // Matcher sig_cer_d_m_e = sig_cer_d_p_e.matcher(xmlResponse); - // Matcher dig_val_m_s = dig_val_p_s.matcher(xmlResponse); - // Matcher dig_val_m_e = dig_val_p_e.matcher(xmlResponse); - - // SignatureValue - String sig_val = null; - if (sig_val_m_s.find() && sig_val_m_e.find()) - { - sig_val = BKUHelper.removeAllWhitespace(xmlResponse.substring(sig_val_m_s.end(), sig_val_m_e.start())); - } - log.debug("sig_val = " + sig_val); //$NON-NLS-1$ - - // X509IssuerName - String iss_nam = null; - if (iss_nam_m_s.find() && iss_nam_m_e.find()) - { - iss_nam = xmlResponse.substring(iss_nam_m_s.end(), iss_nam_m_e.start()); - } - log.debug("iss_nam = " + iss_nam); //$NON-NLS-1$ - - // X509SerialNumber - String ser_num = null; - if (ser_num_m_s.find() && ser_num_m_e.find()) - { - ser_num = BKUHelper.removeAllWhitespace(xmlResponse.substring(ser_num_m_s.end(), ser_num_m_e.start())); - } - log.debug("ser_num = " + ser_num); //$NON-NLS-1$ - - // SigningTime - String sig_tim = null; - if (sig_tim_m_s.find() && sig_tim_m_e.find()) - { - sig_tim = xmlResponse.substring(sig_tim_m_s.end(), sig_tim_m_e.start()); - } - log.debug("sig_tim = " + sig_tim); //$NON-NLS-1$ - - // CertDigest - // if (sig_cer_d_m_s.find() && sig_cer_d_m_e.find()) - // { - // String cert_digest = xmlResponse.substring(sig_cer_d_m_s.end(), - // sig_cer_d_m_e.start()); - // if (dig_val_m_s.find() && dig_val_m_e.find()) - // { - // sig_dig = cert_digest.substring(dig_val_m_s.end(), dig_val_m_e.start()); - // //sigObj.setX509CertificateDigest(sig_dig); - // } - // } - - // X509Certificate - X509Certificate cert = null; - if (sig_cer_m_s.find() && sig_cer_m_e.find()) - { - String sig_cer = BKUHelper.removeAllWhitespace(xmlResponse.substring(sig_cer_m_s.end(), sig_cer_m_e.start())); - - try - { - byte[] der = CodingHelper.decodeBase64(sig_cer); - ByteArrayInputStream bais = new ByteArrayInputStream(der); - CertificateFactory cf = CertificateFactory.getInstance("X.509"); //$NON-NLS-1$ - cert = (X509Certificate) cf.generateCertificate(bais); - bais.close(); - } - catch (UnsupportedEncodingException e) - { - log.error(e); - throw new ConnectorException(300, e); - } - catch (CertificateException e) - { - log.error(e); - throw new ConnectorException(300, e); - } - catch (IOException e) - { - log.error(e); - throw new ConnectorException(300, e); - } - } - log.debug("X509Certificate = " + cert); //$NON-NLS-1$ - - if (log.isDebugEnabled()) - { - - String cert_iss = cert.getIssuerDN().getName(); - log.debug("certificate's issuer = " + cert_iss); //$NON-NLS-1$ - log.debug("response's issuer = " + iss_nam); //$NON-NLS-1$ - log.debug("issuer matches = " + cert_iss.equals(iss_nam)); //$NON-NLS-1$ - log.debug("ser number matches = " + cert.getSerialNumber().toString().equals(ser_num)); //$NON-NLS-1$ - } - - SignSignatureObject so = new SignSignatureObject(); - so.date = sig_tim; - so.issuer = iss_nam; - so.signatureValue = sig_val; - so.x509Certificate = cert; - - so.id = null; - - return so; - } - /** * Holds environment configuration information like templates. * diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/MOAHelper.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/MOAHelper.java new file mode 100644 index 0000000..e05d55c --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/moa/MOAHelper.java @@ -0,0 +1,190 @@ +/** + * + */ +package at.knowcenter.wag.egov.egiz.sig.connectors.moa; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import at.knowcenter.wag.egov.egiz.exceptions.ConnectorException; +import at.knowcenter.wag.egov.egiz.sig.SignatureObject; +import at.knowcenter.wag.egov.egiz.sig.X509Cert; +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.BKUHelper; +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.SignSignatureObject; +import at.knowcenter.wag.egov.egiz.sig.sigid.IdFormatter; +import at.knowcenter.wag.egov.egiz.tools.CodingHelper; + +/** + * @author wprinz + * + */ +public class MOAHelper +{ + /** + * The log. + */ + private static Log log = LogFactory.getLog(MOAHelper.class); + + /** + * This method parses the MOA-Response string. + * + *

+ * It separates the SignatureValue, X509IssuerName, SigningTime, + * X509SerialNumber, X509Certificate, CertDigest and DigestValues. If the + * X509Certificate is extracted it would be stored in the certificates + * directory. + *

+ * + * @param xmlResponse + * the response string from the MOA sign-request + * @throws ConnectorException + * ErrorCode (303, 304) + * @see SignatureObject + * @see CodingHelper + * @see X509Cert + */ + public static SignSignatureObject parseCreateXMLResponse(String xmlResponse, IdFormatter id_formatter) throws ConnectorException + { + Pattern sig_val_p_s = Pattern.compile("<[\\w]*:?SignatureValue>"); //$NON-NLS-1$ + Pattern sig_val_p_e = Pattern.compile(""); //$NON-NLS-1$ + Pattern iss_nam_p_s = Pattern.compile("<[\\w]*:?X509IssuerName>"); //$NON-NLS-1$ + Pattern iss_nam_p_e = Pattern.compile(""); //$NON-NLS-1$ + Pattern sig_tim_p_s = Pattern.compile("<[\\w]*:?SigningTime>"); //$NON-NLS-1$ + Pattern sig_tim_p_e = Pattern.compile(""); //$NON-NLS-1$ + Pattern ser_num_p_s = Pattern.compile("<[\\w]*:?X509SerialNumber>"); //$NON-NLS-1$ + Pattern ser_num_p_e = Pattern.compile(""); //$NON-NLS-1$ + Pattern sig_cer_p_s = Pattern.compile("<[\\w]*:?X509Certificate>"); //$NON-NLS-1$ + Pattern sig_cer_p_e = Pattern.compile(""); //$NON-NLS-1$ + + // Pattern sig_cer_d_p_s = Pattern.compile("<[\\w]*:?CertDigest>"); + // //$NON-NLS-1$ + // Pattern sig_cer_d_p_e = Pattern.compile(""); + // //$NON-NLS-1$ + // Pattern dig_val_p_s = Pattern.compile("<[\\w]*:?DigestValue>"); + // //$NON-NLS-1$ + // Pattern dig_val_p_e = Pattern.compile(""); + // //$NON-NLS-1$ + + Matcher sig_val_m_s = sig_val_p_s.matcher(xmlResponse); + Matcher sig_val_m_e = sig_val_p_e.matcher(xmlResponse); + Matcher iss_nam_m_s = iss_nam_p_s.matcher(xmlResponse); + Matcher iss_nam_m_e = iss_nam_p_e.matcher(xmlResponse); + Matcher sig_tim_m_s = sig_tim_p_s.matcher(xmlResponse); + Matcher sig_tim_m_e = sig_tim_p_e.matcher(xmlResponse); + Matcher ser_num_m_s = ser_num_p_s.matcher(xmlResponse); + Matcher ser_num_m_e = ser_num_p_e.matcher(xmlResponse); + Matcher sig_cer_m_s = sig_cer_p_s.matcher(xmlResponse); + Matcher sig_cer_m_e = sig_cer_p_e.matcher(xmlResponse); + + // Matcher sig_cer_d_m_s = sig_cer_d_p_s.matcher(xmlResponse); + // Matcher sig_cer_d_m_e = sig_cer_d_p_e.matcher(xmlResponse); + // Matcher dig_val_m_s = dig_val_p_s.matcher(xmlResponse); + // Matcher dig_val_m_e = dig_val_p_e.matcher(xmlResponse); + + // SignatureValue + String sig_val = null; + if (sig_val_m_s.find() && sig_val_m_e.find()) + { + sig_val = BKUHelper.removeAllWhitespace(xmlResponse.substring(sig_val_m_s.end(), sig_val_m_e.start())); + } + log.debug("sig_val = " + sig_val); //$NON-NLS-1$ + + // X509IssuerName + String iss_nam = null; + if (iss_nam_m_s.find() && iss_nam_m_e.find()) + { + iss_nam = xmlResponse.substring(iss_nam_m_s.end(), iss_nam_m_e.start()); + } + log.debug("iss_nam = " + iss_nam); //$NON-NLS-1$ + + // X509SerialNumber + String ser_num = null; + if (ser_num_m_s.find() && ser_num_m_e.find()) + { + ser_num = BKUHelper.removeAllWhitespace(xmlResponse.substring(ser_num_m_s.end(), ser_num_m_e.start())); + } + log.debug("ser_num = " + ser_num); //$NON-NLS-1$ + + // SigningTime + String sig_tim = null; + if (sig_tim_m_s.find() && sig_tim_m_e.find()) + { + sig_tim = xmlResponse.substring(sig_tim_m_s.end(), sig_tim_m_e.start()); + } + log.debug("sig_tim = " + sig_tim); //$NON-NLS-1$ + + // CertDigest + // if (sig_cer_d_m_s.find() && sig_cer_d_m_e.find()) + // { + // String cert_digest = xmlResponse.substring(sig_cer_d_m_s.end(), + // sig_cer_d_m_e.start()); + // if (dig_val_m_s.find() && dig_val_m_e.find()) + // { + // sig_dig = cert_digest.substring(dig_val_m_s.end(), dig_val_m_e.start()); + // //sigObj.setX509CertificateDigest(sig_dig); + // } + // } + + // X509Certificate + X509Certificate cert = null; + if (sig_cer_m_s.find() && sig_cer_m_e.find()) + { + String sig_cer = BKUHelper.removeAllWhitespace(xmlResponse.substring(sig_cer_m_s.end(), sig_cer_m_e.start())); + + try + { + byte[] der = CodingHelper.decodeBase64(sig_cer); + ByteArrayInputStream bais = new ByteArrayInputStream(der); + CertificateFactory cf = CertificateFactory.getInstance("X.509"); //$NON-NLS-1$ + cert = (X509Certificate) cf.generateCertificate(bais); + bais.close(); + } + catch (UnsupportedEncodingException e) + { + log.error(e); + throw new ConnectorException(300, e); + } + catch (CertificateException e) + { + log.error(e); + throw new ConnectorException(300, e); + } + catch (IOException e) + { + log.error(e); + throw new ConnectorException(300, e); + } + } + log.debug("X509Certificate = " + cert); //$NON-NLS-1$ + + if (log.isDebugEnabled()) + { + + String cert_iss = cert.getIssuerDN().getName(); + log.debug("certificate's issuer = " + cert_iss); //$NON-NLS-1$ + log.debug("response's issuer = " + iss_nam); //$NON-NLS-1$ + log.debug("issuer matches = " + cert_iss.equals(iss_nam)); //$NON-NLS-1$ + log.debug("ser number matches = " + cert.getSerialNumber().toString().equals(ser_num)); //$NON-NLS-1$ + } + + SignSignatureObject so = new SignSignatureObject(); + so.date = sig_tim; + so.issuer = iss_nam; + so.signatureValue = sig_val; + so.x509Certificate = cert; + + so.id = id_formatter.formatIds(null); + + return so; + } + +} diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/sigid/DetachedLocRefMOAIdFormatter.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/sigid/DetachedLocRefMOAIdFormatter.java new file mode 100644 index 0000000..d37ead0 --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/sigid/DetachedLocRefMOAIdFormatter.java @@ -0,0 +1,25 @@ +/** + * + */ +package at.knowcenter.wag.egov.egiz.sig.sigid; + +/** + * @author wprinz + * + */ +public class DetachedLocRefMOAIdFormatter implements IdFormatter +{ + /** + * The SIG_ID prefix. + */ + public static final String SIG_ID_PREFIX = "etsi-moa-detached@"; //$NON-NLS-1$ + + /** + * @see at.knowcenter.wag.egov.egiz.sig.sigid.IdFormatter#formatIds(java.lang.String[]) + */ + public String formatIds(String[] ids) + { + return SIG_ID_PREFIX; + } + +} diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/sigid/OldMOAIdFormatter.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/sigid/OldMOAIdFormatter.java new file mode 100644 index 0000000..05f5db8 --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/sigid/OldMOAIdFormatter.java @@ -0,0 +1,21 @@ +/** + * + */ +package at.knowcenter.wag.egov.egiz.sig.sigid; + +/** + * @author wprinz + * + */ +public class OldMOAIdFormatter implements IdFormatter +{ + + /** + * @see at.knowcenter.wag.egov.egiz.sig.sigid.IdFormatter#formatIds(java.lang.String[]) + */ + public String formatIds(String[] ids) + { + return null; + } + +} diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/tools/DebugHelper.java b/src/main/java/at/knowcenter/wag/egov/egiz/tools/DebugHelper.java new file mode 100644 index 0000000..e273437 --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/tools/DebugHelper.java @@ -0,0 +1,70 @@ +/** + * + */ +package at.knowcenter.wag.egov.egiz.tools; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStreamWriter; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import at.knowcenter.wag.egov.egiz.sig.connectors.moa.EnvelopingBase64MOAConnector; + +/** + * Contains useful helper methods for debugging. + * + * @author wprinz + */ +public final class DebugHelper +{ + /** + * The log. + */ + private static Log log = LogFactory.getLog(DebugHelper.class); + + /** + * Tells, if Strings should be debugged to a file. + * + *

+ * If set to false, the corresponding methods will simply do nothing. + *

+ */ + public static boolean debug_to_file = true; + + /** + * The directory under which the debug files are to be stored. + */ + public static File debug_dir = new File("C:\\wprinz\\Filer\\egiz2"); //$NON-NLS-1$ + + /** + * Writes the given String to a file with the given file name in UTF-8 + * encoding. + * + * @param str + * The String to be written. + * @param file_name + * The file the String will be written to. + */ + public static void debugStringToFile(String str, String file_name) + { + if (!debug_to_file) + { + return; + } + + try + { + File file = new File(debug_dir, file_name); + FileOutputStream fos = new FileOutputStream(file); + OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); //$NON-NLS-1$ + osw.write(str); + osw.close(); + } + catch (Exception e) + { + log.error(e); + } + } +} diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/AsynchronousRedirectResponder.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/AsynchronousRedirectResponder.java index b98c83e..58d0773 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/web/AsynchronousRedirectResponder.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/AsynchronousRedirectResponder.java @@ -39,6 +39,7 @@ import at.knowcenter.wag.egov.egiz.framework.SignatorFactory; import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory; import at.knowcenter.wag.egov.egiz.sig.SignatureResponse; import at.knowcenter.wag.egov.egiz.sig.connectors.BKUConnector; +import at.knowcenter.wag.egov.egiz.web.servlets.SignServlet; /** * Servlet that responds to the redirect requests of the local service (e.g. @@ -111,7 +112,7 @@ public class AsynchronousRedirectResponder extends HttpServlet catch (PresentableException e) { e.printStackTrace(); - Sign.prepareDispatchToErrorPage(e, request); + SignServlet.prepareDispatchToErrorPage(e, request); dispatch(request, response, "/jsp/error.jsp"); return; @@ -185,7 +186,7 @@ public class AsynchronousRedirectResponder extends HttpServlet si.sign_result = signator.finishSign(si.iui); } - Sign.returnSignResponse(si, response); + SignServlet.returnSignResponse(si, response); } } @@ -195,7 +196,7 @@ public class AsynchronousRedirectResponder extends HttpServlet //SessionTable.remove(si.session_id); e.printStackTrace(); - Sign.prepareDispatchToErrorPage(e, request); + SignServlet.prepareDispatchToErrorPage(e, request); dispatch(request, response, "/jsp/error.jsp"); } diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/FormFields.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/FormFields.java index 6331a54..2285cc6 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/web/FormFields.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/FormFields.java @@ -84,7 +84,7 @@ public abstract class FormFields * The signator mode form field. * @return Returns the corresponding PDFASID. */ - protected static PdfASID translateSignatureModeToPdfASID(String signature_mode) + public static PdfASID translateSignatureModeToPdfASID(String signature_mode) { if (signature_mode.equals(VALUE_MODE_BINARY)) { 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 2008fdc..723bc90 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 @@ -32,7 +32,13 @@ import at.knowcenter.wag.egov.egiz.exceptions.PresentableException; import at.knowcenter.wag.egov.egiz.exceptions.SignatureException; import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder; import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory; -import at.knowcenter.wag.egov.egiz.sig.LocalConnector; +import at.knowcenter.wag.egov.egiz.sig.connectors.LocalConnector; +import at.knowcenter.wag.egov.egiz.sig.SignatureData; +import at.knowcenter.wag.egov.egiz.sig.SignatureDataImpl; +import at.knowcenter.wag.egov.egiz.sig.SignatureObject; +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.LocRefDetachedBKUConnector; +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.SignSignatureObject; +import at.knowcenter.wag.egov.egiz.tools.CodingHelper; /** * Contains commonly used helper functions for the local request procedure. @@ -41,16 +47,21 @@ import at.knowcenter.wag.egov.egiz.sig.LocalConnector; */ public abstract class LocalRequestHelper { + /** + * 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. * @@ -61,40 +72,72 @@ public abstract class LocalRequestHelper * @throws PresentableException * Forwarded exception. */ - public static void processLocalSign(SessionInformation si, + public static String processLocalSign(SessionInformation si, HttpServletRequest request, HttpServletResponse response) throws IOException, PresentableException { - LocalConnector local_conn = (LocalConnector) ConnectorFactory.createConnector(si.connector); - - - // FIXME 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); + String host = request.getServerName(); // "129.27.153.77" + URL loc_ref_URL = new URL(request.getScheme(), host, request.getServerPort(), request.getContextPath() + "/RetrieveSignatureData"); + String loc_ref_url = response.encodeURL(loc_ref_URL.toString()); - // ByteArrayOutputStream baos = new ByteArrayOutputStream(); - // ObjectOutputStream oos = new ObjectOutputStream(baos); - // oos.writeObject(local_requests); - // oos.close(); - // baos.close(); + LocalConnector c = new LocRefDetachedBKUConnector(si.type, loc_ref_url); + String sign_request = c.prepareSignRequest(si.iui.signature_data); + // TODO local URL + String local_request_url = "http://127.0.0.1:3495/http-security-layer-request"; si.requests = new LocalRequest[1]; - si.requests[0] = new LocalRequest(local_conn.getSignURL(si.type), request_string); + si.requests[0] = new LocalRequest(local_request_url, sign_request); 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); + URL data_URL = new URL(request.getScheme(), host, request.getServerPort(), request.getContextPath() + "/DataURL"); + String data_url = response.encodeURL(data_URL.toString()); - // byte [] requests_bytes = baos.toByteArray(); - // String base64 = CodingHelper.encodeBase64(requests_bytes); + request.setAttribute("local_request_url", local_request_url); + request.setAttribute("data_url", data_url); - LocalRequestHelper.prepareDispatchToLocalConnectionPage(si.requests[0], request, response); + return NULL_REQUEST_PAGE_JSP; + + + // TODO make better + // + // LocalConnector local_conn = (LocalConnector) + // ConnectorFactory.createConnector(si.connector); + // + // + // // FIXME 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); } /** @@ -102,6 +145,8 @@ public abstract class LocalRequestHelper * * @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 @@ -111,7 +156,7 @@ public abstract class LocalRequestHelper * @throws ConnectorFactoryException * Forwarded exception. */ - public static void processLocalVerify(SessionInformation si, + public static String processLocalVerify(SessionInformation si, List holders_to_verify, HttpServletRequest request, HttpServletResponse response) throws SignatureException, NormalizeException, IOException, ConnectorFactoryException { @@ -120,36 +165,98 @@ public abstract class LocalRequestHelper si.current_operation = 0; si.finished = false; - request.getSession().setAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION, si); - // SessionTable.put(si); + 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()); - LocalConnector local_conn = (LocalConnector) ConnectorFactory.createConnector(si.connector); + LocalConnector local_conn = new LocRefDetachedBKUConnector(si.type, loc_ref_url); for (int i = 0; i < si.requests.length; i++) { SignatureHolder holder = (SignatureHolder) holders_to_verify.get(i); + SignatureObject s = holder.getSignatureObject(); + + // TODO This whole processing is unnecessary here because only the mime + // type is used. String text_to_be_verified = holder.getSignedText(); - // Normalizer normalizer = new Normalizer(); - // String normalized = normalizer.normalize(holder.signed_text); + SignatureData sd = null; + if (holder.getSignatureObject().isBinary()) + { + byte[] data = CodingHelper.decodeBase64(text_to_be_verified); + sd = new SignatureDataImpl(data, "application/pdf"); + } + else + { + sd = new SignatureDataImpl(text_to_be_verified.getBytes("UTF-8"), "text/plain", "UTF-8"); + } + + SignSignatureObject so = new SignSignatureObject(); + so.date = s.getSignationDate(); + so.signatureValue = s.getSignationValue(); + so.issuer = s.getSignationIssuer(); + so.x509Certificate = s.getX509Cert().getX509Certificate(); + so.id = s.getSignationIds(); + so.kz = s.getKZ().toString(); - String request_string = local_conn.prepareVerifyRequest(text_to_be_verified, holder.getSignatureObject()); + String request_string = local_conn.prepareVerifyRequest(sd, so); - LocalRequest local_request = new LocalRequest(local_conn.getVerifyURL(holder.getSignatureObject().getSignationType()), request_string); + LocalRequest local_request = new LocalRequest("not-needed", 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(); + String local_request_url = "http://127.0.0.1:3495/http-security-layer-request"; + + 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); - // byte [] requests_bytes = baos.toByteArray(); - // String base64 = CodingHelper.encodeBase64(requests_bytes); + return NULL_REQUEST_PAGE_JSP; - prepareDispatchToLocalConnectionPage(si.requests[0], request, response); + // 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); } /** 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 4412c21..0fafca4 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 @@ -24,6 +24,7 @@ import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.log4j.Logger; +import org.apache.log4j.PropertyConfigurator; import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger; import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; @@ -73,7 +74,8 @@ public class PdfASServletContextListener implements ServletContextListener } SettingsReader.initializeForWeb(base_dir); - + PropertyConfigurator.configure(SettingsReader.CONFIG_PATH + "log4j.properties"); + SettingsReader.clearTemporaryDirectory(); } diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/Sign.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/Sign.java deleted file mode 100644 index 2b1c2a4..0000000 --- a/src/main/java/at/knowcenter/wag/egov/egiz/web/Sign.java +++ /dev/null @@ -1,544 +0,0 @@ -/** - * 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: Sign.java,v 1.7 2006/10/11 07:39:13 wprinz Exp $ - */ -package at.knowcenter.wag.egov.egiz.web; - -import java.io.File; -import java.io.IOException; -import java.io.Serializable; -import java.util.Iterator; -import java.util.List; - -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -import org.apache.commons.fileupload.FileItem; -import org.apache.commons.fileupload.FileUploadException; -import org.apache.commons.fileupload.disk.DiskFileItemFactory; -import org.apache.commons.fileupload.servlet.ServletFileUpload; -import org.apache.log4j.Logger; - -import at.knowcenter.wag.egov.egiz.PdfAS; -import at.knowcenter.wag.egov.egiz.PdfASID; -import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger; -import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; -import at.knowcenter.wag.egov.egiz.exceptions.ErrorCodeException; -import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException; -import at.knowcenter.wag.egov.egiz.exceptions.PlaceholderException; -import at.knowcenter.wag.egov.egiz.exceptions.PresentableException; -import at.knowcenter.wag.egov.egiz.framework.SignResult; -import at.knowcenter.wag.egov.egiz.framework.Signator; -import at.knowcenter.wag.egov.egiz.framework.SignatorFactory; -import at.knowcenter.wag.egov.egiz.framework.signators.DetachedSignator_1_0_0; -import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory; -import at.knowcenter.wag.egov.egiz.tools.CodingHelper; - -/** - * This method is the sign servlet for the pdf-as web application. It takes get - * and post requests fill out jsp templates and give the user feedback about the - * results of the sign process - * - * @author wlackner - * @author wprinz - */ -public class Sign extends HttpServlet -{ - - /** - * SVUID. - */ - private static final long serialVersionUID = -4156938216903740438L; - - /** - * Authorisation marker for the http header string. - */ - protected static final String AUTH = "authorization"; - - /** - * Authorisation marker for the http header string. - */ - protected static final String AUTH_BASIC = "Basic"; - - /** - * The logger. - */ - private static final Logger logger_ = ConfigLogger.getLogger(Sign.class); - - protected void dispatch(HttpServletRequest request, - HttpServletResponse response, String resource) throws ServletException, IOException - { - dispatch(request, response, resource, getServletContext()); - } - - protected static void dispatch(HttpServletRequest request, - HttpServletResponse response, String resource, ServletContext context) throws ServletException, IOException - { - response.setContentType("text/html"); - response.setCharacterEncoding("UTF-8"); - - RequestDispatcher disp = context.getRequestDispatcher(resource); - disp.forward(request, response); - } - - /** - * @author modified by tknall - */ - public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException - { - String authenticate = request.getHeader(AUTH); - if (authenticate != null) - { - logger_.info("authenticate:" + authenticate); - if (authenticate.indexOf(AUTH_BASIC) == 0) - { - authenticate = authenticate.substring(AUTH_BASIC.length() + 1); - logger_.info("authenticate:" + authenticate); - authenticate = new String(CodingHelper.decodeBase64(authenticate), "UTF-8"); - logger_.info("authenticate:" + authenticate); - - String[] auth_value = authenticate.split(":"); - String user_name = auth_value[0]; - String user_password = auth_value[1]; - logger_.info("username:" + user_name); - // start modification tknall -// logger_.info("password:" + user_password); - logger_.info("password:XXXXXXXXXXXX"); - // stop modification tknall - - HttpSession session = request.getSession(); - session.setAttribute(SessionAttributes.ATTRIBUTE_USER_NAME, user_name); - session.setAttribute(SessionAttributes.ATTRIBUTE_USER_PASSWORD, user_password); - - dispatch(request, response, "/jsp/signupload.jsp"); - return; - } - // start modification tknall - } else { - String user_name = ""; - String user_password = ""; - logger_.info("authenticate:User has not been authenticated!"); - logger_.info("username: UNKNOWN"); - logger_.info("password: XXXXXXXXXXXX"); - HttpSession session = request.getSession(); - session.setAttribute("uname", user_name); - session.setAttribute("upass", user_password); - dispatch(request, response, "/jsp/signupload.jsp"); - } - -// request.setAttribute("error", "Falsche Authentifikation"); -// request.setAttribute("cause", "Passwort oder Benutzername ist falsch"); -// dispatch(request, response, "/jsp/error.jsp"); - // stop modification tknall - } - - public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException - { - DiskFileItemFactory fif = new DiskFileItemFactory(); - fif.setRepository(SettingsReader.getTemporaryDirectory()); - ServletFileUpload sfu = new ServletFileUpload(fif); - - try - { - List items = sfu.parseRequest(request); - - FileItem preview_fi = null; - FileItem sig_type_fi = null; - FileItem sig_app_fi = null; - FileItem mode_fi = null; - FileItem file_upload_fi = null; - FileItem download_fi = null; - - Iterator it = items.iterator(); - while (it.hasNext()) - { - FileItem item = (FileItem) it.next(); - logger_.debug("item = " + item.getFieldName()); - - if (item.isFormField()) - { - byte[] item_data = item.get(); - String item_string = new String(item_data, "UTF-8"); - logger_.debug(" form field string = " + item_string); - } - else - { - logger_.debug(" filename = " + item.getName()); - logger_.debug(" filesize = " + item.getSize()); - } - - if (item.getFieldName().equals(FormFields.FIELD_PREVIEW)) - { - preview_fi = item; - continue; - } - - if (item.getFieldName().equals(FormFields.FIELD_SIGNATURE_TYPE)) - { - sig_type_fi = item; - continue; - } - - if (item.getFieldName().equals(FormFields.FIELD_CONNECTOR)) - { - sig_app_fi = item; - continue; - } - - if (item.getFieldName().equals(FormFields.FIELD_MODE)) - { - mode_fi = item; - continue; - } - - if (item.getFieldName().equals(FormFields.FIELD_UPLOAD)) - { - file_upload_fi = item; - continue; - } - - if (item.getFieldName().equals(FormFields.FIELD_DOWNLOAD)) - { - download_fi = item; - continue; - } - - throw new ServletException("unrecognized POST data."); - - } - - if (preview_fi == null || sig_type_fi == null || sig_app_fi == null || file_upload_fi == null || download_fi == null) - { - throw new ServletException("Unsufficient data provided in request"); - } - - String mode = mode_fi.getString("UTF-8"); - if (!mode.equals(FormFields.VALUE_MODE_BINARY) && !mode.equals(FormFields.VALUE_MODE_TEXTUAL) && !mode.equals(FormFields.VALUE_MODE_DETACHED)) - { - throw new ServletException("The mode '" + mode + "' is unrecognized."); - } - - String preview_str = preview_fi.getString("UTF-8"); - boolean preview = false; - if (preview_str.equals("true")) - { - preview = true; - } - - boolean download_inline = true; - if (download_fi.getString("UTF-8").equals(FormFields.VALUE_DOWNLOAD_ATTACHMENT)) - { - download_inline = false; - } - - String sig_type = sig_type_fi.getString("UTF-8"); - String connector = sig_app_fi.getString("UTF-8"); - - String doc_file_name = file_upload_fi.getName(); - logger_.debug(" file content type =" + file_upload_fi.getContentType()); - - String extension = Verify.extractExtension(doc_file_name); - if (extension != null && !extension.equals("pdf")) - { - throw new PDFDocumentException(201, "The provided file '" + doc_file_name + "' doesn't have the PDF extension (.pdf)."); - } - - byte[] pdf = file_upload_fi.get(); - if (file_upload_fi.getSize() <= 0) - { - throw new PDFDocumentException(250, "The document is empty."); - } - PdfAS.applyStrictMode(pdf); - - String user_name = (String) request.getSession().getAttribute(SessionAttributes.ATTRIBUTE_USER_NAME); - String user_password = (String) request.getSession().getAttribute(SessionAttributes.ATTRIBUTE_USER_PASSWORD); - - SessionInformation si = new SessionInformation(); // SessionTable.generateSessionInformationObject(); - si.connector = connector; - si.application = "sign"; - si.mode = mode; - si.pdf = pdf; - si.type = sig_type; - si.user_name = user_name; - si.user_password = user_password; - si.filename = formatFileName(file_upload_fi.getName()); - si.download_inline = download_inline; - - prepareSign(si); - - if (preview) - { - request.getSession().setAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION, si); - - String submit_url = response.encodeURL(request.getContextPath() + "/SignPreview"); - - request.setAttribute("submit_url", submit_url); - - dispatch(request, response, "/jsp/signpreview.jsp"); - - return; - } - - finishSign(si, request, response, getServletContext()); - } - catch (FileUploadException e) - { - request.setAttribute("error", "Fehler beim Upload der Daten"); - request.setAttribute("cause", "Beim Upload der Daten ist ein Fehler aufgetreten."); - dispatch(request, response, "/jsp/error.jsp"); - } - catch (PresentableException e) - { - e.printStackTrace(); - prepareDispatchToErrorPage(e, request); - dispatch(request, response, "/jsp/error.jsp"); - } - } - - public static void prepareSign(SessionInformation si) throws PresentableException - { - PdfASID algorithm = FormFields.translateSignatureModeToPdfASID(si.mode); - Signator signator = SignatorFactory.createSignator(algorithm); - si.iui = signator.prepareSign(si.pdf, si.type, null, ConnectorFactory.needsSIG_ID(si.connector)); - } - - public static void finishSign(SessionInformation si, - HttpServletRequest request, HttpServletResponse response, ServletContext context) throws PresentableException, IOException, ServletException - { - if (ConnectorFactory.isConnectorLocal(si.connector)) - { - LocalRequestHelper.processLocalSign(si, request, response); - dispatch(request, response, LocalRequestHelper.LOCAL_CONNECTION_PAGE_JSP, context); - return; - } - - PdfASID algorithm = FormFields.translateSignatureModeToPdfASID(si.mode); - Signator signator = SignatorFactory.createSignator(algorithm); - - // FIXME refactor WEB - si.iui.signed_signature_object = null; //PdfAS.sign(si.iui.document_text, si.type, si.connector, si.user_name, si.user_password); - - si.sign_result = signator.finishSign(si.iui); - - returnSignResponse(si, response); - } - - public static void prepareDispatchToErrorPage(PresentableException pe, - HttpServletRequest request) - { - if (pe instanceof ErrorCodeException) - { - ErrorCodeException ece = (ErrorCodeException) pe; - request.setAttribute("error", "Fehler " + ece.getErrorCode()); - - String cause = ece.getErrorCodeMessage(); - if (ece.hasExternalErrorMessage()) - { - cause = ece.getExternalErrorCode() + ": " + ece.getExternalErrorMessage(); - } - request.setAttribute("cause", cause); - - if (pe instanceof PlaceholderException) - { - PlaceholderException phe = (PlaceholderException) ece; - - request.setAttribute("cause", "Der Platzhalter des Feldes " + phe.getField() + " ist um " + phe.getMissing() + " Bytes zu kurz. " + ece.getErrorCodeMessage()); - } - } - else - { - request.setAttribute("error", "PresentableException"); - request.setAttribute("cause", pe.toString()); - } - } - - public void dispatchToPreview(String document_text, String connector, - String mode, String signature_type, String submit_url, - HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException - { - request.setAttribute("document_text", document_text); - request.setAttribute("connector", connector); - request.setAttribute("mode", mode); - request.setAttribute("signature_type", signature_type); - request.setAttribute("submit_url", submit_url); - - dispatch(request, response, "/jsp/signpreview.jsp"); - } - - // public static void formatPreview(String document_text, String connector, - // String mode, String signature_type, String submit_url, - // HttpServletResponse response) throws ServletException, IOException - // { - // response.setContentType("text/html"); - // response.setCharacterEncoding("UTF-8"); - // - // PrintWriter writer = response.getWriter(); - // - // writer.println(""); - // writer.println(""); - // writer.println(""); - // writer.println(""); - // writer.println(""); - // writer.println("PDF-AS Amtssignaturen Vorschau"); - // writer.println(""); - // writer.println(""); - // - // writer.println(""); - // writer.println("
"); - // - // writer.println("

PDF-AS Amtssignaturen

"); - // - // writer.println("
"); - // writer.println("
Vorschau: Dokument Prüfen
"); - // writer.println("
"); - // writer.println("
"); - // - // writer.println(""); - // writer.println(""); - // writer.println(""); - // writer.println(""); - // writer.println(""); - // - // writer.println(""); - // writer.println("
"); - // - // writer.println(""); - // - // writer.println("
"); - // writer.println("
"); - // writer.println("
"); - // - // writer.println("zurück"); - // - // writer.println("
"); - // writer.println(""); - // - // writer.println(""); - // } - - /** - * This class is just used to put the pdf byte array into the session. - * - * @author wprinz - */ - protected class SignPreviewInfo implements Serializable - { - /** - * SVUID. - */ - private static final long serialVersionUID = 3102824040163616332L; - - public byte[] pdf = null; - - public String mode = null; - } - - /** - * Formats the file name so that it is suitable for content disposition. - * - * @param file_name - * The file name. - * @return Returns the formatted file name. - */ - public static String formatFileName(String file_name) - { - File file = new File(file_name); - String file_name_only = file.getName(); - // the file_name contains \\ ==> remove them so Internet Explorer works - // correctly. - return file_name_only; - } - - /** - * Formats the file name according to the SignResult. - * - * @param file_name - * The file name. - * @param sign_result - * The sign result. - * @return Returns the formatted file name. - */ - public static String formatFileNameForSignResult(String file_name, - SignResult sign_result) - { - String output = file_name + "_signed"; - if (sign_result.getMimeType().equals(DetachedSignator_1_0_0.MIME_TYPE)) - { - output += ".xml"; - } - else - { - output += ".pdf"; - } - - return output; - } - - /** - * Returns the data in the SignResult with proper content disposition. - * - * @param si - * SessionInformation. - * @param response - * The servlet response. - * @throws IOException - * The IO Exception. - */ - public static void returnSignResponse(SessionInformation si, - HttpServletResponse response) throws IOException - { - SignResult sign_result = si.sign_result; - - String file_name = formatFileNameForSignResult(si.filename, sign_result); - - // The name parameter is actually deprecated in favour of Content-Disposition filename - // Unfortunately Acrobat reader does recognize neither of these parameters - // with its inline save-as. It always takes the page name. - response.setContentType(sign_result.getMimeType() + "; name=\"" + file_name + "\""); - if (si.download_inline) - { - response.addHeader("Content-Disposition", "inline; filename=\"" + file_name + "\""); - } - else - { - response.addHeader("Content-Disposition", "attachment; filename=\"" + file_name + "\""); - } - response.getOutputStream().write(sign_result.getData()); - - } -} \ No newline at end of file diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/SignPreview.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/SignPreview.java deleted file mode 100644 index 1b32bdf..0000000 --- a/src/main/java/at/knowcenter/wag/egov/egiz/web/SignPreview.java +++ /dev/null @@ -1,105 +0,0 @@ -/** - * 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: SignPreview.java,v 1.2 2006/10/11 07:39:13 wprinz Exp $ - */ -package at.knowcenter.wag.egov.egiz.web; - -import java.io.IOException; - -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -import at.knowcenter.wag.egov.egiz.exceptions.ErrorCodeException; -import at.knowcenter.wag.egov.egiz.exceptions.PresentableException; - -/** - * @author wprinz - */ -public class SignPreview extends HttpServlet -{ - - /** - * SVUID. - */ - private static final long serialVersionUID = -8818532511322299998L; - - protected void dispatch(HttpServletRequest request, - HttpServletResponse response, String resource) throws ServletException, IOException - { - response.setContentType("text/html"); - response.setCharacterEncoding("UTF-8"); - - RequestDispatcher disp = getServletContext().getRequestDispatcher(resource); - disp.forward(request, response); - } - - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException - { - SessionInformation si = null; - HttpSession session = null; - try - { - session = request.getSession(false); - // String session_id_string = request.getParameter("session"); - if (session == null) - { - throw new ErrorCodeException(600, "The session is missing."); - } - - si = (SessionInformation) session.getAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION); - // long session_id = Long.parseLong(session_id_string); - // si = SessionTable.get(session_id); - if (si == null) - { - throw new ErrorCodeException(600, "The session is not found or is no longer valid."); - } - - } - catch (PresentableException e) - { - e.printStackTrace(); - Sign.prepareDispatchToErrorPage(e, request); - dispatch(request, response, "/jsp/error.jsp"); - - return; - } - - try - { - String preview = request.getParameter(FormFields.FIELD_PREVIEW); - if (preview != null && preview.equals(FormFields.VALUE_TRUE)) - { - response.setContentType("application/pdf"); - response.getOutputStream().write(si.iui.signed_pdf); - return; - } - else - { - Sign.finishSign(si, request, response, getServletContext()); - } - } - catch (PresentableException e) - { - e.printStackTrace(); - Sign.prepareDispatchToErrorPage(e, request); - dispatch(request, response, "/jsp/error.jsp"); - } - } -} diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/Verify.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/Verify.java deleted file mode 100644 index a8a5a5b..0000000 --- a/src/main/java/at/knowcenter/wag/egov/egiz/web/Verify.java +++ /dev/null @@ -1,285 +0,0 @@ -/* - * 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: Verify.java,v 1.7 2006/10/11 07:39:13 wprinz Exp $ - */ -package at.knowcenter.wag.egov.egiz.web; - -import java.io.IOException; -import java.util.Iterator; -import java.util.List; - -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.fileupload.FileItem; -import org.apache.commons.fileupload.FileUploadException; -import org.apache.commons.fileupload.disk.DiskFileItemFactory; -import org.apache.commons.fileupload.servlet.ServletFileUpload; -import org.apache.log4j.Logger; - -import at.knowcenter.wag.egov.egiz.PdfAS; -import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger; -import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; -import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException; -import at.knowcenter.wag.egov.egiz.exceptions.PresentableException; -import at.knowcenter.wag.egov.egiz.framework.VerificationFilter; -import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory; - -/** - * This method is the verify servlet for the pdf-as web application. It takes - * get and post requests fill out jsp templates and give the user feedback about - * the results of the verify process. - * - * @author wlackner - * @author wprinz - */ -public class Verify extends HttpServlet -{ - - /** - * SVUID. - */ - private static final long serialVersionUID = 309198792358636766L; - - /** - * The logger. - */ - private static final Logger logger_ = ConfigLogger.getLogger(Verify.class); - - protected void dispatch(HttpServletRequest request, - HttpServletResponse response, String resource) throws ServletException, IOException - { - response.setContentType("text/html"); - response.setCharacterEncoding("UTF-8"); - - RequestDispatcher disp = getServletContext().getRequestDispatcher(resource); - disp.forward(request, response); - } - - protected void dispatchToResults(List results, HttpServletRequest request, - HttpServletResponse response) throws ServletException, IOException - { - request.setAttribute("results", results); - dispatch(request, response, "/jsp/results.jsp"); - } - - - public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException - { - dispatch(request, response, "/jsp/verifyupload.jsp"); - } - - public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException - { - - DiskFileItemFactory fif = new DiskFileItemFactory(); - fif.setRepository(SettingsReader.getTemporaryDirectory()); - ServletFileUpload sfu = new ServletFileUpload(fif); - - try - { - - List items = sfu.parseRequest(request); - - FileItem upload_fi = null; - FileItem connector_fi = null; -// FileItem mode_fi = null; - FileItem preview_fi = null; - - { - Iterator it = items.iterator(); - while (it.hasNext()) - { - FileItem item = (FileItem) it.next(); - logger_.debug("item = " + item.getFieldName()); - - if (item.isFormField()) - { - byte[] item_data = item.get(); - String item_string = new String(item_data, "UTF-8"); - logger_.debug(" form field string = " + item_string); - } - else - { - logger_.debug(" filename = " + item.getName()); - logger_.debug(" filesize = " + item.getSize()); - } - - if (item.getFieldName().equals(FormFields.FIELD_UPLOAD)) - { - upload_fi = item; - continue; - } - - if (item.getFieldName().equals(FormFields.FIELD_CONNECTOR)) - { - connector_fi = item; - continue; - } - -// if (item.getFieldName().equals(FormFields.FIELD_MODE)) -// { -// mode_fi = item; -// continue; -// } - - if (item.getFieldName().equals(FormFields.FIELD_PREVIEW)) - { - preview_fi = item; - continue; - } - - throw new ServletException("unrecognized POST data."); - } - } - - if (upload_fi == null || connector_fi == null || /*mode_fi == null ||*/ preview_fi == null) - { - throw new ServletException("Unsufficient data provided in request."); - } - - String connector = connector_fi.getString("UTF-8"); - -// String mode = mode_fi.getString("UTF-8"); -// if (!mode.equals(FormFields.VALUE_MODE_BINARY) && !mode.equals(FormFields.VALUE_MODE_TEXTUAL)) -// { -// throw new ServletException("The mode '" + mode + "' is unrecognized."); -// } - - String preview_str = preview_fi.getString("UTF-8"); - if (!preview_str.equals(FormFields.VALUE_TRUE) && !preview_str.equals(FormFields.VALUE_FALSE)) - { - throw new ServletException("The preview '" + preview_str + "' is unrecognized."); - } - boolean preview = false; - if (preview_str.equals(FormFields.VALUE_TRUE)) - { - preview = true; - } - - // process the request - logger_.debug("file content type =" + upload_fi.getContentType()); - logger_.debug("file size = " + upload_fi.getSize()); - if (upload_fi.getSize() <= 0) - { - throw new PDFDocumentException(250, "The document is empty."); - } - byte[] document_bytes = upload_fi.get(); - - VerificationFilter vf = new VerificationFilter(); - List signature_holders = null; - - String doc_file_name = upload_fi.getName(); - String extension = extractExtension(doc_file_name); - - String raw_text = null; - if (doc_file_name == null || (extension != null && extension.equals("txt"))) - { - raw_text = new String(document_bytes, "UTF-8"); - signature_holders = vf.extractSignaturesFromPlainText(raw_text); - } - else - { - signature_holders = vf.extractSignaturesFromPdf(document_bytes); - } - - if (signature_holders.size() == 0) - { - throw new PDFDocumentException(206, "PDF document not signed."); - } - - if (preview) - { - SessionInformation si = new SessionInformation(); - si.application = "verify"; - si.connector = connector; - si.signature_holders = signature_holders; - request.getSession().setAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION, si); - - dispatch(request, response, "/jsp/verifylist.jsp"); - //VerifyPreview.formatPreview(signature_holders, connector, request, response); - } - else - { - if (ConnectorFactory.isConnectorLocal(connector)) - { - SessionInformation si = new SessionInformation(); //SessionTable.generateSessionInformationObject(); - si.connector = connector; - si.application = "verify"; - si.mode = null; - si.pdf = null; - si.type = null; - si.user_name = null; - si.user_password = null; - - si.signature_holders = signature_holders; - - LocalRequestHelper.processLocalVerify(si, si.signature_holders, request, response); - dispatch(request, response, LocalRequestHelper.LOCAL_CONNECTION_PAGE_JSP); - return; - } - - List results = PdfAS.verifySignatureHolders(signature_holders, connector); - dispatchToResults(results, request, response); - } - - } - catch (FileUploadException e) - { - request.setAttribute("error", "Fehler beim Upload der Daten"); - request.setAttribute("cause", "Beim Upload der Daten ist ein Fehler aufgetreten."); - dispatch(request, response, "/jsp/error.jsp"); - } - catch (PresentableException e) - { - e.printStackTrace(); - Sign.prepareDispatchToErrorPage(e, request); - dispatch(request, response, "/jsp/error.jsp"); - } - - } - - /** - * Extracts the extension from a file name string. - * - *

- * The extension of a file name is whatever text follows the last '.'. - *

- * - * @param file_name - * The file name. - * @return Returns the extension. If the file name ends with the '.', then an - * empty string is returned. If the file name doesn't contain any '.' - * or file_name is null, null is returned. - */ - public static String extractExtension(String file_name) - { - if (file_name == null) - { - return null; - } - - int dot_index = file_name.lastIndexOf('.'); - if (dot_index < 0) - { - return null; - } - return file_name.substring(dot_index + 1); - } -} \ No newline at end of file diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/VerifyPreview.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/VerifyPreview.java deleted file mode 100644 index c39fd91..0000000 --- a/src/main/java/at/knowcenter/wag/egov/egiz/web/VerifyPreview.java +++ /dev/null @@ -1,704 +0,0 @@ -/** - * 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: VerifyPreview.java,v 1.4 2006/10/11 07:39:13 wprinz Exp $ - */ -package at.knowcenter.wag.egov.egiz.web; - -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -import org.apache.commons.fileupload.FileItem; -import org.apache.commons.fileupload.FileUploadException; -import org.apache.commons.fileupload.disk.DiskFileItemFactory; -import org.apache.commons.fileupload.servlet.ServletFileUpload; -import org.apache.log4j.Logger; - -import at.knowcenter.wag.egov.egiz.PdfAS; -import at.knowcenter.wag.egov.egiz.PdfASID; -import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger; -import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; -import at.knowcenter.wag.egov.egiz.exceptions.ErrorCodeException; -import at.knowcenter.wag.egov.egiz.exceptions.InvalidIDException; -import at.knowcenter.wag.egov.egiz.exceptions.PresentableException; -import at.knowcenter.wag.egov.egiz.exceptions.SignatureException; -import at.knowcenter.wag.egov.egiz.pdf.BinarySignatureHolder; -import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder; -import at.knowcenter.wag.egov.egiz.pdf.TextualSignatureHolder; -import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory; -import at.knowcenter.wag.egov.egiz.sig.SignatureEntry; -import at.knowcenter.wag.egov.egiz.sig.SignatureObject; -import at.knowcenter.wag.egov.egiz.sig.SignatureTypes; - -/** - * @author wprinz - */ -public class VerifyPreview extends HttpServlet -{ - /** - * SVUID. - */ - private static final long serialVersionUID = 6954343542890239109L; - - /** - * The logger. - */ - private static final Logger logger_ = ConfigLogger.getLogger(VerifyPreview.class); - - protected void dispatch(HttpServletRequest request, - HttpServletResponse response, String resource) throws ServletException, IOException - { - response.setContentType("text/html"); - response.setCharacterEncoding("UTF-8"); - - RequestDispatcher disp = getServletContext().getRequestDispatcher(resource); - disp.forward(request, response); - } - - protected static String generateNamePrefix(int num) - { - return SIG_INPUT_PREFIX + num + "_"; - } - - // public static void formatPreview(List signature_holders, String connector, - // HttpServletRequest request, HttpServletResponse response) throws - // ServletException, IOException - // { - // response.setContentType("text/html"); - // response.setCharacterEncoding("UTF-8"); - // - // PrintWriter writer = response.getWriter(); - // - // writer.println(""); - // writer.println(""); - // writer.println(""); - // writer.println(""); - // writer.println("PDF-AS Amtssignaturen Vorschau"); - // writer.println(""); - // - // writer.println(""); - // - // writer.println(""); - // - // writer.println(""); - // writer.println("
"); - // - // writer.println("

PDF-AS Amtssignaturen

"); - // - // writer.println("
"); - // writer.println("
Vorschau: Dokument Prüfen
"); - // writer.println("
"); - // writer.println("
"); - // - // // writer.println(""); - // writer.println(""); - // - // // if (mode.equals(FormFields.VALUE_MODE_TEXTUAL)) - // // { - // // String raw_document_text = ((SignatureHolder) - // // signature_holders.get(0)).signed_text; - // // writer.println(""); - // // writer.println("
"); - // // } - // - // if (signature_holders.size() == 1) - // { - // writer.println("
Rekonstruktion der Signaturmarke:
"); - // } - // else - // { - // writer.println("
Rekonstruktion der Signaturmarken:
"); - // } - // - // // this special
is only needed because internet explorer doesn't - // // format the width of the - // // tables right when the div is not given. - // // probably this is because the table then tries to calculate the relative - // // width from the surrounding form object. - // writer.println("
"); - // int num = 0; - // Iterator it = signature_holders.iterator(); - // while (it.hasNext()) - // { - // SignatureHolder signature_holder = (SignatureHolder) it.next(); - // - // String name_prefix = generateNamePrefix(num); - // - // String input_key = name_prefix + FormFields.FIELD_RAW_DOCUMENT_TEXT; - // if (signature_holder.signature_object.isBinary()) - // { - // writer.println(""); - // } - // else - // { - // writer.println("
"); - // writer.println(""); - // writer.println("
"); - // } - // - // String html = renderRequiredKeys(signature_holder.signature_object, - // name_prefix, false); - // writer.println(html); - // - // writer.println(""); - // - // num++; - // } - // writer.println("
"); - // - // writer.println("");// + - // // FormFields.VALUE_VERIFY_WHICH_ALL - // // + - // // "\" - // // />"); - // writer.println(""); - // - // writer.println("
"); - // writer.println(""); - // writer.println("
"); - // - // writer.println("zurück"); - // - // writer.println("
"); - // writer.println(""); - // - // writer.println(""); - // - // } - - public static String renderRequiredKeysJavaScript( - SignatureObject signature_object, String name_prefix) - { - StringWriter sw = new StringWriter(); - PrintWriter writer = new PrintWriter(sw); - - String[] rkeys = SignatureTypes.REQUIRED_SIG_KEYS; - - for (int key_idx = 0; key_idx < rkeys.length; key_idx++) - { - String key = rkeys[key_idx]; - SignatureEntry entry = signature_object.getSigEntry(key); - String value = entry.getValue(); - if (SignatureTypes.SIG_ID.equals(key) && value == null) - { - continue; - } - - value = value.replaceAll("\\s", " "); - value = value.replaceAll("\\\"", "\\\""); - - String input_key = name_prefix + key; - - writer.println(" document.submitform." + input_key + ".value = \"" + value + "\";"); - } - - return sw.toString(); - } - - public static String renderRequiredKeys(SignatureObject signature_object, - String name_prefix, boolean write_value) - { - StringWriter sw = new StringWriter(); - PrintWriter writer = new PrintWriter(sw); - - writer.println(""); - - String[] rkeys = SignatureTypes.REQUIRED_SIG_KEYS; - - for (int key_idx = 0; key_idx < rkeys.length; key_idx++) - { - String key = rkeys[key_idx]; - SignatureEntry entry = signature_object.getSigEntry(key); - String caption = entry.getCaption(); - String value = entry.getValue(); - if (SignatureTypes.SIG_ID.equals(key) && value == null) - { - continue; - } - - writer.println(" "); - writer.println(" "); - writer.println(" "); - writer.println(" "); - } - writer.println("
" + caption + ":"); - - value = value.replaceAll("\\s", " "); - value = value.replaceAll("\\\"", "\\\""); - - String input_key = name_prefix + key; - writer.println(" "); - - writer.println("
"); - - return sw.toString(); - } - - public static String renderRequiredKeysText(SignatureObject signature_object) - { - StringWriter sw = new StringWriter(); - PrintWriter writer = new PrintWriter(sw); - - String title = "alte PDF-AS Signatur"; - try - { - PdfASID kz = signature_object.getKZ(); - if (kz != null) - { - title = kz.toString(); - } - } - catch (InvalidIDException e) - { - e.printStackTrace(); - } - writer.println("
Signatur: " + title + "
"); - writer.println(""); - - // just render useful information - String[] rkeys = { SignatureTypes.SIG_DATE, SignatureTypes.SIG_ISSUER, - SignatureTypes.SIG_NUMBER }; // SignatureTypes.REQUIRED_SIG_KEYS; - - for (int key_idx = 0; key_idx < rkeys.length; key_idx++) - { - String key = rkeys[key_idx]; - SignatureEntry entry = signature_object.getSigEntry(key); - String caption = entry.getCaption(); - String value = entry.getValue(); - if (SignatureTypes.SIG_ID.equals(key) && value == null) - { - continue; - } - - writer.println(" "); - writer.println(" "); - writer.println(" "); - writer.println(" "); - } - writer.println("
" + caption + ":"); - - value = value.replaceAll("\\s", " "); - value = value.replaceAll("\\\"", "\\\""); - - writer.println(" " + value); - - writer.println("
"); - - return sw.toString(); - } - - protected void dispatchToResults(List results, HttpServletRequest request, - HttpServletResponse response, boolean backbutton) throws ServletException, IOException - { - request.setAttribute("results", results); - request.setAttribute("backbutton", backbutton ? "true" : "false"); - dispatch(request, response, "/jsp/results.jsp"); - } - - // public static void formatVerifyResults(List results, - // HttpServletResponse response) throws IOException, SettingNotFoundException - // { - // response.setContentType("text/html"); - // response.setCharacterEncoding("UTF-8"); - // - // PrintWriter writer = response.getWriter(); - // - // writer.println(""); - // writer.println(""); - // writer.println(""); - // writer.println(""); - // writer.println("PDF-AS Amtssignaturen Resultat"); - // writer.println(""); - // writer.println(""); - // - // writer.println(""); - // writer.println("
"); - // - // writer.println("

PDF-AS Amtssignaturen

"); - // - // writer.println("
"); - // writer.println("
Resultat
"); - // writer.println("
"); - // - // Iterator it = results.iterator(); - // while (it.hasNext()) - // { - // SignatureResponse result = (SignatureResponse) it.next(); - // formatSignatureResponse(result, writer); - // - // if (it.hasNext()) - // { - // writer.println("
"); - // } - // } - // - // writer.println("
"); - // writer.println("
"); - // - // writer.println("zurück"); - // - // writer.println("
"); - // writer.println(""); - // - // writer.println(""); - // - // } - // - // public static void formatSignatureResponse(SignatureResponse result, - // PrintWriter writer) throws SettingNotFoundException - // { - // writer.println("
Zertifikat"); - // writer.println(""); - // writer.println(" "); - // writer.println(" "); - // writer.println(" "); - // List public_properties = result.getPublicProperties(); - // Iterator it = public_properties.iterator(); - // while (it.hasNext()) - // { - // String public_property = (String) it.next(); - // writer.println(" "); - // } - // - // writer.println(" "); - // - // writer.println("
Signator:" + - // result.getX509SubjectName() + "
Aussteller:" + - // result.getX509IssuerName() + "
Seriennummer:" + - // result.getX509SerialNumber() + "
Eigenschaft:" + - // public_property + "
Zertifikat:" + result.getCertificateCheckInfo() - // + "
"); - // writer.println("
"); - // writer.println("
Signatur-Check"); - // writer.println("
" + result.getSignatureCheckInfo() + "
"); - // writer.println("
"); - // writer.println("
Manifest-Check"); - // writer.println("
" + - // result.getSignatureManifestCheckInfo() + "
"); - // writer.println("
"); - // } - - /** - * Form field name prefix for signature table names - */ - public static final String SIG_INPUT_PREFIX = "sig_inp_"; - - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException - { - SessionInformation si = null; - HttpSession session = null; - try - { - session = request.getSession(false); - // String session_id_string = request.getParameter("session"); - if (session == null) - { - throw new ErrorCodeException(600, "The session is missing."); - } - - si = (SessionInformation) session.getAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION); - // long session_id = Long.parseLong(session_id_string); - // si = SessionTable.get(session_id); - if (si == null) - { - throw new ErrorCodeException(600, "The session is not found or is no longer valid."); - } - - } - catch (PresentableException e) - { - e.printStackTrace(); - Sign.prepareDispatchToErrorPage(e, request); - dispatch(request, response, "/jsp/error.jsp"); - - return; - } - - try - { - - int verify_which = -1; - boolean preview = false; - - { - String str_verify_which = request.getParameter(FormFields.FIELD_VERIFY_WHICH); - logger_.debug("verify_which = " + str_verify_which); - if (str_verify_which.equals(FormFields.VALUE_VERIFY_WHICH_ALL)) - { - verify_which = -1; - } - else - { - verify_which = Integer.parseInt(str_verify_which); - } - logger_.debug("verify_which = " + verify_which); - } - - { - String preview_string = request.getParameter(FormFields.FIELD_PREVIEW); - if (preview_string.equals("true")) - { - preview = true; - } - } - - List holders_to_verify = si.signature_holders; - - if (verify_which >= 0) - { - if (verify_which >= si.signature_holders.size()) - { - throw new SignatureException(312, "The selected signature to be verified doesn't exist."); - } - - SignatureHolder holder = (SignatureHolder) si.signature_holders.get(verify_which); - holders_to_verify = new ArrayList(); - holders_to_verify.add(holder); - - if (preview == true) - { - if (holder instanceof BinarySignatureHolder) - { - BinarySignatureHolder binary_holder = (BinarySignatureHolder) holder; - response.setContentType("application/pdf"); - response.getOutputStream().write(binary_holder.getSignedPdf(), 0, binary_holder.getSignedPdfLength()); - } - else - // if (holder.getSignatureObject().isTextual()) - { - // formatPreview(holders_to_verify, si.connector, request, - // response); - request.setAttribute(FormFields.FIELD_VERIFY_WHICH, new Integer(verify_which)); - dispatch(request, response, "/jsp/verifypreview.jsp"); - } - - return; - } - - } - - if (ConnectorFactory.isConnectorLocal(si.connector)) - { - LocalRequestHelper.processLocalVerify(si, holders_to_verify, request, response); - dispatch(request, response, LocalRequestHelper.LOCAL_CONNECTION_PAGE_JSP); - return; - } - - List results = PdfAS.verifySignatureHolders(holders_to_verify, si.connector); - boolean backbutton = true; - if (verify_which >= 0) - { - backbutton = false; - } - dispatchToResults(results, request, response, backbutton); - - } - catch (PresentableException e) - { - e.printStackTrace(); - Sign.prepareDispatchToErrorPage(e, request); - dispatch(request, response, "/jsp/error.jsp"); - } - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException - { - SessionInformation si = null; - HttpSession session = null; - try - { - session = request.getSession(false); - // String session_id_string = request.getParameter("session"); - if (session == null) - { - throw new ErrorCodeException(600, "The session is missing."); - } - - si = (SessionInformation) session.getAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION); - // long session_id = Long.parseLong(session_id_string); - // si = SessionTable.get(session_id); - if (si == null) - { - throw new ErrorCodeException(600, "The session is not found or is no longer valid."); - } - - } - catch (PresentableException e) - { - e.printStackTrace(); - Sign.prepareDispatchToErrorPage(e, request); - dispatch(request, response, "/jsp/error.jsp"); - - return; - } - - DiskFileItemFactory fif = new DiskFileItemFactory(); - fif.setRepository(SettingsReader.getTemporaryDirectory()); - ServletFileUpload sfu = new ServletFileUpload(fif); - - try - { - String text_to_be_verified = null; - SignatureObject signature_object = new SignatureObject(); - - String default_type = SettingsReader.getInstance().getValueFromKey(SignatureTypes.DEFAULT_TYPE); - signature_object.setSigType(default_type); - signature_object.initByType(); - - int verify_which = -1; - boolean verify = false; - - List items = sfu.parseRequest(request); - - Iterator it = items.iterator(); - while (it.hasNext()) - { - FileItem item = (FileItem) it.next(); - logger_.debug("item = " + item.getFieldName()); - - if (item.getFieldName().equals(FormFields.FIELD_RAW_DOCUMENT_TEXT)) - { - String raw_document_text = item.getString("UTF-8"); - text_to_be_verified = PdfAS.normalizeText(raw_document_text); - continue; - } - - if (item.getFieldName().equals(FormFields.FIELD_VERIFY_WHICH)) - { - String which_str = item.getString("UTF-8"); - verify_which = Integer.parseInt(which_str); - continue; - } - - if (item.getFieldName().equals("verify")) - { - if (item.getString("UTF-8").equals("true")) - { - verify = true; - } - continue; - } - - String key = item.getFieldName(); - String value = item.getString("UTF-8"); - - signature_object.setSigValue(key, value); - logger_.debug("sig_obj_number" + key + " = " + value); - } - - SignatureHolder new_holder = new TextualSignatureHolder(text_to_be_verified, signature_object); - si.signature_holders.set(verify_which, new_holder); - - if (verify == false) - { - dispatch(request, response, "/dataok.html"); - return; - } - - List holders_to_verify = si.signature_holders; - - if (verify_which >= 0) - { - if (verify_which >= si.signature_holders.size()) - { - throw new SignatureException(312, "The selected signature to be verified doesn't exist."); - } - - SignatureHolder holder = (SignatureHolder) si.signature_holders.get(verify_which); - holders_to_verify = new ArrayList(); - holders_to_verify.add(holder); - } - - if (ConnectorFactory.isConnectorLocal(si.connector)) - { - LocalRequestHelper.processLocalVerify(si, holders_to_verify, request, response); - dispatch(request, response, LocalRequestHelper.LOCAL_CONNECTION_PAGE_JSP); - return; - } - - List results = PdfAS.verifySignatureHolders(holders_to_verify, si.connector); - dispatchToResults(results, request, response, true); - } - catch (FileUploadException e) - { - request.setAttribute("error", "Fehler beim Upload der Daten"); - request.setAttribute("cause", "Beim Upload der Daten ist ein Fehler aufgetreten."); - dispatch(request, response, "/jsp/error.jsp"); - } - catch (PresentableException e) - { - e.printStackTrace(); - Sign.prepareDispatchToErrorPage(e, request); - dispatch(request, response, "/jsp/error.jsp"); - } - - } -} 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 new file mode 100644 index 0000000..7d7220c --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/DataURLServlet.java @@ -0,0 +1,199 @@ +/** + * + */ +package at.knowcenter.wag.egov.egiz.web.servlets; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import at.knowcenter.wag.egov.egiz.PdfASID; +import at.knowcenter.wag.egov.egiz.exceptions.PresentableException; +import at.knowcenter.wag.egov.egiz.framework.Signator; +import at.knowcenter.wag.egov.egiz.framework.SignatorFactory; +import at.knowcenter.wag.egov.egiz.sig.SignatureResponse; +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.sig.connectors.bku.EnvelopedBase64BKUConnector; +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.LocRefDetachedBKUConnector; +import at.knowcenter.wag.egov.egiz.web.FormFields; +import at.knowcenter.wag.egov.egiz.web.LocalRequest; +import at.knowcenter.wag.egov.egiz.web.SessionAttributes; +import at.knowcenter.wag.egov.egiz.web.SessionInformation; + +/** + * @author wprinz + * + */ +public class DataURLServlet extends HttpServlet +{ + + /** + * SVUID. + */ + private static final long serialVersionUID = -5846618335843762752L; + + /** + * The log. + */ + private static Log log = LogFactory.getLog(DataURLServlet.class); + + protected void dispatch(HttpServletRequest request, + HttpServletResponse response, String resource) throws ServletException, IOException + { + dispatch(request, response, resource, getServletContext()); + } + + protected static void dispatch(HttpServletRequest request, + HttpServletResponse response, String resource, ServletContext context) throws ServletException, IOException + { + response.setContentType("text/html"); + response.setCharacterEncoding("UTF-8"); + + RequestDispatcher disp = context.getRequestDispatcher(resource); + disp.forward(request, response); + } + + protected void dispatchToResults(List results, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException + { + request.setAttribute("results", results); + dispatch(request, response, "/jsp/results.jsp"); + } + + /** + * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + log.debug("Data URL is accessed."); //$NON-NLS-1$ + + HttpSession session = request.getSession(false); + if (session == null) + { + String msg = "There is no session associated with this request."; //$NON-NLS-1$ + log.error(msg); + throw new ServletException(msg); + } + + SessionInformation si = (SessionInformation) session.getAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION); + if (si == null) + { + String msg = "The session is not found or no longer valid."; //$NON-NLS-1$ + log.error(msg); + throw new ServletException(msg); + } + + try + { + log.debug("Request character encoding = " + request.getCharacterEncoding()); //$NON-NLS-1$ + if (request.getCharacterEncoding() == null || request.getCharacterEncoding().equals("UTF-8")) //$NON-NLS-1$ + { + log.error("The BKU didn't set a character encoding for the request."); //$NON-NLS-1$ + + log.warn("Manually setting character encoding to UTF-8"); //$NON-NLS-1$ + request.setCharacterEncoding("UTF-8"); //$NON-NLS-1$ + } + + String xml_response = request.getParameter("XMLResponse"); //$NON-NLS-1$ + log.debug("xml_response = " + xml_response); //$NON-NLS-1$ + + if (isNullResponse(xml_response)) + { + log.debug("Received a NullOperationResponse -> answering with the first request."); //$NON-NLS-1$ + + assert si.current_operation == 0; + } + else + { + log.debug("Recieved a normal response -> storing the response."); //$NON-NLS-1$ + + Properties response_properties = new Properties(); + response_properties.setProperty(BKUPostConnection.RESPONSE_STRING_KEY, xml_response); + si.response_properties[si.current_operation] = response_properties; + + si.current_operation++; + } + + if (si.current_operation < si.requests.length) + { + log.debug("There are still requests to be performed -> answering with request #" + si.current_operation); //$NON-NLS-1$ + + LocalRequest local_request = si.requests[si.current_operation]; + + String request_string = local_request.getRequestString(); + + response.setContentType("text/xml"); + response.setCharacterEncoding("UTF-8"); + response.getWriter().println(request_string); + } + else + { + log.debug("All requests have been processed -> processing the responses."); //$NON-NLS-1$ + + if (si.application.equals("sign")) + { + // Sign + + if (si.sign_result == null) + { + LocalConnector c = new LocRefDetachedBKUConnector(si.type, "loc ref content not needed here"); //$NON-NLS-1$ + + si.iui.signed_signature_object = c.analyzeSignResponse(si.response_properties[0]); + + PdfASID algorithm = FormFields.translateSignatureModeToPdfASID(si.mode); + Signator signator = SignatorFactory.createSignator(algorithm); + + si.sign_result = signator.finishSign(si.iui); + } + + SignServlet.returnSignResponse(si, response); + } + else + { + // Verify + + List results = new ArrayList(); + + for (int i = 0; i < si.response_properties.length; i++) + { + LocalConnector c = new LocRefDetachedBKUConnector(si.type, "loc ref content not needed here"); //$NON-NLS-1$ + + SignatureResponse sig_resp = c.analyzeVerifyResponse(si.response_properties[i]); + results.add(sig_resp); + } + + dispatchToResults(results, request, response); + } + } + } + catch (PresentableException e) + { + log.error(e); + SignServlet.prepareDispatchToErrorPage(e, request); + dispatch(request, response, "/jsp/error.jsp"); + } + + log.debug("DataURL access finished."); //$NON-NLS-1$ + } + + protected boolean isNullResponse(String xml_response) + { + return xml_response.indexOf("NullOperationResponse") >= 0; + } +} 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 new file mode 100644 index 0000000..402170c --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/RetrieveSignatureDataServlet.java @@ -0,0 +1,100 @@ +/** + * + */ +package at.knowcenter.wag.egov.egiz.web.servlets; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder; +import at.knowcenter.wag.egov.egiz.sig.SignatureData; +import at.knowcenter.wag.egov.egiz.sig.SignatureDataImpl; +import at.knowcenter.wag.egov.egiz.sig.SignatureObject; +import at.knowcenter.wag.egov.egiz.tools.CodingHelper; +import at.knowcenter.wag.egov.egiz.web.SessionAttributes; +import at.knowcenter.wag.egov.egiz.web.SessionInformation; + +/** + * Retrieves the Signature Data from the session and returns it. + * + * @author wprinz + */ +public class RetrieveSignatureDataServlet extends HttpServlet +{ + + /** + * SVUID. + */ + private static final long serialVersionUID = -5387006236836240538L; + + /** + * The log. + */ + private static Log log = LogFactory.getLog(RetrieveSignatureDataServlet.class); + + /** + * @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$ + + HttpSession session = request.getSession(false); + if (session == null) + { + String msg = "There is no session associated with this request."; //$NON-NLS-1$ + log.error(msg); + throw new ServletException(msg); + } + + SessionInformation si = (SessionInformation) session.getAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION); + if (si == null) + { + String msg = "The session is not found or no longer valid."; //$NON-NLS-1$ + log.error(msg); + throw new ServletException(msg); + } + + SignatureData sd = null; + if (si.application.equals("sign")) + { + sd = si.iui.signature_data; + } + else + { + SignatureHolder holder = (SignatureHolder) si.signature_holders.get(si.current_operation); + SignatureObject s = holder.getSignatureObject(); + + // TODO make better + String text_to_be_verified = holder.getSignedText(); + if (holder.getSignatureObject().isBinary()) + { + byte[] data = CodingHelper.decodeBase64(text_to_be_verified); + sd = new SignatureDataImpl(data, "application/pdf"); + } + else + { + sd = new SignatureDataImpl(text_to_be_verified.getBytes("UTF-8"), "text/plain", "UTF-8"); + } + + } + + log.debug("Writing " + sd.getMimeType() + " data:"); //$NON-NLS-1$ //$NON-NLS-2$ + + response.setContentType(sd.getMimeType()); + response.setCharacterEncoding(sd.getCharacterEncoding()); + response.getOutputStream().write(sd.getData()); + + log.debug("Writing SignatureData finished."); //$NON-NLS-1$ + } + + +} diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignPreviewServlet.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignPreviewServlet.java new file mode 100644 index 0000000..1d8ee0b --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignPreviewServlet.java @@ -0,0 +1,94 @@ +/** + * 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: SignPreview.java,v 1.2 2006/10/11 07:39:13 wprinz Exp $ + */ +package at.knowcenter.wag.egov.egiz.web.servlets; + +import java.io.IOException; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import at.knowcenter.wag.egov.egiz.exceptions.ErrorCodeException; +import at.knowcenter.wag.egov.egiz.exceptions.PresentableException; +import at.knowcenter.wag.egov.egiz.web.FormFields; +import at.knowcenter.wag.egov.egiz.web.SessionAttributes; +import at.knowcenter.wag.egov.egiz.web.SessionInformation; + +/** + * @author wprinz + */ +public class SignPreviewServlet extends HttpServlet +{ + + /** + * SVUID. + */ + private static final long serialVersionUID = -8818532511322299998L; + + protected void dispatch(HttpServletRequest request, + HttpServletResponse response, String resource) throws ServletException, IOException + { + response.setContentType("text/html"); + response.setCharacterEncoding("UTF-8"); + + RequestDispatcher disp = getServletContext().getRequestDispatcher(resource); + disp.forward(request, response); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + SessionInformation si = null; + try + { + HttpSession session = request.getSession(false); + if (session == null) + { + throw new ErrorCodeException(600, "The session is missing."); + } + + si = (SessionInformation) session.getAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION); + if (si == null) + { + throw new ErrorCodeException(600, "The session is not found or is no longer valid."); + } + + } + catch (PresentableException e) + { + e.printStackTrace(); + SignServlet.prepareDispatchToErrorPage(e, request); + dispatch(request, response, "/jsp/error.jsp"); + + return; + } + + try + { + SignServlet.finishSign(si, request, response, getServletContext()); + } + catch (PresentableException e) + { + e.printStackTrace(); + SignServlet.prepareDispatchToErrorPage(e, request); + dispatch(request, response, "/jsp/error.jsp"); + } + } +} 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 new file mode 100644 index 0000000..f2cbde8 --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignServlet.java @@ -0,0 +1,576 @@ +/** + * 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: Sign.java,v 1.7 2006/10/11 07:39:13 wprinz Exp $ + */ +package at.knowcenter.wag.egov.egiz.web.servlets; + +import java.io.File; +import java.io.IOException; +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.net.URL; +import java.util.Iterator; +import java.util.List; +import java.util.Properties; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileUploadException; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.log4j.Logger; + +import at.knowcenter.wag.egov.egiz.PdfAS; +import at.knowcenter.wag.egov.egiz.PdfASID; +import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger; +import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; +import at.knowcenter.wag.egov.egiz.exceptions.ErrorCodeException; +import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException; +import at.knowcenter.wag.egov.egiz.exceptions.PlaceholderException; +import at.knowcenter.wag.egov.egiz.exceptions.PresentableException; +import at.knowcenter.wag.egov.egiz.framework.SignResult; +import at.knowcenter.wag.egov.egiz.framework.Signator; +import at.knowcenter.wag.egov.egiz.framework.SignatorFactory; +import at.knowcenter.wag.egov.egiz.framework.signators.DetachedSignator_1_0_0; +import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory; +import at.knowcenter.wag.egov.egiz.sig.SignatureData; +import at.knowcenter.wag.egov.egiz.sig.SignatureDataImpl; +import at.knowcenter.wag.egov.egiz.sig.connectors.Connector; +import at.knowcenter.wag.egov.egiz.sig.connectors.LocalConnector; +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.DetachedBKUConnector; +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.EnvelopedBase64BKUConnector; +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.LocRefDetachedBKUConnector; +import at.knowcenter.wag.egov.egiz.sig.connectors.moa.DetachedLocRefMOAConnector; +import at.knowcenter.wag.egov.egiz.tools.CodingHelper; +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; +import at.knowcenter.wag.egov.egiz.web.SessionInformation; + +/** + * This method is the sign servlet for the pdf-as web application. It takes get + * and post requests fill out jsp templates and give the user feedback about the + * results of the sign process + * + * @author wlackner + * @author wprinz + */ +public class SignServlet extends HttpServlet +{ + + /** + * SVUID. + */ + private static final long serialVersionUID = -4156938216903740438L; + + /** + * The log. + */ + private static Log log = LogFactory.getLog(SignServlet.class); + + protected void dispatch(HttpServletRequest request, + HttpServletResponse response, String resource) throws ServletException, IOException + { + dispatch(request, response, resource, getServletContext()); + } + + protected static void dispatch(HttpServletRequest request, + HttpServletResponse response, String resource, ServletContext context) throws ServletException, IOException + { + response.setContentType("text/html"); + response.setCharacterEncoding("UTF-8"); + + RequestDispatcher disp = context.getRequestDispatcher(resource); + disp.forward(request, response); + } + + // The sign servlet is used for processing the upload only. + // Authentication is deactivated. if required - make an own servlet. + // /** + // * @author modified by tknall + // */ + // public void doGet(HttpServletRequest request, HttpServletResponse response) + // throws ServletException, IOException + // { + // String authenticate = request.getHeader(AUTH); + // if (authenticate != null) + // { + // logger_.info("authenticate:" + authenticate); + // if (authenticate.indexOf(AUTH_BASIC) == 0) + // { + // authenticate = authenticate.substring(AUTH_BASIC.length() + 1); + // logger_.info("authenticate:" + authenticate); + // authenticate = new String(CodingHelper.decodeBase64(authenticate), + // "UTF-8"); + // logger_.info("authenticate:" + authenticate); + // + // String[] auth_value = authenticate.split(":"); + // String user_name = auth_value[0]; + // String user_password = auth_value[1]; + // logger_.info("username:" + user_name); + // // start modification tknall + // // logger_.info("password:" + user_password); + // logger_.info("password:XXXXXXXXXXXX"); + // // stop modification tknall + // + // HttpSession session = request.getSession(); + // session.setAttribute(SessionAttributes.ATTRIBUTE_USER_NAME, user_name); + // session.setAttribute(SessionAttributes.ATTRIBUTE_USER_PASSWORD, + // user_password); + // + // dispatch(request, response, "/jsp/signupload.jsp"); + // return; + // } + // // start modification tknall + // } else { + // String user_name = ""; + // String user_password = ""; + // logger_.info("authenticate:User has not been authenticated!"); + // logger_.info("username: UNKNOWN"); + // logger_.info("password: XXXXXXXXXXXX"); + // HttpSession session = request.getSession(); + // session.setAttribute("uname", user_name); + // session.setAttribute("upass", user_password); + // dispatch(request, response, "/jsp/signupload.jsp"); + // } + + // request.setAttribute("error", "Falsche Authentifikation"); + // request.setAttribute("cause", "Passwort oder Benutzername ist falsch"); + // dispatch(request, response, "/jsp/error.jsp"); + // // stop modification tknall + // } + + /** + * Processes the sign upload. + * + * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + try + { + UploadedData ud = retrieveUploadedDataFromRequest(request); + + PdfAS.applyStrictMode(ud.pdf); + + SessionInformation si = new SessionInformation(); // SessionTable.generateSessionInformationObject(); + si.connector = ud.sig_app; + si.application = "sign"; + si.mode = ud.sig_mode; + si.pdf = ud.pdf; + si.type = ud.sig_type; + si.filename = formatFileName(ud.file_name); + si.download_inline = ud.download_inline; + + request.getSession().setAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION, si); + + // String user_name = (String) + // request.getSession().getAttribute(SessionAttributes.ATTRIBUTE_USER_NAME); + // String user_password = (String) + // request.getSession().getAttribute(SessionAttributes.ATTRIBUTE_USER_PASSWORD); + // si.user_name = user_name; + // si.user_password = user_password; + + prepareSign(si); + + if (ud.preview) + { + String submit_url = response.encodeURL(request.getContextPath() + "/SignPreview"); + String signature_data_url = response.encodeURL(request.getContextPath() + "/RetrieveSignatureData"); + + request.setAttribute("submit_url", submit_url); + request.setAttribute("signature_data_url", signature_data_url); + + dispatch(request, response, "/jsp/signpreview.jsp"); + + return; + } + + finishSign(si, request, response, getServletContext()); + } + catch (FileUploadException e) + { + request.setAttribute("error", "Fehler beim Upload der Daten"); + request.setAttribute("cause", "Beim Upload der Daten ist ein Fehler aufgetreten."); + dispatch(request, response, "/jsp/error.jsp"); + } + catch (PresentableException e) + { + e.printStackTrace(); + prepareDispatchToErrorPage(e, request); + dispatch(request, response, "/jsp/error.jsp"); + } + } + + protected UploadedData retrieveUploadedDataFromRequest( + HttpServletRequest request) throws ServletException, UnsupportedEncodingException, FileUploadException, PDFDocumentException + { + DiskFileItemFactory fif = new DiskFileItemFactory(); + fif.setRepository(SettingsReader.getTemporaryDirectory()); + ServletFileUpload sfu = new ServletFileUpload(fif); + + List items = sfu.parseRequest(request); + + FileItem preview_fi = null; + FileItem sig_type_fi = null; + FileItem sig_app_fi = null; + FileItem mode_fi = null; + FileItem file_upload_fi = null; + FileItem download_fi = null; + + Iterator it = items.iterator(); + while (it.hasNext()) + { + FileItem item = (FileItem) it.next(); + log.debug("item = " + item.getFieldName()); //$NON-NLS-1$ + + if (log.isDebugEnabled()) + { + if (item.isFormField()) + { + String item_string = item.getString("UTF-8"); //$NON-NLS-1$ + log.debug(" form field string = " + item_string); //$NON-NLS-1$ + } + else + { + log.debug(" filename = " + item.getName()); //$NON-NLS-1$ + log.debug(" filesize = " + item.getSize()); //$NON-NLS-1$ + } + } + + if (item.getFieldName().equals(FormFields.FIELD_PREVIEW)) + { + preview_fi = item; + continue; + } + + if (item.getFieldName().equals(FormFields.FIELD_SIGNATURE_TYPE)) + { + sig_type_fi = item; + continue; + } + + if (item.getFieldName().equals(FormFields.FIELD_CONNECTOR)) + { + sig_app_fi = item; + continue; + } + + if (item.getFieldName().equals(FormFields.FIELD_MODE)) + { + mode_fi = item; + continue; + } + + if (item.getFieldName().equals(FormFields.FIELD_UPLOAD)) + { + file_upload_fi = item; + continue; + } + + if (item.getFieldName().equals(FormFields.FIELD_DOWNLOAD)) + { + download_fi = item; + continue; + } + + throw new ServletException("unrecognized POST data."); //$NON-NLS-1$ + + } + + if (preview_fi == null || sig_type_fi == null || sig_app_fi == null || file_upload_fi == null || download_fi == null) + { + throw new ServletException("Insufficient data provided in request"); //$NON-NLS-1$ + } + + String mode = mode_fi.getString("UTF-8"); //$NON-NLS-1$ + if (!mode.equals(FormFields.VALUE_MODE_BINARY) && !mode.equals(FormFields.VALUE_MODE_TEXTUAL) && !mode.equals(FormFields.VALUE_MODE_DETACHED)) + { + throw new ServletException("The mode '" + mode + "' is unrecognized."); //$NON-NLS-1$ //$NON-NLS-2$ + } + + String preview_str = preview_fi.getString("UTF-8"); //$NON-NLS-1$ + boolean preview = false; + if (preview_str.equals("true")) //$NON-NLS-1$ + { + preview = true; + } + + boolean download_inline = true; + if (download_fi.getString("UTF-8").equals(FormFields.VALUE_DOWNLOAD_ATTACHMENT)) //$NON-NLS-1$ + { + download_inline = false; + } + + String sig_type = sig_type_fi.getString("UTF-8"); //$NON-NLS-1$ + String sig_app = sig_app_fi.getString("UTF-8"); //$NON-NLS-1$ + + String doc_file_name = file_upload_fi.getName(); + log.debug("file content type =" + file_upload_fi.getContentType()); //$NON-NLS-1$ + + String extension = VerifyServlet.extractExtension(doc_file_name); + if (extension != null && !extension.equals("pdf")) //$NON-NLS-1$ + { + throw new PDFDocumentException(201, "The provided file '" + doc_file_name + "' doesn't have the PDF extension (.pdf)."); //$NON-NLS-1$//$NON-NLS-2$ + } + + byte[] pdf = file_upload_fi.get(); + if (file_upload_fi.getSize() <= 0) + { + throw new PDFDocumentException(250, "The document is empty."); //$NON-NLS-1$ + } + + UploadedData ud = new UploadedData(); + + ud.preview = preview; + ud.download_inline = download_inline; + ud.sig_type = sig_type; + ud.sig_app = sig_app; + ud.sig_mode = mode; + ud.file_name = doc_file_name; + ud.pdf = pdf; + + return ud; + } + + /** + * Prepares the sign. + * + *

+ * This prepares the data for both being signed or being previewed. + *

+ * + * @param si + * The SessionInformation to be prepared. + * @throws PresentableException + * f.e. + */ + public static void prepareSign(SessionInformation si) throws PresentableException + { + log.debug("prepareSign:"); //$NON-NLS-1$ + + PdfASID algorithm = FormFields.translateSignatureModeToPdfASID(si.mode); + Signator signator = SignatorFactory.createSignator(algorithm); + si.iui = signator.prepareSign(si.pdf, si.type, null, ConnectorFactory.needsSIG_ID(si.connector)); + + log.debug("prepareSign finished."); //$NON-NLS-1$ + } + + /** + * Finishes the sign. + * + *

+ * For non local connectors this concludes the sign process, signs the + * document and returns the result. For local connectors this initializes the + * local sign process and redirects to following servlets. + *

+ * + * @param si + * The SessionInformation. + * @param request + * The servlet request for dispatching. + * @param response + * The servlet response for dispatching. + * @param context + * The servlet context for dispatching. + * @throws PresentableException + * f.e. + * @throws IOException + * f. e. + * @throws ServletException + * f. e. + */ + public static void finishSign(SessionInformation si, + HttpServletRequest request, HttpServletResponse response, + ServletContext context) throws PresentableException, IOException, ServletException + { + log.debug("finishSign:"); //$NON-NLS-1$ + + log.debug("connector = " + si.connector); //$NON-NLS-1$ + if (ConnectorFactory.isConnectorLocal(si.connector)) + { + log.debug("Connector is local -> dispatching to local processing."); //$NON-NLS-1$ + + String dispatch_to = LocalRequestHelper.processLocalSign(si, request, response); + dispatch(request, response, dispatch_to, context); + return; + } + log.debug("Connector is not local -> finishing the sign."); //$NON-NLS-1$ + + PdfASID algorithm = FormFields.translateSignatureModeToPdfASID(si.mode); + Signator signator = SignatorFactory.createSignator(algorithm); + + log.debug("RequestURL = " + request.getRequestURL()); + log.debug("ContextPath = " + request.getContextPath()); + String host = request.getServerName(); + URL signature_data_URL = new URL(request.getScheme(), host, request.getServerPort(), request.getContextPath() + "/RetrieveSignatureData"); + String signature_data_url = response.encodeURL(signature_data_URL.toString()); + + Connector c = new DetachedLocRefMOAConnector(si.type, signature_data_url); + si.iui.signed_signature_object = c.doSign(si.iui.signature_data); + + si.sign_result = signator.finishSign(si.iui); + + returnSignResponse(si, response); + + log.debug("finishSign finished."); //$NON-NLS-1$ + } + + public static void prepareDispatchToErrorPage(PresentableException pe, + HttpServletRequest request) + { + if (pe instanceof ErrorCodeException) + { + ErrorCodeException ece = (ErrorCodeException) pe; + request.setAttribute("error", "Fehler " + ece.getErrorCode()); + + String cause = ece.getErrorCodeMessage(); + if (ece.hasExternalErrorMessage()) + { + cause = ece.getExternalErrorCode() + ": " + ece.getExternalErrorMessage(); + } + request.setAttribute("cause", cause); + + if (pe instanceof PlaceholderException) + { + PlaceholderException phe = (PlaceholderException) ece; + + request.setAttribute("cause", "Der Platzhalter des Feldes " + phe.getField() + " ist um " + phe.getMissing() + " Bytes zu kurz. " + ece.getErrorCodeMessage()); + } + } + else + { + request.setAttribute("error", "PresentableException"); + request.setAttribute("cause", pe.toString()); + } + } + + public void dispatchToPreview(String document_text, String connector, + String mode, String signature_type, String submit_url, + HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + request.setAttribute("document_text", document_text); + request.setAttribute("connector", connector); + request.setAttribute("mode", mode); + request.setAttribute("signature_type", signature_type); + request.setAttribute("submit_url", submit_url); + + dispatch(request, response, "/jsp/signpreview.jsp"); + } + + /** + * Formats the file name so that it is suitable for content disposition. + * + * @param file_name + * The file name. + * @return Returns the formatted file name. + */ + public static String formatFileName(String file_name) + { + File file = new File(file_name); + String file_name_only = file.getName(); + // the file_name contains \\ ==> remove them so Internet Explorer works + // correctly. + return file_name_only; + } + + /** + * Formats the file name according to the SignResult. + * + * @param file_name + * The file name. + * @param sign_result + * The sign result. + * @return Returns the formatted file name. + */ + public static String formatFileNameForSignResult(String file_name, + SignResult sign_result) + { + String output = file_name + "_signed"; + if (sign_result.getMimeType().equals(DetachedSignator_1_0_0.MIME_TYPE)) + { + output += ".xml"; + } + else + { + output += ".pdf"; + } + + return output; + } + + /** + * Returns the data in the SignResult with proper content disposition. + * + * @param si + * SessionInformation. + * @param response + * The servlet response. + * @throws IOException + * The IO Exception. + */ + public static void returnSignResponse(SessionInformation si, + HttpServletResponse response) throws IOException + { + SignResult sign_result = si.sign_result; + + String file_name = formatFileNameForSignResult(si.filename, sign_result); + + // The name parameter is actually deprecated in favour of + // Content-Disposition filename + // Unfortunately Acrobat reader does recognize neither of these parameters + // with its inline save-as. It always takes the page name. + response.setContentType(sign_result.getMimeType() + "; name=\"" + file_name + "\""); + if (si.download_inline) + { + response.addHeader("Content-Disposition", "inline; filename=\"" + file_name + "\""); + } + else + { + response.addHeader("Content-Disposition", "attachment; filename=\"" + file_name + "\""); + } + response.getOutputStream().write(sign_result.getData()); + + } + + protected static class UploadedData + { + protected boolean preview = false; + + protected boolean download_inline = false; + + protected String sig_type = null; + + protected String sig_app = null; + + protected String sig_mode = null; + + protected String file_name = null; + + protected byte[] pdf = null; + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..98f582e --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/VerifyPreviewServlet.java @@ -0,0 +1,708 @@ +/** + * 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: VerifyPreview.java,v 1.4 2006/10/11 07:39:13 wprinz Exp $ + */ +package at.knowcenter.wag.egov.egiz.web.servlets; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileUploadException; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.log4j.Logger; + +import at.knowcenter.wag.egov.egiz.PdfAS; +import at.knowcenter.wag.egov.egiz.PdfASID; +import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger; +import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; +import at.knowcenter.wag.egov.egiz.exceptions.ErrorCodeException; +import at.knowcenter.wag.egov.egiz.exceptions.InvalidIDException; +import at.knowcenter.wag.egov.egiz.exceptions.PresentableException; +import at.knowcenter.wag.egov.egiz.exceptions.SignatureException; +import at.knowcenter.wag.egov.egiz.pdf.BinarySignatureHolder; +import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder; +import at.knowcenter.wag.egov.egiz.pdf.TextualSignatureHolder; +import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory; +import at.knowcenter.wag.egov.egiz.sig.SignatureEntry; +import at.knowcenter.wag.egov.egiz.sig.SignatureObject; +import at.knowcenter.wag.egov.egiz.sig.SignatureTypes; +import at.knowcenter.wag.egov.egiz.web.FormFields; +import at.knowcenter.wag.egov.egiz.web.LocalRequestHelper; +import at.knowcenter.wag.egov.egiz.web.SessionAttributes; +import at.knowcenter.wag.egov.egiz.web.SessionInformation; + +/** + * @author wprinz + */ +public class VerifyPreviewServlet extends HttpServlet +{ + /** + * SVUID. + */ + private static final long serialVersionUID = 6954343542890239109L; + + /** + * The logger. + */ + private static final Logger logger_ = ConfigLogger.getLogger(VerifyPreviewServlet.class); + + protected void dispatch(HttpServletRequest request, + HttpServletResponse response, String resource) throws ServletException, IOException + { + response.setContentType("text/html"); + response.setCharacterEncoding("UTF-8"); + + RequestDispatcher disp = getServletContext().getRequestDispatcher(resource); + disp.forward(request, response); + } + + protected static String generateNamePrefix(int num) + { + return SIG_INPUT_PREFIX + num + "_"; + } + + // public static void formatPreview(List signature_holders, String connector, + // HttpServletRequest request, HttpServletResponse response) throws + // ServletException, IOException + // { + // response.setContentType("text/html"); + // response.setCharacterEncoding("UTF-8"); + // + // PrintWriter writer = response.getWriter(); + // + // writer.println(""); + // writer.println(""); + // writer.println(""); + // writer.println(""); + // writer.println("PDF-AS Amtssignaturen Vorschau"); + // writer.println(""); + // + // writer.println(""); + // + // writer.println(""); + // + // writer.println(""); + // writer.println("
"); + // + // writer.println("

PDF-AS Amtssignaturen

"); + // + // writer.println("
"); + // writer.println("
Vorschau: Dokument Prüfen
"); + // writer.println("
"); + // writer.println("
"); + // + // // writer.println(""); + // writer.println(""); + // + // // if (mode.equals(FormFields.VALUE_MODE_TEXTUAL)) + // // { + // // String raw_document_text = ((SignatureHolder) + // // signature_holders.get(0)).signed_text; + // // writer.println(""); + // // writer.println("
"); + // // } + // + // if (signature_holders.size() == 1) + // { + // writer.println("
Rekonstruktion der Signaturmarke:
"); + // } + // else + // { + // writer.println("
Rekonstruktion der Signaturmarken:
"); + // } + // + // // this special
is only needed because internet explorer doesn't + // // format the width of the + // // tables right when the div is not given. + // // probably this is because the table then tries to calculate the relative + // // width from the surrounding form object. + // writer.println("
"); + // int num = 0; + // Iterator it = signature_holders.iterator(); + // while (it.hasNext()) + // { + // SignatureHolder signature_holder = (SignatureHolder) it.next(); + // + // String name_prefix = generateNamePrefix(num); + // + // String input_key = name_prefix + FormFields.FIELD_RAW_DOCUMENT_TEXT; + // if (signature_holder.signature_object.isBinary()) + // { + // writer.println(""); + // } + // else + // { + // writer.println("
"); + // writer.println(""); + // writer.println("
"); + // } + // + // String html = renderRequiredKeys(signature_holder.signature_object, + // name_prefix, false); + // writer.println(html); + // + // writer.println(""); + // + // num++; + // } + // writer.println("
"); + // + // writer.println("");// + + // // FormFields.VALUE_VERIFY_WHICH_ALL + // // + + // // "\" + // // />"); + // writer.println(""); + // + // writer.println("
"); + // writer.println(""); + // writer.println("
"); + // + // writer.println("zurück"); + // + // writer.println("
"); + // writer.println(""); + // + // writer.println(""); + // + // } + + public static String renderRequiredKeysJavaScript( + SignatureObject signature_object, String name_prefix) + { + StringWriter sw = new StringWriter(); + PrintWriter writer = new PrintWriter(sw); + + String[] rkeys = SignatureTypes.REQUIRED_SIG_KEYS; + + for (int key_idx = 0; key_idx < rkeys.length; key_idx++) + { + String key = rkeys[key_idx]; + SignatureEntry entry = signature_object.getSigEntry(key); + String value = entry.getValue(); + if (SignatureTypes.SIG_ID.equals(key) && value == null) + { + continue; + } + + value = value.replaceAll("\\s", " "); + value = value.replaceAll("\\\"", "\\\""); + + String input_key = name_prefix + key; + + writer.println(" document.submitform." + input_key + ".value = \"" + value + "\";"); + } + + return sw.toString(); + } + + public static String renderRequiredKeys(SignatureObject signature_object, + String name_prefix, boolean write_value) + { + StringWriter sw = new StringWriter(); + PrintWriter writer = new PrintWriter(sw); + + writer.println(""); + + String[] rkeys = SignatureTypes.REQUIRED_SIG_KEYS; + + for (int key_idx = 0; key_idx < rkeys.length; key_idx++) + { + String key = rkeys[key_idx]; + SignatureEntry entry = signature_object.getSigEntry(key); + String caption = entry.getCaption(); + String value = entry.getValue(); + if (SignatureTypes.SIG_ID.equals(key) && value == null) + { + continue; + } + + writer.println(" "); + writer.println(" "); + writer.println(" "); + writer.println(" "); + } + writer.println("
" + caption + ":"); + + value = value.replaceAll("\\s", " "); + value = value.replaceAll("\\\"", "\\\""); + + String input_key = name_prefix + key; + writer.println(" "); + + writer.println("
"); + + return sw.toString(); + } + + public static String renderRequiredKeysText(SignatureObject signature_object) + { + StringWriter sw = new StringWriter(); + PrintWriter writer = new PrintWriter(sw); + + String title = "alte PDF-AS Signatur"; + try + { + PdfASID kz = signature_object.getKZ(); + if (kz != null) + { + title = kz.toString(); + } + } + catch (InvalidIDException e) + { + e.printStackTrace(); + } + writer.println("
Signatur: " + title + "
"); + writer.println(""); + + // just render useful information + String[] rkeys = { SignatureTypes.SIG_DATE, SignatureTypes.SIG_ISSUER, + SignatureTypes.SIG_NUMBER }; // SignatureTypes.REQUIRED_SIG_KEYS; + + for (int key_idx = 0; key_idx < rkeys.length; key_idx++) + { + String key = rkeys[key_idx]; + SignatureEntry entry = signature_object.getSigEntry(key); + String caption = entry.getCaption(); + String value = entry.getValue(); + if (SignatureTypes.SIG_ID.equals(key) && value == null) + { + continue; + } + + writer.println(" "); + writer.println(" "); + writer.println(" "); + writer.println(" "); + } + writer.println("
" + caption + ":"); + + value = value.replaceAll("\\s", " "); + value = value.replaceAll("\\\"", "\\\""); + + writer.println(" " + value); + + writer.println("
"); + + return sw.toString(); + } + + protected void dispatchToResults(List results, HttpServletRequest request, + HttpServletResponse response, boolean backbutton) throws ServletException, IOException + { + request.setAttribute("results", results); + request.setAttribute("backbutton", backbutton ? "true" : "false"); + dispatch(request, response, "/jsp/results.jsp"); + } + + // public static void formatVerifyResults(List results, + // HttpServletResponse response) throws IOException, SettingNotFoundException + // { + // response.setContentType("text/html"); + // response.setCharacterEncoding("UTF-8"); + // + // PrintWriter writer = response.getWriter(); + // + // writer.println(""); + // writer.println(""); + // writer.println(""); + // writer.println(""); + // writer.println("PDF-AS Amtssignaturen Resultat"); + // writer.println(""); + // writer.println(""); + // + // writer.println(""); + // writer.println("
"); + // + // writer.println("

PDF-AS Amtssignaturen

"); + // + // writer.println("
"); + // writer.println("
Resultat
"); + // writer.println("
"); + // + // Iterator it = results.iterator(); + // while (it.hasNext()) + // { + // SignatureResponse result = (SignatureResponse) it.next(); + // formatSignatureResponse(result, writer); + // + // if (it.hasNext()) + // { + // writer.println("
"); + // } + // } + // + // writer.println("
"); + // writer.println("
"); + // + // writer.println("zurück"); + // + // writer.println("
"); + // writer.println(""); + // + // writer.println(""); + // + // } + // + // public static void formatSignatureResponse(SignatureResponse result, + // PrintWriter writer) throws SettingNotFoundException + // { + // writer.println("
Zertifikat"); + // writer.println(""); + // writer.println(" "); + // writer.println(" "); + // writer.println(" "); + // List public_properties = result.getPublicProperties(); + // Iterator it = public_properties.iterator(); + // while (it.hasNext()) + // { + // String public_property = (String) it.next(); + // writer.println(" "); + // } + // + // writer.println(" "); + // + // writer.println("
Signator:" + + // result.getX509SubjectName() + "
Aussteller:" + + // result.getX509IssuerName() + "
Seriennummer:" + + // result.getX509SerialNumber() + "
Eigenschaft:" + + // public_property + "
Zertifikat:" + result.getCertificateCheckInfo() + // + "
"); + // writer.println("
"); + // writer.println("
Signatur-Check"); + // writer.println("
" + result.getSignatureCheckInfo() + "
"); + // writer.println("
"); + // writer.println("
Manifest-Check"); + // writer.println("
" + + // result.getSignatureManifestCheckInfo() + "
"); + // writer.println("
"); + // } + + /** + * Form field name prefix for signature table names + */ + public static final String SIG_INPUT_PREFIX = "sig_inp_"; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + SessionInformation si = null; + HttpSession session = null; + try + { + session = request.getSession(false); + // String session_id_string = request.getParameter("session"); + if (session == null) + { + throw new ErrorCodeException(600, "The session is missing."); + } + + si = (SessionInformation) session.getAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION); + // long session_id = Long.parseLong(session_id_string); + // si = SessionTable.get(session_id); + if (si == null) + { + throw new ErrorCodeException(600, "The session is not found or is no longer valid."); + } + + } + catch (PresentableException e) + { + e.printStackTrace(); + SignServlet.prepareDispatchToErrorPage(e, request); + dispatch(request, response, "/jsp/error.jsp"); + + return; + } + + try + { + + int verify_which = -1; + boolean preview = false; + + { + String str_verify_which = request.getParameter(FormFields.FIELD_VERIFY_WHICH); + logger_.debug("verify_which = " + str_verify_which); + if (str_verify_which.equals(FormFields.VALUE_VERIFY_WHICH_ALL)) + { + verify_which = -1; + } + else + { + verify_which = Integer.parseInt(str_verify_which); + } + logger_.debug("verify_which = " + verify_which); + } + + { + String preview_string = request.getParameter(FormFields.FIELD_PREVIEW); + if (preview_string.equals("true")) + { + preview = true; + } + } + + List holders_to_verify = si.signature_holders; + + if (verify_which >= 0) + { + if (verify_which >= si.signature_holders.size()) + { + throw new SignatureException(312, "The selected signature to be verified doesn't exist."); + } + + SignatureHolder holder = (SignatureHolder) si.signature_holders.get(verify_which); + holders_to_verify = new ArrayList(); + holders_to_verify.add(holder); + + if (preview == true) + { + if (holder instanceof BinarySignatureHolder) + { + BinarySignatureHolder binary_holder = (BinarySignatureHolder) holder; + response.setContentType("application/pdf"); + response.getOutputStream().write(binary_holder.getSignedPdf(), 0, binary_holder.getSignedPdfLength()); + } + else + // if (holder.getSignatureObject().isTextual()) + { + // formatPreview(holders_to_verify, si.connector, request, + // response); + request.setAttribute(FormFields.FIELD_VERIFY_WHICH, new Integer(verify_which)); + dispatch(request, response, "/jsp/verifypreview.jsp"); + } + + return; + } + + } + + if (ConnectorFactory.isConnectorLocal(si.connector)) + { + String dispatch_to = LocalRequestHelper.processLocalVerify(si, holders_to_verify, request, response); + dispatch(request, response, dispatch_to); + return; + } + + List results = PdfAS.verifySignatureHolders(holders_to_verify, si.connector); + boolean backbutton = true; + if (verify_which >= 0) + { + backbutton = false; + } + dispatchToResults(results, request, response, backbutton); + + } + catch (PresentableException e) + { + e.printStackTrace(); + SignServlet.prepareDispatchToErrorPage(e, request); + dispatch(request, response, "/jsp/error.jsp"); + } + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + SessionInformation si = null; + HttpSession session = null; + try + { + session = request.getSession(false); + // String session_id_string = request.getParameter("session"); + if (session == null) + { + throw new ErrorCodeException(600, "The session is missing."); + } + + si = (SessionInformation) session.getAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION); + // long session_id = Long.parseLong(session_id_string); + // si = SessionTable.get(session_id); + if (si == null) + { + throw new ErrorCodeException(600, "The session is not found or is no longer valid."); + } + + } + catch (PresentableException e) + { + e.printStackTrace(); + SignServlet.prepareDispatchToErrorPage(e, request); + dispatch(request, response, "/jsp/error.jsp"); + + return; + } + + DiskFileItemFactory fif = new DiskFileItemFactory(); + fif.setRepository(SettingsReader.getTemporaryDirectory()); + ServletFileUpload sfu = new ServletFileUpload(fif); + + try + { + String text_to_be_verified = null; + SignatureObject signature_object = new SignatureObject(); + + String default_type = SettingsReader.getInstance().getValueFromKey(SignatureTypes.DEFAULT_TYPE); + signature_object.setSigType(default_type); + signature_object.initByType(); + + int verify_which = -1; + boolean verify = false; + + List items = sfu.parseRequest(request); + + Iterator it = items.iterator(); + while (it.hasNext()) + { + FileItem item = (FileItem) it.next(); + logger_.debug("item = " + item.getFieldName()); + + if (item.getFieldName().equals(FormFields.FIELD_RAW_DOCUMENT_TEXT)) + { + String raw_document_text = item.getString("UTF-8"); + text_to_be_verified = PdfAS.normalizeText(raw_document_text); + continue; + } + + if (item.getFieldName().equals(FormFields.FIELD_VERIFY_WHICH)) + { + String which_str = item.getString("UTF-8"); + verify_which = Integer.parseInt(which_str); + continue; + } + + if (item.getFieldName().equals("verify")) + { + if (item.getString("UTF-8").equals("true")) + { + verify = true; + } + continue; + } + + String key = item.getFieldName(); + String value = item.getString("UTF-8"); + + signature_object.setSigValue(key, value); + logger_.debug("sig_obj_number" + key + " = " + value); + } + + SignatureHolder new_holder = new TextualSignatureHolder(text_to_be_verified, signature_object); + si.signature_holders.set(verify_which, new_holder); + + if (verify == false) + { + dispatch(request, response, "/dataok.html"); + return; + } + + List holders_to_verify = si.signature_holders; + + if (verify_which >= 0) + { + if (verify_which >= si.signature_holders.size()) + { + throw new SignatureException(312, "The selected signature to be verified doesn't exist."); + } + + SignatureHolder holder = (SignatureHolder) si.signature_holders.get(verify_which); + holders_to_verify = new ArrayList(); + holders_to_verify.add(holder); + } + + if (ConnectorFactory.isConnectorLocal(si.connector)) + { + String dispatch_to = LocalRequestHelper.processLocalVerify(si, holders_to_verify, request, response); + dispatch(request, response, dispatch_to); + return; + } + + List results = PdfAS.verifySignatureHolders(holders_to_verify, si.connector); + dispatchToResults(results, request, response, true); + } + catch (FileUploadException e) + { + request.setAttribute("error", "Fehler beim Upload der Daten"); + request.setAttribute("cause", "Beim Upload der Daten ist ein Fehler aufgetreten."); + dispatch(request, response, "/jsp/error.jsp"); + } + catch (PresentableException e) + { + e.printStackTrace(); + SignServlet.prepareDispatchToErrorPage(e, request); + dispatch(request, response, "/jsp/error.jsp"); + } + + } +} 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 new file mode 100644 index 0000000..ee20498 --- /dev/null +++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/VerifyServlet.java @@ -0,0 +1,334 @@ +/* + * 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: Verify.java,v 1.7 2006/10/11 07:39:13 wprinz Exp $ + */ +package at.knowcenter.wag.egov.egiz.web.servlets; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URL; +import java.util.Iterator; +import java.util.List; +import java.util.Properties; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileUploadException; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.log4j.Logger; + +import at.knowcenter.wag.egov.egiz.PdfAS; +import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger; +import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; +import at.knowcenter.wag.egov.egiz.exceptions.ConnectorFactoryException; +import at.knowcenter.wag.egov.egiz.exceptions.NormalizeException; +import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException; +import at.knowcenter.wag.egov.egiz.exceptions.PresentableException; +import at.knowcenter.wag.egov.egiz.exceptions.SignatureException; +import at.knowcenter.wag.egov.egiz.exceptions.SignatureTypesException; +import at.knowcenter.wag.egov.egiz.framework.VerificationFilter; +import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder; +import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory; +import at.knowcenter.wag.egov.egiz.sig.SignatureData; +import at.knowcenter.wag.egov.egiz.sig.SignatureDataImpl; +import at.knowcenter.wag.egov.egiz.sig.SignatureObject; +import at.knowcenter.wag.egov.egiz.sig.connectors.LocalConnector; +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.LocRefDetachedBKUConnector; +import at.knowcenter.wag.egov.egiz.sig.connectors.bku.SignSignatureObject; +import at.knowcenter.wag.egov.egiz.tools.CodingHelper; +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; +import at.knowcenter.wag.egov.egiz.web.SessionInformation; +import at.knowcenter.wag.egov.egiz.web.servlets.SignServlet.UploadedData; + +/** + * This method is the verify servlet for the pdf-as web application. It takes + * get and post requests fill out jsp templates and give the user feedback about + * the results of the verify process. + * + * @author wlackner + * @author wprinz + */ +public class VerifyServlet extends HttpServlet +{ + + /** + * SVUID. + */ + private static final long serialVersionUID = 309198792358636766L; + + /** + * The log. + */ + private static Log log = LogFactory.getLog(SignServlet.class); + + protected void dispatch(HttpServletRequest request, + HttpServletResponse response, String resource) throws ServletException, IOException + { + response.setContentType("text/html"); //$NON-NLS-1$ + response.setCharacterEncoding("UTF-8"); //$NON-NLS-1$ + + RequestDispatcher disp = getServletContext().getRequestDispatcher(resource); + disp.forward(request, response); + } + + protected void dispatchToResults(List results, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException + { + request.setAttribute("results", results); //$NON-NLS-1$ + dispatch(request, response, "/jsp/results.jsp"); //$NON-NLS-1$ + } + + /** + * Processes the verify upload. + * + * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + try + { + UploadedData ud = retrieveUploadedDataFromRequest(request); + + List signature_holders = extractSignatureHoldersFromFile(ud.file_name, ud.file_data); + + SessionInformation si = new SessionInformation(); // SessionTable.generateSessionInformationObject(); + si.connector = ud.sig_app; + si.application = "verify"; + si.mode = null; + si.pdf = null; + si.type = null; + si.user_name = null; + si.user_password = null; + + si.signature_holders = signature_holders; + + request.getSession().setAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION, si); + + if (ud.preview) + { + dispatch(request, response, "/jsp/verifylist.jsp"); + // VerifyPreview.formatPreview(signature_holders, connector, request, + // response); + } + else + { + if (ConnectorFactory.isConnectorLocal(si.connector)) + { + String dispatch_to = LocalRequestHelper.processLocalVerify(si, si.signature_holders, request, response); + dispatch(request, response, dispatch_to); + return; + } + + List results = PdfAS.verifySignatureHolders(signature_holders, si.connector); + dispatchToResults(results, request, response); + } + + } + catch (FileUploadException e) + { + request.setAttribute("error", "Fehler beim Upload der Daten"); + request.setAttribute("cause", "Beim Upload der Daten ist ein Fehler aufgetreten."); + dispatch(request, response, "/jsp/error.jsp"); + } + catch (PresentableException e) + { + e.printStackTrace(); + SignServlet.prepareDispatchToErrorPage(e, request); + dispatch(request, response, "/jsp/error.jsp"); + } + + } + + protected UploadedData retrieveUploadedDataFromRequest( + HttpServletRequest request) throws ServletException, UnsupportedEncodingException, FileUploadException, PDFDocumentException + { + DiskFileItemFactory fif = new DiskFileItemFactory(); + fif.setRepository(SettingsReader.getTemporaryDirectory()); + ServletFileUpload sfu = new ServletFileUpload(fif); + + List items = sfu.parseRequest(request); + + FileItem upload_fi = null; + FileItem connector_fi = null; + // FileItem mode_fi = null; + FileItem preview_fi = null; + + { + Iterator it = items.iterator(); + while (it.hasNext()) + { + FileItem item = (FileItem) it.next(); + log.debug("item = " + item.getFieldName()); //$NON-NLS-1$ + + if (item.isFormField()) + { + String item_string = item.getString("UTF-8"); //$NON-NLS-1$ + log.debug(" form field string = " + item_string); //$NON-NLS-1$ + } + else + { + log.debug(" filename = " + item.getName()); //$NON-NLS-1$ + log.debug(" filesize = " + item.getSize()); //$NON-NLS-1$ + } + + if (item.getFieldName().equals(FormFields.FIELD_UPLOAD)) + { + upload_fi = item; + continue; + } + + if (item.getFieldName().equals(FormFields.FIELD_CONNECTOR)) + { + connector_fi = item; + continue; + } + + // if (item.getFieldName().equals(FormFields.FIELD_MODE)) + // { + // mode_fi = item; + // continue; + // } + + if (item.getFieldName().equals(FormFields.FIELD_PREVIEW)) + { + preview_fi = item; + continue; + } + + throw new ServletException("unrecognized POST data."); //$NON-NLS-1$ + } + } + + if (upload_fi == null || connector_fi == null || /* mode_fi == null || */preview_fi == null) + { + throw new ServletException("Unsufficient data provided in request."); //$NON-NLS-1$ + } + + String connector = connector_fi.getString("UTF-8"); //$NON-NLS-1$ + + // String mode = mode_fi.getString("UTF-8"); + // if (!mode.equals(FormFields.VALUE_MODE_BINARY) && + // !mode.equals(FormFields.VALUE_MODE_TEXTUAL)) + // { + // throw new ServletException("The mode '" + mode + "' is unrecognized."); + // } + + String preview_str = preview_fi.getString("UTF-8"); //$NON-NLS-1$ + if (!preview_str.equals(FormFields.VALUE_TRUE) && !preview_str.equals(FormFields.VALUE_FALSE)) + { + throw new ServletException("The preview '" + preview_str + "' is unrecognized."); //$NON-NLS-1$//$NON-NLS-2$ + } + boolean preview = false; + if (preview_str.equals(FormFields.VALUE_TRUE)) + { + preview = true; + } + + // process the request + log.debug("file content type =" + upload_fi.getContentType()); //$NON-NLS-1$ + log.debug("file size = " + upload_fi.getSize()); //$NON-NLS-1$ + if (upload_fi.getSize() <= 0) + { + throw new PDFDocumentException(250, "The document is empty."); //$NON-NLS-1$ + } + byte[] document_bytes = upload_fi.get(); + + UploadedData ud = new UploadedData(); + ud.preview = preview; + ud.sig_app = connector; + ud.file_name = upload_fi.getName(); + ud.file_data = document_bytes; + + return ud; + } + + protected List extractSignatureHoldersFromFile (String file_name, byte [] data) throws UnsupportedEncodingException, PresentableException + { + VerificationFilter vf = new VerificationFilter(); + List signature_holders = null; + + String extension = extractExtension(file_name); + + String raw_text = null; + if (file_name == null || (extension != null && extension.equals("txt"))) //$NON-NLS-1$ + { + raw_text = new String(data, "UTF-8"); //$NON-NLS-1$ + signature_holders = vf.extractSignaturesFromPlainText(raw_text); + } + else + { + signature_holders = vf.extractSignaturesFromPdf(data); + } + + if (signature_holders.size() == 0) + { + throw new PDFDocumentException(206, "PDF document not signed."); //$NON-NLS-1$ + } + + return signature_holders; + } + + /** + * Extracts the extension from a file name string. + * + *

+ * The extension of a file name is whatever text follows the last '.'. + *

+ * + * @param file_name + * The file name. + * @return Returns the extension. If the file name ends with the '.', then an + * empty string is returned. If the file name doesn't contain any '.' + * or file_name is null, null is returned. + */ + public static String extractExtension(String file_name) + { + if (file_name == null) + { + return null; + } + + int dot_index = file_name.lastIndexOf('.'); + if (dot_index < 0) + { + return null; + } + return file_name.substring(dot_index + 1); + } + + protected static class UploadedData + { + protected boolean preview = false; + + protected String sig_app = null; + + protected String file_name = null; + + protected byte[] file_data = null; + } +} \ No newline at end of file -- cgit v1.2.3