/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.signer.ui;
import com.digisi.support.SignerSupport;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.File;
import java.io.IOException;
import java.security.KeyStoreException;
import java.security.cert.X509Certificate;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.naming.InvalidNameException;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.event.MouseInputAdapter;
import org.signer.gui.logging.SimpleConsoleLogger;
import org.signer.gui.logging.SimpleDialogLogger;
import org.signer.gui.logging.SimpleLogger;
import org.signer.gui.models.CertificateModel;
import org.signer.gui.utils.GUIUtils;
import org.signer.domain.SignerProvider;
import org.signer.gui.swing.ZebraJList;
import static org.signer.ui.SigningAppStart.LIC_FILE_PATH;
import org.slf4j.LoggerFactory;
/**
*
* @author dcuentas
*/
public class LoginDialog extends javax.swing.JDialog implements SignerProvider {
static final org.slf4j.Logger logger = LoggerFactory.getLogger(LoginDialog.class);
private static int selectAliasTryCount = 2;
public static final String PROP_ALIAS = "alias";
private SimpleLogger userLogger;
private String alias;
private SignerSupport signerSupport;
private X509Certificate currentSelectedCertificate;
private final CertificateModel certificateListModel;
private java.awt.Frame parent;
private Action doLogingAction;
private transient final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
/**
* Add PropertyChangeListener.
*
* @param listener
*/
@Override
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}
/**
* Remove PropertyChangeListener.
*
* @param listener
*/
@Override
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(listener);
}
/**
* Creates new form LoginDialog
*
* @param parent
* @param modal
* @param signerSupport
* @param simpleLogger
*/
public LoginDialog(
java.awt.Frame parent,
boolean modal,
SignerSupport signerSupport,
SimpleLogger simpleLogger) {
super(parent, modal);
this.parent = parent;
initComponents();
initActions();
this.userLogger = simpleLogger;
setTitle("NOTSEL - INICIO DE SESIÓN");
logingMenuItem.setAction(doLogingAction);
certificateListModel = new CertificateModel(signerSupport);
aliasZebraList.setModel(certificateListModel);
aliasZebraList.addListSelectionListener(certificateListModel);
aliasZebraList.setComponentPopupMenu(mainPopupMenu);
aliasZebraList.setToolTipText("doble clic para iniciar");
bienvenido.setToolTipText("seleccione el certificado y haga doble clic para iniciar");
aliasZebraList.addMouseListener(new MouseInputAdapter() {
@Override
public void mouseClicked(MouseEvent mouseEvent) {
super.mouseClicked(mouseEvent); //To change body of generated methods, choose Tools | Templates.
// JList theList = (JList) mouseEvent.getSource();
if (mouseEvent.getClickCount() == 2) {
int selectedIndex = aliasZebraList.locationToIndex(mouseEvent.getPoint());
if (selectedIndex > -1) {
X509Certificate certificate
= certificateListModel.getCertificateList().get(selectedIndex);
certificateListModel.setSelectedSertificate(certificate);
doLogingAction.actionPerformed(null);
}
}
}
});
loginButton.setAction(doLogingAction);
BufferedImage img;
try {
img = ImageIO.read(LoginDialog.class.getResource("logo.png"));
ImageIcon icon = new ImageIcon(img);
JLabel label = new JLabel(icon);
logoPanel.add(label);
logoPanel.validate();
logoPanel.updateUI();
} catch (IOException ex) {
Logger.getLogger(LoginDialog.class.getName()).log(Level.SEVERE, null, ex);
}
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
super.windowClosing(we);
int exitOption = JOptionPane.showConfirmDialog(
we.getWindow(), "Está a punto de cerrar la aplicación, ¿Desea continuar?",
"Cerrando aplicación", JOptionPane.OK_CANCEL_OPTION);
if (exitOption == JOptionPane.OK_OPTION) {
System.exit(0);
}
}
});
GUIUtils.centerWithinScreen(this);
}
public LoginDialog(
java.awt.Frame parent,
boolean modal,
SignerSupport signerSupport) {
this(parent, modal, signerSupport, new SimpleConsoleLogger());
}
private void initActions() {
doLogingAction = new AbstractAction("Iniciar") {
@Override
public void actionPerformed(ActionEvent ae) {
doLoging();
}
};
}
public void doLoging() {
final X509Certificate selectedCert = certificateListModel.getSelectedCertificate();
if (selectedCert == null) {
userLogger.error("No ha seleccionado un entidad");
}
setAlias(certificateListModel.getSelectedAlias());
setX509Certificate(certificateListModel.getSelectedCertificate());
setVisible(false);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
mainPopupMenu = new javax.swing.JPopupMenu();
logingMenuItem = new javax.swing.JMenuItem();
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
aliasZebraList = new ZebraJList();
logoPanel = new javax.swing.JPanel();
bienvenido = new javax.swing.JLabel();
loginButton = new javax.swing.JButton();
logingMenuItem.setText("jMenuItem1");
mainPopupMenu.add(logingMenuItem);
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
);
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
setTitle("Login");
setAlwaysOnTop(true);
setModal(true);
setModalExclusionType(java.awt.Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
aliasZebraList.setModel(new javax.swing.AbstractListModel() {
String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
public int getSize() { return strings.length; }
public Object getElementAt(int i) { return strings[i]; }
});
aliasZebraList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
aliasZebraList.setToolTipText("");
jScrollPane1.setViewportView(aliasZebraList);
logoPanel.setLayout(new java.awt.GridLayout(1, 0));
bienvenido.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
bienvenido.setText("Bienvenido, seleccione su certificado");
loginButton.setText("login");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(bienvenido, javax.swing.GroupLayout.PREFERRED_SIZE, 255, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(logoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 255, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 316, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(loginButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(bienvenido)
.addGap(18, 18, 18)
.addComponent(logoPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 109, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(loginButton)
.addContainerGap())
);
pack();
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JList aliasZebraList;
private javax.swing.JLabel bienvenido;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JButton loginButton;
private javax.swing.JMenuItem logingMenuItem;
private javax.swing.JPanel logoPanel;
private javax.swing.JPopupMenu mainPopupMenu;
// End of variables declaration
@Override
public void setVisible(boolean bln) {
GUIUtils.centerWithinScreen(this);
super.setVisible(bln); //To change body of generated methods, choose Tools | Templates.
Container parent = getParent();
}
/**
* Get the value of alias
*
* @return the value of alias
*/
@Override
public String getAlias() {
if (alias == null) {
userLogger.warn("debe seleccionar un certificado para proceder");
alias = selectAlias();
}
return alias;
}
/**
* Set the value of alias
*
* @param alias new value of alias
*/
@Override
public void setAlias(String oldAlias) {
userLogger.log(SimpleLogger.LEVEL.DEBUG, "alias cambiado : " + oldAlias);
this.alias = oldAlias;
propertyChangeSupport.firePropertyChange(PROP_ALIAS, oldAlias, alias);
}
@Override
public String selectAlias() {
// LoginDialog loginDialog = getInstance();
// loginDialog.
setVisible(true);
userLogger.info("Usuario actual : " + alias);
return alias;
}
/**
* should reload list instead create a new instance
*
* @return
*/
public LoginDialog getInstance() {
return this;
// return new LoginDialog(
// parent,
// true,
// signerSupport,
// SimpleDialogLogger.getConfirmationalModalDialog());
}
/**
* Get the value of signerSupport
*
* @return the value of signerSupport
*/
@Override
public SignerSupport getSignerSupport() {
return signerSupport;
}
/**
* Set the value of signerSupport
*
* @param signerSupport new value of signerSupport
*/
@Override
public void setSignerSupport(SignerSupport signerSupport) {
this.signerSupport = signerSupport;
}
/**
*
* @return
*/
@Override
public X509Certificate getCertificate() {
return this.currentSelectedCertificate;
}
@Override
public void setX509Certificate(X509Certificate certificateX509) {
//TODO implement sing with certificate
this.currentSelectedCertificate = certificateX509;
userLogger.log(SimpleLogger.LEVEL.DEBUG, "certificado cambiado : " + certificateX509);
}
@Override
public List<X509Certificate> getCertificatesFileList() {
try {
return signerSupport.listCertificates();
} catch (KeyStoreException ex) {
Logger.getLogger(LoginDialog.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidNameException ex) {
Logger.getLogger(LoginDialog.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
/**
* TODO i'm soooo ugly kill me please
*/
public static LoginDialog signinSupportInstance;
// public static void setSigninSupportInstance(LoginDialog param){
// signinSupportInstance = param;
// }
// public statci LoginDialog getSigninSupportInstance(){
// return signinSupportInstance;
// }
@Override
public void propertyChange(PropertyChangeEvent pce) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}