/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2013, MPL CodeInside http://codeinside.ru */ package ru.codeinside.gses.webui.components.sign; import ru.codeinside.adm.AdminServiceProvider; import ru.codeinside.gses.cert.X509; import ru.codeinside.gses.vaadin.AppletIntegration; import ru.codeinside.gses.webui.Flash; import ru.codeinside.gses.webui.utils.RunProfile; import javax.xml.bind.DatatypeConverter; import java.net.URL; import java.security.cert.X509Certificate; import java.util.Arrays; import java.util.Map; import java.util.logging.Logger; public class SignApplet extends AppletIntegration { SignAppletListener listener; X509Certificate certificate; int blocksCount; int blockReq; int blockAck; int chunksCount; int chunkReq; int chunkAck; public SignApplet(SignAppletListener listener) { this.listener = listener; if (!RunProfile.isProduction()) { setAppletParams("appDebug", "true"); } setAppletArchives(Arrays.asList("sign-applet-1.9.jar")); setName("Подписание данных личной ЭЦП"); setAppletParams("appletId", "formSign"); setAppletClass("ru.codeinside.sign.SignApplet"); setWidth("477px"); setHeight("177px"); // загружается быстро, не успеют увидеть setAppletParams("image", "applet.gif"); } private String getCodeBase() { final URL url = getWindow().getApplication().getURL(); String appBase = url.getPath(); return appBase.substring(0, 1 + appBase.lastIndexOf('/', appBase.length() - 2)); } @Override public void attach() { setCodebase(getCodeBase()); } public void setBindingMode() { setAppletParams("mode", "binding"); setAppletParams("fio", AdminServiceProvider.get().findEmployeeByLogin(Flash.login()).getFio()); } public void setRebindMode(byte[] x509) { setAppletParams("mode", "rebind"); setAppletParams("x509", DatatypeConverter.printBase64Binary(x509)); setAppletParams("fio", AdminServiceProvider.get().findEmployeeByLogin(Flash.login()).getFio()); } public void setSignMode(byte[] x509) { setAppletParams("mode", "sign"); setAppletParams("x509", DatatypeConverter.printBase64Binary(x509)); } public void setUnboundSignMode() { setAppletParams("mode", "unbound"); } public void changeVariables(Object source, Map<String, Object> variables) { Logger.getLogger(getClass().getName()).fine("applet send: " + variables.keySet()); if (variables.containsKey("state")) { String state = variables.get("state").toString(); if ("loading".equals(state)) { listener.onLoading(this); } else if ("noJcp".equals(state)) { listener.onNoJcp(this); } } if (variables.containsKey("cert")) { byte[] encoded = DatatypeConverter.parseBase64Binary(variables.get("cert").toString()); X509Certificate cert = X509.decode(encoded); if (cert != null) { certificate = cert; listener.onCert(this, certificate); } } if (variables.containsKey("block")) { blockAck = Integer.parseInt(variables.get("block").toString()); listener.onBlockAck(this, blockAck); } if (variables.containsKey("chunk")) { chunkAck = Integer.parseInt(variables.get("chunk").toString()); listener.onChunkAck(this, chunkAck); } if (variables.containsKey("sign")) { chunkAck = chunksCount; byte[] sign = DatatypeConverter.parseBase64Binary(variables.get("sign").toString()); listener.onSign(this, sign); } } public void block(int i, int n) { blockReq = i; blocksCount = n; executeCommand("block", new String[]{i + "", n + ""}); } public void chunk(int i, int n, byte[] bytes) { chunkReq = i; chunksCount = n; executeCommand("chunk", new String[]{i + "", n + "", DatatypeConverter.printBase64Binary(bytes)}); } public void close() { executeCommand("close"); } public X509Certificate getCertificate() { return certificate; } public int getBlockAck() { return blockAck; } }