All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jpedal.objects.acroforms.javafx.JavaFXSummary Maven / Gradle / Ivy

/*
 * ===========================================
 * Java Pdf Extraction Decoding Access Library
 * ===========================================
 *
 * Project Info:  http://www.idrsolutions.com
 * Help section for developers at http://www.idrsolutions.com/support/
 *
 * (C) Copyright 1997-2017 IDRsolutions and Contributors.
 *
 * This file is part of JPedal/JPDF2HTML5
 *
     This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


 *
 * ---------------
 * JavaFXSummary.java
 * ---------------
 */


package org.jpedal.objects.acroforms.javafx;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.jpedal.objects.raw.PdfDictionary;
import org.jpedal.objects.raw.PdfObject;
import org.jpedal.utils.LogWriter;

public class JavaFXSummary extends javafx.scene.layout.Pane {

    private final Stage frame;
    private final PdfObject sigObject;
    private static TextField signedByBox = new TextField();
    private static TextField reasonBox = new TextField();
    private static TextField dateBox = new TextField();
    private static TextField locationBox = new TextField();


    public void setValues(final String signName, final String reason, final String location) {
        signedByBox.setText(signName);
        reasonBox.setText(reason);

        final String rawDate = sigObject.getTextStreamValue(PdfDictionary.M);
        final StringBuilder date = new StringBuilder(rawDate);
        date.delete(0, 2);
        date.insert(4, '/');
        date.insert(7, '/');
        date.insert(10, ' ');
        date.insert(13, ':');
        date.insert(16, ':');
        date.insert(19, ' ');
        dateBox.setText(date.toString());

        locationBox.setText(location);
    }

    /**
     * Creates new form Signatures
     *
     * @param sig
     */
    public JavaFXSummary(final Stage stage, final PdfObject sig) {
        this.frame = stage;
        this.sigObject = sig;
        initComponents();
    }

    /**
     * This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // 
    private void initComponents() {

        final Label locationLbl = new Label();
        final Label signedByLbl = new Label();
        final Label reasonLbl = new Label();
        final Label dateLbl = new Label();
        final Button showCertificateButton = new Button();
        final Button closeButton = new Button();
        locationBox = new TextField();
        signedByBox = new TextField();
        reasonBox = new TextField();
        dateBox = new TextField();

        locationLbl.setText("Location: ");
        signedByLbl.setText("Signed by: ");
        reasonLbl.setText("Reason: ");
        dateLbl.setText("Date: ");
        closeButton.setText("Close");
        showCertificateButton.setText("Show Certificate...");
        locationBox.setEditable(false);
        reasonBox.setEditable(false);
        dateBox.setEditable(false);
        signedByBox.setEditable(false);

        reasonBox.setPrefWidth(400);
        final byte[] bytes = sigObject.getTextStreamValueAsByte(PdfDictionary.Cert);
        if (bytes == null) {
            showCertificateButton.setDisable(true);
        } else {
            showCertificateButton.setOnAction(new EventHandler() {
                @Override
                public void handle(final ActionEvent t) {
                    showCertificate();
                }

            });
        }
        closeButton.setOnAction(new EventHandler() {
            @Override
            public void handle(final ActionEvent t) {
                frame.close();
            }
        });

        final VBox left = new VBox(20);
        left.getChildren().addAll(signedByLbl, reasonLbl, dateLbl, locationLbl);

        final VBox middle = new VBox(8);
        middle.getChildren().addAll(signedByBox, reasonBox, dateBox, locationBox);
        middle.setPadding(new Insets(3, 0, 3, 0));

        final HBox location = new HBox();
        location.getChildren().addAll(locationLbl, locationBox);
        locationBox.setAlignment(Pos.BOTTOM_CENTER);
        location.setAlignment(Pos.BOTTOM_CENTER);
        location.setPadding(new Insets(0, 0, 3, 0));

        final StackPane right = new StackPane();
        right.getChildren().addAll(showCertificateButton, closeButton);
        StackPane.setAlignment(closeButton, Pos.BOTTOM_RIGHT);
        StackPane.setAlignment(showCertificateButton, Pos.TOP_RIGHT);

        final HBox box = new HBox(3);
        box.getChildren().addAll(left, middle, location, right);

        this.getChildren().add(box);

    }

    private void showCertificate() {
        final Stage certificateStage = new Stage();
        final CertificateHolderFX ch = new CertificateHolderFX(certificateStage);
        try {
            final byte[] bytes = sigObject.getTextStreamValueAsByte(PdfDictionary.Cert);
            final InputStream bais = new ByteArrayInputStream(bytes);
            final CertificateFactory cf = CertificateFactory.getInstance("X.509");
            final X509Certificate signingCertificate = (X509Certificate) cf.generateCertificate(bais);
            bais.close();

            final DateFormat format1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss z");
            final Date notBefore = signingCertificate.getNotBefore();
            final Date notAfter = signingCertificate.getNotAfter();

            final String publicKey = byteToHex(signingCertificate.getPublicKey().getEncoded());
            final String x509Data = byteToHex(signingCertificate.getEncoded());
            final String sha1Digest = byteToHex(getDigest(bytes, "SHA1"));
            final String md5Digest = byteToHex(getDigest(bytes, "MD5"));

            String keyDescription = signingCertificate.getPublicKey().toString();
            final int keyDescriptionEnd = keyDescription.indexOf('\n');
            if (keyDescriptionEnd != -1) {
                keyDescription = keyDescription.substring(0, keyDescriptionEnd);
            }

            ch.setValues(sigObject.getTextStreamValue(PdfDictionary.Name), signingCertificate.getVersion(), signingCertificate.getSigAlgName(),
                    signingCertificate.getSubjectX500Principal().toString(),
                    signingCertificate.getIssuerX500Principal().toString(),
                    signingCertificate.getSerialNumber(),
                    format1.format(notBefore),
                    format1.format(notAfter),
                    keyDescription, publicKey, x509Data, sha1Digest, md5Digest);

        } catch (final Exception e) {
            LogWriter.writeLog("Exception: " + e.getMessage());
        }


    }

    /**
     * @param bytes
     * @return
     * @throws NoSuchAlgorithmException
     */
    private static byte[] getDigest(final byte[] bytes, final String algorithm) throws NoSuchAlgorithmException {
        final MessageDigest sha1 = MessageDigest.getInstance(algorithm);
        sha1.update(bytes);
        return sha1.digest();
    }

    /**
     * @return
     */
    private static String byteToHex(final byte[] bytes) {
        final StringBuilder hex = new StringBuilder();
        for (final byte aByte : bytes) {
            String singleByte = Integer.toHexString(aByte);
            if (singleByte.startsWith("ffffff")) {
                singleByte = singleByte.substring(6, singleByte.length());
            } else if (singleByte.length() == 1) {
                singleByte = '0' + singleByte;
            }

            singleByte = singleByte.toUpperCase();
            hex.append(singleByte).append(' ');
        }
        return hex.toString();
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy