/** * Copyright 2006 by Know-Center, Graz, Austria * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a * joint initiative of the Federal Chancellery Austria and Graz University of * Technology. * * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by * the European Commission - subsequent versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * http://www.osor.eu/eupl/ * * Unless required by applicable law or agreed to in writing, software * distributed under the Licence is distributed on an "AS IS" basis, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the Licence for the specific language governing permissions and * limitations under the Licence. * * This product combines work with different licenses. See the "NOTICE" text * file for details on the various modules and licenses. * The "NOTICE" text file is part of the distribution. Any derivative works * that you distribute must include a readable copy of the "NOTICE" text file. * * $Id: Sign.java,v 1.7 2006/10/11 07:39:13 wprinz Exp $ */ package at.gv.egiz.pdfas.web.servlets; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URL; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; 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.codec.binary.Hex; 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.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import at.gv.egiz.pdfas.api.commons.Constants; import at.gv.egiz.pdfas.api.exceptions.PdfAsException; import at.gv.egiz.pdfas.api.io.DataSource; import at.gv.egiz.pdfas.api.sign.pos.SignaturePositioning; 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.web.ExternAppInformation; import at.gv.egiz.pdfas.web.FormFields; import at.gv.egiz.pdfas.web.helper.ApiHelper; import at.gv.egiz.pdfas.web.helper.SignServletHelper; import at.gv.egiz.pdfas.web.helper.WebSettingsReader; import at.gv.egiz.pdfas.web.io.ByteArrayPdfDataSource; import at.gv.egiz.pdfas.web.itext.IText; import at.gv.egiz.pdfas.web.session.SessionAttributes; import at.gv.egiz.pdfas.web.session.SignSessionInformation; 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 com.lowagie.text.DocumentException; /** * 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); public static final String SUBMITFORM_SIGNATURE_TYPE_KEY = "signupload.jsp:signatureType"; public static final String SUBMITFORM_SIGNATURE_MODE_KEY = "signupload.jsp:signatureMode"; public static final String SUBMITFORM_SIGNATURE_DEVICE_KEY = "signupload.jsp:signatureKey"; public static final String SUBMITFORM_PDFA_KEY = "signupload.jsp:pdfaKey"; public static final String SUBMITFORM_SOURCE_KEY = "signupload.jsp:sourceKey"; public static final String SUBMITFORM_FREETEXT_KEY = "signupload.jsp:freeTextKey"; public static final String SUBMITFORM_NOTE_KEY = "signupload.jsp:noteKey"; public static final String SUBMITFORM_FILE_KEY = "signupload.jsp:fileKey"; public static final String SUBMITFORM_FILENAME_KEY = "signupload.jsp:filenameKey"; public static final String SUBMITFORM_PREVIEW = "signupload.jsp:previewKey"; // Added by rpiazzi to know if an error occured within IFrame because this // calls for // a different display of the error public static final String ERROR_WITHIN_IFRAME = "error_within_iframe"; // Added by rpiazzi to know the height of the div's in further jsp's public static final String HEIGHT_SIGN_DIV = "height_sign_div"; // Added by rpiazzi public static HttpSession session = null; 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); } /** * 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 { UploadedData ud = null; ExternAppInformation exappinf = null; SignaturePositioning sigpos = null; // for performance measurement long startTime = System.currentTimeMillis(); String plain_hex_digest = null; MessageDigest md = null; try { md = MessageDigest.getInstance("SHA-256"); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } // check if pdf-as has been called by external webapp 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); String sig_mode = (String) request .getParameter(FormFields.FIELD_MODE); String filename = (String) request .getParameter(FormFields.FIELD_FILENAME); String pdf_url = (String) request .getParameter(FormFields.FIELD_PDF_URL); String pdf_id = (String) request .getParameter(FormFields.FIELD_PDF_ID); String invoke_url = (String) request .getParameter(FormFields.FIELD_INVOKE_APP_URL); String invoke_error_url = (String) request .getParameter(FormFields.FIELD_INVOKE_APP_ERROR_URL); 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); String sig_pos_x = (String) request .getParameter(FormFields.FIELD_SIGPOS_X); String sig_pos_w = (String) request .getParameter(FormFields.FIELD_SIGPOS_W); String note = (String) request .getParameter(FormFields.FIELD_NOTE_ENABLED); // Added by rpiazzi log.debug("Received external request from " + request.getRemoteAddr()); log.debug("Parameter preview: " + preview); log.debug("Parameter sig_type: " + sig_type); log.debug("Parameter sig_app: " + sig_app); log.debug("Parameter sig_mode: " + sig_mode); log.debug("Parameter filename: " + filename); log.debug("Parameter pdf_url: " + pdf_url); log.debug("Parameter pdf_id: " + pdf_id); log.debug("Parameter invoke_url: " + invoke_url); log.debug("Parameter invoke_error_url: " + invoke_error_url); log.debug("Parameter session_id: " + session_id); log.debug("Parameter sig_pos_y: " + sig_pos_y); log.debug("Parameter sig_pos_p: " + sig_pos_p); log.debug("Parameter sig_pos_x: " + sig_pos_x); log.debug("Parameter sig_pos_w: " + sig_pos_w); log.debug("Parameter note: " + note); // end added session = request.getSession(true); session.setAttribute(SignServlet.SUBMITFORM_FILENAME_KEY, filename); // added by tknall if (sig_pos_y != null && sig_pos_p != null && sig_pos_x != null) { if (sig_pos_w != null) { try { sigpos = new SignaturePositioning("x:" + sig_pos_x + ";y:" + sig_pos_y + ";w:" + sig_pos_w + ";p:" + sig_pos_p); } catch (PDFDocumentException e) { log.warn("Unable to create signature position object: " + e.getMessage(), e); } } else { try { sigpos = new SignaturePositioning("x:" + sig_pos_x + ";y:" + sig_pos_y + ";p:" + sig_pos_p); } catch (PDFDocumentException e) { log.warn("Unable to create signature position object: " + e.getMessage(), e); } } } else { log.debug("No signature position provided."); } // if we already have parameters "&" must be used instead of "?" String paramSeparator = (pdf_url.indexOf("?") != -1) ? "&" : "?"; String query = pdf_url + "/" + filename + paramSeparator + FormFields.FIELD_PDF_ID + "=" + pdf_id; // query = pdf_url; log.debug("Query string for loading pdf: " + query); // 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... UploadedData ud_extern = new UploadedData(); ud_extern.file_name = filename; byte[] plain_pdf_data = IOUtils.toByteArray(is); ud_extern.pdfDataSource = new ByteArrayPdfDataSource(plain_pdf_data); ud_extern.preview = "true".equalsIgnoreCase(preview); ud_extern.sig_app = sig_app; ud_extern.sig_mode = sig_mode; ud_extern.sig_type = sig_type; if (note != null) { if (note.equals("true")) { ud_extern.note = true; ud_extern.sig_type = ud_extern.sig_type + "_NOTE"; } else { ud_extern.note = false; } } else { ud_extern.note = true; ud_extern.sig_type = ud_extern.sig_type + "_NOTE"; } ud_extern.pdfa = false; ud = ud_extern; exappinf = new ExternAppInformation(invoke_url, pdf_id, session_id, invoke_error_url); } else { try { // tzefferer: modified // UploadedData ud = retrieveUploadedDataFromRequest(request); UploadedData ud_form = retrieveUploadedDataFromRequest(request); ud = ud_form; // end modify } catch (PdfAsException e) { log.error(e); // Added by rpiazzi to check if this attribute is still null HttpSession session = request.getSession(); String error_within_iframe = (String) session .getAttribute(SUBMITFORM_SIGNATURE_DEVICE_KEY); if (error_within_iframe == null) { session.setAttribute(SignServlet.ERROR_WITHIN_IFRAME, "no"); } // end added prepareDispatchToErrorPage(e, request); dispatch(request, response, "/jsp/error.jsp"); return; } catch (FileUploadException e) { log.error(e); // Added by rpiazzi to check if this attribute is still null HttpSession session = request.getSession(); String error_within_iframe = (String) session .getAttribute(SUBMITFORM_SIGNATURE_DEVICE_KEY); if (error_within_iframe == null) { session.setAttribute(SignServlet.ERROR_WITHIN_IFRAME, "no"); } // end added request.setAttribute("error", e.getMessage()); request.setAttribute("cause", e.getCause()); request.setAttribute("resourcebundle", Boolean.TRUE); dispatch(request, response, "/jsp/error.jsp"); } catch (IOException e) { log.error(e); // Added by rpiazzi to check if this attribute is still null HttpSession session = request.getSession(); String error_within_iframe = (String) session .getAttribute(SUBMITFORM_SIGNATURE_DEVICE_KEY); if (error_within_iframe == null) { session.setAttribute(SignServlet.ERROR_WITHIN_IFRAME, "no"); } // end added request.setAttribute("error", e.getMessage()); request.setAttribute("cause", e.getCause()); request.setAttribute("resourcebundle", Boolean.TRUE); dispatch(request, response, "/jsp/error.jsp"); } } try { // not needed, that is done in sign() // ud.pdfDataSource = PdfAS.applyStrictMode(ud.pdfDataSource); session = request.getSession(true); SignSessionInformation si = new SignSessionInformation(); // SessionTable.generateSessionInformationObject(); si.connector = ud.sig_app; if ((ud.mobileTestEnabled) && (si.connector.equals("mobile"))) { si.connector = Constants.SIGNATURE_DEVICE_MOBILETEST; session.setAttribute( SignServlet.SUBMITFORM_SIGNATURE_DEVICE_KEY, si.connector); } si.application = "sign"; si.mode = ud.sig_mode; si.pdfDataSource = ud.pdfDataSource; si.type = ud.sig_type; if (md != null) { byte[] plain_digest = md.digest(ud.pdfDataSource.getAsByteArray()); plain_hex_digest = Hex.encodeHexString(plain_digest); log.info("Original PDF HASH Value: " + plain_hex_digest); si.plainPDFDigest = plain_hex_digest; } si.filename = formatFileName(ud.file_name); si.download_inline = ud.download_inline; si.pdfa = ud.pdfa; si.note = ud.note; // added tzefferer: si.exappinf = exappinf; si.pos = sigpos; // end add // added afitzek si.startTime = startTime; log.info("Putting signature data into session " + session.getId()); session.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; SignServletHelper.prepareSign( ApiHelper.getPdfAsFromContext(getServletContext()), si); // comment out by rpiazzi because preview has now its own Servlet /* * if (ud.preview) { String submit_url = * response.encodeURL(request.getContextPath() + "/SignPreview"); * String signature_data_url = * response.encodeURL(WebUtils.buildRetrieveSignatureDataURL * (request, response)); * * request.setAttribute("submit_url", submit_url); * request.setAttribute("signature_data_url", signature_data_url); * if (si.mode.equals(FormFields.VALUE_MODE_TEXTUAL)){ * request.setAttribute("document_text", * ((TextBased)si.sdi.getSignatureData()).getText()); } * * dispatch(request, response, "/jsp/signpreview.jsp"); * * return; } */ SignServletHelper.finishSign(si, request, response, getServletContext()); } catch (PresentableException e) { log.error(e.getMessage(), e); prepareDispatchToErrorPage(e, request); dispatch(request, response, "/jsp/error.jsp"); } catch (Exception e) { log.error(e.getMessage(), e); PresentableException pe = new PresentableException( ErrorCode.UNKNOWN_ERROR, e); prepareDispatchToErrorPage(pe, request); dispatch(request, response, "/jsp/error.jsp"); } } // tzefferer:added public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); doPost(request, response); } // end add protected UploadedData retrieveUploadedDataFromRequest( HttpServletRequest request) throws ServletException, UnsupportedEncodingException, FileUploadException, PDFDocumentException, IOException { DiskFileItemFactory fif = new DiskFileItemFactory(); fif.setRepository(WebSettingsReader.getTemporaryDirectory()); ServletFileUpload sfu = new ServletFileUpload(fif); List items = sfu.parseRequest(request); // FileItem preview_fi = null; FileItem mode_fi = null; FileItem file_upload_fi = null; // FileItem download_fi = null; FileItem freeText_fi = null; FileItem source_fi = null; FileItem sig_type_fi = null; FileItem sig_app_fi = null; boolean pdfaEnabled = false; boolean noteEnabled = false; String sig_type = ""; String sig_app = ""; String mode = ""; String doc_file_name; DataSource pdfDataSource; boolean mobileTestEnabled = false; Iterator it = items.iterator(); session = request.getSession(true); // Added by rpiazzi. If servlet was called for preview data was already // written into // session. // Now commented out because the preview function is no more supported /* * if ((((FileItem)items.get(0)).getFieldName().equals(SignServlet. * SUBMITFORM_PREVIEW))) { FileItem fi = (FileItem)items.get(1); * * sig_app_fi = fi; * session.setAttribute(SUBMITFORM_SIGNATURE_DEVICE_KEY, * sig_app_fi.getString("UTF-8")); * * if (((String)session.getAttribute(SUBMITFORM_PDFA_KEY))!=null) { if * (((String)session.getAttribute(SUBMITFORM_PDFA_KEY)).equals("on")) { * pdfaEnabled = true; } } if * (((String)session.getAttribute(SUBMITFORM_NOTE_KEY))!=null) { if * (((String)session.getAttribute(SUBMITFORM_NOTE_KEY)).equals("on")) { * noteEnabled = true; } } * * sig_type = * (String)session.getAttribute(SUBMITFORM_SIGNATURE_TYPE_KEY); sig_app * = sig_app_fi.getString("UTF-8"); * * mode = (String)session.getAttribute(SUBMITFORM_SIGNATURE_MODE_KEY); * doc_file_name = * (String)session.getAttribute(SUBMITFORM_FILENAME_KEY); pdfDataSource * = (DataSource)session.getAttribute(SUBMITFORM_FILE_KEY); * * } //end added else { */ // Added by rpiazzi to check wheter local bku button was hit. In this // case the parameters // were already put into session because before local bku, online bku // has to be called // and therefore this servlet was already called. // First check if one submitted parameter is the local bku button. boolean localFound = false; int positionLocal = 0; while (it.hasNext()) { if (((FileItem) it.next()).getFieldName().equals( FormFields.FIELD_CONNECTOR_LOCALBKU)) { localFound = true; break; } positionLocal++; } if (localFound) { session.setAttribute(SignServlet.ERROR_WITHIN_IFRAME, "no"); pdfaEnabled = "on".equalsIgnoreCase((String) session .getAttribute(SUBMITFORM_PDFA_KEY)); sig_type = (String) session .getAttribute(SUBMITFORM_SIGNATURE_TYPE_KEY); noteEnabled = "on".equalsIgnoreCase((String) session .getAttribute(SUBMITFORM_NOTE_KEY)); session.setAttribute(SUBMITFORM_SIGNATURE_DEVICE_KEY, "bku"); sig_app = "bku"; mode = (String) session.getAttribute(SUBMITFORM_SIGNATURE_MODE_KEY); doc_file_name = (String) session .getAttribute(SUBMITFORM_FILENAME_KEY); pdfDataSource = (DataSource) session .getAttribute(SUBMITFORM_FILE_KEY); } // end added // else get settings from form fields else { session.setAttribute(SignServlet.ERROR_WITHIN_IFRAME, "yes"); 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_SIGNATURE_TYPE)) { sig_type_fi = item; session.setAttribute(SUBMITFORM_SIGNATURE_TYPE_KEY, item.getString("UTF-8")); sig_type = item.getString("UTF-8"); continue; } if ((item.getFieldName() .equals(FormFields.FIELD_CONNECTOR_SMARTCARD)) || (item.getFieldName() .equals(FormFields.FIELD_CONNECTOR_MOBILE)) || (item.getFieldName() .equals(FormFields.FIELD_CONNECTOR_LOCALBKU))) { if (item.getFieldName().equals( FormFields.FIELD_CONNECTOR_SMARTCARD)) { session.setAttribute(SUBMITFORM_SIGNATURE_DEVICE_KEY, "moc"); sig_app = "moc"; } if (item.getFieldName().equals( FormFields.FIELD_CONNECTOR_MOBILE)) { session.setAttribute(SUBMITFORM_SIGNATURE_DEVICE_KEY, "mobile"); sig_app = "mobile"; } if (item.getFieldName().equals( FormFields.FIELD_CONNECTOR_LOCALBKU)) { session.setAttribute(SUBMITFORM_SIGNATURE_DEVICE_KEY, "bku"); sig_app = "bku"; } continue; } if (item.getFieldName().equals(FormFields.FIELD_MODE)) { mode_fi = item; session.setAttribute(SUBMITFORM_SIGNATURE_MODE_KEY, mode_fi.getString("UTF-8")); continue; } if (item.getFieldName().equals(FormFields.FIELD_SOURCE_FILE)) { // changed by rpiazzi // Item always contains something as it is just hidden by // javascript // because of this just set the value if not empty if (item != null) { file_upload_fi = item; } continue; } // Added by rpiazzi to ignore the form fields for the inactive // mode // but not more needed /* * if * (item.getFieldName().equals(FormFields.FIELD_MODE_INACTIVE)) * { continue; } */ // end added /* * Commented out by rpiazzi because not more needed if * (item.getFieldName().equals(FormFields.FIELD_DOWNLOAD)) { * download_fi = item; continue; } */ if (FormFields.FIELD_PDFA_ENABLED.equals(item.getFieldName())) { if (item.getString("UTF-8") != null) { session.setAttribute(SUBMITFORM_PDFA_KEY, "on"); pdfaEnabled = true; } else { session.setAttribute(SUBMITFORM_PDFA_KEY, "off"); pdfaEnabled = false; } continue; } if (FormFields.FIELD_SOURCE_FREETEXT .equals(item.getFieldName())) { freeText_fi = item; String value = freeText_fi.getString("UTF-8"); if (value != null) { session.setAttribute(SUBMITFORM_FREETEXT_KEY, value); } continue; } if (FormFields.FIELD_SOURCE.equals(item.getFieldName())) { source_fi = item; session.setAttribute(SUBMITFORM_SOURCE_KEY, item.getString("UTF-8")); continue; } // Added by rpiazzi. Feature added for inserting note into // signature block if (FormFields.FIELD_NOTE_ENABLED.equals(item.getFieldName())) { if (item.getString("UTF-8") != null) { session.setAttribute(SUBMITFORM_NOTE_KEY, "on"); noteEnabled = true; } else { session.setAttribute(SUBMITFORM_NOTE_KEY, "off"); noteEnabled = false; } continue; } // end added // Added by rpiazzi to let later jsp's know the height of the // div elements if (FormFields.FIELD_HEIGHT_SIGNDIV.equals(item.getFieldName())) { session.setAttribute(HEIGHT_SIGN_DIV, item.getString("UTF-8")); continue; } // end added if (FormFields.FIELD_MOBILETEST_ENABLED.equals(item .getFieldName())) { if (item.getString("UTF-8") != null) { if (item.getString("UTF-8").equals("on")) { mobileTestEnabled = true; } } continue; } throw new ServletException("Unrecognized POST data."); //$NON-NLS-1$ } if (sig_type_fi == null || (file_upload_fi == null && freeText_fi == null)) { throw new ServletException( "Insufficient data provided in request"); //$NON-NLS-1$ } 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$ } // Commented out by rpiazzi because not more needed /* * boolean download_inline = true; if * (download_fi.getString("UTF-8") * .equals(FormFields.VALUE_DOWNLOAD_ATTACHMENT)) //$NON-NLS-1$ { * download_inline = false; } */ // distinguish between file and freetext if (source_fi.getString("UTF-8").equals( FormFields.VALUE_SOURCE_FILE)) { log.debug("Processing file."); File f = new File(file_upload_fi.getName()); doc_file_name = f.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$ } if (file_upload_fi.getSize() <= 0) { throw new PDFDocumentException(250, "The document is empty."); //$NON-NLS-1$ } try { pdfDataSource = new ByteArrayPdfDataSource( IOUtils.toByteArray(file_upload_fi.getInputStream())); session.setAttribute(SUBMITFORM_FILE_KEY, pdfDataSource); session.setAttribute(SUBMITFORM_FILENAME_KEY, doc_file_name); } catch (IOException e) { throw new PDFDocumentException(201, "Couldn't store the file in the temp dir.", e); } } else { log.debug("Processing free text."); try { byte[] freeTextPDF = IText.createPDF( freeText_fi.getString("UTF-8"), pdfaEnabled); pdfDataSource = new ByteArrayPdfDataSource(freeTextPDF); doc_file_name = IText.DEFAULT_FILENAME; session.setAttribute(SUBMITFORM_FILE_KEY, pdfDataSource); session.setAttribute(SUBMITFORM_FILENAME_KEY, doc_file_name); } catch (DocumentException e) { throw new PDFDocumentException(201, "Unable to create PDF document.", e); } catch (IOException e) { throw new PDFDocumentException(201, "Unable to create PDF document.", e); } // } // byte[] pdf = file_upload_fi.get(); } } UploadedData ud = new UploadedData(); ud.preview = false; ud.pdfa = pdfaEnabled; ud.download_inline = false; ud.sig_type = sig_type; ud.sig_app = sig_app; ud.sig_mode = mode; ud.file_name = doc_file_name; ud.pdfDataSource = pdfDataSource; ud.note = noteEnabled; // Added by rpiazzi if (ud.note && !ud.sig_type.contains("NOTE")) { ud.sig_type += "_NOTE"; session.setAttribute(SUBMITFORM_SIGNATURE_TYPE_KEY, ud.sig_type); } if (mobileTestEnabled) { ud.mobileTestEnabled = true; } // end added return ud; } public static void prepareDispatchToErrorPage(PdfAsException pe, HttpServletRequest request) { request.setAttribute("PresentableException", pe); // if (pe instanceof ErrorCodeException) // { request.setAttribute("error", "Fehler " + pe.getErrorCode()); String cause = ErrorCodeHelper .getMessageForErrorCode(pe.getErrorCode()); if (pe instanceof ExternalErrorException) { ExternalErrorException eee = (ExternalErrorException) pe; cause = eee.getExternalErrorCode() + ": " + eee.getExternalErrorMessage(); } request.setAttribute("cause", cause); if (pe.getErrorCode() == ErrorCode.PLACEHOLDER_EXCEPTION) { 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. " + cause); } // Added by rpiazzi to know if error happened when request was within // iframe // In this case the visualization of the error has to be done // differently /* * HttpSession session = request.getSession(); if * (((String)session.getAttribute * (SUBMITFORM_SIGNATURE_DEVICE_KEY)).equals * (Constants.SIGNATURE_DEVICE_BKU)) { * request.setAttribute(ERROR_WITHIN_IFRAME, "no"); } else { * request.setAttribute(ERROR_WITHIN_IFRAME, "yes"); } */ // end added // } // else // { // request.setAttribute("error", "PresentableException"); // request.setAttribute("cause", pe.toString()); // } } /** * 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; } // tzefferer: added 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) { out.write(buffer, 0, n); } } finally { if (bufIn != null) { bufIn.close(); } } return out.toByteArray(); } // end add protected static class UploadedData { protected boolean preview = false; protected boolean pdfa = 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 DataSource pdfDataSource = null; protected boolean mobileTestEnabled = false; // added by rpiazzi protected boolean note = false; // protected byte[] pdf = null; } }