/*
* CollaboratorLocal.java
*
* Created on 17 Декабрь 2007 г., 11:28
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package cli_fmw.delegate.collaborator;
import cli_fmw.Application;
import cli_fmw.delegate.AuditListener;
import cli_fmw.delegate.DEC.DECClientAbstract;
import cli_fmw.delegate.DelegateLine2;
import cli_fmw.delegate.cache.DelegateExtraData;
import cli_fmw.delegate.cache.ExtraDataManager;
import cli_fmw.delegate.client.ClientLocalAbstract;
import cli_fmw.login.UserInfoAbstract;
import cli_fmw.main.ClipsException;
import cli_fmw.main.MainWindow;
import cli_fmw.main.UserPanel;
import cli_fmw.utils.MessageBox;
import framework.beans.ModificationInfo;
import framework.beans.collaborator.CollaboratorBeanRemoteAbstract;
import framework.beans.collaborator.CollaboratorDetailsAbstract;
import framework.beans.security.passwords.SessionPassword;
import framework.security.UserRight;
import framework.security.UserRightsGroup;
import framework.security.UserRightsSetAbstract;
import java.io.File;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
//import org.infotechservice.GostCrypto.CryptoException;
//import org.infotechservice.GostCrypto.GostSignatureProvider;
//import org.infotechservice.GostCrypto.SignatureManager;
//import org.infotechservice.GostCrypto.storage.HDImgStorage;
/**
* Делегат, представляющий доступ к 1 записи в таблице collaborator - сотрудник.
* @author Администратор
*/
public abstract class CollaboratorLocalAbstract
<BEANINTERFACE extends CollaboratorBeanRemoteAbstract,
COLLABDETAILS extends CollaboratorDetailsAbstract,
CLIENTDELEGATE extends ClientLocalAbstract>
extends DelegateLine2<BEANINTERFACE, COLLABDETAILS> {
private RightsInfo rights = new RightsInfo(getEDM());
private PanelInfo panels = new PanelInfo(getEDM());
private RightsMapInfo rightsMap = new RightsMapInfo(getEDM());
private DECClientAbstract<CLIENTDELEGATE> client = initClientCache();
// private GostSignatureProvider provider;
// private DataStorage dataStorage;
private PrivateKey key;
private X509Certificate certificate;
// private SignatureManager signatureManager;
private static String br = (System.getProperty("os.name").indexOf("windows") > -1) ? "\\" : "/";
private static String cert_stub_path = System.getProperty("user.home") + br + "Certificate_stub";
private static int getSignVersion(){
//STUB
return 1;
//END STUB
}
protected void initCrypto() throws ClipsException {//STUB
// try {
// if (isNewlyCreated()){
// return;
// }
//// if (!isNewlyCreated() || ){
// provider = GostSignatureProvider.getInstance();
// File f = new File(getStorePath());
// if (!f.exists()){
// throw new ClipsException("Не найдено хранилище ключей");
// }
// HDImgStorage dataStorage = new HDImgStorage(f);
// if (dataStorage == null){
// throw new ClipsException("Не найдено хранилище ключей");
// }
// certificate = dataStorage.getCertificate();
// key = dataStorage.getPrivateKey();
// if (certificate == null){
// throw new ClipsException("У вас нет сертификата открытого ключа");
// }
// if (key == null){
// throw new ClipsException("У вас нет открытого ключа");
// }
// checkCertificate();
// signatureManager = provider.getSignatureManager(getSignVersion());
//// }
// } catch (ClipsException ex){
// if (this.getID() != UserInfoAbstract.get().getCollaborator().getID()){
// MessageBox.printStackTrace(ex);
// return;
// }else{
// throw ex;
// }
// } catch (CryptoException ex) {
// throw new ClipsException("Ошибка системы защиты информации", ex);
// }
}
private String getStorePath(){
return cert_stub_path + br + getID();
}
public CollaboratorLocalAbstract(CLIENTDELEGATE c) throws ClipsException {
super(c.getAuditListener());
client.initBy(c);
}
public CollaboratorLocalAbstract(int id, AuditListener al) throws ClipsException {
super(id, al);
}
public CollaboratorLocalAbstract(COLLABDETAILS details, AuditListener al) throws ClipsException {
super(details, al);
}
abstract protected DECClientAbstract<CLIENTDELEGATE> initClientCache()throws ClipsException;
public CLIENTDELEGATE getClient() throws ClipsException {
return client.get();
}
public int changePassword(char[] aNewPassword, char[] oldPassword) throws ClipsException {
int r;
try {
ModificationInfo mi = getBean().changePassword(
SessionPassword.getPasswordHash(aNewPassword),
SessionPassword.getPasswordHash(oldPassword));
r = mi.getId();
auditDetailsList.addAll(mi.getAudit());
fireAuditEvent();
} catch (Exception ex) {
clearBean();
throw new ClipsException("Не удалось сменить пароль", ex);
}
fireContentStateEvent();
return r;
}
public Set<UserRight> getRights() throws ClipsException {
return new HashSet<UserRight>(rights.get());
}
/**
* меняет текущие права на заданные
* @param urList
* @throws ClipsException
*/
public void setRights(Set<UserRight> urList) throws ClipsException {
for (UserRight userRight : urList) {
int rightMask = getRightMask(userRight.getGroup());
rightMask |= userRight.getRightsMask();
setRightsMask(userRight.getGroup(), rightMask);
}
rights.set(new HashSet<UserRight>(urList));
}
/**
* Возвращает набор панелей для данного сотрудника
* @return
* @throws ClipsException
*/
public Set<UserPanel> getPanels() throws ClipsException {
return new HashSet<UserPanel>(panels.get());
}
/**
* меняет набор панелей сотрудника
* @param panels
* @throws ClipsException
*/
public void setPanels(Set<UserPanel> panels) throws ClipsException {
this.panels.set(new HashSet<UserPanel>(panels));
fireContentStateEvent();
}
public String getLDAPName() throws ClipsException {
return getDetails().ldapName;
}
public void setLDAPName(String ldapName) throws ClipsException {
getDetails().ldapName = ldapName;
fireContentStateEvent();
}
/**
* Возвращает ФИО сотрудника в формате Фамилия И.О.
* @return
*/
@Override
public String toString() {
try {
return getClient().getFIO();
} catch (ClipsException ex) {
return "ОШИБКА";
}
}
/**
* Получение конфигурации ГУИ для пользователя
* @return конфигурация
* @throws ClipsException
*/
public GUIConfig getGuiConfig() throws ClipsException {
try {
String s = getBean().getGUIConfig();
GUIConfig config = new GUIConfig(s);
return config;
} catch (Exception ex) {
clearBean();
throw new ClipsException("Не удалось получить настройки для текущего пользователя", ex);
}
}
/**
* Назначает конфигурацию ГУИ для позльзователя
* @param config конфигурация
* @throws ClipsException
*/
public void saveGuiConfig(GUIConfig config) throws ClipsException {
try {
ModificationInfo mi = getBean().setGUIConfig(config.toXML());
auditDetailsList.addAll(mi.getAudit());
fireAuditEvent();
} catch (Exception ex) {
clearBean();
throw new ClipsException("Не удалось сохранить настройки для текущего пользователя", ex);
}
}
public void setFired(boolean fired) throws ClipsException {
getDetails().hidden = fired;
fireContentStateEvent();
}
public boolean isFired() throws ClipsException {
return getDetails().hidden;
}
public int getRightMask(UserRightsGroup group) throws ClipsException{
int mask = rightsMap.get().get(group.getTitle());
System.out.println("GET RIGHT MASK group: " + group + " mask: " + mask);
return mask;
}
public void setRightsMask(UserRightsGroup group, int mask) throws ClipsException{
Map<String, Integer> map = new HashMap<String, Integer>(rightsMap.get());
map.put(group.getTitle(), mask);
rightsMap.set(map);
// rightsMap.get().put(group.getTitle(), mask);
// System.out.println("SET RIGHT MASK group: " + group + " mask: " + mask);
fireContentStateEvent();
}
private class RightsMapInfo extends DelegateExtraData<Map<String, Integer>>{
public RightsMapInfo(ExtraDataManager contaner) {
super(contaner);
}
@Override
protected void saveDB() throws Exception {
ModificationInfo mi = getBean().setRightsMask(this.get());
auditDetailsList.addAll(mi.getAudit());
fireAuditEvent();
}
@Override
protected Map<String, Integer> init() throws Exception {
return getBean().getRightsMask();
}
@Override
protected Map<String, Integer> initNew() {
return null;
}
}
/**
*
*/
private class RightsInfo extends DelegateExtraData<Set<UserRight>> {
public RightsInfo(ExtraDataManager contaner) {
super(contaner);
}
@Override
protected Set<UserRight> init() throws Exception {
Iterator<Integer> ri = getBean().getRights().iterator();
Set<UserRight> rs = new HashSet<UserRight>();
while (ri.hasNext()) {
rs.add(UserRightsSetAbstract.getRightFromID(ri.next()));
}
return rs;
}
@Override
protected void saveDB() throws Exception {
Set<Integer> si = new HashSet<Integer>();
Iterator<UserRight> it = rights.get().iterator();
while (it.hasNext()) {
UserRight userRights = it.next();
si.add(userRights.getID());
}
ModificationInfo mi = getBean().setRights(si);
auditDetailsList.addAll(mi.getAudit());
fireAuditEvent();
}
@Override
protected Set<UserRight> initNew() {
return null;
}
}
/**
*
*/
private class PanelInfo extends DelegateExtraData<Set<UserPanel>> {
public PanelInfo(ExtraDataManager contaner) {
super(contaner);
}
@Override
protected Set<UserPanel> init() throws Exception {
initCrypto();
Iterator<String> ri = getBean().getPanelList().iterator();
Set<UserPanel> rs = new HashSet<UserPanel>();
while (ri.hasNext()) {
try {
UserPanel up = UserPanel.getPanel(ri.next());
if (up != null) {
rs.add(up);
}
} catch (ClipsException ex) {
MessageBox.showExceptionOnly(ex);
}
}
return rs;
}
@Override
protected void saveDB() throws Exception {
Set<String> si = new HashSet<String>();
Iterator<UserPanel> it = get().iterator();
while (it.hasNext()) {
UserPanel userPanel = it.next();
si.add(userPanel.getClassName());
}
ModificationInfo mi = getBean().setPanelList(si);
auditDetailsList.addAll(mi.getAudit());
fireAuditEvent();
}
@Override
protected Set<UserPanel> initNew() {
return null;
}
}
/**
*
*/
private class GUIConfigInfo extends DelegateExtraData<String> {
public GUIConfigInfo(ExtraDataManager contaner) {
super(contaner);
}
@Override
protected String init() throws Exception {
String s = getBean().getGUIConfig();
GUIConfig config = new GUIConfig(s);
return config.toXML();
}
@Override
protected void saveDB() throws Exception {
getBean().setGUIConfig(get());
}
@Override
protected String initNew() {
return null;
}
}
public boolean haveCertificate() throws ClipsException{
// try {
// if (signatureManager == null){
// initCrypto();
// }
// return dataStorage != null && dataStorage.getCertificate() != null;
// return certificate != null;
// } catch (CryptoException ex) {
// throw new ClipsException("Не удалось получить сведенья о наличии у сотрудника сертификата", ex);
// }
return true;//STUB
}
public byte[] sign(byte[] data) throws ClipsException{//STUB
// long t1 = new Date().getTime();
// try {
// if (!haveCertificate() || key == null){
// throw new ClipsException("Для подписывания данных необходимо иметь сертификат и закрытый ключ!");
// }
//// PrivateKey privateKey = dataStorage.getPrivateKey();
// System.out.println("SIGNATURE private key load in " + (new Date().getTime() - t1) + " ms");
// long t2 = new Date().getTime();
// byte[] signData = signatureManager.signData(data, key);
// System.out.println("SIGNATURE data sign in " + (new Date().getTime() - t2) + " ms");
// return signData;
// } catch (CryptoException ex) {
// throw new ClipsException("Не удалось подписать данные", ex);
// }
return Arrays.copyOf(data, 10);//STUB
}
/**
*
* @throws ClipsException
*/
@Deprecated
public void createCertificate() throws ClipsException{
// try {
// if (dataStorage != null && dataStorage.getCertificate() != null){
// throw new ClipsException("Сотрудник уже имеет сертификат");
// }
// if (dataStorage == null){
// File f = new File(getStorePath());
// if (!f.exists()){
// f.mkdir();
// }
// dataStorage = new HDImgStorage(f);
//
// }
// CertManager certManager = provider.getCertManager();
// KeyPair kp = certManager.generateKeys();
// X509dhName x509dhName = null;
//
// DirectoryEnterpriseItemAbstract currentEnterprise = ConfigLocalAbstract.getInstance().getCurrentEnterprise();
// String fio = DirectoryLocator.getDirectory(DirectoryCollaborator.class).getItemFromID(getID()).getTitle();
// if (currentEnterprise != null && currentEnterprise.getAddress() != null){
// Address address = currentEnterprise.getAddress();
// x509dhName = new X509dhName("RU", address.getRegionTitle(), address.getCityTitle(), currentEnterprise.getTitle(), "", fio, "");
// System.out.println(x509dhName.getName());
// }else{
// x509dhName = new X509dhName("RU", "", "", "", "", fio, "");
// }
// if (x509dhName != null){
// X509Certificate certificate = certManager.generateX509(kp, x509dhName);
// dataStorage.saveKeyAndCert(kp.getPrivate(), certificate);
// }else{
// throw new ClipsException("Данные сотрудника недоступны");
// }
//
// } catch (CryptoException ex) {
// throw new ClipsException("Не создать сертификат", ex);
// }
}
/**
*
* @return may be null
*/
public String getCertificateText() throws ClipsException {
// try {
return certificate.toString();
// } catch (CryptoException ex) {
// throw new ClipsException("Не удалось получить сертификаит", ex);
// }
}
public String getCertificateNumber() throws ClipsException{
// try {
return "";
// return certificate.getSerialNumber().toString();
// } catch (CryptoException ex) {
// throw new ClipsException("Не удалось получить сертификаит", ex);
// }
}
public void addCertificate() throws ClipsException{
try {
byte[] encoded = certificate.getEncoded();
getBean().addCurrentCertificate(encoded);
} catch (Exception ex) {
throw new ClipsException("Не удалось сохранить сертификаит", ex);
}
}
private void checkCertificate() throws ClipsException{
try {
if (UserInfoAbstract.get().isSuperUser()){
return;
}
byte[] encoded = certificate.getEncoded();
if (!getBean().isCurrentCertificate(encoded)){
throw new ClipsException("Используемый сертификат не подтверждён, обратитесь к администратору");
}
} catch (Exception ex) {
throw new ClipsException("Ошибка при проверке сертификата", ex);
}
}
}