org.casbah.ui.MainCAView.java Source code

Java tutorial

Introduction

Here is the source code for org.casbah.ui.MainCAView.java

Source

/*******************************************************************************
 * Copyright (C) 2010 Marco Sandrini
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 * 
 * This program 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 Affero General Public License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public
 * License along with this program.
 * If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/
package org.casbah.ui;

import java.security.cert.X509CRL;
import java.security.cert.X509Certificate;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.casbah.provider.CAProvider;
import org.casbah.provider.CAProviderException;
import org.casbah.provider.CertificateHelper;

import com.vaadin.Application;
import com.vaadin.ui.Button;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.DateField;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Panel;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Window.CloseEvent;
import com.vaadin.ui.Window.Notification;

public class MainCAView extends CustomComponent {

    private static final String X509_CERT_MIME_TYPE = "application/x-x509-ca-cert";
    private static final String X509_CRL_MIME_TYPE = "application/x-x509-crl";

    private static final Logger logger = Logger.getLogger(MainCAView.class.getCanonicalName());
    private static final long serialVersionUID = 1L;

    private final Application application;
    private final CAProvider provider;

    public MainCAView(final CAProvider provider, Application application) {

        this.provider = provider;
        this.application = application;

    }

    public void init() throws CAProviderException {

        final X509Certificate caCert = provider.getCACertificate();
        Panel panel = new Panel("CA Details");
        VerticalLayout mainLayout = new VerticalLayout();
        panel.setContent(mainLayout);
        mainLayout.setSizeFull();
        VerticalLayout caInfo = new VerticalLayout();
        TextField name = new TextField("Distinguished Name");
        String nameValue = caCert.getSubjectX500Principal().getName();
        name.setValue(nameValue);
        name.setColumns(50);
        name.setReadOnly(true);

        TextField issuer = new TextField("Issuer");
        issuer.setColumns(50);
        issuer.setValue(caCert.getIssuerX500Principal().getName());
        issuer.setReadOnly(true);

        DateField expDate = new DateField("Expiration Date");
        expDate.setResolution(DateField.RESOLUTION_SEC);
        expDate.setValue(caCert.getNotAfter());
        expDate.setReadOnly(true);

        TextField serial = new TextField("Serial");
        serial.setValue(caCert.getSerialNumber().toString(16));
        serial.setReadOnly(true);

        caInfo.addComponent(name);
        caInfo.addComponent(issuer);
        caInfo.addComponent(expDate);
        caInfo.addComponent(serial);
        caInfo.setSizeFull();

        HorizontalLayout caButtons = new HorizontalLayout();
        caButtons.addComponent(new Button("View Certificate", new Button.ClickListener() {

            private static final long serialVersionUID = 1L;

            public void buttonClick(ClickEvent event) {
                try {
                    showEncodedCertificate(caCert, caCert.getSerialNumber().toString(16));
                } catch (CAProviderException e) {
                    e.printStackTrace();
                }

            }
        }));
        caButtons.addComponent(new Button("Download Certificate", new Button.ClickListener() {

            private static final long serialVersionUID = 1L;

            public void buttonClick(ClickEvent event) {
                try {
                    downloadEncodedCertificate(caCert, caCert.getSerialNumber().toString(16));
                } catch (CAProviderException e) {
                    e.printStackTrace();
                }
            }
        }));

        caButtons.addComponent(new Button("Sign a CSR", new Button.ClickListener() {

            private static final long serialVersionUID = 1L;

            public void buttonClick(ClickEvent event) {
                try {
                    uploadAndSignCsr();
                } catch (CAProviderException pe) {
                    pe.printStackTrace();
                }

            }

        }));

        caButtons.addComponent(new Button("Get CRL", new Button.ClickListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void buttonClick(ClickEvent event) {
                try {
                    downloadCrlList(provider.getLatestCrl(false));
                } catch (CAProviderException pe) {
                    logger.log(Level.SEVERE, "Could not retrieve CRL", pe);
                    getWindow().showNotification("An error occurred while retrieving the CRL",
                            Notification.TYPE_ERROR_MESSAGE);
                }

            }

        }));

        panel.addComponent(caInfo);
        panel.addComponent(caButtons);
        panel.setSizeFull();
        setSizeFull();
        setCompositionRoot(panel);

    }

    private void uploadAndSignCsr() throws CAProviderException {
        final Window csrWindow = new Window("Upload CSR");
        csrWindow.setPositionX(200);
        csrWindow.setPositionY(100);
        csrWindow.setWidth("800px");
        csrWindow.setHeight("300px");
        csrWindow.addListener(new Window.CloseListener() {

            private static final long serialVersionUID = 1L;

            public void windowClose(CloseEvent e) {
                application.getMainWindow().removeWindow(csrWindow);

            }
        });

        final TextField csrData = new TextField("DER Encoded CSR");
        csrData.setColumns(80);
        csrData.setRows(20);
        csrData.setWordwrap(false);
        csrWindow.addComponent(csrData);
        HorizontalLayout hl = new HorizontalLayout();
        csrWindow.addComponent(hl);
        hl.addComponent(new Button("Cancel", new Button.ClickListener() {

            private static final long serialVersionUID = 1L;

            public void buttonClick(ClickEvent event) {
                application.getMainWindow().removeWindow(csrWindow);

            }
        }));
        hl.addComponent(new Button("Upload", new Button.ClickListener() {

            private static final long serialVersionUID = 1L;

            public void buttonClick(ClickEvent event) {
                String csr = (String) csrData.getValue();
                try {
                    X509Certificate result = provider.sign(csr);
                    showEncodedCertificate(result, result.getSerialNumber().toString(16));

                } catch (CAProviderException cpe) {
                    cpe.printStackTrace();
                }
            }
        }));
        csrWindow.setModal(true);
        application.getMainWindow().addWindow(csrWindow);
    }

    private void showEncodedCertificate(X509Certificate cert, String serialNumber) throws CAProviderException {
        final Window certWindow = new Window(serialNumber);
        certWindow.setPositionX(200);
        certWindow.setPositionY(100);
        certWindow.setWidth("800px");
        certWindow.setHeight("300px");
        certWindow.addListener(new Window.CloseListener() {

            private static final long serialVersionUID = 1L;

            public void windowClose(CloseEvent e) {
                application.getMainWindow().removeWindow(certWindow);

            }
        });
        String certData = CertificateHelper.encodeCertificate(cert, true);
        TextField encodedCert = new TextField("Encoded Certificate", certData);
        encodedCert.setReadOnly(true);
        encodedCert.setColumns(80);
        encodedCert.setRows(certData.split("\n").length);
        encodedCert.setWordwrap(false);
        certWindow.addComponent(encodedCert);
        certWindow.addComponent(new Button("Close", new Button.ClickListener() {

            /**
             * 
             */
            private static final long serialVersionUID = 1L;

            public void buttonClick(ClickEvent event) {
                application.getMainWindow().removeWindow(certWindow);
            }
        }));
        certWindow.setModal(true);
        application.getMainWindow().addWindow(certWindow);

    }

    private void downloadEncodedCertificate(X509Certificate cert, String serialNumber) throws CAProviderException {
        StringResource source = new StringResource(CertificateHelper.encodeCertificate(cert, true));
        DownloadResource dr = new DownloadResource(source, X509_CERT_MIME_TYPE, serialNumber + ".crt", application);
        application.getMainWindow().open(dr, "_new");
    }

    private void downloadCrlList(X509CRL crl) throws CAProviderException {
        StringResource source = new StringResource(CertificateHelper.encodeCrlList(crl, true));
        DownloadResource dr = new DownloadResource(source, X509_CRL_MIME_TYPE, "ca.crl", application);
        application.getMainWindow().open(dr, "_new");
    }

}