Java tutorial
/* 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"); } }