diff options
19 files changed, 297 insertions, 157 deletions
diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/PdfAsFactory.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/PdfAsFactory.java index d6ed2028..c710082b 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/PdfAsFactory.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/PdfAsFactory.java @@ -36,6 +36,7 @@ import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; +import org.apache.log4j.BasicConfigurator; import org.apache.log4j.PropertyConfigurator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,11 +54,12 @@ public class PdfAsFactory { private static final String DEFAULT_CONFIG_RES = "config/config.zip"; -// private static final String MAN_ATTRIBUTE = "JARMANIFEST"; -// private static final String PDF_AS_LIB = "PDF-AS-LIB"; -// private static final String IMPL_VERSION = "Implementation-Version"; -// private static final String SCM_REVISION = "SCMREVISION"; - + private static final String DEFAULT_LOG4J_ENV = "log4j.configuration"; + + // private static final String MAN_ATTRIBUTE = "JARMANIFEST"; + // private static final String PDF_AS_LIB = "PDF-AS-LIB"; + // private static final String IMPL_VERSION = "Implementation-Version"; + // private static final String SCM_REVISION = "SCMREVISION"; static { /* @@ -66,13 +68,16 @@ public class PdfAsFactory { */ IAIK.addAsProvider(); ECCelerate.addAsProvider(); - - System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); + + System.out + .println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); System.out.println("+ PDF-AS: " + getVersion()); System.out.println("+ PDF-AS SCM Revision: " + getSCMRevision()); System.out.println("+ IAIK-JCE Version: " + IAIK.getVersionInfo()); - System.out.println("+ ECCelerate Version: " + ECCelerate.getInstance().getVersion()); - System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println("+ ECCelerate Version: " + + ECCelerate.getInstance().getVersion()); + System.out + .println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); } private static boolean log_configured = false; @@ -86,30 +91,64 @@ public class PdfAsFactory { /** * Create a new instance of PDF-AS - * @param configuration The PDF-AS configuration + * + * @param configuration + * The PDF-AS configuration * @return */ public static PdfAs createPdfAs(File configuration) { if (!log_configured) { synchronized (log_mutex) { if (!log_configured) { - File log4j = new File(configuration.getAbsolutePath() - + File.separator + "cfg" + File.separator - + "log4j.properties"); - logger.info("Loading log4j configuration: " - + log4j.getAbsolutePath()); - if (log4j.exists()) { - try { - System.setProperty("pdf-as.work-dir", - configuration.getAbsolutePath()); - PropertyConfigurator.configure(new FileInputStream( - log4j)); - logger.info("Configured Log4j with: " + log4j.getAbsolutePath()); - } catch (FileNotFoundException e) { - e.printStackTrace(); + + if (System.getProperty(DEFAULT_LOG4J_ENV) != null) { + String file = System.getProperty(DEFAULT_LOG4J_ENV); + File log4j = new File(file); + System.out.println("Configuring logging with: " + log4j.getAbsolutePath()); + logger.info("Loading log4j configuration: " + + log4j.getAbsolutePath()); + if (log4j.exists()) { + try { + System.setProperty("pdf-as.work-dir", + configuration.getAbsolutePath()); + PropertyConfigurator + .configure(new FileInputStream(log4j)); + logger.info("Configured Log4j with: " + + log4j.getAbsolutePath()); + } catch (FileNotFoundException e) { + e.printStackTrace(); + System.err.println("Failed to initialize logging System. Defaulting to basic configuration!"); + BasicConfigurator.configure(); + } + } else { + System.err.println("Log4j File: " + log4j.getAbsolutePath() + " does not exist! Defaulting to basic configuration!"); + BasicConfigurator.configure(); + } + } else { + File log4j = new File(configuration.getAbsolutePath() + + File.separator + "cfg" + File.separator + + "log4j.properties"); + System.out.println("Configuring logging with: " + log4j.getAbsolutePath()); + logger.info("Loading log4j configuration: " + + log4j.getAbsolutePath()); + if (log4j.exists()) { + try { + System.setProperty("pdf-as.work-dir", + configuration.getAbsolutePath()); + PropertyConfigurator + .configure(new FileInputStream(log4j)); + logger.info("Configured Log4j with: " + + log4j.getAbsolutePath()); + } catch (FileNotFoundException e) { + e.printStackTrace(); + System.err.println("Failed to initialize logging System. Defaulting to basic configuration!"); + BasicConfigurator.configure(); + } + } else { + System.err.println("Log4j File: " + log4j.getAbsolutePath() + " does not exist! Defaulting to basic configuration!"); + BasicConfigurator.configure(); } } - log_configured = true; } } @@ -120,8 +159,11 @@ public class PdfAsFactory { /** * Creates a sign parameter - * @param configuration The configuration to be used - * @param dataSource The data source to be used + * + * @param configuration + * The configuration to be used + * @param dataSource + * The data source to be used * @return */ public static SignParameter createSignParameter( @@ -132,8 +174,11 @@ public class PdfAsFactory { /** * Creates a verification parameter - * @param configuration The configuration to be used - * @param dataSource The data source to be used + * + * @param configuration + * The configuration to be used + * @param dataSource + * The data source to be used * @return */ public static VerifyParameter createVerifyParameter( @@ -216,18 +261,20 @@ public class PdfAsFactory { } } } - + /** * Gets the PDF-AS SCM Revision + * * @return */ public static String getSCMRevision() { Package pack = PdfAsFactory.class.getPackage(); return pack.getSpecificationVersion(); } - - /** - * Gets the PDF-AS Version + + /** + * Gets the PDF-AS Version + * * @return PDF-AS Verison string */ public static String getVersion() { diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java index cf7376c2..ed7033eb 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java @@ -103,16 +103,6 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants { if (parameter.getOutput() == null) { throw new PdfAsValidationException("error.pdf.sig.11", null); } - - /* - * try { PDDocument doc = PDDocument.load(new - * ByteArrayInputStream(parameter.getDataSource().getByteData())); - * PDFUtils.checkPDFPermissions(doc); doc.close(); } catch(IOException - * e) { throw new PdfAsValidationException("error.pdf.sig.12", null, e); - * } - */ - - // TODO: verify Sign Parameter } private void verifyVerifyParameter(VerifyParameter parameter) @@ -126,8 +116,6 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants { || parameter.getDataSource().getByteData() == null) { throw new PdfAsValidationException("error.pdf.verify.01", null); } - - // TODO: verify Verify Parameter } public SignResult sign(SignParameter parameter) throws PdfAsException { @@ -200,9 +188,7 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants { throw new PdfAsException("error.pdf.sig.01", e); } finally { if(status != null) { - if(status.getPdfObject() != null) { - status.getPdfObject().close(); - } + status.clear(); } logger.trace("sign done"); } @@ -444,9 +430,7 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants { throw new PdfAsException("error.pdf.sig.06", e); } finally { if(status != null) { - if(status.getPdfObject() != null) { - status.getPdfObject().close(); - } + status.clear(); } } } diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/positioning/Positioning.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/positioning/Positioning.java index b6405c2d..84e85686 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/positioning/Positioning.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/positioning/Positioning.java @@ -113,6 +113,8 @@ public class Positioning { .getAllPages().get(page - 1); PDRectangle cropBox = pdPage.getCropBox(); + // fallback to MediaBox if Cropbox not available! + if (cropBox == null) { cropBox = pdPage.findCropBox(); } @@ -121,8 +123,6 @@ public class Positioning { cropBox = pdPage.findMediaBox(); } - // TODO: fallback to MediaBox if Cropbox not available! - // getPagedimensions // Rectangle psize = reader.getPageSizeWithRotation(page); // int page_rotation = reader.getPageRotation(page); diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/TableFactory.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/TableFactory.java index 8f945414..c3ce8cc8 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/TableFactory.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/TableFactory.java @@ -278,7 +278,7 @@ public class TableFactory implements IProfileConstants { } */ /* String overrideVal = OverridePropertyHolder.getProperty(key); - if (value != null && sigEntry != null && !sigEntry.isPlaceholder && overrideVal != null) { // TODO this!! SignatureEntry.isPlaceholder + if (value != null && sigEntry != null && !sigEntry.isPlaceholder && overrideVal != null) { value = overrideVal; if (logger.isDebugEnabled()) { logger.debug("Using override property for key '" + key + "' = " + value); diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsTemplateCreator.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsTemplateCreator.java index 1c001b0c..90f39ed7 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsTemplateCreator.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsTemplateCreator.java @@ -32,7 +32,7 @@ public class PDFAsTemplateCreator extends PDFTemplateCreator { public InputStream buildPDF(PDFAsVisualSignatureDesigner properties) throws IOException { - logger.info("pdf building has been started"); + logger.debug("pdf building has been started"); PDFTemplateStructure pdfStructure = pdfBuilder.getStructure(); // we create array of [Text, ImageB, ImageC, ImageI] @@ -134,7 +134,7 @@ public class PDFAsTemplateCreator extends PDFTemplateCreator { { logger.error("COSVisitorException: can't get apereance stream ", e); } - logger.info("stream returning started, size= " + in.available()); + logger.debug("stream returning started, size= " + in.available()); // we must close the document template.close(); diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java index f7a6c824..39fe164c 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java @@ -69,7 +69,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { } } - logger.info("Drawing Table:"); + logger.debug("Drawing Table:"); abstractTable.dumpTable(); if (abstractTable.getBGColor() != null) { @@ -90,7 +90,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { } for (int cols_idx = 0; cols_idx < colsSizes.length; cols_idx++) { - logger.info("Col: " + cols_idx + " : " + colsSizes[cols_idx]); + logger.debug("Col: " + cols_idx + " : " + colsSizes[cols_idx]); } float border = abstractTable.style.getBorder(); @@ -106,7 +106,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { // draw the rows float nexty = y + tableHeight; for (int i = 0; i <= rows; i++) { - logger.info("ROW LINE: {} {} {} {}", x, nexty, x + tableWidth, + logger.debug("ROW LINE: {} {} {} {}", x, nexty, x + tableWidth, nexty); contentStream.drawLine(x, nexty, x + tableWidth, nexty); if (i < abstractTable.getRowHeights().length) { @@ -129,7 +129,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { if (subtable && i == cols) { continue; } - logger.info("COL LINE: {} {} {} {}", nextx, ypos, nextx, + logger.debug("COL LINE: {} {} {} {}", nextx, ypos, nextx, yheight); contentStream.drawLine(nextx, ypos, nextx, yheight); if (i < colsSizes.length) { @@ -167,13 +167,13 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { if (innerFormResources.getFonts().containsValue(textFont)) { String fontID = getFontID(textFont); - logger.info("Using Font: " + fontID); + logger.debug("Using Font: " + fontID); contentStream.appendRawCommands("/" + fontID + " " + fontSize + " Tf\n"); } else { contentStream.setFont(textFont, fontSize); } - logger.info("Writing: " + textx + " : " + ttexty + " = " + logger.debug("Writing: " + textx + " : " + ttexty + " = " + text + " as " + cell.getType() + " w " + fontName); contentStream.moveTextPositionByAmount(textx, ttexty); @@ -222,7 +222,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { - abstractTable.getRowHeights()[i] / 2; imgy = imgy - image.getSize() / 2; } - logger.info("Image: " + textx + " : " + imgy); + logger.debug("Image: " + textx + " : " + imgy); contentStream.drawXObject(pdImage, textx, imgy, image.getSize(), image.getSize()); // contentStream.endMarkedContentSequence(); @@ -234,14 +234,14 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { // texty = texty - padding; tableX = textx - padding; PDFBoxTable tbl_value = (PDFBoxTable) cell.getValue(); - logger.info("Table: " + tableX + " : " + tableY); + logger.debug("Table: " + tableX + " : " + tableY); drawTable(page, contentStream, tableX, tableY, tbl_value, doc, true); } textx += (colsSizes != null) ? colsSizes[j] : colWidth; } // if (i + 1 < abstractTable.getRowHeights().length) { - logger.info("Row {} from {} - {} - {} = {}", i, texty, + logger.debug("Row {} from {} - {} - {} = {}", i, texty, abstractTable.getRowHeights()[i], padding * 2, texty - (abstractTable.getRowHeights()[i] + padding * 2)); texty -= abstractTable.getRowHeights()[i] + padding * 2; @@ -286,7 +286,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { procSetArr.add(COSName.getPDFName("ImageB")); procSetArr.add(COSName.getPDFName("ImageI")); getStructure().setProcSet(procSetArr); - logger.info("ProcSet array has been created"); + logger.debug("ProcSet array has been created"); } @Override @@ -311,7 +311,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { } } - logger.info("TOTAL Width: " + table.getWidth()); + logger.debug("TOTAL Width: " + table.getWidth()); float total = 0; @@ -325,7 +325,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { } for (int cols_idx = 0; cols_idx < colsSizes.length; cols_idx++) { - logger.info("Col: " + cols_idx + " : " + colsSizes[cols_idx]); + logger.debug("Col: " + cols_idx + " : " + colsSizes[cols_idx]); } /* @@ -417,7 +417,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { stream.close(); PDStream innterFormStream = getStructure().getPage().getContents(); getStructure().setInnterFormStream(innterFormStream); - logger.info("Strean of another form (inner form - it would be inside holder form) has been created"); + logger.debug("Strean of another form (inner form - it would be inside holder form) has been created"); } catch (Throwable e) { e.printStackTrace(); @@ -439,7 +439,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { */ holderFormResources.getCOSDictionary().setItem(COSName.PROC_SET, procSet); - logger.info("inserted ProcSet to PDF"); + logger.debug("inserted ProcSet to PDF"); } public void injectAppearanceStreams(PDStream holderFormStream, @@ -470,7 +470,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { String innerFormComment = getStructure().getInnterFormStream() .getInputStreamAsString(); - logger.info("Inner Form Stream: " + innerFormComment); + logger.debug("Inner Form Stream: " + innerFormComment); // appendRawCommands(getStructure().getInnterFormStream().createOutputStream(), // getStructure().getInnterFormStream().getInputStreamAsString()); @@ -481,7 +481,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { .createOutputStream(), innerFormComment); // appendRawCommands(getStructure().getImageFormStream().createOutputStream(), // imgFormComment); - logger.info("Injected apereance stream to pdf"); + logger.debug("Injected apereance stream to pdf"); } @@ -490,21 +490,21 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { page.setMediaBox(new PDRectangle(properties.getPageWidth(), properties .getPageHeight())); getStructure().setPage(page); - logger.info("PDF page has been created"); + logger.debug("PDF page has been created"); } public void createAcroForm(PDDocument template) { PDAcroForm theAcroForm = new PDAcroForm(template); template.getDocumentCatalog().setAcroForm(theAcroForm); getStructure().setAcroForm(theAcroForm); - logger.info("Acro form page has been created"); + logger.debug("Acro form page has been created"); } public void createSignatureField(PDAcroForm acroForm) throws IOException { PDSignatureField sf = new PDSignatureField(acroForm); getStructure().setSignatureField(sf); - logger.info("Signature field has been created"); + logger.debug("Signature field has been created"); } public void createSignature(PDSignatureField pdSignatureField, PDPage page, @@ -517,7 +517,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { pdSignature.setByteRange(new int[] { 0, 0, 0, 0 }); pdSignature.setContents(new byte[4096]); getStructure().setPdSignature(pdSignature); - logger.info("PDSignatur has been created"); + logger.debug("PDSignatur has been created"); } public void createAcroFormDictionary(PDAcroForm acroForm, @@ -531,7 +531,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { acroFormDict.setString(COSName.DA, "/sylfaen 0 Tf 0 g"); getStructure().setAcroFormFields(acroFormFields); getStructure().setAcroFormDictionary(acroFormDict); - logger.info("AcroForm dictionary has been created"); + logger.debug("AcroForm dictionary has been created"); } public void createSignatureRectangle(PDSignatureField signatureField, @@ -563,11 +563,11 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { rect.setUpperRightY((float) upDst.getY()); rect.setLowerLeftY((float) llDst.getY()); rect.setLowerLeftX((float) llDst.getX()); - logger.info("rectangle of signature has been created: {}", + logger.debug("rectangle of signature has been created: {}", rect.toString()); signatureField.getWidget().setRectangle(rect); getStructure().setSignatureRectangle(rect); - logger.info("rectangle of signature has been created"); + logger.debug("rectangle of signature has been created"); } public void createAffineTransform(byte[] params) { @@ -575,14 +575,14 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { params[2], params[3], params[4], params[5]); // transform.rotate(90); getStructure().setAffineTransform(transform); - logger.info("Matrix has been added"); + logger.debug("Matrix has been added"); } public void createSignatureImage(PDDocument template, InputStream inputStream) throws IOException { PDJpeg img = new PDJpeg(template, inputStream); getStructure().setJpedImage(img); - logger.info("Visible Signature Image has been created"); + logger.debug("Visible Signature Image has been created"); // pdfStructure.setTemplate(template); inputStream.close(); @@ -601,20 +601,20 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { formrect.setLowerLeftY(translated[3]); getStructure().setFormaterRectangle(formrect); - logger.info("Formater rectangle has been created"); + logger.debug("Formater rectangle has been created"); } public void createHolderFormStream(PDDocument template) { PDStream holderForm = new PDStream(template); getStructure().setHolderFormStream(holderForm); - logger.info("Holder form Stream has been created"); + logger.debug("Holder form Stream has been created"); } public void createHolderFormResources() { PDResources holderFormResources = new PDResources(); getStructure().setHolderFormResources(holderFormResources); - logger.info("Holder form resources have been created"); + logger.debug("Holder form resources have been created"); } @@ -626,7 +626,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { holderForm.setBBox(formrect); holderForm.setFormType(1); getStructure().setHolderForm(holderForm); - logger.info("Holder form has been created"); + logger.debug("Holder form has been created"); } @@ -646,13 +646,13 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { signatureField.getWidget().setAppearance(appearance); getStructure().setAppearanceDictionary(appearance); - logger.info("PDF appereance Dictionary has been created"); + logger.debug("PDF appereance Dictionary has been created"); } public void createInnerFormResource() { getStructure().setInnerFormResources(innerFormResources); - logger.info("Resources of another form (inner form - it would be inside holder form) have been created"); + logger.debug("Resources of another form (inner form - it would be inside holder form) have been created"); } public void createInnerForm(PDResources innerFormResources, @@ -662,7 +662,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { innerForm.setBBox(formrect); innerForm.setFormType(1); getStructure().setInnerForm(innerForm); - logger.info("Another form (inner form - it would be inside holder form) have been created"); + logger.debug("Another form (inner form - it would be inside holder form) have been created"); } @@ -670,19 +670,19 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { PDResources holderFormResources) { String name = holderFormResources.addXObject(innerForm, "FRM"); getStructure().setInnerFormName(name); - logger.info("Alerady inserted inner form inside holder form"); + logger.debug("Alerady inserted inner form inside holder form"); } public void createImageFormStream(PDDocument template) { PDStream imageFormStream = new PDStream(template); getStructure().setImageFormStream(imageFormStream); - logger.info("Created image form Stream"); + logger.debug("Created image form Stream"); } public void createImageFormResources() { PDResources imageFormResources = new PDResources(); getStructure().setImageFormResources(imageFormResources); - logger.info("Created image form Resources"); + logger.debug("Created image form Resources"); } public void createImageForm(PDResources imageFormResources, @@ -716,7 +716,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { this.getStructure().setImageForm(imageForm); this.getStructure().setImageFormName(imageFormName); this.getStructure().setImageName(imageName); - logger.info("Created image form"); + logger.debug("Created image form"); } public void appendRawCommands(OutputStream os, String commands) @@ -727,7 +727,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { public void createVisualSignature(PDDocument template) { this.getStructure().setVisualSignature(template.getDocument()); - logger.info("Visible signature has been created"); + logger.debug("Visible signature has been created"); } @@ -739,7 +739,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { widgetDict.setItem(COSName.DR, holderFormResources.getCOSObject()); getStructure().setWidgetDictionary(widgetDict); - logger.info("WidgetDictionary has been crated"); + logger.debug("WidgetDictionary has been crated"); } public void closeTemplate(PDDocument template) throws IOException { diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureProperties.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureProperties.java index 9ccf4eed..1b3cf688 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureProperties.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureProperties.java @@ -40,7 +40,7 @@ public class PDFAsVisualSignatureProperties extends PDVisibleSigProperties { float posy = designer.getPageHeight() - pos.getY(); designer.coordinates(pos.getX(), posy); float[] form_rect = new float[] {0,0, main.getWidth() + 2, main.getHeight() + 2}; - logger.info("AP Rect: {} {} {} {}", form_rect[0], form_rect[1], form_rect[2], form_rect[3]); + logger.debug("AP Rect: {} {} {} {}", form_rect[0], form_rect[1], form_rect[2], form_rect[3]); designer.formaterRectangleParams(form_rect); //this.setPdVisibleSignature(designer); } catch (Throwable e) { diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxFont.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxFont.java index 62aaf5a8..b0c4b552 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxFont.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxFont.java @@ -125,7 +125,7 @@ public class PDFBoxFont { public PDFBoxFont(String fontDesc, ISettings settings) throws IOException { this.settings = settings; this.fontDesc = fontDesc; - logger.info("Creating Font: " + fontDesc); + logger.debug("Creating Font: " + fontDesc); this.setFont(fontDesc); } diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxTable.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxTable.java index 1c9ad953..1d8928aa 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxTable.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxTable.java @@ -504,22 +504,22 @@ public class PDFBoxTable { } public void dumpTable() { - logger.info("====================================================================="); - logger.info("Information about: " + this.table.getName()); - logger.info("\tDimensions: {} x {} (W x H)", this.tableWidth, + logger.debug("====================================================================="); + logger.debug("Information about: " + this.table.getName()); + logger.debug("\tDimensions: {} x {} (W x H)", this.tableWidth, this.tableHeight); - logger.info("\tPadding: {}", padding); - logger.info("\t================================"); - logger.info("\tRow Heights:"); + logger.debug("\tPadding: {}", padding); + logger.debug("\t================================"); + logger.debug("\tRow Heights:"); for (int i = 0; i < rowHeights.length; i++) { - logger.info("\t[{}] : {}", i, this.rowHeights[i]); + logger.debug("\t[{}] : {}", i, this.rowHeights[i]); } - logger.info("\t================================"); - logger.info("\tCol Widths:"); + logger.debug("\t================================"); + logger.debug("\tCol Widths:"); for (int i = 0; i < colWidths.length; i++) { - logger.info("\t[{}] : {}", i, this.colWidths[i]); + logger.debug("\t[{}] : {}", i, this.colWidths[i]); } - logger.info("====================================================================="); + logger.debug("====================================================================="); } public Table getOrigTable() { diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxStamper.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxStamper.java index 762f22e9..374c7fea 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxStamper.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PdfBoxStamper.java @@ -31,8 +31,7 @@ public class PdfBoxStamper implements IPDFStamper { } public void setSettings(ISettings settings) { - // TODO Auto-generated method stub - + // not needed currently } } diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/status/OperationStatus.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/status/OperationStatus.java index 0796078f..75eee27f 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/status/OperationStatus.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/status/OperationStatus.java @@ -36,39 +36,53 @@ import at.gv.egiz.pdfas.lib.impl.configuration.PlaceholderConfiguration; import at.gv.egiz.pdfas.lib.impl.configuration.SignatureProfileConfiguration; public class OperationStatus implements Serializable { - + /** * */ private static final long serialVersionUID = -2985007198666388528L; - - + private SignParameter signParamter; private PDFObject pdfObject = new PDFObject(this); - + private ISettings configuration; private PlaceholderConfiguration placeholderConfiguration = null; private GlobalConfiguration gloablConfiguration = null; - private Map<String, SignatureProfileConfiguration> signatureProfiles = - new HashMap<String, SignatureProfileConfiguration>(); + private Map<String, SignatureProfileConfiguration> signatureProfiles = new HashMap<String, SignatureProfileConfiguration>(); private TempFileHelper helper; private RequestedSignature requestedSignature; private Calendar signingDate; - + public OperationStatus(ISettings configuration, SignParameter signParameter) { this.configuration = configuration; this.signParamter = signParameter; helper = new TempFileHelper(configuration); } - + @Override protected void finalize() throws Throwable { + if (this.helper != null) { + try { + this.helper.clear(); + } catch (Throwable e) { + } + } super.finalize(); } - - - + // ======================================================================== + + public void clear() { + if (this.helper != null) { + try { + this.helper.clear(); + } catch (Throwable e) { + } + } + if(pdfObject != null) { + pdfObject.close(); + } + } public RequestedSignature getRequestedSignature() { return requestedSignature; @@ -79,34 +93,37 @@ public class OperationStatus implements Serializable { } public PlaceholderConfiguration getPlaceholderConfiguration() { - if(this.placeholderConfiguration == null) { - this.placeholderConfiguration = - new PlaceholderConfiguration(this.configuration); + if (this.placeholderConfiguration == null) { + this.placeholderConfiguration = new PlaceholderConfiguration( + this.configuration); } return this.placeholderConfiguration; } - + public GlobalConfiguration getGlobalConfiguration() { - if(this.gloablConfiguration == null) { - this.gloablConfiguration = - new GlobalConfiguration(this.configuration); + if (this.gloablConfiguration == null) { + this.gloablConfiguration = new GlobalConfiguration( + this.configuration); } return this.gloablConfiguration; } - - public SignatureProfileConfiguration getSignatureProfileConfiguration(String profileID) { - - SignatureProfileConfiguration signatureProfileConfiguration = signatureProfiles.get(profileID); - if(signatureProfileConfiguration == null) { - signatureProfileConfiguration = new SignatureProfileConfiguration(this.configuration, profileID); + + public SignatureProfileConfiguration getSignatureProfileConfiguration( + String profileID) { + + SignatureProfileConfiguration signatureProfileConfiguration = signatureProfiles + .get(profileID); + if (signatureProfileConfiguration == null) { + signatureProfileConfiguration = new SignatureProfileConfiguration( + this.configuration, profileID); signatureProfiles.put(profileID, signatureProfileConfiguration); } - + return signatureProfileConfiguration; } - + // ======================================================================== - + public PDFObject getPdfObject() { return pdfObject; } @@ -122,11 +139,11 @@ public class OperationStatus implements Serializable { public void setSignParamter(SignParameter signParamter) { this.signParamter = signParamter; } - + public TempFileHelper getTempFileHelper() { return this.helper; } - + public ISettings getSettings() { return this.configuration; } @@ -138,6 +155,5 @@ public class OperationStatus implements Serializable { public void setSigningDate(Calendar signingDate) { this.signingDate = signingDate; } - - + } diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/verify/SignatureCheckImpl.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/verify/SignatureCheckImpl.java index 2ce74e6a..bfb8ccdc 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/verify/SignatureCheckImpl.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/verify/SignatureCheckImpl.java @@ -43,4 +43,8 @@ public class SignatureCheckImpl implements SignatureCheck { return message; } + public void setMessage(String message) { + this.message = message; + } + } diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/verify/VerifierDispatcher.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/verify/VerifierDispatcher.java index 4fb883a3..0c37e637 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/verify/VerifierDispatcher.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/verify/VerifierDispatcher.java @@ -23,6 +23,7 @@ ******************************************************************************/ package at.gv.egiz.pdfas.lib.impl.verify; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -44,20 +45,61 @@ public class VerifierDispatcher { "at.gv.egiz.pdfas.sigs.pkcs7detached.PKCS7DetachedVerifier", "at.gv.egiz.pdfas.sigs.pades.PAdESVerifier" }; + public static final String CONF_VERIFIER_LIST = "verifier.classes"; + public static final String CONF_VERIFIER_SEP = ";"; + public static final String CONF_VERIFIER = "default.verifier"; public Map<String, HashMap<String, IVerifyFilter>> filterMap = new HashMap<String, HashMap<String, IVerifyFilter>>(); + private String[] getClasses(ISettings settings) { + String confVerifiers = settings.getValue(CONF_VERIFIER_LIST); + String[] classes; + if (confVerifiers != null) { + classes = confVerifiers.split(CONF_VERIFIER_SEP); + } else { + classes = defaultClasses; + } + + List<String> filteredClasses = new ArrayList<String>(); + + for (int i = 0; i < classes.length; i++) { + String clsName = classes[i]; + try { + Class<?> cls = Class.forName(clsName); + filteredClasses.add(clsName); + } catch (Throwable e) { + logger.error("Cannot find Verifier class: " + clsName, e); + } + } + + String[] clsNames = new String[filteredClasses.size()]; + for (int i = 0; i < filteredClasses.size(); i++) { + clsNames[i] = filteredClasses.get(i); + } + + dumpVerifierClasses(clsNames); + + return clsNames; + } + + private void dumpVerifierClasses(String[] clsNames) { + for (int i = 0; i < clsNames.length; i++) { + String clsName = clsNames[i]; + logger.debug("Registering Signature Verifier: " + clsName); + } + } + public VerifierDispatcher(ISettings settings) { // TODO: add configuration parameter to set verifier - Map<String, String> verifierClasses = settings - .getValuesPrefix(CONF_VERIFIER); + //Map<String, String> verifierClasses = settings + // .getValuesPrefix(CONF_VERIFIER); String[] currentClasses = null; - if (verifierClasses == null || verifierClasses.isEmpty()) { - logger.info("No verifier configured using default"); - currentClasses = defaultClasses; - } else { + //if (verifierClasses == null || verifierClasses.isEmpty()) { + logger.info("Getting Verifier classes"); + currentClasses = getClasses(settings); + /*} else { currentClasses = new String[verifierClasses.values().size()]; Iterator<String> classIt = verifierClasses.values().iterator(); int j = 0; @@ -65,7 +107,7 @@ public class VerifierDispatcher { currentClasses[j] = classIt.next(); j++; } - } + }*/ try { for (int i = 0; i < currentClasses.length; i++) { String clsName = currentClasses[i]; diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/MOAConnector.java b/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/MOAConnector.java index 71e7181a..9c5c720a 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/MOAConnector.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/MOAConnector.java @@ -55,6 +55,8 @@ import org.xml.sax.SAXException; import at.gv.egiz.pdfas.common.exceptions.PdfAsException; import at.gv.egiz.pdfas.common.exceptions.PdfAsMOAException; +import at.gv.egiz.pdfas.common.exceptions.PdfAsWrappedIOException; +import at.gv.egiz.pdfas.common.settings.ISettings; import at.gv.egiz.pdfas.lib.api.Configuration; public class MOAConnector implements ISignatureConnector { @@ -95,9 +97,30 @@ public class MOAConnector implements ISignatureConnector { public MOAConnector(Configuration config) throws CertificateException, FileNotFoundException, IOException { - logger.info("Loading certificate: " + config.getValue(MOA_SIGN_CERTIFICATE)); - this.certificate = new X509Certificate(new FileInputStream(new File( - config.getValue(MOA_SIGN_CERTIFICATE)))); + if(config.getValue(MOA_SIGN_CERTIFICATE) == null) { + logger.error(MOA_SIGN_CERTIFICATE + " not configured for MOA connector"); + throw new PdfAsWrappedIOException(new PdfAsException("Please configure: " + MOA_SIGN_CERTIFICATE + " to use MOA connector")); + } + + if(!(config instanceof ISettings)) { + logger.error("Configuration is no instance of ISettings"); + throw new PdfAsWrappedIOException(new PdfAsException("Configuration is no instance of ISettings")); + } + + ISettings settings = (ISettings)config; + + String certificateValue = config.getValue(MOA_SIGN_CERTIFICATE); + + File certFile = new File(certificateValue); + if(!certFile.isAbsolute()) { + certificateValue = settings.getWorkingDirectory() + "/" + + config.getValue(MOA_SIGN_CERTIFICATE); + certFile = new File(certificateValue); + } + + logger.info("Loading certificate: " + certificateValue); + + this.certificate = new X509Certificate(new FileInputStream(certFile)); this.moaEndpoint = config.getValue(MOA_SIGN_URL); this.keyIdentifier = config.getValue(MOA_SIGN_KEY_ID); } diff --git a/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TablePos.java b/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TablePos.java index 9d411d1e..2eb3b341 100644 --- a/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TablePos.java +++ b/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TablePos.java @@ -272,6 +272,7 @@ public class TablePos implements Serializable } case 'r': { float flval=Float.parseFloat(commandval); + // TODO: check rotation to be only multiples of 90 degrees if (flval<0) { throw new PdfAsException("Pos string (=" + pos_string + ") is invalid."); diff --git a/signature-standards/sigs-pades/src/main/java/at/gv/egiz/pdfas/sigs/pades/PAdESSignerKeystore.java b/signature-standards/sigs-pades/src/main/java/at/gv/egiz/pdfas/sigs/pades/PAdESSignerKeystore.java index 16a56c90..f0eedb61 100644 --- a/signature-standards/sigs-pades/src/main/java/at/gv/egiz/pdfas/sigs/pades/PAdESSignerKeystore.java +++ b/signature-standards/sigs-pades/src/main/java/at/gv/egiz/pdfas/sigs/pades/PAdESSignerKeystore.java @@ -135,6 +135,7 @@ public class PAdESSignerKeystore implements IPlainSigner { public byte[] sign(byte[] input, int[] byteRange) throws PdfAsException { try { + logger.info("Creating PAdES signature."); IssuerAndSerialNumber issuer = new IssuerAndSerialNumber(cert); AlgorithmID[] algorithms = CertificateUtils.getAlgorithmIDs(cert); diff --git a/signature-standards/sigs-pades/src/main/java/at/gv/egiz/pdfas/sigs/pades/PAdESVerifier.java b/signature-standards/sigs-pades/src/main/java/at/gv/egiz/pdfas/sigs/pades/PAdESVerifier.java index e39db2c6..91754317 100644 --- a/signature-standards/sigs-pades/src/main/java/at/gv/egiz/pdfas/sigs/pades/PAdESVerifier.java +++ b/signature-standards/sigs-pades/src/main/java/at/gv/egiz/pdfas/sigs/pades/PAdESVerifier.java @@ -50,6 +50,7 @@ import at.gv.egiz.moa.SignatureVerificationServiceStub.VerifyCMSSignatureRespons import at.gv.egiz.moa.SignatureVerificationServiceStub.VerifyCMSSignatureResponseTypeSequence; import at.gv.egiz.moa.SignatureVerificationServiceStub.X509DataTypeSequence; import at.gv.egiz.pdfas.common.exceptions.PdfAsException; +import at.gv.egiz.pdfas.common.messages.CodesResolver; import at.gv.egiz.pdfas.common.utils.PDFUtils; import at.gv.egiz.pdfas.common.utils.StreamUtils; import at.gv.egiz.pdfas.lib.api.Configuration; @@ -112,13 +113,17 @@ public class PAdESVerifier implements IVerifyFilter { VerifyCMSSignatureResponse response = service .verifyCMSSignature(verifyCMSSignatureRequest); + logger.debug("Got Verify Response from MOA"); + VerifyCMSSignatureResponseTypeSequence[] verifySequence = response .getVerifyCMSSignatureResponse() .getVerifyCMSSignatureResponseTypeSequence(); for (int i = 0; i < verifySequence.length; i++) { VerifyResultImpl result = new VerifyResultImpl(); - - SignatureCheck certificateCheck; + logger.debug(" ---------------------- "); + logger.debug("Signature: " + i); + + SignatureCheckImpl certificateCheck; verifySequence[i].getSignerInfo().getKeyInfoTypeChoice()[0] .getExtraElement(); @@ -132,16 +137,32 @@ public class PAdESVerifier implements IVerifyFilter { } else { certificateCheck = new SignatureCheckImpl( 1, - "Es konnte keine formal korrekte Zertifikatskette vom Signatorzertifikat zu einem vertrauenswürdigen Wurzelzertifikat konstruiert werden."); + ""); } - SignatureCheck signatureCheck = new SignatureCheckImpl( + if(certificateCheck.getMessage() == null || certificateCheck.getMessage().trim().length() == 0) { + String resourceString = "verify.cert." + certificateCheck.getCode(); + String message = CodesResolver.resolveMessage(resourceString); + certificateCheck.setMessage(message); + } + + logger.debug("Certificate Check: " + certificateCheck.getCode() + " [" + certificateCheck.getMessage() + "]"); + + SignatureCheckImpl signatureCheck = new SignatureCheckImpl( verifySequence[i].getSignatureCheck().getCode() .intValue(), verifySequence[i].getSignatureCheck().isInfoSpecified() ? verifySequence[i] .getSignatureCheck().getInfo().toString() : ""); + if(signatureCheck.getMessage() == null || signatureCheck.getMessage().trim().length() == 0) { + String resourceString = "verify.value." + signatureCheck.getCode(); + String message = CodesResolver.resolveMessage(resourceString); + signatureCheck.setMessage(message); + } + + logger.debug("Signature Check: " + signatureCheck.getCode() + " [" + signatureCheck.getMessage() + "]"); + result.setCertificateCheck(certificateCheck); result.setValueCheckCode(signatureCheck); result.setVerificationDone(true); @@ -211,8 +232,11 @@ public class PAdESVerifier implements IVerifyFilter { } resultList.add(result); + + logger.debug(" ---------------------- "); } } catch (Throwable e) { + logger.error("Verification failed", e); throw new PdfAsException("error.pdf.verify.02", e); } return resultList; diff --git a/signature-standards/sigs-pkcs7detached/src/main/java/at/gv/egiz/pdfas/sigs/pkcs7detached/PKCS7DetachedSigner.java b/signature-standards/sigs-pkcs7detached/src/main/java/at/gv/egiz/pdfas/sigs/pkcs7detached/PKCS7DetachedSigner.java index 7b45a45a..62839ea6 100644 --- a/signature-standards/sigs-pkcs7detached/src/main/java/at/gv/egiz/pdfas/sigs/pkcs7detached/PKCS7DetachedSigner.java +++ b/signature-standards/sigs-pkcs7detached/src/main/java/at/gv/egiz/pdfas/sigs/pkcs7detached/PKCS7DetachedSigner.java @@ -104,7 +104,7 @@ public class PKCS7DetachedSigner implements IPlainSigner { while ((dataIs.read(buf)) > 0) ; // skip data ContentInfo ci = new ContentInfo(si); - logger.info("PKCS7 signature done."); + logger.debug("PKCS7 signature done."); return ci.getEncoded(); } catch (NoSuchAlgorithmException e) { throw new PdfAsSignatureException("error.pdf.sig.01", e); diff --git a/signature-standards/sigs-pkcs7detached/src/main/java/at/gv/egiz/pdfas/sigs/pkcs7detached/PKCS7DetachedVerifier.java b/signature-standards/sigs-pkcs7detached/src/main/java/at/gv/egiz/pdfas/sigs/pkcs7detached/PKCS7DetachedVerifier.java index 605142a6..bef034b1 100644 --- a/signature-standards/sigs-pkcs7detached/src/main/java/at/gv/egiz/pdfas/sigs/pkcs7detached/PKCS7DetachedVerifier.java +++ b/signature-standards/sigs-pkcs7detached/src/main/java/at/gv/egiz/pdfas/sigs/pkcs7detached/PKCS7DetachedVerifier.java @@ -129,8 +129,7 @@ public class PKCS7DetachedVerifier implements IVerifyFilter { } public void setConfiguration(Configuration config) { - // TODO Auto-generated method stub - + // not needed } } |