/* * 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; import com.google.common.base.Function; import com.google.common.base.Joiner; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Component; import com.vaadin.ui.FormLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Panel; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import com.vaadin.ui.themes.Reindeer; import ru.codeinside.adm.AdminServiceProvider; import ru.codeinside.adm.database.CertificateOfEmployee; import ru.codeinside.adm.database.Employee; import ru.codeinside.adm.database.Group; import ru.codeinside.adm.database.Role; import ru.codeinside.gses.cert.NameParts; import ru.codeinside.gses.cert.X509; import ru.codeinside.gses.webui.CertificateReader; import ru.codeinside.gses.webui.Flash; import ru.codeinside.gses.webui.components.sign.SignApplet; import ru.codeinside.gses.webui.components.sign.SignAppletListener; import java.security.cert.CertificateEncodingException; import java.security.cert.X509Certificate; import java.text.Format; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; final public class EmployeeInfo extends Panel { public EmployeeInfo(String userLogin, Button button) { setCaption("Информация пользователя ".concat(userLogin)); FormLayout layout = new FormLayout(); for (Component c : AdminServiceProvider.get().withEmployee(userLogin, new CreateInfo())) { layout.addComponent(c); } addComponent(layout); addComponent(button); } final static class CreateInfo implements Function<Employee, Collection<Component>> { public Collection<Component> apply(Employee employee) { Label fio = new Label(employee.getFio()); fio.setCaption("ФИО:"); String snilsValue = employee.getSnils() == null ? "" : employee.getSnils(); final Pattern snilsPattern = Pattern.compile("\\d{11}"); final Pattern splitSnilsPattern = Pattern.compile("(\\d{3})(\\d{3})(\\d{3})(\\d{2})"); final Matcher maskMatcher = snilsPattern.matcher(snilsValue); final Matcher splitMatcher = splitSnilsPattern.matcher(snilsValue); if (maskMatcher.matches()) { snilsValue = splitMatcher.replaceAll("$1-$2-$3 $4"); } Label snils = new Label(snilsValue); snils.setCaption("СНИЛС:"); Set<String> roleNames = employee.getRoleNames(); Label role = new Label(); if (roleNames == null || roleNames.isEmpty()) { role.setValue("отсутствует"); } else { role.setValue(Joiner.on(", ").join(roleNames)); } role.setCaption("Роль:"); Label organization = new Label(employee.getOrganization().getName()); organization.setCaption("Организация:"); Format formatter = new SimpleDateFormat("dd.MM.yyyy HH:mm"); Label date = new Label(formatter.format(employee.getDate())); date.setCaption("Дата создания:"); String sCreator = employee.getCreator(); Label creator = new Label(); if (sCreator == null || sCreator.isEmpty()) { creator.setValue("не указан"); } else { creator.setValue(sCreator); } creator.setCaption("Создатель:"); Label groupsExecutor = new Label(getGroupsNames(employee.getGroups())); groupsExecutor.setCaption("Состоит в группах:"); Label groupsSupervisorEmp = new Label(getGroupsNames(employee.getEmployeeGroups())); groupsSupervisorEmp.setCaption("Имеет доступ к группам исполнителей:"); Label groupsSupervisorOrg = new Label(getGroupsNames(employee.getOrganizationGroups())); groupsSupervisorOrg.setCaption("Имеет доступ к группам организаций:"); Component certificateUi = null; Set<Role> roles = employee.getRoles(); if (roles.contains(Role.Executor) || roles.contains(Role.Declarant) || roles.contains(Role.Supervisor) || roles.contains(Role.SuperSupervisor)) { CertificateOfEmployee certificate = employee.getCertificate(); String certName; if (certificate == null) { certName = "отсутствует"; } else { X509Certificate x509Certificate = X509.decode(certificate.getX509()); if (x509Certificate != null) { NameParts subjectParts = X509.getSubjectParts(x509Certificate); certName = subjectParts.getShortName(); } else { certName = "не соответствует стандарту X509"; } } Label label = new Label(certName); if (certificate != null && Flash.login().equals(employee.getLogin())) { HorizontalLayout h = new HorizontalLayout(); h.setSpacing(true); h.addComponent(label); Button remove = new Button("Привязать другой сертификат"); remove.setStyleName(Reindeer.BUTTON_SMALL); h.addComponent(remove); h.setComponentAlignment(remove, Alignment.BOTTOM_LEFT); remove.addListener(new CertificateRebinder(remove, label)); certificateUi = h; } else { certificateUi = label; } certificateUi.setCaption("Используемый сертификат:"); } ArrayList<Component> items = new ArrayList<Component>(); items.add(fio); items.add(snils); items.add(role); items.add(organization); items.add(groupsExecutor); items.add(groupsSupervisorEmp); items.add(groupsSupervisorOrg); items.add(date); items.add(creator); if (certificateUi != null) { items.add(certificateUi); } return items; } private String getGroupsNames(Set<Group> groups) { Set<String> groupsNames = new HashSet<String>(); for (Group g : groups) { groupsNames.add(g.getName()); } return Joiner.on(", ").join(groupsNames); } } final static class CertificateRebinder implements Button.ClickListener { final Button remove; final Label label; byte[] x509; Label appletHint; public CertificateRebinder(Button remove, Label label) { this.remove = remove; this.label = label; } @Override public void buttonClick(Button.ClickEvent event) { x509 = AdminServiceProvider.get().withEmployee(Flash.login(), new CertificateReader()); if (x509 == null) { label.getApplication().close(); return; } Window window = new Window(); window.setModal(true); window.setClosable(true); window.setResizable(false); window.setResizeLazy(true); window.setCaption("Привязка сертификата"); SignApplet applet = new SignApplet(new Protocol()); applet.setName("Привязка сертификата"); applet.setCaption(null); applet.setRebindMode(x509); appletHint = new Label( "Требуется поддержка <b>Java</b> в " + Flash.getActor().getBrowser() + " и наличие <b>КриптоПРО JCP</b>.<br/> " + "Для помощи с установкой программного обеспечения и получения сертификата " + "обратитесь в <a target='_blank' href='http://ca.oep-penza.ru/'" + ">Удостоверяющий центр Оператора Электронного Правительства</a>.", Label.CONTENT_XHTML); VerticalLayout layout = new VerticalLayout(); layout.setSizeUndefined();// вписываем layout.addComponent(applet); layout.addComponent(appletHint); layout.setSpacing(true); layout.setMargin(true); window.setContent(layout); event.getButton().getWindow().addWindow(window); } final class Protocol implements SignAppletListener { @Override public void onLoading(SignApplet signApplet) { appletHint.setStyleName(Reindeer.LABEL_SMALL); } @Override public void onNoJcp(SignApplet signApplet) { appletHint.setStyleName(Reindeer.LABEL_H2); } @Override public void onCert(SignApplet signApplet, X509Certificate certificate) { boolean ok = AdminServiceProvider.get().withEmployee(Flash.login(), new CertificateReSetter(certificate)); if (!ok) { label.getApplication().close(); } else { NameParts subjectParts = X509.getSubjectParts(certificate); label.setValue(subjectParts.getShortName()); remove.getWindow().removeWindow(appletHint.getWindow()); } } @Override public void onBlockAck(SignApplet signApplet, int i) { } @Override public void onChunkAck(SignApplet signApplet, int i) { } @Override public void onSign(SignApplet signApplet, byte[] sign) { } } final class CertificateReSetter implements Function<Employee, Boolean> { final X509Certificate certificate; public CertificateReSetter(X509Certificate certificate) { this.certificate = certificate; } @Override public Boolean apply(Employee employee) { Set<Role> roles = employee.getRoles(); if (roles.contains(Role.Executor) || roles.contains(Role.Declarant) || roles.contains(Role.Supervisor) || roles.contains(Role.SuperSupervisor)) { CertificateOfEmployee certificateOfEmployee = employee.getCertificate(); if (certificateOfEmployee != null && Arrays.equals(x509, certificateOfEmployee.getX509())) { try { certificateOfEmployee.setX509(certificate.getEncoded()); return true; } catch (CertificateEncodingException e) { // игнорируем } } } return false; } } } }