Security Java

/*
 * XAdES4j - A Java library for generation and verification of XAdES signatures.
 * Copyright (C) 2010 Luis Goncalves.
 *
 * XAdES4j 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 3 of the License, or any later version.
 *
 * XAdES4j 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 XAdES4j. If not, see .
 */
//package xades4j.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.security.InvalidAlgorithmParameterException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CRLException;
import java.security.cert.CertStore;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.CollectionCertStoreParameters;
import java.security.cert.X509CRL;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collection;
/**
 * Creates a {@code CertStore} from the contents of a file-system directory. The
 * directories are recusively searched for X509 certificates or CRLs files that
 * have one of the specified extensions.
 * @author Luís
 */
public class FileSystemDirectoryCertStore
{
    private final CertStore content;
    /**
     * Creates a new instance over a directory. The {@code cer} and {@code crt}
     * extesions are considered for certificates and {@code crl} for CRLs.
     * @param dirPath the path for the base directory
     * @throws CertificateException if there's an error reading the certificates
     * @throws CRLException if there's an error reading the CRLs
     */
    public FileSystemDirectoryCertStore(String dirPath) throws CertificateException, CRLException
    {
        this(dirPath, new String[]
                {
                    "cer", "crt"
                }, new String[]
                {
                    "crl"
                });
    }
    /**
     * Creates a new instance over a directory using the specified extensions
     * @param dirPath the path for the base directory
     * @param certsFilesExts extensions for included certificate files
     * @param crlsFilesExts  extensions for included CRL files
     * @throws CertificateException if there's an error reading the certificates
     * @throws CRLException if there's an error reading the CRLs
     */
    public FileSystemDirectoryCertStore(
            String dirPath,
            final String[] certsFilesExts,
            final String[] crlsFilesExts) throws CertificateException, CRLException
    {
        File dir = new File(dirPath);
        if (!dir.exists() || !dir.isDirectory())
            throw new IllegalArgumentException("Specified path doesn't exist or doesn't refer a directory");
        Collection contentList = new ArrayList();
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        transverseDirToFindContent(dir, contentList, certsFilesExts, crlsFilesExts, cf);
        try
        {
            this.content = CertStore.getInstance("Collection", new CollectionCertStoreParameters(contentList));
            return;
        } catch (InvalidAlgorithmParameterException ex)
        {
        } catch (NoSuchAlgorithmException ex)
        {
        }
        // ToDo: this is a bit ugly!
        throw new CertificateException("Error getting Collection CertStore");
    }
    private void transverseDirToFindContent(
            File dir,
            Collection contentList,
            String[] certsFilesExts,
            String[] crlsFilesExts,
            CertificateFactory cf) throws CertificateException, CRLException
    {
        File[] dirContents = dir.listFiles();
        for (int i = 0; i < dirContents.length; i++)
        {
            File f = dirContents[i];
            if (f.isDirectory())
                transverseDirToFindContent(f, contentList, certsFilesExts, crlsFilesExts, cf);
            else if (f.isFile())
                try
                {
                    if (hasExt(f, certsFilesExts))
                        contentList.add((X509Certificate)cf.generateCertificate(new FileInputStream(f)));
                    else if (hasExt(f, crlsFilesExts))
                        contentList.add((X509CRL)cf.generateCRL(new FileInputStream(f)));
                } catch (FileNotFoundException ex)
                {
                    // The file existed right up there! If somehow it doesn't exist
                    // now, nevermind.
                }
        }
    }
    private boolean hasExt(File f, String[] filesExts)
    {
        for (int j = 0; j <
                filesExts.length; j++)
        {
            if (f.getName().endsWith('.' + filesExts[j]))
                return true;
        }
        return false;
    }
    /**
     * Gets the {@code CertStore} resulting from this instance.
     * @return the {@code CertStore} containing all the certificates and CRLs that were found
     */
    public CertStore getStore()
    {
        return content;
    }
}