package gov.pr.celepar.tabeliao.client.applet.action; /* Este programa � licenciado de acordo com a LPG-AP (LICEN�A P�BLICA GERAL PARA PROGRAMAS DE COMPUTADOR DA ADMINISTRA��O P�BLICA), vers�o 1.1 ou qualquer vers�o posterior. A LPG-AP deve acompanhar todas PUBLICA��ES, DISTRIBUI��ES e REPRODU��ES deste Programa. Caso uma c�pia da LPG-AP n�o esteja dispon�vel junto com este Programa, voc� pode contatar o LICENCIANTE ou ent�o acessar diretamente: http://www.celepar.pr.gov.br/licenca/LPG-AP.pdf Para poder USAR, PUBLICAR, DISTRIBUIR, REPRODUZIR ou ALTERAR este Programa � preciso estar de acordo com os termos da LPG-AP */ import gov.pr.celepar.tabeliao.client.applet.DocumentSignException; import gov.pr.celepar.tabeliao.client.applet.TabeliaoAppletUtil; import gov.pr.celepar.tabeliao.util.Base64Utils; import gov.pr.celepar.tabeliao.util.PrivateKeyAndCertChain; import gov.pr.celepar.tabeliao.util.XmlSigUtil; import gov.pr.celepar.tabeliao.core.GerarEnvelopedXML; import java.io.ByteArrayInputStream; import java.io.StringWriter; import java.util.StringTokenizer; import javax.swing.JApplet; import javax.xml.crypto.dsig.XMLSignatureException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import netscape.javascript.JSObject; import org.w3c.dom.Document; import org.xml.sax.InputSource; /** * Classe de acao para executar assinatura em formato EnvelopedXML para ambiente WEB * * @version 1.0 * @author Emerson Sachio Saito - GIC/CELEPAR * */ public class ActionAssinarEnvelopedXmlWeb implements ActionHandler { private JApplet applet; /** * Metodo de acao para executar assinatura em formato EnvelopedXML para ambiente WEB via applet * * @param applet Applet do Tabeliao */ public ActionAssinarEnvelopedXmlWeb(JApplet applet) { this.applet = applet; } /** * Metodo executar a assinatura * * @param arquivo certificado armazenado em arquivo * @param pin PIN do certificado * @param isHardware boolean = true para certificado em token/smartcard */ public boolean execute(String arquivo, String pin, boolean isHardware){ String separadorArquivo = applet.getParameter("separadorArquivo"); String conteudosArquivos = applet.getParameter("conteudosArquivos"); String nomeTagAssinar = applet.getParameter("nomeTagAssinar"); String varPoliticaId = applet.getParameter("politicaId"); String varPoliticaUri = applet.getParameter("politicaUri"); String varContraAssinatura = applet.getParameter("contraAssinatura"); String nomeForm = applet.getParameter("nomeForm"); boolean pContraAssinatura = false; //Tenta pegar o keyStore que possui o certificado do usuario PrivateKeyAndCertChain privateKey; try { privateKey = TabeliaoAppletUtil.loadPrivateKeyAndCertChain(arquivo, pin, isHardware); } catch (DocumentSignException e1) { TabeliaoAppletUtil.showMensagem(applet, "Ocorreu um erro ao carregar a chave privada do certificado.\nMotivo: " + e1.getCause().getMessage(),2); return false; } //Prepara o formulario para carregar os arquivos XML assinados. JSObject window = JSObject.getWindow(applet); JSObject document = (JSObject)window.getMember("document"); Object obj = document.getMember(nomeForm); if(!(obj instanceof JSObject)) { TabeliaoAppletUtil.showMensagem(applet, "N�o foi poss�vel localizar o formul�rio '" + nomeForm + "'.\n A taglib assinaturaEnvelopedXmlWeb n�o deve ser colocada dentro de uma tag <form>.",2); return false; } JSObject form = (JSObject)obj; String script = "var elementXmlAssinado = document.createElement('input');\n" + "elementXmlAssinado.type='hidden';\n" + "elementXmlAssinado.name='campoArquivosXmlAssinados';\n" + "elementXmlAssinado.value='${value}';\n" + "document." + nomeForm + ".appendChild(elementXmlAssinado);"; try { if (varContraAssinatura.equalsIgnoreCase("true") || varContraAssinatura.equalsIgnoreCase("on")){ pContraAssinatura = true; } if(separadorArquivo != null) { StringTokenizer token = new StringTokenizer(conteudosArquivos, separadorArquivo); String[] conteudoArquivos = new String[token.countTokens()]; int i=0; while(token.hasMoreTokens()) { conteudoArquivos[i++] = token.nextToken(); } // Efetua a assinatura for(int j=0 ; j< conteudoArquivos.length ; j++) { byte[] conteudo = Base64Utils.base64Decode(conteudoArquivos[j]); InputSource novoImput = new InputSource(new ByteArrayInputStream(conteudo)); Document arquivoAssinar = XmlSigUtil.carregarArquivoXML(novoImput); Document docEnvelopedXmlAssinado = GerarEnvelopedXML.assinarArquivoEnvelopedXml(arquivoAssinar, nomeTagAssinar, varPoliticaId, varPoliticaUri, pContraAssinatura, privateKey); StringWriter sw = new StringWriter(); TransformerFactory tf = TransformerFactory.newInstance(); Transformer trans = tf.newTransformer(); trans.transform(new DOMSource(docEnvelopedXmlAssinado), new StreamResult(sw)); String texto = Base64Utils.base64Encode(sw.toString().getBytes()); window.eval(script.replace("${value}",texto)); } } else { byte[] conteudo = Base64Utils.base64Decode(conteudosArquivos); InputSource novoImput = new InputSource(new ByteArrayInputStream(conteudo)); Document arquivoAssinar = XmlSigUtil.carregarArquivoXML(novoImput); Document docEnvelopedXmlAssinado = GerarEnvelopedXML.assinarArquivoEnvelopedXml(arquivoAssinar, nomeTagAssinar, varPoliticaId, varPoliticaUri, pContraAssinatura, privateKey); StringWriter sw = new StringWriter(); TransformerFactory tf = TransformerFactory.newInstance(); Transformer trans = tf.newTransformer(); trans.transform(new DOMSource(docEnvelopedXmlAssinado), new StreamResult(sw)); String texto = Base64Utils.base64Encode(sw.toString().getBytes()); window.eval(script.replace("${value}",texto)); } } catch (XMLSignatureException e) { TabeliaoAppletUtil.showMensagem(applet, "Ocorreu um erro ao assinar o arquivo.\nMotivo: " + e.getCause().getMessage(),2); return false; } catch (TransformerConfigurationException e) { TabeliaoAppletUtil.showMensagem(applet, "Ocorreu um erro de configura��o ao transformar o arquivo XML.\nMotivo: " + e.getCause().getMessage(),2); return false; } catch (TransformerException e) { TabeliaoAppletUtil.showMensagem(applet, "Ocorreu um erro ao transformar o arquivo XML.\nMotivo: " + e.getCause().getMessage(),2); return false; }catch (Exception e) { TabeliaoAppletUtil.showMensagem(applet, "Ocorreu um erro ao assinar o arquivo XML.\nMotivo: " + e.getCause().getMessage(),2); return false; } //Manda um submit para o form form.call("submit", new Object[0]); return true; } }