package org.irmacard.cardmanagement; import java.awt.Color; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ResourceBundle; import javax.swing.ButtonModel; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.EmptyBorder; import net.sourceforge.scuba.smartcards.CardEvent; import net.sourceforge.scuba.smartcards.CardManager; import net.sourceforge.scuba.smartcards.CardServiceException; import net.sourceforge.scuba.smartcards.CardTerminalEvent; import net.sourceforge.scuba.smartcards.CardTerminalListener; import net.sourceforge.scuba.smartcards.TerminalCardService; import net.sourceforge.scuba.smartcards.TerminalFactoryListener; import org.irmacard.chvservice.CardHolderVerificationService; import org.irmacard.chvservice.IPinVerificationListener; import org.irmacard.idemix.IdemixService; public class WelcomeScreen extends JFrame implements CardTerminalListener, TerminalFactoryListener, IPinVerificationListener { private static final long serialVersionUID = -1120906824335303913L; private static final ResourceBundle BUNDLE = ResourceBundle.getBundle("org.irmacard.cardmanagement.messages"); //$NON-NLS-1$ private JPanel contentPane; private CardManager manager; private JLabel lblInfo; private JButton btnClose; private MainWindow mainWindow; /** * Launch the application. */ public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (InstantiationException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IllegalAccessException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (UnsupportedLookAndFeelException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } EventQueue.invokeLater(new Runnable() { public void run() { try { WelcomeScreen frame = new WelcomeScreen(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public WelcomeScreen() { setUndecorated(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 561, 306); contentPane = new JPanel(); contentPane.setBackground(new Color(0, 66, 137)); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); JLabel lblIrmaLogo = new JLabel(); lblIrmaLogo.setBounds(5, 5, 558, 305); /*lblIrmaLogo.addMouseListener(new MouseAdapter() { //TODO: Temporary solution for not detecting card insertion @Override public void mouseClicked(MouseEvent arg0) { try { CardTerminal terminal = TerminalFactory.getDefault().terminals().list().get(0); CardService service = new TerminalCardService(terminal); cardInserted(new CardEvent(CardEvent.INSERTED, service)); } catch (CardException e) { // TODO Auto-generated catch block e.printStackTrace(); } } });*/ contentPane.setLayout(null); lblIrmaLogo.setHorizontalAlignment(SwingConstants.CENTER); lblIrmaLogo.setIcon(new ImageIcon(WelcomeScreen.class.getResource("/img/PlaceCard.png"))); contentPane.add(lblIrmaLogo); lblInfo = new JLabel(BUNDLE.getString("WelcomeScreen.lblInfo.placeCard")); //$NON-NLS-1$ lblInfo.setBounds(5, 547, 804, 14); lblInfo.setVisible(false); lblInfo.setHorizontalAlignment(SwingConstants.CENTER); contentPane.add(lblInfo); btnClose = new CloseButton(); btnClose.setLocation(530, 11); btnClose.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { WindowEvent wev = new WindowEvent(WelcomeScreen.this, WindowEvent.WINDOW_CLOSING); Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev); } }); contentPane.add(btnClose); manager = CardManager.getInstance(); manager.addTerminalFactoryListener(this); manager.addCardTerminalListener(this); manager.startPolling(); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { manager.stopPolling(); } }); } public void cardInserted(CardEvent ce) { System.out.println("Card inserted"); TerminalCardService service = (TerminalCardService)ce.getService(); try { IdemixService idemix = new IdemixService(service); idemix.open(); CardHolderVerificationService chv = new CardHolderVerificationService(service); chv.addPinVerificationListener(this); int pinResponse; do { //pinResponse = chv.verifyPIN(); //TODO: ask for pin pinResponse = idemix.sendCardPin(new byte[]{0x30, 0x30, 0x30, 0x30, 0x30, 0x30}); } while(pinResponse > 0 && pinResponse != -1);//CardHolderVerificationService.PIN_OK); if(pinResponse == -1) {//CardHolderVerificationService.PIN_OK) { mainWindow = new MainWindow(ce.getService()); mainWindow.setVisible(true); setVisible(false); } else { //TODO No tries left } } catch (CardServiceException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { service.close(); } } public void cardRemoved(CardEvent ce) { System.out.println("Card removed"); showWelcomeScreen(); } public void cardTerminalAdded(CardTerminalEvent cte) { System.out.println("Terminal added"); } public void cardTerminalRemoved(CardTerminalEvent cte) { System.out.println("Terminal removed"); showWelcomeScreen(); } private void showWelcomeScreen() { if(mainWindow != null) { mainWindow.dispose(); setVisible(true); } } @Override public String userPinRequest(Integer nr_tries_left) { String pinText = "The server requests to authenticate your identity, enter PIN"; if(nr_tries_left != null) { pinText += " (" + nr_tries_left + " tries left):"; } else { pinText += ":"; } String pinString = ""; boolean valid = false; JPasswordField pinField = new JPasswordField(4); JLabel lab = new JLabel(pinText); JPanel panel = new JPanel(); panel.setLayout(new GridBagLayout()); GridBagConstraints cc = new GridBagConstraints(); cc.anchor = GridBagConstraints.WEST; cc.insets = new Insets(10, 10, 10, 10); cc.gridx = 0; cc.gridy = 0; panel.add(lab, cc); cc.gridy++; panel.add(pinField, cc); while (!valid) { // ask for pin, inform the user int result = JOptionPane.showConfirmDialog(null, panel, "PIN", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); pinString = new String(pinField.getPassword()); if (result != 0) { // User pressed cancel; lab.setText("<html><font color=\"red\">Please enter a pin</font><br />" + pinText + "</html>"); } else if (pinString.length() != 4) { lab.setText("<html><font color=\"red\">Pin should be 4 digits</font><br />" + pinText + "</html>"); } else { valid = true; } } return pinString; } @Override public void pinPadPinRequired(Integer nr_tries_left) { lblInfo.setText(BUNDLE.getString("WelcomeScreen.lblInfo.enterPin")); } @Override public void pinPadPinEntered() { lblInfo.setText(BUNDLE.getString("WelcomeScreen.lblInfo.placeCard")); } private class CloseButton extends JButton { private static final long serialVersionUID = 2887545853103440609L; private ImageIcon defaultIcon = new ImageIcon(WelcomeScreen.class.getResource("/img/closeButton/default.png")); private ImageIcon hoverIcon = new ImageIcon(WelcomeScreen.class.getResource("/img/closeButton/hover.png")); private ImageIcon pressIcon = new ImageIcon(WelcomeScreen.class.getResource("/img/closeButton/press.png")); public CloseButton() { super(); setSize(defaultIcon.getIconWidth(), defaultIcon.getIconHeight()); } @Override public void paint(Graphics g) { ButtonModel model = getModel(); if(model.isArmed() || model.isPressed()) { pressIcon.paintIcon(this, g, 0, 0); } else if(model.isRollover()) { hoverIcon.paintIcon(this, g, 0, 0); } else { defaultIcon.paintIcon(this, g, 0, 0); } } } }