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.CertificationChainAndSignatureBase64; import gov.pr.celepar.tabeliao.util.PrivateKeyAndCertChain; import gov.pr.celepar.tabeliao.util.Util; import javax.swing.JApplet; import netscape.javascript.JSObject; /** * Classe de acao para efetuar Assinatura PKCS#7/CMS , em ambiente Servidor de Aplicacao * * @author Thiago Meneghello - GIC/CELEPAR * */ public class ActionAssinaturaWeb implements ActionHandler { private JApplet applet; /** * * @param applet */ public ActionAssinaturaWeb(JApplet applet) { this.applet = applet; } /** * * @param arquivo -> arquivo a ser assinado * @param pin * @param isHardware -> true se o certificado estiver armazenado em hardware (smartcard/token) */ public boolean execute(String arquivo, String pin, boolean isHardware){ String[] hashs = Util.stringToArray(applet.getParameter("hash")); String nomeForm = applet.getParameter("nomeForm"); //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; } //Aqui o documento ja esta assinado! Coloca ele no form 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 + "'.\nVerifique se a taglib assinaturaWeb n�o foi colocada dentro de uma tag <form>.",2); return false; } JSObject form = (JSObject)obj; String script = "var elementAssinatura = document.createElement('input');\n" + "elementAssinatura.type='hidden';\n" + "elementAssinatura.name='campoAssinaturas';\n" + "elementAssinatura.value='${value}';\n" + "document." + nomeForm + ".appendChild(elementAssinatura);"; try { for(int i=0 ; i<hashs.length ; i++) { CertificationChainAndSignatureBase64 signature; signature = TabeliaoAppletUtil.signHashDocument(Base64Utils.base64Decode(hashs[i]), privateKey); String valorAssinatura = Base64Utils.base64Encode(signature.mSignature); window.eval(script.replace("${value}", valorAssinatura)); } } catch (DocumentSignException e) { TabeliaoAppletUtil.showMensagem(applet, "Ocorreu um erro ao assinar o arquivo.\nMotivo: " + e.getCause().getMessage(),2); return false; } //Manda um submit para o form form.call("submit", new Object[0]); return true; } }