org.viafirma.conector.ConectorFirmaRMI.java Source code

Java tutorial

Introduction

Here is the source code for org.viafirma.conector.ConectorFirmaRMI.java

Source

/* Copyright (C) 2007 Flix Garca Borrego (borrego at gmail.com)
      
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public
   License as published by the Free Software Foundation; either
   version 2 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
   Library General Public License for more details.
      
   You should have received a copy of the GNU Library 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 
 */

package org.viafirma.conector;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import javax.jws.HandlerChain;
import javax.jws.WebService;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.viafirma.cliente.exception.InternalException;
import org.viafirma.cliente.firma.TypeFile;
import org.viafirma.cliente.firma.TypeFormatSign;
import org.viafirma.cliente.firma.rmi.FirmaClienteRMI;
import org.viafirma.cliente.vo.FirmaInfoViafirma;
import org.viafirma.excepciones.ExcepcionCertificadoNoEncontrado;
import org.viafirma.excepciones.ExcepcionErrorInterno;
import org.viafirma.nucleo.Nucleo;
import org.viafirma.util.XmlSignUtil;
import org.viafirma.vo.Documento;
import org.w3c.dom.Document;

/**
 * Conector para los servicios de firma. Mediante este conector es posible
 * aadir nuevos ficheros para que estos sean firmados. NOTA:Este mtodo es
 * expuesto medieante RMI y mediante WebServices para que sea accesible desde
 * fuera.
 * 
 * Implementacin basada en JAX-WS 2.x
 * 
 * @author Felix Garcia Borrego (borrego at gmail.com)
 * @author Alexis Castilla Armero <Pencerval at Gmail.com>
 */
@HandlerChain(file = "handlerchain.xml")
@WebService(serviceName = "ConectorFirmaRMIService", targetNamespace = "http://viafirma.org/client", name = "ConectorFirmaRMIClient", portName = "ConectorFirmaRMI", endpointInterface = "org.viafirma.cliente.firma.rmi.FirmaClienteRMI")
public class ConectorFirmaRMI extends UnicastRemoteObject implements FirmaClienteRMI {

    // logger
    private static Log log = LogFactory.getLog(ConectorFirmaRMI.class);

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

    /**
     * @throws RemoteException
     */
    public ConectorFirmaRMI() throws RemoteException {
        super();
    }

    /**
     * mtodo para comprobar la conexin correcta a viafirma
     */
    public String ping(String mensaje) throws RemoteException {
        return "return ping :" + mensaje;
    }

    /**
     * Inicia la firma digital. El mtodo requiere la intervencin del usuario.
     * 
     * @param typeFormatSign indica el formato de firma utilizado.
     * 
     * @see org.viafirma.client.firma.rmi.FirmaClienteRMI#prepareFirma(java.lang.String,
     *      org.viafirma.cliente.firma.TypeFile, byte[])
     */
    public String prepareFirmaWithTypeFileAndFormatSign(String nombreFile, TypeFile typeFichero,
            TypeFormatSign typeFormatSign, byte[] bytesToSign) throws RemoteException {
        // creamos un nuevo documento pendiente de ser firmado.
        Documento documentToSign = new Documento(null, nombreFile, bytesToSign, typeFichero, typeFormatSign);
        // obtengo la instancia del nucleo.
        Nucleo nucleo = Nucleo.getInstance();

        // almaceno el documento en el nucleo para que este lo gestione.
        return nucleo.prepareSign(documentToSign);
    }

    /**
     * Inicia la firma digital. El mtodo requiere la intervencin del usuario.
     * Por defecto todos los documentos binarios son firmados en formato
     * XMLSIG_ENVELOPING, y los documentos XML son firmados con formato
     * XADES_EPES.
     * 
     * @see org.viafirma.client.firma.rmi.FirmaClienteRMI#prepareFirma(java.lang.String,
     *      org.viafirma.cliente.firma.TypeFile, byte[])
     */
    public String prepareFirma(String nombreFile, TypeFile typeFichero, byte[] bytesToSign) throws RemoteException {

        // Si el tipo de documento es un xml, la firma la realiza por defecto en
        // formato XADES_EPES, en otro caso en XMLSIGN
        TypeFormatSign typeFormatSign = TypeFormatSign.XADES_EPES_ENVELOPED;
        return prepareFirmaWithTypeFileAndFormatSign(nombreFile, typeFichero, typeFormatSign, bytesToSign);
    }

    /**
     * Firma los datos utilizando un certificado almacenado en el servidor.
     * Nota: Este mtodo no requiere intervencion del usuario, el formato
     * utilizado por defecto es TypeFormatSign.XMLSIG_ENVELOPING y suponiendo que el documento a firmar es un pdf.
     * 
     * @param datosToSign
     *                datos a firmar
     * @param alias
     *                Nombre del alias utilizado para realizar la firma.
     * @return El cdigo de firma asignado a este documento firmado.
     * @throws ParserConfigurationException 
     * @throws ParserConfigurationException 
     * @throws InternalException
     *                 Problemas al realizar la firma o al conectar con el
     *                 servidor.
     */
    public String signByServer(byte[] datosToSign, String alias, String password) throws RemoteException {

        try {
            // Estructura a firmar:
            Documento documento = new Documento("datos", datosToSign, TypeFile.pdf,
                    TypeFormatSign.XMLSIG_ENVELOPING);
            // Obtengo la instancia del ncleo.
            Nucleo nucleo = Nucleo.getInstance();

            // almaceno el documento en el nucleo para que este lo gestione.
            return nucleo.signByServer(documento, alias, password);
        } catch (ExcepcionErrorInterno e) {
            log.warn("No se ha podido firmar: " + e.getMessage(), e);
            throw new RemoteException("No se ha podido firmar: " + e.getMessage());
        } catch (ExcepcionCertificadoNoEncontrado e) {
            log.warn("El alias '" + alias + "' no ha sido encontrado.", e);
            throw new RemoteException("El alias '" + alias + "' no ha sido encontrado." + e.getMessage());
        } catch (ParserConfigurationException e) {
            throw new RemoteException("No se ha podido firmar: " + e.getMessage());
        }
    }

    /**
     * Firma los datos utilizando un certificado almacenado en el servidor. Para
     * la utilizacion de este metodo es necesario tener un certificado de
     * usuario dentro del Cacert de Java. Nota: Este mtodo no requiere
     * intervencion del usuario.
     * 
     * @param nombredocumento nombre del documento original
     * @param datosToSign datos a firmar
     * @param alias Nombre del alias utilizado para realizar la firma.
     * @param password clave del certificado utilizado.
     * @param tipofirma Tipo de firma realizada en servidor
     * @param tipoFichero Tipo de formato del fichero firmado.
     * @return El cdigo de firma asignado a este documento firmado.
     * @throws InternalException
     *             Problemas al realizar la firma o al conectar con el servidor.
     */
    public String signByServerWithTypeFileAndFormatSign(String nombredocumento, byte[] datosToSign, String alias,
            String password, TypeFile tipoFichero, TypeFormatSign tipofirma) throws RemoteException {
        try { // Estructura a firmar: 
            if (tipofirma.equals(TypeFormatSign.XMLSIG_ENVELOPING)) {
                Documento documento = new Documento("datos", datosToSign, TypeFile.pdf,
                        TypeFormatSign.XMLSIG_ENVELOPING);
                // almaceno el documento en el nucleo para que este lo gestione. 
                return Nucleo.getInstance().signByServer(documento, alias, password);
            } else if (tipofirma.equals(TypeFormatSign.XADES_EPES_ENVELOPED)) {
                throw new UnsupportedOperationException(
                        "Esta operacin no esta soportada o implementada en la versin Viafirma GPL/Estandar");
            } else {
                throw new RemoteException("No Implementado ");
            }
        } catch (ExcepcionErrorInterno e) {
            log.warn("No se ha podido firmar:" + e.getMessage(), e);
            throw new RemoteException("No se ha podido firmar: " + e.getMessage());
        } catch (ExcepcionCertificadoNoEncontrado e) {
            log.warn("El alias '" + alias + "' no ha sido encontrado.", e);
            throw new RemoteException("El alias '" + alias + "' no ha sido encontrado." + e.getMessage());
        } catch (ParserConfigurationException e) {
            log.warn("El alias '" + alias + "' no ha sido encontrado.", e);
            throw new RemoteException("No se ha podido parsear el documento:" + e.getMessage());
        }
    }

    /**
     * Firma los datos utilizando un certificado almacenado en el servidor en
     * funcion del tipo de firma. Nota: Este mtodo no requiere intervencion del
     * usuario, el formato utilizado por defecto es
     * TypeFormatSign.XMLSIG_ENVELOPING asumiendo que el formado del fichero es un pdf.
     * 
     * @param datosToSign
     *                datos a firmar
     * @param alias
     *                Nombre del alias utilizado para realizar la firma.
     * @param type
     *                Tipo de firma
     * @return El cdigo de firma asignado a este documento firmado.
     * @throws InternalException
     *                 Problemas al realizar la firma o al conectar con el
     *                 servidor.
     */
    public String signByServerWithType(byte[] datosToSign, String alias, String password, TypeFormatSign type)
            throws RemoteException {
        try { // Estructura a firmar: 
            if (type.equals(TypeFormatSign.XMLSIG_ENVELOPING)) {
                Documento documento = new Documento("datos", datosToSign, TypeFile.pdf,
                        TypeFormatSign.XMLSIG_ENVELOPING);
                // almaceno el documento en el nucleo para que este lo gestione. 
                return Nucleo.getInstance().signByServer(documento, alias, password);
            } else if (type.equals(TypeFormatSign.XADES_EPES_ENVELOPED)) {
                Documento documento = new Documento("datos", datosToSign, TypeFile.XML,
                        TypeFormatSign.XADES_EPES_ENVELOPED);
                // Obtengo la instancia del ncleo. Nucleo nucleo=Nucleo.getInstance(); 
                // almaceno el documento en el nucleo para que este lo gestione. 
                return Nucleo.getInstance().signByServer(documento, alias, password);
            } else {
                throw new RemoteException("No Implementado ");
            }
        } catch (ExcepcionErrorInterno e) {
            log.warn("No se ha podido firmar:" + e.getMessage(), e);
            throw new RemoteException("No se ha podido firmar: " + e.getMessage());
        } catch (ExcepcionCertificadoNoEncontrado e) {
            log.warn("El alias '" + alias + "' no ha sido encontrado.", e);
            throw new RemoteException("El alias '" + alias + "' no ha sido encontrado." + e.getMessage());
        } catch (ParserConfigurationException e) {
            log.warn("El alias '" + alias + "' no ha sido encontrado.", e);
            throw new RemoteException("No se ha podido parsear el documento:" + e.getMessage());
        }
    }

    /**
     * Permite el envo de emails firmados digitalmente .
     * 
     * @param texto texto del mensaje a enviar
     * @param textoHtml Texto en formato html del mensaje (optativo)
     * @param datosAdjunto Datos del fichero adjuntado (optativo)
     * @param fromUser Usuario que envia
     * @param toUser  Destinatario
     * @param alias   Alias del certificado utilizado en la firma
     * @param password Password del certificado utilizado en la firma
     * @return El proceso de firma se ha realizado correctamente.
     * @throws RemoteException
     */
    public boolean sendSignMailByServer(String subject, String mailTo, String texto, String htmlTexto, String alias,
            String password) throws RemoteException {
        // Delegamos en el nucleo para que realice el proceso de firma.
        try {
            Nucleo.getInstance().sendSignMailByServer(subject, mailTo, texto, htmlTexto, alias, password);
        } catch (ExcepcionErrorInterno e) {
            log.warn("No se ha podido enviar el email desde WS." + e.getMessage(), e);
            throw new RemoteException("No se ha podido recupear: " + e.getMessage());
        }
        return true;
    }

    /**
     * Recupera el documento original custodiado por la plataforma
     * 
     * @param idFirma
     *                identificador del documento en el sistema de custodia.
     * @return los Bytes del documento custodiado
     * @throws InternalException
     *                 Problemas al recuperar el documento
     */
    public byte[] getDocumentoCustodiado(String codFirma) throws RemoteException {
        try {
            // recuperamos el documento custodiado.
            Documento documento = Nucleo.getInstance().getDocumentoCustodiado(codFirma);
            return documento.getDatos();
        } catch (ExcepcionErrorInterno e) {
            log.warn("No se ha podido recuperar documento custodiado: " + e.getMessage(), e);
            throw new RemoteException("No se ha podido recupear: " + e.getMessage());
        }
    }

    /**
     * Recupera el xmlSignature custodiado por la plataforma.
     * 
     * @param idFirma
     *                identificador del documento en el sistema de custodia.
     * @return los Bytes del documento custodiado
     * @throws InternalException
     *                 Problemas al recuperar el documento
     */
    public String getXMLDocument(String codFirma) throws RemoteException {
        throw new UnsupportedOperationException(
                "Esta operacin no esta soportada o implementada en la versin Viafirma GPL/Estandar");
    }

    /**
     * Retorna una imagen png con el cdigo de barras y QR code del documento
     * custodiado.
     * 
     * @param codFirma
     *                cdigo de firma del documento.
     * @return imagen png
     * @throws InternalException
     *                 Problemas al realizar la firma o al conectar con el
     *                 servidor.
     */
    public byte[] buildInfoQRBarCode(String codFirma) throws RemoteException {
        try {
            // recuperamos el documento custodiado.
            return Nucleo.getInstance().buildInfoQRBarCode(codFirma, null, null, false);
        } catch (ExcepcionErrorInterno e) {
            log.warn("No se ha podido crear el cdigo de QRCode-BarCode: " + e.getMessage(), e);
            throw new RemoteException("No se ha podido crear el cdigo de QRCode-BarCode: " + e.getMessage());
        }
    }

    /**
     * Chequea la validez del documento. En el caso de que el documento sea un
     * XAdes, comprueba que el documento XML ( que ya contiene la firma) es
     * vlido.
     * 
     * @param originalData
     * @param id
     * @return
     * @throws RemoteException
     */
    public FirmaInfoViafirma checkDocumentSigned(byte[] originalData, String id) throws RemoteException {
        throw new UnsupportedOperationException("Metodo no implementado.");
    }

    /**
     * Chequea la validez del documento original indicado. Los datos deben
     * corresponder a los datos que inicialmente se enviaron para su firma a la
     * plataforma, Viafirma en primer lugar comprueba que el hash de los bytes
     * indicados coinciden con el hash del documento referenciado que ha sido
     * custodiado, y que a su vez el documento custodiado es vlido.
     * 
     * @param originalData
     * @param id
     * @return
     * @throws RemoteException
     */
    public FirmaInfoViafirma checkOrignalDocumentSigned(byte[] originalData, String id) throws RemoteException {
        // Chequeamos que el documento no ha sido modificado
        return Nucleo.getInstance().checkOrignalDocumentSigned(originalData, id);
    }

    /**
     * 
     * Valida un XML firmado en cualquier plataforma devolviendo el resultado del analisis
     * 
     */
    public boolean checkSignedDocumentValidity(byte[] signedXML) throws RemoteException {
        //Generamos un document desde el archivo en XML
        Document xmlDocument = null;
        try {
            //Validamos el document y devolvemos el resultado del analisis
            xmlDocument = XmlSignUtil.getInstance().parseDocument(new String(signedXML));
            return XmlSignUtil.getInstance().checkSignatureFrom(xmlDocument, false);
        } catch (ExcepcionErrorInterno e) {
            log.warn("No se ha validar el documento: " + e.getMessage(), e);
            throw new RemoteException("No se ha podido validar el documento: " + e.getMessage());
        }
    }

    /**
     * Activa la multifirma para el documento actual.
     * @param idFirma
     * @return
    */
    public String enabledMultiSign(String idFirma) throws RemoteException {
        throw new UnsupportedOperationException(
                "Esta operacin no esta soportada o implementada en la versin Viafirma GPL/Estandar");
    }

    /**
     * Desactiva la multifirma para el documento actual.
     */
    public void disabledMultiSign(String idMultiSign) throws RemoteException {
        throw new UnsupportedOperationException(
                "Esta operacin no esta soportada o implementada en la versin Viafirma GPL/Estandar");
    }
}