diff options
Diffstat (limited to 'src/main')
11 files changed, 126 insertions, 110 deletions
| diff --git a/src/main/java/at/gv/egiz/pdfas/api/analyze/AnalyzeResult.java b/src/main/java/at/gv/egiz/pdfas/api/analyze/AnalyzeResult.java index c9dde9e..a1aabb4 100644 --- a/src/main/java/at/gv/egiz/pdfas/api/analyze/AnalyzeResult.java +++ b/src/main/java/at/gv/egiz/pdfas/api/analyze/AnalyzeResult.java @@ -30,17 +30,5 @@ public interface AnalyzeResult    public List getNoSignatures();
 -  /**
 -   * Returns non textual data from pdf provided that {@link AnalyzeParameters#setReturnNonTextualObjects(boolean)}
 -   * has been set {@code true}. 
 -   * @return List of {@link NonTextObjectInfo}
 -   */
 -  public List getNonTextualObjects();
 -
 -  /**
 -   * Returns <code>true</code> if non textual objects have been found, <code>false</code> if not.
 -   * @return <code>true</code> if non textual objects have been found, <code>false</code> if not.
 -   */
 -  public boolean hasNonTextualObjects();
  }
 diff --git a/src/main/java/at/gv/egiz/pdfas/api/commons/SignatureInformation.java b/src/main/java/at/gv/egiz/pdfas/api/commons/SignatureInformation.java index 8eef6e8..3b05685 100644 --- a/src/main/java/at/gv/egiz/pdfas/api/commons/SignatureInformation.java +++ b/src/main/java/at/gv/egiz/pdfas/api/commons/SignatureInformation.java @@ -19,7 +19,9 @@ package at.gv.egiz.pdfas.api.commons;  import java.security.cert.X509Certificate;
  import java.util.Date;
 +import java.util.List;
 +import at.gv.egiz.pdfas.api.analyze.NonTextObjectInfo;
  import at.gv.egiz.pdfas.api.io.DataSource;
  /**
 @@ -99,5 +101,21 @@ public interface SignatureInformation     * @return 
     */
    public String getTimeStampValue();
 +  
 +  /**
 +   * Returns a list<{@link NonTextObjectInfo}> of non textual objects in the pdf document.
 +   * Only available for textual signatures. Show this to the user who signed the textual content only! 
 +   * @return  List<{@link NonTextObjectInfo} or <tt>null</tt> of not available (binary signature)
 +   */
 +  public List getNonTextualObjects();
 +  
 +  public void setNonTextualObjects(List nonTextualObjects);
 +
 +  /**
 +   * Returns <code>true</code> if non textual objects have been found, <code>false</code> if not.
 +   * @return <code>true</code> if non textual objects have been found, <code>false</code> if not.
 +   */
 +  public boolean hasNonTextualObjects();
 +
  }
\ No newline at end of file diff --git a/src/main/java/at/gv/egiz/pdfas/api/verify/VerifyResult.java b/src/main/java/at/gv/egiz/pdfas/api/verify/VerifyResult.java index 34fbcd1..9455a2d 100644 --- a/src/main/java/at/gv/egiz/pdfas/api/verify/VerifyResult.java +++ b/src/main/java/at/gv/egiz/pdfas/api/verify/VerifyResult.java @@ -3,6 +3,7 @@ package at.gv.egiz.pdfas.api.verify;  import java.util.Date;
  import java.util.List;
 +import at.gv.egiz.pdfas.api.analyze.NonTextObjectInfo;
  import at.gv.egiz.pdfas.api.commons.SignatureInformation;
  /**
 @@ -113,6 +114,20 @@ public interface VerifyResult extends SignatureInformation     * @see SignatureInformation#getSignedData()
     */
    public String getHashInputData();
 +  
 +  /**
 +   * Returns a list<{@link NonTextObjectInfo}> of non textual objects in the pdf document.
 +   * Only available for textual signatures. Show this to the user who signed the textual content only! 
 +   * @return  List<{@link NonTextObjectInfo} or <tt>null</tt> of not available (binary signature)
 +   */
 +  public List getNonTextualObjects();
 +  
 +
 +  /**
 +   * Returns <code>true</code> if non textual objects have been found, <code>false</code> if not.
 +   * @return <code>true</code> if non textual objects have been found, <code>false</code> if not.
 +   */
 +  public boolean hasNonTextualObjects();
  }
 diff --git a/src/main/java/at/gv/egiz/pdfas/api/verify/VerifyResults.java b/src/main/java/at/gv/egiz/pdfas/api/verify/VerifyResults.java index ef06880..d2f79b3 100644 --- a/src/main/java/at/gv/egiz/pdfas/api/verify/VerifyResults.java +++ b/src/main/java/at/gv/egiz/pdfas/api/verify/VerifyResults.java @@ -5,8 +5,6 @@ package at.gv.egiz.pdfas.api.verify;  import java.util.List;
 -import at.gv.egiz.pdfas.api.analyze.NonTextObjectInfo;
 -
  /**
   * The result of the verification of a document.
   * 
 @@ -26,19 +24,5 @@ public interface VerifyResults     *         signature.
     */
    public List getResults();
 -  
 -  /**
 -   * Returns a list<{@link NonTextObjectInfo}> of non textual objects in the pdf document.
 -   * Only available for textual signatures. Show this to the user who signed the textual content only! 
 -   * @return  List<{@link NonTextObjectInfo} or <tt>null</tt> of not available (binary signature)
 -   */
 -  public List getNonTextualObjects();
 -  
 -
 -  /**
 -   * Returns <code>true</code> if non textual objects have been found, <code>false</code> if not.
 -   * @return <code>true</code> if non textual objects have been found, <code>false</code> if not.
 -   */
 -  public boolean hasNonTextualObjects();
 -  
 +    
  }
 diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/PdfAsObject.java b/src/main/java/at/gv/egiz/pdfas/impl/api/PdfAsObject.java index f98b0f0..824416f 100644 --- a/src/main/java/at/gv/egiz/pdfas/impl/api/PdfAsObject.java +++ b/src/main/java/at/gv/egiz/pdfas/impl/api/PdfAsObject.java @@ -31,6 +31,7 @@ import at.gv.egiz.pdfas.commandline.CommandlineConnectorChooser;  import at.gv.egiz.pdfas.exceptions.ErrorCode;
  import at.gv.egiz.pdfas.framework.config.SettingsHelper;
  import at.gv.egiz.pdfas.framework.input.ExtractionStage;
 +import at.gv.egiz.pdfas.framework.input.PdfDataSource;
  import at.gv.egiz.pdfas.framework.signator.SignatorInformation;
  import at.gv.egiz.pdfas.framework.vfilter.VerificationFilterParameters;
  import at.gv.egiz.pdfas.impl.api.analyze.AnalyzeResultImpl;
 @@ -43,6 +44,7 @@ import at.gv.egiz.pdfas.impl.api.sign.ActualSignaturePositionAdapter;  import at.gv.egiz.pdfas.impl.api.sign.SignResultImpl;
  import at.gv.egiz.pdfas.impl.api.verify.VerifyResultAdapter;
  import at.gv.egiz.pdfas.impl.api.verify.VerifyResultsImpl;
 +import at.gv.egiz.pdfas.impl.input.DelimitedPdfDataSource;
  import at.gv.egiz.pdfas.impl.vfilter.VerificationFilterParametersImpl;
  import at.gv.egiz.pdfas.utils.ConfigUtils;
  import at.knowcenter.wag.egov.egiz.PdfAS;
 @@ -52,11 +54,12 @@ 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.framework.SignatorFactory;
 +import at.knowcenter.wag.egov.egiz.pdf.BinarySignatureHolder;
  import at.knowcenter.wag.egov.egiz.pdf.NoSignatureHolder;
  import at.knowcenter.wag.egov.egiz.pdf.ObjectExtractor;
  import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder;
  import at.knowcenter.wag.egov.egiz.pdf.TablePos;
 -import at.knowcenter.wag.egov.egiz.pdf.TextualSignature;
 +import at.knowcenter.wag.egov.egiz.pdf.TextualSignatureHolder;
  import at.knowcenter.wag.egov.egiz.sig.SignatureResponse;
  import at.knowcenter.wag.egov.egiz.sig.SignatureTypeDefinition;
  import at.knowcenter.wag.egov.egiz.sig.SignatureTypes;
 @@ -378,17 +381,35 @@ public class PdfAsObject implements PdfAs          SignatureInformation si = new SignatureInformationAdapter(sh);
          sigInfs.add(si);
 +        if (analyzeParameters.isReturnNonTextualObjects()) {           
 +           si.setNonTextualObjects(doExtractNonTexualObjects(sh, (PdfDataSource) inputDataSource));           
 +        }        
 +        
        }
      }
 -    List nonTextInfos = null;
 -    if (analyzeParameters.isReturnNonTextualObjects()) {
 -       nonTextInfos = ObjectExtractor.extractNonTextInfo(new PdfDataSourceAdapter(analyzeParameters.getDocument()));
 -    }
 -    return new AnalyzeResultImpl(sigInfs, noSigs, nonTextInfos);
 +    return new AnalyzeResultImpl(sigInfs, noSigs);
    }
 -  /**
 +  private List doExtractNonTexualObjects(SignatureHolder sh, PdfDataSource pdfDataSource) {
 +     if (sh == null) return null;
 +     if (sh instanceof BinarySignatureHolder) {
 +        BinarySignatureHolder bsh = (BinarySignatureHolder)sh;
 +        return ObjectExtractor.extractNonTextInfo(bsh.getSignedPdf());
 +     } else if (sh instanceof TextualSignatureHolder) {
 +        TextualSignatureHolder tsh = (TextualSignatureHolder)sh;
 +        if (tsh.getUiBlockEndPos() == 0) {
 +           log.warn("uiblockendpos not available. Extract objects from final pdf document");
 +           return ObjectExtractor.extractNonTextInfo(pdfDataSource);
 +        }
 +        DelimitedPdfDataSource dpds = new DelimitedPdfDataSource(pdfDataSource, tsh.getUiBlockEndPos());
 +        return ObjectExtractor.extractNonTextInfo(dpds);
 +     } else {
 +        return null;
 +     }
 +  }
 +
 +/**
     * @see at.gv.egiz.pdfas.api.PdfAs#verify(at.gv.egiz.pdfas.api.verify.VerifyAfterAnalysisParameters)
     */
    public VerifyResults verify(VerifyAfterAnalysisParameters verifyAfterAnalysisParameters) throws PdfAsException
 @@ -424,11 +445,12 @@ public class PdfAsObject implements PdfAs        SignatureHolder holder = (SignatureHolder) signature_holders.get(i);
        VerifyResult vr = new VerifyResultAdapter(response, holder, verifyAfterAnalysisParameters.getVerificationTime());
 +      vr.setNonTextualObjects( ((SignatureInformation) signatures.get(i)).getNonTextualObjects());
 +
        vrs.add(vr);
      }
      VerifyResultsImpl verifyResults = new VerifyResultsImpl(vrs); 
 -    verifyResults.setNonTextualObjects(verifyAfterAnalysisParameters.getAnalyzeResult().getNonTextualObjects());
      return verifyResults;
    }
 diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/analyze/AnalyzeResultImpl.java b/src/main/java/at/gv/egiz/pdfas/impl/api/analyze/AnalyzeResultImpl.java index a50b7a1..154d73d 100644 --- a/src/main/java/at/gv/egiz/pdfas/impl/api/analyze/AnalyzeResultImpl.java +++ b/src/main/java/at/gv/egiz/pdfas/impl/api/analyze/AnalyzeResultImpl.java @@ -5,9 +5,7 @@ package at.gv.egiz.pdfas.impl.api.analyze;  import java.util.List;
 -import at.gv.egiz.pdfas.api.analyze.AnalyzeParameters;
  import at.gv.egiz.pdfas.api.analyze.AnalyzeResult;
 -import at.gv.egiz.pdfas.api.analyze.NonTextObjectInfo;
  import at.gv.egiz.pdfas.api.exceptions.PdfAsException;
  /**
 @@ -25,23 +23,8 @@ public class AnalyzeResultImpl implements AnalyzeResult    /**
     * The found non-signature update blocks.
     */
 -  protected List noSignatures = null;
 +  protected List noSignatures = null;  
 -  protected List nonTextualObjects = null;
 -  
 -
 -  /**
 -   * Constructor.
 -   * 
 -   * @param signatures
 -   *          The found signatures.
 -   * @param noSignatures
 -   *          The found non-signature update blocks.             
 -   */
 -  public AnalyzeResultImpl(List signatures, List noSignatures)
 -  {
 -     this(signatures, noSignatures, null);
 -  }
    /**
     * Constructor.
 @@ -50,9 +33,8 @@ public class AnalyzeResultImpl implements AnalyzeResult     *          The found signatures.
     * @param noSignatures
     *          The found non-signature update blocks.
 -   * @param nonTextInfos Non textual data from pdf provided that {@link AnalyzeParameters#setReturnNonTextualObjects(boolean)} was set.              
     */
 -  public AnalyzeResultImpl(List signatures, List noSignatures, List nonTextInfos)
 +  public AnalyzeResultImpl(List signatures, List noSignatures)
    {
      if (signatures == null)
      {
 @@ -60,8 +42,7 @@ public class AnalyzeResultImpl implements AnalyzeResult      }
      this.signatures = signatures;
 -    this.noSignatures = noSignatures;
 -    this.nonTextualObjects = nonTextInfos;
 +    this.noSignatures = noSignatures;   
    }
 @@ -94,22 +75,4 @@ public class AnalyzeResultImpl implements AnalyzeResult      return this.noSignatures;
    }
 -
 -  /**
 -   * Returns non textual data from pdf provided that {@link AnalyzeParameters#setReturnNonTextualObjects(boolean)}
 -   * has been set {@code true}. 
 -   * @return List of {@link NonTextObjectInfo}
 -   */
 -  public List getNonTextualObjects() {
 -     return this.nonTextualObjects;
 -  }
 -
 -  /**
 -   * Returns <code>true</code> if non textual objects have been found, <code>false</code> if not.
 -   * @return <code>true</code> if non textual objects have been found, <code>false</code> if not.
 -   */
 -  public boolean hasNonTextualObjects() {
 -   return this.nonTextualObjects != null && !this.nonTextualObjects.isEmpty();
 -  }
 -  
  }
 diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/commons/SignatureInformationAdapter.java b/src/main/java/at/gv/egiz/pdfas/impl/api/commons/SignatureInformationAdapter.java index 3d4b560..4661d4e 100644 --- a/src/main/java/at/gv/egiz/pdfas/impl/api/commons/SignatureInformationAdapter.java +++ b/src/main/java/at/gv/egiz/pdfas/impl/api/commons/SignatureInformationAdapter.java @@ -5,6 +5,7 @@ package at.gv.egiz.pdfas.impl.api.commons;  import java.security.cert.X509Certificate;
  import java.util.Date;
 +import java.util.List;
  import at.gv.egiz.pdfas.api.commons.Constants;
  import at.gv.egiz.pdfas.api.commons.SignatureInformation;
 @@ -27,6 +28,8 @@ public class SignatureInformationAdapter implements SignatureInformation    protected SignatureHolder signatureHolder = null;
    protected String timeStamp = null;
 +  
 +  protected List nonTextualObjects = null;
    /**
     * Constructor.
 @@ -94,5 +97,17 @@ public class SignatureInformationAdapter implements SignatureInformation        return this.timeStamp;
     }
 +   public List getNonTextualObjects() {
 +      return this.nonTextualObjects;
 +   }
 +
 +   public boolean hasNonTextualObjects() {
 +      return this.nonTextualObjects != null && this.nonTextualObjects.size() > 0;
 +   }
 +
 +   public void setNonTextualObjects(List nonTextualObjects) {
 +      this.nonTextualObjects = nonTextualObjects;      
 +   }
 +
  }
 diff --git a/src/main/java/at/gv/egiz/pdfas/impl/api/verify/VerifyResultsImpl.java b/src/main/java/at/gv/egiz/pdfas/impl/api/verify/VerifyResultsImpl.java index 22d446a..22ab475 100644 --- a/src/main/java/at/gv/egiz/pdfas/impl/api/verify/VerifyResultsImpl.java +++ b/src/main/java/at/gv/egiz/pdfas/impl/api/verify/VerifyResultsImpl.java @@ -15,9 +15,7 @@ public class VerifyResultsImpl implements VerifyResults    /**
     * The results.
     */
 -  protected List results = null;
 -  
 -  protected List nonTextualObjects = null;
 +  protected List results = null;  
    /**
     * Constructor.
 @@ -38,21 +36,5 @@ public class VerifyResultsImpl implements VerifyResults      return this.results;
    }
 -   public List getNonTextualObjects() {
 -      return this.nonTextualObjects;
 -   }
 -
 -   public void setNonTextualObjects(List nonTextObjects) {
 -      this.nonTextualObjects = nonTextObjects;
 -      
 -   }
 -
 -   /**
 -    * Returns <code>true</code> if non textual objects have been found, <code>false</code> if not.
 -    * @return <code>true</code> if non textual objects have been found, <code>false</code> if not.
 -    */
 -   public boolean hasNonTextualObjects() {
 -      return this.nonTextualObjects != null && !this.nonTextualObjects.isEmpty();
 -   }
  }
 diff --git a/src/main/java/at/gv/egiz/pdfas/impl/vfilter/VerificationFilterImpl.java b/src/main/java/at/gv/egiz/pdfas/impl/vfilter/VerificationFilterImpl.java index e7724bc..acf6622 100644 --- a/src/main/java/at/gv/egiz/pdfas/impl/vfilter/VerificationFilterImpl.java +++ b/src/main/java/at/gv/egiz/pdfas/impl/vfilter/VerificationFilterImpl.java @@ -242,7 +242,7 @@ public class VerificationFilterImpl implements VerificationFilter        if (sao.oldSignature != null)
        {
          extractedSignatures.add(0, sao.oldSignature);
 -      }
 +      }      
      }
      else
      {
 @@ -666,7 +666,7 @@ public class VerificationFilterImpl implements VerificationFilter            //kz = new PdfASID("urn:pdfsigfilter:bka.gv.at:binaer:v1.1.0");
            Verificator verificator = VerificatorFactory.createBinaryVerificator(kz);
 -          List binary_holders = verificator.parseBlock(pdf, data, fpr, prev_end);
 +          List binary_holders = verificator.parseBlock(pdf, data, fpr, prev_end);      
            binarySignatures.addAll(binary_holders);
            if(binary_holders.size() > 0) {
 @@ -753,7 +753,9 @@ public class VerificationFilterImpl implements VerificationFilter      assert partition.isTextPartition();
      int endOfDocument = VerificationFilterHelper.getEndOfPartition(partition);
 -    return extractSignatures(pdf, endOfDocument);
 +    List extractedSigs = extractSignatures(pdf, endOfDocument);
 +    TextualSignatureHolder.mulitSetUiBlockEndPos(extractedSigs, endOfDocument);
 +    return extractedSigs;
    }
    protected SignaturesAndOld extractSignaturesFromPartitionAndOld(PdfDataSource pdf, Partition partition) throws VerificationFilterException
 @@ -770,6 +772,8 @@ public class VerificationFilterImpl implements VerificationFilter  //      log.debug("extracted text: " + extractedText);
        SignaturesAndOld sao = extractSignaturesAndOld(extractedText);
 +      TextualSignatureHolder.trySetUiBlockEndPos(sao.oldSignature, endOfDocument);
 +      TextualSignatureHolder.mulitSetUiBlockEndPos(sao.newSignatures, endOfDocument);
        return sao;
      }
 diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TextualSignatureHolder.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TextualSignatureHolder.java index 0971f90..8c7863d 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TextualSignatureHolder.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TextualSignatureHolder.java @@ -18,6 +18,8 @@  package at.knowcenter.wag.egov.egiz.pdf;
  import java.io.Serializable;
 +import java.util.Iterator;
 +import java.util.List;
  import at.gv.egiz.pdfas.framework.input.DataSource;
  import at.gv.egiz.pdfas.framework.input.TextDataSource;
 @@ -53,6 +55,8 @@ public class TextualSignatureHolder implements Serializable, SignatureHolder    private SignatureObject signature_object = null;
    private TextDataSource textDataSource = null;
 +  
 +  private int uiBlockEndPos = 0;
    public TextualSignatureHolder(String text, SignatureObject so)
    {
 @@ -114,6 +118,28 @@ public class TextualSignatureHolder implements Serializable, SignatureHolder    {
      return this.textDataSource.getText();
    }
 +
 +   public int getUiBlockEndPos() {
 +      return this.uiBlockEndPos;
 +   }
 +
 +   public void setUiBlockEndPos(int uiBlockEndPos) {
 +      this.uiBlockEndPos = uiBlockEndPos;
 +   }
 +   
 +   public static void mulitSetUiBlockEndPos(List signatureHolders, int uiBlockEndPos) {
 +      for (Iterator it = signatureHolders.iterator(); it.hasNext();) {
 +         SignatureHolder sh = (SignatureHolder) it.next();
 +         trySetUiBlockEndPos(sh, uiBlockEndPos);
 +      }      
 +   }
 +   
 +   public static void trySetUiBlockEndPos(SignatureHolder sh, int uiBlockEndPos ) {
 +      if (sh != null && sh instanceof TextualSignatureHolder) {
 +         ((TextualSignatureHolder)sh).setUiBlockEndPos(uiBlockEndPos);
 +      }
 +   }
 +   
  }
 diff --git a/src/main/java/demo/SignatureVerificationDemo.java b/src/main/java/demo/SignatureVerificationDemo.java index 498849d..6df4973 100644 --- a/src/main/java/demo/SignatureVerificationDemo.java +++ b/src/main/java/demo/SignatureVerificationDemo.java @@ -90,19 +90,18 @@ public class SignatureVerificationDemo {           while (it.hasNext()) {
              VerifyResult result = (VerifyResult) it.next();
              Main.formatVerifyResult(result, out);
 -         }
 -         out.flush();
 -         
 -         // check if non textual elements have been detected
 -         if (analyzeResult.hasNonTextualObjects()) {
 -            System.out.println("\nWARNING: Non textual objects detected.");
 -            Iterator noit = analyzeResult.getNonTextualObjects().iterator();
 -            while (noit.hasNext()) {
 -               NonTextObjectInfo info = (NonTextObjectInfo) noit.next();
 -               System.out.println("  -> " + info.toString());
 +            if (result.hasNonTextualObjects()) {
 +               System.out.println("\nWARNING: Non textual objects detected.");
 +               Iterator noit = result.getNonTextualObjects().iterator();
 +               while (noit.hasNext()) {
 +                  NonTextObjectInfo info = (NonTextObjectInfo) noit.next();
 +                  System.out.println("  -> " + info.toString());
 +               }
 +               System.out.println();
 +               
              }
 -            System.out.println();
           }
 +         out.flush();         
        } catch (PdfAsException e) {
           e.printStackTrace();
 | 
