/*
* 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.sign;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.security.PrivateKey;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import static javax.xml.bind.DatatypeConverter.printBase64Binary;
final class Rebinder implements CertConsumer {
final Vaadin vaadin;
final Panel ui;
final byte[] x509;
final String fio;
boolean second;
Rebinder(Vaadin vaadin, Panel ui, byte[] x509, String fio) {
this.vaadin = vaadin;
this.ui = ui;
this.x509 = x509;
this.fio = fio;
}
public void ready(String name, PrivateKey unusedPrivateKey, X509Certificate certificate) {
if (second) {
String status;
try {
vaadin.updateVariable("cert", printBase64Binary(certificate.getEncoded()));
status = "Готово.";
} catch (CertificateEncodingException e) {
status = "Ошибка.";
}
ui.removeAll();
ui.add(new Label(name), BorderLayout.PAGE_START);
ui.add(new Label(status), BorderLayout.CENTER);
Button cancel = new Button("Отменить");
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
loading();
}
});
Panel buttons = new Panel(new BorderLayout(2, 2));
buttons.add(cancel, BorderLayout.LINE_START);
ui.add(buttons, BorderLayout.PAGE_END);
refresh();
} else {
second = true;
loading();
}
}
@Override
public void loading() {
if (!second) { // сообщение лишь на первый сертификат
vaadin.updateVariable("state", "loading");
}
ui.removeAll();
ui.add(new Label("Загрузка сертификатов..."), BorderLayout.LINE_START);
Label status = new Label("");
ui.add(status, BorderLayout.CENTER);
refresh();
new Thread(new CertDetector(this, ui, status,fio)).start();
}
public void refresh() {
ui.validate();
ui.repaint();
}
@Override
public void noJcp() {
vaadin.updateVariable("state", "noJcp");
ui.removeAll();
ui.add(new Label("КриптоПРО JCP не установлен!"), BorderLayout.LINE_START);
refresh();
}
@Override
public Filter getFilter() {
if (second) {
return new Filter() {
@Override
public boolean accept(X509Certificate certificate) {
byte[] encoded;
try {
encoded = certificate.getEncoded();
} catch (CertificateEncodingException e) {
return false;
}
return !Arrays.equals(x509, encoded);
}
};
}
return new EqualsFilter(x509);
}
@Override
public String getActionText() {
return second ? "Завершить выбор" : "Подтвердить текущий";
}
@Override
public String getSelectionLabel() {
return second ? "Выберите новый сертификат:" : "Текущий сертификат:";
}
}