aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignServlet.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignServlet.java')
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignServlet.java373
1 files changed, 114 insertions, 259 deletions
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignServlet.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignServlet.java
index 54be8df..3f1342d 100644
--- a/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignServlet.java
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/servlets/SignServlet.java
@@ -22,12 +22,10 @@ import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
-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;
@@ -35,7 +33,14 @@ 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.gv.egiz.pdfas.exceptions.ErrorCode;
+import at.gv.egiz.pdfas.exceptions.ErrorCodeHelper;
+import at.gv.egiz.pdfas.exceptions.external.ExternalErrorException;
+import at.gv.egiz.pdfas.impl.input.FileBasedPdfDataSourceImpl;
+import at.gv.egiz.pdfas.web.SignSessionInformation;
+import at.gv.egiz.pdfas.web.helper.SignServletHelper;
+import at.gv.egiz.pdfas.web.helper.TempDirHelper;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
@@ -43,39 +48,16 @@ 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.pdf.TablePos;
-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.ConnectorChooser;
-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.ExternAppInformation;
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.PDFContainer;
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
@@ -97,15 +79,13 @@ public class SignServlet extends HttpServlet
* The log.
*/
private static Log log = LogFactory.getLog(SignServlet.class);
-
- protected void dispatch(HttpServletRequest request,
- HttpServletResponse response, String resource) throws ServletException, IOException
+
+ 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
+ protected static void dispatch(HttpServletRequest request, HttpServletResponse response, String resource, ServletContext context) throws ServletException, IOException
{
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
@@ -181,10 +161,11 @@ public class SignServlet extends HttpServlet
UploadedData ud = null;
ExternAppInformation exappinf = null;
TablePos pos = null;
-
+
// check if pdf-as has been called by external webapp
- if(request.getParameter(FormFields.FIELD_PDF_URL) != null) {
-
+ if (request.getParameter(FormFields.FIELD_PDF_URL) != null)
+ {
+
String preview = (String) request.getParameter(FormFields.FIELD_PREVIEW);
String sig_type = (String) request.getParameter(FormFields.FIELD_SIGNATURE_TYPE);
String sig_app = (String) request.getParameter(FormFields.FIELD_CONNECTOR);
@@ -197,65 +178,74 @@ public class SignServlet extends HttpServlet
String session_id = (String) request.getParameter(FormFields.FIELD_SESSION_ID);
String sig_pos_y = (String) request.getParameter(FormFields.FIELD_SIGPOS_Y);
String sig_pos_p = (String) request.getParameter(FormFields.FIELD_SIGPOS_P);
-
- try {
- pos = new TablePos("y:" + sig_pos_y +";p:" + sig_pos_p);
- } catch (PDFDocumentException e) {
+
+ try
+ {
+ pos = new TablePos("y:" + sig_pos_y + ";p:" + sig_pos_p);
+ }
+ catch (PDFDocumentException e)
+ {
log.warn("Uanable to create signature position object: " + e.getMessage());
}
-
- String query = pdf_url + "&" + FormFields.FIELD_PDF_ID + "=" + pdf_id;
-
- byte[] extern_pdf = new byte[Integer.parseInt(pdf_length)];
+
+ String query = pdf_url + "&" + FormFields.FIELD_PDF_ID + "=" + pdf_id;
+
+ // wprinz: rem: this allocation is useless
+ // byte[] extern_pdf = new byte[Integer.parseInt(pdf_length)];
URL source_url = new URL(query);
InputStream is = source_url.openStream();
- extern_pdf = toByteArray(is);
-
- // set UploadedData object...
+ // extern_pdf = toByteArray(is);
+
+ // set UploadedData object...
UploadedData ud_extern = new UploadedData();
ud_extern.file_name = filename;
- ud_extern.pdf = extern_pdf;
+ ud_extern.pdfDataSource = TempDirHelper.placePdfIntoTempDir(is, filename);
+ // ud_extern.pdf = extern_pdf;
ud_extern.preview = preview.equalsIgnoreCase("true") ? true : false;
ud_extern.sig_app = sig_app;
ud_extern.sig_mode = sig_mode;
ud_extern.sig_type = sig_type;
-
+
ud = ud_extern;
-
- exappinf = new ExternAppInformation(invoke_url,pdf_id, session_id);
+
+ exappinf = new ExternAppInformation(invoke_url, pdf_id, session_id);
}
- else {
-
+ else
+ {
+
try
{
// tzefferer: modified
- //UploadedData ud = retrieveUploadedDataFromRequest(request);
+ // UploadedData ud = retrieveUploadedDataFromRequest(request);
UploadedData ud_form = retrieveUploadedDataFromRequest(request);
ud = ud_form;
// end modify
-
- } catch(Exception e) {
+
+ }
+ catch (Exception e)
+ {
// Error retrieving data
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");
}
}
- try {
+ try
+ {
- PdfAS.applyStrictMode(ud.pdf);
+ PdfAS.applyStrictMode(ud.pdfDataSource);
- SessionInformation si = new SessionInformation(); // SessionTable.generateSessionInformationObject();
+ SignSessionInformation si = new SignSessionInformation(); // SessionTable.generateSessionInformationObject();
si.connector = ud.sig_app;
si.application = "sign";
si.mode = ud.sig_mode;
- si.pdf = ud.pdf;
+ si.pdfDataSource = ud.pdfDataSource;
si.type = ud.sig_type;
si.filename = formatFileName(ud.file_name);
si.download_inline = ud.download_inline;
-
+
// added tzefferer:
si.exappinf = exappinf;
si.pos = pos;
@@ -270,7 +260,7 @@ public class SignServlet extends HttpServlet
// si.user_name = user_name;
// si.user_password = user_password;
- prepareSign(si);
+ SignServletHelper.prepareSign(si);
if (ud.preview)
{
@@ -285,7 +275,7 @@ public class SignServlet extends HttpServlet
return;
}
- finishSign(si, request, response, getServletContext());
+ SignServletHelper.finishSign(si, request, response, getServletContext());
}
catch (PresentableException e)
{
@@ -296,13 +286,13 @@ public class SignServlet extends HttpServlet
}
// tzefferer:added
- public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
doPost(request, response);
}
// end add
-
- protected UploadedData retrieveUploadedDataFromRequest(
- HttpServletRequest request) throws ServletException, UnsupportedEncodingException, FileUploadException, PDFDocumentException
+
+ protected UploadedData retrieveUploadedDataFromRequest(HttpServletRequest request) throws ServletException, UnsupportedEncodingException, FileUploadException, PDFDocumentException
{
DiskFileItemFactory fif = new DiskFileItemFactory();
fif.setRepository(SettingsReader.getTemporaryDirectory());
@@ -413,12 +403,22 @@ public class SignServlet extends HttpServlet
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$
}
+ FileBasedPdfDataSourceImpl pdfDataSource = null;
+ try
+ {
+ pdfDataSource = TempDirHelper.placePdfIntoTempDir(file_upload_fi.getInputStream(), doc_file_name);
+ }
+ catch (IOException e)
+ {
+ throw new PDFDocumentException(201, "Couldn't store the file in the temp dir.");
+ }
+ // byte[] pdf = file_upload_fi.get();
+
UploadedData ud = new UploadedData();
ud.preview = preview;
@@ -427,129 +427,55 @@ public class SignServlet extends HttpServlet
ud.sig_app = sig_app;
ud.sig_mode = mode;
ud.file_name = doc_file_name;
- ud.pdf = pdf;
+ ud.pdfDataSource = pdfDataSource;
return ud;
}
- /**
- * Prepares the sign.
- *
- * <p>
- * This prepares the data for both being signed or being previewed.
- * </p>
- *
- * @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);
-
- //tzefferer: modified
- //si.iui = signator.prepareSign(si.pdf, si.type, null, ConnectorFactory.needsSIG_ID(si.connector));
- si.iui = signator.prepareSign(si.pdf, si.type, si.pos, ConnectorFactory.needsSIG_ID(si.connector));
- // end modify
- log.debug("prepareSign finished."); //$NON-NLS-1$
- }
-
- /**
- * Finishes the sign.
- *
- * <p>
- * 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.
- * </p>
- *
- * @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 = ConnectorChooser.chooseWebConnectorForSign(si.connector, 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)
+ public static void prepareDispatchToErrorPage(PresentableException pe, HttpServletRequest request)
{
- if (pe instanceof ErrorCodeException)
- {
- ErrorCodeException ece = (ErrorCodeException) pe;
- request.setAttribute("error", "Fehler " + ece.getErrorCode());
+ request.setAttribute("PresentableException", pe);
+// if (pe instanceof ErrorCodeException)
+// {
+ request.setAttribute("error", "Fehler " + pe.getErrorCode());
- String cause = ece.getErrorCodeMessage();
- if (ece.hasExternalErrorMessage())
+ String cause = ErrorCodeHelper.getMessageForErrorCode(pe.getErrorCode());
+
+ if (pe instanceof ExternalErrorException)
{
- cause = ece.getExternalErrorCode() + ": " + ece.getExternalErrorMessage();
+ ExternalErrorException eee = (ExternalErrorException) pe;
+ cause = eee.getExternalErrorCode() + ": " + eee.getExternalErrorMessage();
}
request.setAttribute("cause", cause);
- if (pe instanceof PlaceholderException)
+ if (pe.getErrorCode() == ErrorCode.PLACEHOLDER_EXCEPTION)
{
- PlaceholderException phe = (PlaceholderException) ece;
+ PlaceholderException phe = null;
+ if (pe instanceof PlaceholderException)
+ {
+ phe = (PlaceholderException) pe;
+ }
+ else
+ {
+ phe = (PlaceholderException) pe.getCause();
+ }
- request.setAttribute("cause", "Der Platzhalter des Feldes " + phe.getField() + " ist um " + phe.getMissing() + " Bytes zu kurz. " + ece.getErrorCodeMessage());
+ request.setAttribute("cause", "Der Platzhalter des Feldes " + phe.getField() + " ist um " + phe.getMissing() + " Bytes zu kurz. " + cause);
}
- }
- else
- {
- request.setAttribute("error", "PresentableException");
- request.setAttribute("cause", pe.toString());
- }
+// }
+// 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
+ 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);
@@ -576,112 +502,40 @@ public class SignServlet extends HttpServlet
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);
-
- // tzefferer: added condition
- if (si.exappinf == null) {
-
- // 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());
- // tzefferer: added else-block
- } else {
- SignResult sr = si.sign_result;
- byte[] signed_pdf = sr.getData();
- PDFContainer entry = new PDFContainer(signed_pdf, si.exappinf.pdf_id);
- ProvidePDFServlet.signedDocuments.add(entry);
-
- // notify webapp...
- String invoke_url = si.exappinf.invoke_url;
-
- String providePDFServlet = "ProvidePDF";
- String pdf_id = String.valueOf(si.exappinf.pdf_id);
- String session_id = si.exappinf.session_id;
-
- // build URL
- int ind = invoke_url.indexOf("?");
- String query = invoke_url.substring(0, ind) + ";jsessionid=" + session_id + invoke_url.substring(ind) + "&" + FormFields.FIELD_PDF_URL + "=" + providePDFServlet + "&" + FormFields.FIELD_PDF_ID + "=" + pdf_id + "&" + FormFields.FIELD_FILE_LENGTH + "=" + signed_pdf.length;
- response.sendRedirect(query);
-
- }
- }
-
-
// tzefferer: added
- public static byte[] toByteArray(InputStream inputStream) throws IOException {
-
- if(inputStream == null) {
+ public static byte[] toByteArray(InputStream inputStream) throws IOException
+ {
+
+ if (inputStream == null)
+ {
return null;
}
-
+
ByteArrayOutputStream out = new ByteArrayOutputStream(8192);
int n;
byte[] buffer = new byte[2048];
BufferedInputStream bufIn = new BufferedInputStream(inputStream);
- try {
- while ((n = bufIn.read(buffer)) != -1) {
+ try
+ {
+ while ((n = bufIn.read(buffer)) != -1)
+ {
out.write(buffer, 0, n);
}
- } finally {
- if(bufIn != null) {
+ }
+ finally
+ {
+ if (bufIn != null)
+ {
bufIn.close();
}
}
return out.toByteArray();
}
+
// end add
protected static class UploadedData
@@ -698,6 +552,7 @@ public class SignServlet extends HttpServlet
protected String file_name = null;
- protected byte[] pdf = null;
+ protected FileBasedPdfDataSourceImpl pdfDataSource = null;
+ // protected byte[] pdf = null;
}
} \ No newline at end of file