/**
* LICENCIA LGPL:
*
* Esta librería es Software Libre; Usted puede redistribuirlo y/o modificarlo
* bajo los términos de la GNU Lesser General Public License (LGPL)
* tal y como ha sido publicada por la Free Software Foundation; o
* bien la versión 2.1 de la Licencia, o (a su elección) cualquier versión posterior.
*
* Esta librería se distribuye con la esperanza de que sea útil, pero SIN NINGUNA
* GARANTÍA; tampoco las implícitas garantías de MERCANTILIDAD o ADECUACIÓN A UN
* PROPÓSITO PARTICULAR. Consulte la GNU Lesser General Public License (LGPL) para más
* detalles
*
* Usted debe recibir una copia de la GNU Lesser General Public License (LGPL)
* junto con esta librería; si no es así, escriba a la Free Software Foundation Inc.
* 51 Franklin Street, 5º Piso, Boston, MA 02110-1301, USA o consulte
* <http://www.gnu.org/licenses/>.
*
* Copyright 2008 Ministerio de Industria, Turismo y Comercio
*
*/
package es.mityc.firmaJava.ocsp.config;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Vector;
import javax.xml.XMLConstants;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.SchemaFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.bouncycastle.asn1.ASN1OctetString;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
/**
* Obtiene la lista de proveedores OCSP's configurados.
*
* @author Ministerio de Industria, Turismo y Comercio
* @version 0.9 beta
*/
public class ConfigProveedores
implements ConstantesProveedores, Cloneable
{
private static Log logger = LogFactory.getLog(ConfigProveedores.class);
private Vector<ProveedorInfo> proveedores = null;
private String version = EMPTY_STRING;
private String fecha = EMPTY_STRING;
/**
* Constructor de la clase.
*/
public ConfigProveedores(){
proveedores = new Vector<ProveedorInfo> ();
}
protected Object clone() throws CloneNotSupportedException {
ConfigProveedores copy = (ConfigProveedores) super.clone();
copy.version = version;
copy.fecha = fecha;
int totalProveedores = proveedores.size();
for (int i=0;i<totalProveedores;i++ ){
copy.proveedores.add((ProveedorInfo)proveedores.get(i).clone());
}
return copy;
}
private InputSource getConfigFile () throws FileNotFoundException {
InputSource sourceXml = null;
File XmlUpdated = new File (System.getProperty(USERDIR) + SEPARATOR + XML_FILE);
InputStream sXml = null;
if (XmlUpdated.exists()) {
sXml = new FileInputStream (XmlUpdated);
} else {
sXml = getClass().getResourceAsStream(XML_DEFAULT_FILE);
}
sourceXml = new InputSource(sXml);
return sourceXml;
}
/**
* Lee el fichero de configuracion para obtener la lista de proveedores OCSP
* @return true si la operacion fue correcta, false en otro caso
* @throws SAXException Si el XML es erroneo o no es válido.
*/
public boolean read() throws SAXException {
boolean ok = false;
ConfigProveedoresHandler reader = new ConfigProveedoresHandler();
SAXParserFactory spf = SAXParserFactory.newInstance();
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.XML_NS_URI);
spf.setSchema(sf.newSchema(new StreamSource(this.getClass().getResourceAsStream("/OCSPServersInfo.xsd"))));
spf.setNamespaceAware(true);
// spf.setValidating(true);
try {
javax.xml.parsers.SAXParser parser = spf.newSAXParser();
// Perform namespace processing
// parser.setFeature(FEATURE_NAMESPACES, true);
// parser.setFeature(FEATURE_VALIDATION, true);
// parser.setFeature(FEATURE_SCHEMA, true);
//
// parser.setEntityResolver(new ConfigProveedoresResolver());
// parser.setErrorHandler(reader);
// parser.setContentHandler(reader);
// parser.parse(getConfigFile());
parser.parse(getConfigFile(), reader);
proveedores = reader.getProveedores();
version = reader.getVersion();
fecha = reader.getFecha();
ok = true;
}
catch (FileNotFoundException e) {
logger.error(IO_EXCEPTION + e.getMessage());
if (logger.isDebugEnabled())
logger.debug(e);
}
catch (SAXNotRecognizedException e) {
logger.error(e.getMessage());
if (logger.isDebugEnabled())
logger.debug(e);
}
catch (SAXNotSupportedException e) {
logger.error(e.getMessage());
if (logger.isDebugEnabled())
logger.debug(e);
}
catch (IOException e) {
logger.error(IO_EXCEPTION + e.getMessage());
if (logger.isDebugEnabled())
logger.debug(e);
} catch (ParserConfigurationException ex) {
logger.error(ex.getMessage());
if (logger.isDebugEnabled())
logger.debug(ex);
}
return ok;
}
/**
* Obtiene el proveedorOcsp configurado para el certificado indicado
* @param Object Certificado del que se quiere obtener los datos del OCSP.
* Puede ser del tipo String, byte[], o X509Certificate
* @return ProveedorInfo encontrado o null otro caso
*/
public ProveedorInfo buscarProveedor (Object certObj) {
X509Certificate cert = null;
if (certObj == null) {
logger.error(CERTIFICATE_TYPE_EXCEPTION);
return null;
}
try {
if (certObj instanceof byte[]) {
cert = UtilidadesX509.getCertificate((byte[])certObj);
} else if (certObj instanceof String) {
cert = UtilidadesX509.getCertificate((String)certObj);
} else if (certObj instanceof X509Certificate) {
cert = (X509Certificate)certObj;
} else {
logger.error(CERTIFICATE_TYPE_EXCEPTION);
return null;
}
} catch (CertificateException e) {
logger.error(CERTIFICATE_EXCEPTION, e);
}
ProveedorInfo buscado = null;
String nameHash = EMPTY_STRING;
String pkHash = EMPTY_STRING;
try {
ASN1OctetString issuerNameHash = UtilidadesX509.getIssuerNameHash(cert);
ASN1OctetString issuerKeyHash = UtilidadesX509.getIssuerKeyHash(cert);
nameHash = issuerNameHash.toString().replace(ALMOHADILLA, EMPTY_STRING);
pkHash = issuerKeyHash.toString().replace(ALMOHADILLA, EMPTY_STRING);
buscado = buscarProveedor(nameHash,pkHash);
} catch (IOException ex) {
logger.error(ex.getMessage());
}
return buscado;
}
/**
* Obtiene el proveedorOcsp configurado para los datos indicados
* @param nameHash
* @param pkHash
* @return ProveedorInfo encontrado o null otro caso
*/
protected ProveedorInfo buscarProveedor (String nameHash, String pkHash) {
if (null == proveedores) return null;
int totalProveedores = proveedores.size();
ProveedorInfo poBuscado = null;
for (int i=0;i<totalProveedores;i++ ){
if (proveedores.get(i).puedeValidar(nameHash, pkHash))
poBuscado = proveedores.get(i);
}
return poBuscado;
}
/**
* Obtiene la fecha del fichero de configuracion
*/
public String getFecha() {
return fecha;
}
/**
* Obtiene la version del fichero de configuracion
*/
public String getVersion() {
return version;
}
/**
* Obtiene la lista completa de proveedores del fichero de configuracion.
*/
public Vector<ProveedorInfo> getProveedores() {
return (Vector<ProveedorInfo>) proveedores.clone();
}
private static ConfigProveedores configCacheado = null;
/**
* Obtiene el primer Servidor ocsp de la lista de servidores con los que se puede validar el certificado indicado.
* @param cert
* @return ServidorOcsp encontrado. Null en otro caso.
*/
public static ServidorOcsp getServidor(X509Certificate cert){
ServidorOcsp servidorOcsp = null;
try {
ConfigProveedores config = null;
if (null == configCacheado) {
config = new ConfigProveedores();
if (!config.read()) return null;
configCacheado = config;
}
else config = configCacheado;
ProveedorInfo proveedor = config.buscarProveedor(cert);
if (null == proveedor) return null;
servidorOcsp = proveedor.getServidor();
} catch (SAXException e) {
logger.error (e.getMessage());
if (logger.isDebugEnabled())
logger.debug(e);
}
return servidorOcsp;
}
/**
* Obtiene la lista de servidores con los que se puede validar el certificado indicado.
* @param cert
* @return ServidorOcsp encontrado. Null en otro caso.
*/
public static Vector<ServidorOcsp> getServidores(X509Certificate cert) {
Vector<ServidorOcsp> servidores = null;
try {
ConfigProveedores config = null;
if (null == configCacheado) {
// AppPerfect: falso positivo
config = new ConfigProveedores();
if (!config.read()) return null;
configCacheado = config;
}
else config = configCacheado;
ProveedorInfo proveedor = config.buscarProveedor(cert);
if (null == proveedor) return null;
servidores = proveedor.getServidores();
} catch (SAXException e) {
logger.error (e.getMessage());
}
return servidores;
}
}