diff options
| author | clemenso <clemenso@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4> | 2009-02-26 19:39:00 +0000 | 
|---|---|---|
| committer | clemenso <clemenso@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4> | 2009-02-26 19:39:00 +0000 | 
| commit | 6576428966f1e3d688269a407b072fb01f9f7647 (patch) | |
| tree | f79a9c3c70c27477133c9283dd4b0440b7559d05 /BKUAppletExt/src/main/java/at/gv | |
| parent | bd18d9084fd139aaae40ad8d525c1d0e626f2e5e (diff) | |
| download | mocca-6576428966f1e3d688269a407b072fb01f9f7647.tar.gz mocca-6576428966f1e3d688269a407b072fb01f9f7647.tar.bz2 mocca-6576428966f1e3d688269a407b072fb01f9f7647.zip | |
1.1 candidate (activation)
git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@309 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4
Diffstat (limited to 'BKUAppletExt/src/main/java/at/gv')
| -rw-r--r-- | BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINManagementGUI.java | 519 | ||||
| -rw-r--r-- | BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINManagementGUIFacade.java | 47 | ||||
| -rw-r--r-- | BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINSpecRenderer.java (renamed from BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINStatusProvider.java) | 15 | ||||
| -rw-r--r-- | BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINStatusRenderer.java | 63 | ||||
| -rw-r--r-- | BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINStatusTableModel.java | 60 | ||||
| -rw-r--r-- | BKUAppletExt/src/main/java/at/gv/egiz/bku/online/applet/PINManagementApplet.java | 3 | ||||
| -rw-r--r-- | BKUAppletExt/src/main/java/at/gv/egiz/bku/online/applet/PINManagementBKUWorker.java | 82 | ||||
| -rw-r--r-- | BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext/PINManagementRequestHandler.java | 331 | ||||
| -rw-r--r-- | BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext/PINMgmtRequestHandler.java | 93 | 
9 files changed, 1011 insertions, 202 deletions
| diff --git a/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINManagementGUI.java b/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINManagementGUI.java index 8acf051e..8eef8aea 100644 --- a/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINManagementGUI.java +++ b/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINManagementGUI.java @@ -17,15 +17,28 @@  package at.gv.egiz.bku.gui; +import at.gv.egiz.smcc.PINSpec;  import java.awt.Container; +import java.awt.Cursor; +import java.awt.event.ActionEvent;  import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionAdapter;  import java.net.URL; +import java.text.MessageFormat;  import java.util.Locale; +import java.util.Map;  import javax.swing.GroupLayout;  import javax.swing.JButton;  import javax.swing.JLabel; +import javax.swing.JPasswordField; +import javax.swing.JScrollPane; +import javax.swing.JTable;  import javax.swing.LayoutStyle; +import javax.swing.ListSelectionModel;  import javax.swing.SwingUtilities; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener;  /**   * TODO pull out ResourceBundle to common superclass for activationGUI and pinMgmtGUI @@ -33,9 +46,10 @@ import javax.swing.SwingUtilities;   */  public class PINManagementGUI extends ActivationGUI implements PINManagementGUIFacade { -  public static final String BUTTON_ACTIVATE = "button.activate"; -  public static final String BUTTON_UNBLOCK = "button.unblock"; -  public static final String BUTTON_CHANGE = "button.change"; +  /** remember the pinfield to return to worker */ +  protected JPasswordField oldPinField; +  /** remember the pinSpec to return to worker */ +  protected PINSpec pinSpec;    public PINManagementGUI(Container contentPane,            Locale locale, @@ -46,12 +60,31 @@ public class PINManagementGUI extends ActivationGUI implements PINManagementGUIF    }    @Override -  public void showPINManagementDialog(final PINStatusProvider pinStatusProvider, -          final ActionListener activateListener, final String activateCmd, -          final ActionListener changeListener, final String changeCmd, -          final ActionListener unblockListener, final String unblockCmd, -          final ActionListener cancelListener, final String cancelCmd) { -//    try { +  public char[] getOldPin() { +    if (oldPinField != null) { +      char[] pin = oldPinField.getPassword(); +      oldPinField = null; +      return pin; +    } +    return null; +  } + +  @Override +  public PINSpec getSelectedPIN() { +    return pinSpec; +  } + +  @Override +  public void showPINManagementDialog(final Map<PINSpec, STATUS> pins,  +          final ActionListener activateListener, +          final String activateCmd, +          final String changeCmd, +          final String unblockCmd, +          final ActionListener cancelListener, +          final String cancelCmd) { + +      log.debug("scheduling PIN managment dialog"); +            SwingUtilities.invokeLater(new Runnable() {          @Override @@ -68,13 +101,76 @@ public class PINManagementGUI extends ActivationGUI implements PINManagementGUIF                  if (renderHeaderPanel) {                    titleLabel.setText(cardmgmtMessages.getString(TITLE_PINMGMT)); -                  mgmtLabel.setText(cardmgmtMessages.getString(MESSAGE_PINMGMT)); +                  String infoPattern = cardmgmtMessages.getString(MESSAGE_PINMGMT); +                  mgmtLabel.setText(MessageFormat.format(infoPattern, pins.size()));                  } else {                    mgmtLabel.setText(cardmgmtMessages.getString(TITLE_PINMGMT));                  } +                final PINStatusTableModel tableModel = new PINStatusTableModel(pins); +                final JTable pinStatusTable = new JTable(tableModel); +                pinStatusTable.setDefaultRenderer(PINSpec.class, new PINSpecRenderer()); +                pinStatusTable.setDefaultRenderer(STATUS.class, new PINStatusRenderer(cardmgmtMessages)); +                pinStatusTable.setTableHeader(null); -                 +                pinStatusTable.addMouseMotionListener(new MouseMotionAdapter() { + +                  @Override +                  public void mouseMoved(MouseEvent e) { +                    if (pinStatusTable.columnAtPoint(e.getPoint()) == 0) { +                      pinStatusTable.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); +                    } else { +                      pinStatusTable.setCursor(Cursor.getDefaultCursor()); +                    } +                  } +                }); + +                final JButton activateButton = new JButton(); +                activateButton.setFont(activateButton.getFont().deriveFont(activateButton.getFont().getStyle() & ~java.awt.Font.BOLD)); +                activateButton.addActionListener(activateListener); + +                pinStatusTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); +                pinStatusTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { + +                  @Override +                  public void valueChanged(final ListSelectionEvent e) { +                    //invoke later to allow thread to paint selection background +                    SwingUtilities.invokeLater(new Runnable() { + +                      @Override +                      public void run() { +                        ListSelectionModel lsm = (ListSelectionModel) e.getSource(); +                        int selectionIdx = lsm.getMinSelectionIndex(); +                        if (selectionIdx >= 0) { +                          pinSpec = (PINSpec) tableModel.getValueAt(selectionIdx, 0); +                          STATUS status = (STATUS) tableModel.getValueAt(selectionIdx, 1); + +                          if (status == STATUS.NOT_ACTIV) { +                            activateButton.setText(cardmgmtMessages.getString(BUTTON_ACTIVATE)); +                            activateButton.setEnabled(true); +                            activateButton.setActionCommand(activateCmd); +                          } else if (status == STATUS.BLOCKED) { +                            activateButton.setText(cardmgmtMessages.getString(BUTTON_UNBLOCK)); +                            activateButton.setEnabled(true); +                            activateButton.setActionCommand(unblockCmd); +                          } else if (status == STATUS.ACTIV) { +                            activateButton.setText(cardmgmtMessages.getString(BUTTON_CHANGE)); +                            activateButton.setEnabled(true); +                            activateButton.setActionCommand(changeCmd); +                          } else { +                            activateButton.setText(cardmgmtMessages.getString(BUTTON_ACTIVATE)); +                            activateButton.setEnabled(false); +                          } +                        } +                      } +                    }); +                  } +                }); + +                //select first entry +                pinStatusTable.getSelectionModel().setSelectionInterval(0, 0); + +                JScrollPane pinStatusScrollPane = new JScrollPane(pinStatusTable);                  GroupLayout mainPanelLayout = new GroupLayout(mainPanel);                  mainPanel.setLayout(mainPanelLayout); @@ -91,30 +187,16 @@ public class PINManagementGUI extends ActivationGUI implements PINManagementGUIF                            .addComponent(helpLabel);                  } -                mainPanelLayout.setHorizontalGroup(messageHorizontal); -                mainPanelLayout.setVerticalGroup(messageVertical); +                mainPanelLayout.setHorizontalGroup( +                mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                  .addGroup(messageHorizontal) +                  .addComponent(pinStatusScrollPane, 0, 0, Short.MAX_VALUE)); - -                JButton activateButton = new JButton(); -                activateButton.setFont(activateButton.getFont().deriveFont(activateButton.getFont().getStyle() & ~java.awt.Font.BOLD)); -                activateButton.setText(cardmgmtMessages.getString(BUTTON_ACTIVATE)); -                activateButton.setEnabled(true);//false); -                activateButton.setActionCommand(activateCmd); -                activateButton.addActionListener(activateListener); - -                JButton changeButton = new JButton(); -                changeButton.setFont(activateButton.getFont().deriveFont(activateButton.getFont().getStyle() & ~java.awt.Font.BOLD)); -                changeButton.setText(cardmgmtMessages.getString(BUTTON_CHANGE)); -                changeButton.setEnabled(false); -                changeButton.setActionCommand(changeCmd); -                changeButton.addActionListener(changeListener); - -                JButton unblockButton = new JButton(); -                unblockButton.setFont(activateButton.getFont().deriveFont(activateButton.getFont().getStyle() & ~java.awt.Font.BOLD)); -                unblockButton.setText(cardmgmtMessages.getString(BUTTON_UNBLOCK)); -                unblockButton.setEnabled(false); -                unblockButton.setActionCommand(unblockCmd); -                unblockButton.addActionListener(unblockListener); +                mainPanelLayout.setVerticalGroup( +                  mainPanelLayout.createSequentialGroup() +                    .addGroup(messageVertical) +                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                    .addComponent(pinStatusScrollPane, 0, 0, pinStatusTable.getPreferredSize().height+3));                  JButton cancelButton = new JButton();                  cancelButton.setFont(cancelButton.getFont().deriveFont(cancelButton.getFont().getStyle() & ~java.awt.Font.BOLD)); @@ -129,30 +211,377 @@ public class PINManagementGUI extends ActivationGUI implements PINManagementGUIF                          .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)                          .addComponent(activateButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) -                        .addComponent(changeButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE) -                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) -                        .addComponent(unblockButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE) -                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)                          .addComponent(cancelButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE);                  GroupLayout.Group buttonVertical = buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)                            .addComponent(activateButton) -                          .addComponent(changeButton) -                          .addComponent(unblockButton)                            .addComponent(cancelButton);                  buttonPanelLayout.setHorizontalGroup(buttonHorizontal);                  buttonPanelLayout.setVerticalGroup(buttonVertical);                  contentPanel.validate(); -          }        }); +  } + +  @Override +  public void showActivatePINDialog(final PINSpec pin, +          final ActionListener okListener, final String okCommand, +          final ActionListener cancelListener, final String cancelCommand) { +    log.debug("scheduling activate pin dialog"); +    showPINDialog(false, pin, okListener, okCommand, cancelListener, cancelCommand); +  } + + +  private void showPINDialog(final boolean changePin, final PINSpec pinSpec, +          final ActionListener okListener, final String okCommand, +          final ActionListener cancelListener, final String cancelCommand) { + +      SwingUtilities.invokeLater(new Runnable() { + +            @Override +            public void run() { + +              String HELP_TOPIC, TITLE, MESSAGE_MGMT; +              if (changePin) { +                log.debug("show change pin dialog"); +                HELP_TOPIC = HELP_PINMGMT; +                TITLE = TITLE_CHANGE_PIN; +                MESSAGE_MGMT = MESSAGE_CHANGE_PIN; +              } else { +                log.debug("show activate pin dialog"); +                HELP_TOPIC = HELP_PINMGMT; +                TITLE = TITLE_ACTIVATE_PIN; +                MESSAGE_MGMT = MESSAGE_ACTIVATE_PIN; +                oldPinField = null; +              } + +                mainPanel.removeAll(); +                buttonPanel.removeAll(); + +                helpListener.setHelpTopic(HELP_TOPIC); + +                JLabel mgmtLabel = new JLabel(); +                mgmtLabel.setFont(mgmtLabel.getFont().deriveFont(mgmtLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); + +                if (renderHeaderPanel) { +                  titleLabel.setText(cardmgmtMessages.getString(TITLE)); +                  String mgmtPattern = cardmgmtMessages.getString(MESSAGE_MGMT); +                  if (shortText) { +                    mgmtLabel.setText(MessageFormat.format(mgmtPattern, "PIN")); +                  } else { +                    mgmtLabel.setText(MessageFormat.format(mgmtPattern, pinSpec.getLocalizedName())); +                  } +                } else { +                  mgmtLabel.setText(cardmgmtMessages.getString(TITLE)); +                } + +                JButton okButton = new JButton(); +                okButton.setFont(okButton.getFont().deriveFont(okButton.getFont().getStyle() & ~java.awt.Font.BOLD)); +                okButton.setText(messages.getString(BUTTON_OK)); +                okButton.setEnabled(false); +                okButton.setActionCommand(okCommand); +                okButton.addActionListener(okListener); + +                JLabel pinLabel = new JLabel(); +                pinLabel.setFont(pinLabel.getFont().deriveFont(pinLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); +                String pinLabelPattern = (changePin) ? cardmgmtMessages.getString(LABEL_NEW_PIN) : messages.getString(LABEL_PIN); +                pinLabel.setText(MessageFormat.format(pinLabelPattern, new Object[]{pinSpec.getLocalizedName()})); + +                final JPasswordField repeatPinField = new JPasswordField(); +                pinField = new JPasswordField(); +                pinField.setText(""); +                pinField.setDocument(new PINDocument(pinSpec, null)); +                pinField.setActionCommand(okCommand); +                pinField.addActionListener(new ActionListener() { + +                    @Override +                    public void actionPerformed(ActionEvent e) { +                        if (pinField.getPassword().length >= pinSpec.getMinLength()) { +                          repeatPinField.requestFocusInWindow(); +                        } +                    } +                }); +                JLabel repeatPinLabel = new JLabel(); +                repeatPinLabel.setFont(pinLabel.getFont()); +                String repeatPinLabelPattern = cardmgmtMessages.getString(LABEL_REPEAT_PIN); +                repeatPinLabel.setText(MessageFormat.format(repeatPinLabelPattern, new Object[]{pinSpec.getLocalizedName()})); + +                repeatPinField.setText(""); +                repeatPinField.setDocument(new PINDocument(pinSpec, okButton, pinField.getDocument())); +                repeatPinField.setActionCommand(okCommand); +                repeatPinField.addActionListener(new ActionListener() { + +                    @Override +                    public void actionPerformed(ActionEvent e) { +                        if (pinField.getPassword().length >= pinSpec.getMinLength()) { +                            okListener.actionPerformed(e); +                        } +                    } +                }); + +                JLabel oldPinLabel = null; +                if (changePin) { +                  oldPinLabel = new JLabel(); +                  oldPinLabel.setFont(oldPinLabel.getFont().deriveFont(oldPinLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); +                  String oldPinLabelPattern = cardmgmtMessages.getString(LABEL_OLD_PIN); +                  oldPinLabel.setText(MessageFormat.format(oldPinLabelPattern, new Object[]{pinSpec.getLocalizedName()})); + +                  oldPinField = new JPasswordField(); +                  oldPinField.setText(""); +                  oldPinField.setDocument(new PINDocument(pinSpec, null)); +                  oldPinField.setActionCommand(okCommand); +                  oldPinField.addActionListener(new ActionListener() { + +                      @Override +                      public void actionPerformed(ActionEvent e) { +                          if (oldPinField.getPassword().length >= pinSpec.getMinLength()) { +                            pinField.requestFocusInWindow(); +                          } +                      } +                  }); +                } +                 +                JLabel pinsizeLabel = new JLabel(); +                pinsizeLabel.setFont(pinsizeLabel.getFont().deriveFont(pinsizeLabel.getFont().getStyle() & ~java.awt.Font.BOLD, pinsizeLabel.getFont().getSize()-2)); +                String pinsizePattern = messages.getString(LABEL_PINSIZE); +                String pinSize = String.valueOf(pinSpec.getMinLength()); +                if (pinSpec.getMinLength() != pinSpec.getMaxLength()) { +                    pinSize += "-" + pinSpec.getMaxLength(); +                } +                pinsizeLabel.setText(MessageFormat.format(pinsizePattern, new Object[]{pinSize})); + +                GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +                mainPanel.setLayout(mainPanelLayout); + +                GroupLayout.SequentialGroup infoHorizontal = mainPanelLayout.createSequentialGroup() +                          .addComponent(mgmtLabel); +                GroupLayout.ParallelGroup infoVertical = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                          .addComponent(mgmtLabel); + +                if (!renderHeaderPanel) { +                  infoHorizontal +                          .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, 0, Short.MAX_VALUE) +                          .addComponent(helpLabel); +                  infoVertical +                          .addComponent(helpLabel); +                } -//    } catch (Exception ex) { -//      log.error(ex.getMessage(), ex); -//      showErrorDialog(ERR_UNKNOWN_WITH_PARAM, new Object[] {ex.getMessage()}); -//    } +                GroupLayout.ParallelGroup pinHorizontal = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING); +                GroupLayout.SequentialGroup pinVertical = mainPanelLayout.createSequentialGroup(); + +                if (pinLabelPos == PinLabelPosition.ABOVE) { +                  if (changePin) { +                    pinHorizontal +                            .addComponent(oldPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +                            .addComponent(oldPinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE); +                    pinVertical +                            .addComponent(oldPinLabel) +                            .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                            .addComponent(oldPinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +                            .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED); +                  } +                  pinHorizontal  +                          .addComponent(pinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +                          .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                          .addComponent(repeatPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +                          .addComponent(repeatPinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                          .addGroup(mainPanelLayout.createSequentialGroup() +                            .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, 0, Short.MAX_VALUE) +                            .addComponent(pinsizeLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)); +                  pinVertical +                          .addComponent(pinLabel) +                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                          .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                          .addComponent(repeatPinLabel) +                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                          .addComponent(repeatPinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                          .addComponent(pinsizeLabel); +                } else { +                  if (changePin) { +                    pinHorizontal +                          .addGroup(mainPanelLayout.createSequentialGroup() +                            .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                              .addComponent(oldPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +                              .addComponent(pinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +                              .addComponent(repeatPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) +                            .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                            .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                              .addComponent(oldPinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                              .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                              .addComponent(repeatPinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))); + +                    pinVertical +                          .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) +                            .addComponent(oldPinLabel) +                            .addComponent(oldPinField)) +                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED); +                  } else { +                    pinHorizontal +                          .addGroup(mainPanelLayout.createSequentialGroup() +                            .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                              .addComponent(pinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +                              .addComponent(repeatPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) +                            .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                            .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                              .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                              .addComponent(repeatPinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))); + +                  } +                  pinHorizontal +                          .addGroup(mainPanelLayout.createSequentialGroup() +                            .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, 0, Short.MAX_VALUE) +                            .addComponent(pinsizeLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)); +                  pinVertical +                          .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) +                            .addComponent(pinLabel) +                            .addComponent(pinField)) +                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                          .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) +                            .addComponent(repeatPinLabel) +                            .addComponent(repeatPinField)) +                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                          .addComponent(pinsizeLabel); +                } + +                mainPanelLayout.setHorizontalGroup( +                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                    .addGroup(infoHorizontal) +                    .addGroup(pinHorizontal)); + +                mainPanelLayout.setVerticalGroup( +                  mainPanelLayout.createSequentialGroup() +                    .addGroup(infoVertical) +                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                    .addGroup(pinVertical)); + +                GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +                buttonPanel.setLayout(buttonPanelLayout); + +                GroupLayout.SequentialGroup buttonHorizontal = buttonPanelLayout.createSequentialGroup() +                        .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                        .addComponent(okButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE); +                GroupLayout.Group buttonVertical; + +                JButton cancelButton = new JButton(); +                cancelButton.setFont(cancelButton.getFont().deriveFont(cancelButton.getFont().getStyle() & ~java.awt.Font.BOLD)); +                cancelButton.setText(messages.getString(BUTTON_CANCEL)); +                cancelButton.setActionCommand(cancelCommand); +                cancelButton.addActionListener(cancelListener); + +                buttonHorizontal +                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                        .addComponent(cancelButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE); +                buttonVertical = buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) +                        .addComponent(okButton) +                        .addComponent(cancelButton); + +                buttonPanelLayout.setHorizontalGroup(buttonHorizontal); +                buttonPanelLayout.setVerticalGroup(buttonVertical); + +                if (oldPinField != null) { +                  oldPinField.requestFocusInWindow(); +                } else { +                  pinField.requestFocusInWindow(); +                } +                contentPanel.validate(); + +            } +        }); +  } + +  @Override +  public void showChangePINDialog(final PINSpec pin, +          final ActionListener okListener, final String okCommand, +          final ActionListener cancelListener, final String cancelCommand) { +     +      log.debug("scheduling change pin dialog"); +      showPINDialog(true, pin, okListener, okCommand, cancelListener, cancelCommand); +  } + +  @Override +  public void showUnblockPINDialog(final PINSpec pin, +          final ActionListener okListener, final String okCommand, +          final ActionListener cancelListener, final String cancelCommand) { + +      log.debug("scheduling unblock PIN dialog"); + +      SwingUtilities.invokeLater(new Runnable() { + +          @Override +            public void run() { + +                log.debug("show unblock PIN dialog"); + +                log.error("unblock pin not supported"); + +                mainPanel.removeAll(); +                buttonPanel.removeAll(); + +                if (renderHeaderPanel) { +                  titleLabel.setText(messages.getString(TITLE_ERROR)); +                } + +                helpListener.setHelpTopic(HELP_PINMGMT); + +                String errorMsgPattern = cardmgmtMessages.getString(ERR_UNBLOCK); +                String errorMsg = MessageFormat.format(errorMsgPattern, pin.getLocalizedName()); + +                JLabel errorMsgLabel = new JLabel(); +                errorMsgLabel.setFont(errorMsgLabel.getFont().deriveFont(errorMsgLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); +                errorMsgLabel.setText(errorMsg); + +                GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +                mainPanel.setLayout(mainPanelLayout); + +                GroupLayout.ParallelGroup mainHorizontal = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING); +                GroupLayout.SequentialGroup mainVertical = mainPanelLayout.createSequentialGroup(); + +                if (!renderHeaderPanel) { +                  JLabel errorTitleLabel = new JLabel(); +                  errorTitleLabel.setFont(errorTitleLabel.getFont().deriveFont(errorTitleLabel.getFont().getStyle() | java.awt.Font.BOLD)); +                  errorTitleLabel.setText(messages.getString(TITLE_ERROR)); +                  errorTitleLabel.setForeground(ERROR_COLOR); + +                  mainHorizontal +                          .addGroup(mainPanelLayout.createSequentialGroup() +                            .addComponent(errorTitleLabel) +                            .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, 0, Short.MAX_VALUE) +                            .addComponent(helpLabel)); +                  mainVertical +                          .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                            .addComponent(errorTitleLabel) +                            .addComponent(helpLabel)); +                } + +                mainPanelLayout.setHorizontalGroup(mainHorizontal +                        .addComponent(errorMsgLabel)); +                mainPanelLayout.setVerticalGroup(mainVertical +                        .addComponent(errorMsgLabel)); + +                JButton okButton = new JButton(); +                okButton.setFont(okButton.getFont().deriveFont(okButton.getFont().getStyle() & ~java.awt.Font.BOLD)); +                okButton.setText(messages.getString(BUTTON_OK)); +                okButton.setActionCommand(cancelCommand); +                okButton.addActionListener(cancelListener); + +                GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +                buttonPanel.setLayout(buttonPanelLayout); + +                buttonPanelLayout.setHorizontalGroup( +                  buttonPanelLayout.createSequentialGroup() +                        .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                        .addComponent(okButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)); +                buttonPanelLayout.setVerticalGroup( +                  buttonPanelLayout.createSequentialGroup() +                    .addComponent(okButton)); + +                contentPanel.validate(); +            } +        });    } diff --git a/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINManagementGUIFacade.java b/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINManagementGUIFacade.java index 3d653fab..2a8f28d2 100644 --- a/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINManagementGUIFacade.java +++ b/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINManagementGUIFacade.java @@ -17,7 +17,9 @@  package at.gv.egiz.bku.gui; +import at.gv.egiz.smcc.PINSpec;  import java.awt.event.ActionListener; +import java.util.Map;  /**   * @@ -27,8 +29,49 @@ public interface PINManagementGUIFacade extends BKUGUIFacade {    public static final String HELP_PINMGMT = "help.pin.mgmt";    public static final String TITLE_PINMGMT = "title.pin.mgmt"; +  public static final String TITLE_ACTIVATE_PIN = "title.activate.pin"; +  public static final String TITLE_CHANGE_PIN = "title.change.pin"; +  public static final String TITLE_UNBLOCK_PIN = "title.unblock.pin";    public static final String MESSAGE_PINMGMT = "message.pin.mgmt"; -   -  public void showPINManagementDialog(PINStatusProvider pinStatusProvider, ActionListener activateListener, String activateCmd, ActionListener changeListener, String changeCmd, ActionListener unblockListener, String unblockCmd, ActionListener cancelListener, String cancelCmd); +  public static final String MESSAGE_ACTIVATE_PIN = "message.activate.pin"; +  public static final String MESSAGE_CHANGE_PIN = "message.change.pin"; +  public static final String MESSAGE_UNBLOCK_PIN = "message.unblock.pin"; +  public static final String LABEL_OLD_PIN = "label.old.pin"; +  public static final String LABEL_NEW_PIN = "label.new.pin"; +  public static final String LABEL_REPEAT_PIN = "label.repeat.pin"; +  public static final String ERR_ACTIVATE = "err.activate"; +  public static final String ERR_CHANGE = "err.change"; +  public static final String ERR_UNBLOCK = "err.unblock"; + +  public static final String BUTTON_ACTIVATE = "button.activate"; +  public static final String BUTTON_UNBLOCK = "button.unblock"; +  public static final String BUTTON_CHANGE = "button.change"; + +  public static final String STATUS_ACTIVE = "status.active"; +  public static final String STATUS_BLOCKED = "status.blocked"; +  public static final String STATUS_NOT_ACTIVE = "status.not.active"; +  public static final String STATUS_UNKNOWN = "status.unknown"; + +  public enum STATUS { ACTIV, NOT_ACTIV, BLOCKED, UNKNOWN }; + +  public void showPINManagementDialog(Map<PINSpec, STATUS> pins, +          ActionListener activateListener, String activateCmd, String changeCmd, String unblockCmd, +          ActionListener cancelListener, String cancelCmd); + +  public void showActivatePINDialog(PINSpec pin, +          ActionListener okListener, String okCmd, +          ActionListener cancelListener, String cancelCmd); + +  public void showChangePINDialog(PINSpec pin, +          ActionListener okListener, String okCmd, +          ActionListener cancelListener, String cancelCmd); + +  public void showUnblockPINDialog(PINSpec pin, +          ActionListener okListener, String okCmd, +          ActionListener cancelListener, String cancelCmd); + +  public char[] getOldPin(); + +  public PINSpec getSelectedPIN();  } diff --git a/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINStatusProvider.java b/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINSpecRenderer.java index 73fa0920..e3d73e1f 100644 --- a/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINStatusProvider.java +++ b/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINSpecRenderer.java @@ -17,16 +17,23 @@  package at.gv.egiz.bku.gui; -import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.smcc.PINSpec; +import javax.swing.table.DefaultTableCellRenderer; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory;  /**   *   * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>   */ -public interface PINStatusProvider { +public class PINSpecRenderer extends DefaultTableCellRenderer { -  public enum STATUS { ACTIV, NOT_ACTIV, BLOCKED }; +  private static final Log log = LogFactory.getLog(PINSpecRenderer.class); -  public STATUS getPINStatus(int pin) throws SignatureCardException; +  @Override +  protected void setValue(Object value) { +    PINSpec pinSpec = (PINSpec) value; +    super.setText(pinSpec.getLocalizedName()); +  }  } diff --git a/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINStatusRenderer.java b/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINStatusRenderer.java new file mode 100644 index 00000000..2f8852ff --- /dev/null +++ b/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINStatusRenderer.java @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Federal Chancellery Austria and + * Graz University of Technology + *  + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *  + *     http://www.apache.org/licenses/LICENSE-2.0 + *  + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package at.gv.egiz.bku.gui; + +import at.gv.egiz.bku.gui.PINManagementGUIFacade.STATUS; +import java.awt.Color; +import java.awt.Font; +import java.util.ResourceBundle; +import javax.swing.table.DefaultTableCellRenderer; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public class PINStatusRenderer extends DefaultTableCellRenderer { +   +  private static final Log log = LogFactory.getLog(PINStatusRenderer.class); + +  public static final Color RED = new Color(0.9f, 0.0f, 0.0f); +  public static final Color GREEN = new Color(0.0f, 0.8f, 0.0f); +  protected ResourceBundle messages; + +  public PINStatusRenderer(ResourceBundle messages) { +    this.messages = messages; +  } + +  @Override +  protected void setValue(Object value) { +    STATUS pinStatus = (STATUS) value; +    super.setFont(super.getFont().deriveFont(super.getFont().getStyle() | Font.BOLD)); +       +    if (pinStatus == STATUS.NOT_ACTIV) { +      super.setForeground(RED); +      super.setText("<html>" + messages.getString(PINManagementGUIFacade.STATUS_NOT_ACTIVE) + "</html>"); +    } else if (pinStatus == STATUS.ACTIV) { +      super.setForeground(GREEN); +      super.setText("<html>" + messages.getString(PINManagementGUIFacade.STATUS_ACTIVE) + "</html>"); +    } else if (pinStatus == STATUS.BLOCKED) { +      super.setForeground(RED); +      super.setText("<html>" + messages.getString(PINManagementGUIFacade.STATUS_BLOCKED) + "</html>"); +    } else { +      super.setForeground(Color.BLACK); +      super.setText("<html>" + messages.getString(PINManagementGUIFacade.STATUS_UNKNOWN) + "</html>"); +    } +  } +} diff --git a/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINStatusTableModel.java b/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINStatusTableModel.java new file mode 100644 index 00000000..feaa5072 --- /dev/null +++ b/BKUAppletExt/src/main/java/at/gv/egiz/bku/gui/PINStatusTableModel.java @@ -0,0 +1,60 @@ +/* + * Copyright 2008 Federal Chancellery Austria and + * Graz University of Technology + *  + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *  + *     http://www.apache.org/licenses/LICENSE-2.0 + *  + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package at.gv.egiz.bku.gui; + +import at.gv.egiz.bku.gui.PINManagementGUIFacade.STATUS; +import at.gv.egiz.smcc.PINSpec; +import java.util.Map; +import javax.swing.table.DefaultTableModel; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public class PINStatusTableModel extends DefaultTableModel { + +  protected static final Log log = LogFactory.getLog(PINStatusTableModel.class); +  protected Class[] types; + +  public PINStatusTableModel(Map<PINSpec, STATUS> pinStatuses) { +    super(0, 2); +    if (pinStatuses == null) { +      throw new RuntimeException("pinStatuses must not be null"); +    } +    log.trace(pinStatuses.size() + " PINs"); +    types = new Class[] { PINSpec.class, STATUS.class }; +    for (PINSpec pinSpec : pinStatuses.keySet()) { +      addRow(new Object[] { pinSpec, pinStatuses.get(pinSpec) }); +    } +//    PINSpec activePIN = new PINSpec(0, 1, null, "active-PIN", (byte) 0x01); +//    PINSpec blockedPIN = new PINSpec(0, 1, null, "blocked-PIN", (byte) 0x01); +//    addRow(new Object[] { activePIN, PINStatusProvider.STATUS.ACTIV }); +//    addRow(new Object[] { blockedPIN, PINStatusProvider.STATUS.BLOCKED }); +  } + +  @Override +  public Class getColumnClass(int columnIndex) { +    return types[columnIndex]; +  } + +  @Override +  public boolean isCellEditable(int rowIndex, int columnIndex) { +    return false; +  } +} diff --git a/BKUAppletExt/src/main/java/at/gv/egiz/bku/online/applet/PINManagementApplet.java b/BKUAppletExt/src/main/java/at/gv/egiz/bku/online/applet/PINManagementApplet.java index 72d06618..d948ac03 100644 --- a/BKUAppletExt/src/main/java/at/gv/egiz/bku/online/applet/PINManagementApplet.java +++ b/BKUAppletExt/src/main/java/at/gv/egiz/bku/online/applet/PINManagementApplet.java @@ -19,6 +19,7 @@ package at.gv.egiz.bku.online.applet;  import at.gv.egiz.bku.gui.AbstractHelpListener;  import at.gv.egiz.bku.gui.BKUGUIFacade;  import at.gv.egiz.bku.gui.PINManagementGUI; +import at.gv.egiz.bku.gui.PINManagementGUIFacade;  import java.awt.Container;  import java.net.URL;  import java.util.Locale; @@ -45,6 +46,6 @@ public class PINManagementApplet extends BKUApplet {    @Override    protected AppletBKUWorker createBKUWorker(BKUApplet applet, BKUGUIFacade gui) { -    return new PINManagementBKUWorker(applet, gui); +    return new PINManagementBKUWorker(applet, (PINManagementGUIFacade) gui);    }  } diff --git a/BKUAppletExt/src/main/java/at/gv/egiz/bku/online/applet/PINManagementBKUWorker.java b/BKUAppletExt/src/main/java/at/gv/egiz/bku/online/applet/PINManagementBKUWorker.java index e65d98ca..ffd83e42 100644 --- a/BKUAppletExt/src/main/java/at/gv/egiz/bku/online/applet/PINManagementBKUWorker.java +++ b/BKUAppletExt/src/main/java/at/gv/egiz/bku/online/applet/PINManagementBKUWorker.java @@ -18,35 +18,28 @@ package at.gv.egiz.bku.online.applet;  import at.gv.egiz.bku.gui.BKUGUIFacade;  import at.gv.egiz.bku.gui.PINManagementGUIFacade; -import at.gv.egiz.bku.smccstal.ext.PINMgmtRequestHandler; +import at.gv.egiz.bku.smccstal.ext.PINManagementRequestHandler; +import at.gv.egiz.stal.ErrorResponse;  import at.gv.egiz.stal.STALResponse; -import at.gv.egiz.stal.ext.ActivatePINRequest; -import at.gv.egiz.stal.ext.ChangePINRequest; -import at.gv.egiz.stal.ext.UnblockPINRequest; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.Collection; +import at.gv.egiz.stal.ext.PINManagementRequest; +import at.gv.egiz.stal.ext.PINManagementResponse;  import java.util.Collections;  import java.util.List;  import java.util.logging.Level;  import java.util.logging.Logger;  /** - * + * This BKU Worker does not connect to STAL webservice + * (no Internet connection permitted while activating PINs). + *    * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>   */  public class PINManagementBKUWorker extends AppletBKUWorker { -  protected PINMgmtRequestHandler handler = new PINMgmtRequestHandler(); -  protected PINManagementActionListener listener = new PINManagementActionListener(); - -  public PINManagementBKUWorker(BKUApplet applet, BKUGUIFacade gui) { +  public PINManagementBKUWorker(BKUApplet applet, PINManagementGUIFacade gui) {      super(applet, gui);      handlerMap.clear(); -//    PINMgmtRequestHandler handler = new PINMgmtRequestHandler(); -//    addRequestHandler(ActivatePINRequest.class, handler); -//    addRequestHandler(ChangePINRequest.class, handler); -//    addRequestHandler(UnblockPINRequest.class, handler); +    addRequestHandler(PINManagementRequest.class, new PINManagementRequestHandler());    }    @Override @@ -54,22 +47,24 @@ public class PINManagementBKUWorker extends AppletBKUWorker {      gui.showWelcomeDialog();      try { - -      if (waitForCard()) { -        gui.showErrorDialog("no card, canceled PIN mgmt dialog", null); +      List<STALResponse> responses = handleRequest(Collections.singletonList(new PINManagementRequest())); + +      if (responses.size() == 1) { +        STALResponse response = responses.get(0); +        if (response instanceof PINManagementResponse) { +          log.debug("PIN management dialog finished"); +        } else if (response instanceof ErrorResponse) { +          showErrorDialog(BKUGUIFacade.ERR_UNKNOWN, null); +        } else { +          throw new RuntimeException("Invalid STAL response: " + response.getClass().getName()); +        } +      } else { +        throw new RuntimeException("invalid number of STAL responses: " + responses.size());        } -      actionCommandList.clear(); -      actionCommandList.add("cancel"); - -      ((PINManagementGUIFacade) gui).showPINManagementDialog(handler, -              listener, "activate", -              listener, "change", -              listener, "unblock", -              this, "cancel"); - -      waitForAction(); - +    } catch (RuntimeException ex) { +      log.error("unexpected error: " + ex.getMessage(), ex); +      showErrorDialog(BKUGUIFacade.ERR_UNKNOWN, null);      } catch (Exception ex) {        log.error(ex.getMessage(), ex);        showErrorDialog(BKUGUIFacade.ERR_UNKNOWN_WITH_PARAM, ex); @@ -82,31 +77,4 @@ public class PINManagementBKUWorker extends AppletBKUWorker {      applet.sendRedirect(sessionId);    } -  protected class PINManagementActionListener implements ActionListener { - -    @Override -    public void actionPerformed(ActionEvent e) { -      try { -        String cmd = e.getActionCommand(); -        if ("activate".equals(cmd)) { -          //create STAL request, call handle(req) -          ActivatePINRequest stalReq = new ActivatePINRequest(); -          STALResponse stalResp = handler.handleRequest(stalReq); -          gui.showErrorDialog(BKUGUIFacade.ERR_UNKNOWN_WITH_PARAM, new Object[]{"debug"}, this, "back"); -        } else if ("change".equals(cmd)) { -        } else if ("unblock".equals(cmd)) { -        } else if ("back".equals(cmd)) { - -          ((PINManagementGUIFacade) gui).showPINManagementDialog(handler, -                  this, "activate", -                  this, "change", -                  this, "unblock", -                  PINManagementBKUWorker.this, "cancel"); - -        } -      } catch (InterruptedException ex) { -        log.fatal(ex); -      } -    }    } -} diff --git a/BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext/PINManagementRequestHandler.java b/BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext/PINManagementRequestHandler.java new file mode 100644 index 00000000..fcef3191 --- /dev/null +++ b/BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext/PINManagementRequestHandler.java @@ -0,0 +1,331 @@ +/* + * Copyright 2008 Federal Chancellery Austria and + * Graz University of Technology + *  + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *  + *     http://www.apache.org/licenses/LICENSE-2.0 + *  + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package at.gv.egiz.bku.smccstal.ext; + +import at.gv.egiz.bku.gui.BKUGUIFacade; +import at.gv.egiz.bku.gui.PINManagementGUIFacade; +import at.gv.egiz.bku.gui.PINManagementGUIFacade.STATUS; +import at.gv.egiz.bku.smccstal.AbstractRequestHandler; +import at.gv.egiz.smcc.PINSpec; +import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.smcc.util.SMCCHelper; +import at.gv.egiz.stal.ErrorResponse; +import at.gv.egiz.stal.STALRequest; +import at.gv.egiz.stal.STALResponse; +import at.gv.egiz.stal.ext.PINManagementRequest; +import at.gv.egiz.stal.ext.PINManagementResponse; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.smartcardio.Card; +import javax.smartcardio.CardChannel; +import javax.smartcardio.CardException; +import javax.smartcardio.CommandAPDU; +import javax.smartcardio.ResponseAPDU; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public class PINManagementRequestHandler extends AbstractRequestHandler { + +  public static final String ERR_NOPIN_SELECTED = "err.no.pin.selected"; +  protected static final Log log = LogFactory.getLog(PINManagementRequestHandler.class); + +//  protected ResourceBundle messages; + +//  public PINManagementRequestHandler(ResourceBundle messages) { +//    this.messages = messages; +//  } +  @Override +  public STALResponse handleRequest(STALRequest request) throws InterruptedException { +    if (request instanceof PINManagementRequest) { + +      PINManagementGUIFacade gui = (PINManagementGUIFacade) this.gui; + +      showPINManagementDialog(gui); + +      while (true) { + +        waitForAction(); + +        if ("cancel".equals(actionCommand)) { +          return new PINManagementResponse(); +        } else if ("back".equals(actionCommand)) { +          showPINManagementDialog(gui); +        } else { +          PINSpec selectedPIN = gui.getSelectedPIN(); + +          if (selectedPIN == null) { +            throw new RuntimeException("no PIN selected for activation/change"); +          } + +          if ("activate_enterpin".equals(actionCommand)) { +            gui.showActivatePINDialog(selectedPIN, this, "activate", this, "back"); +          } else if ("change_enterpin".equals(actionCommand)) { +            gui.showChangePINDialog(selectedPIN, this, "change", this, "back"); +          } else if ("unblock_enterpuk".equals(actionCommand)) { +            gui.showUnblockPINDialog(selectedPIN, this, "unblock", this, "back"); +          } else if ("activate".equals(actionCommand)) { +            try { +              byte[] pin = encodePIN(gui.getPin()); +              activatePIN(selectedPIN.getKID(), selectedPIN.getContextAID(), pin); +              showPINManagementDialog(gui); +            } catch (SignatureCardException ex) { +              log.error("failed to activate " + selectedPIN.getLocalizedName() + ": " + ex.getMessage()); +              gui.showErrorDialog(PINManagementGUIFacade.ERR_ACTIVATE,  +                      new Object[] {selectedPIN.getLocalizedName()}, +                      this, "cancel"); +            } +          } else if ("change".equals(actionCommand)) { +            try { +              byte[] oldPin = encodePIN(gui.getOldPin()); //new byte[]{(byte) 0x25, (byte) 0x40, (byte) 0x01}; +              byte[] pin = encodePIN(gui.getPin()); //new byte[]{(byte) 0x25, (byte) 0x40}; +              changePIN(selectedPIN.getKID(), selectedPIN.getContextAID(), oldPin, pin); +              showPINManagementDialog(gui); +            } catch (SignatureCardException ex) { +              log.error("failed to change " + selectedPIN.getLocalizedName() + ": " + ex.getMessage()); +              gui.showErrorDialog(PINManagementGUIFacade.ERR_CHANGE,  +                      new Object[] {selectedPIN.getLocalizedName()}, +                      this, "cancel"); +            } +          } else if ("unblock".equals(actionCommand)) { +            log.error("unblock PIN not implemented"); +            gui.showErrorDialog(PINManagementGUIFacade.ERR_UNBLOCK, null, this, "cancel"); +          } else { +            throw new RuntimeException("unsupported action " + actionCommand); +          } +        } +      } +    } else { +      log.error("Got unexpected STAL request: " + request); +      return new ErrorResponse(1000); +    } +  } + +  @Override +  public boolean requireCard() { +    return true; +  } + +  /** +   * pin.length < 4bit +   * @param kid +   * @param contextAID +   * @param pin +   * @throws at.gv.egiz.smcc.SignatureCardException +   */ +  private void activatePIN(byte kid, byte[] contextAID, byte[] pin) throws SignatureCardException { +    try { +      Card icc = card.getCard(); +      icc.beginExclusive(); +      CardChannel channel = icc.getBasicChannel(); + +      if (contextAID != null) { +        CommandAPDU selectAPDU = new CommandAPDU(0x00, 0xa4, 0x04, 0x0c, contextAID); +        ResponseAPDU responseAPDU = channel.transmit(selectAPDU); +        if (responseAPDU.getSW() != 0x9000) { +          String msg = "Failed to activate PIN " + SMCCHelper.toString(new byte[]{kid}) + +                  ": Failed to select AID " + SMCCHelper.toString(contextAID) + +                  ": " + SMCCHelper.toString(responseAPDU.getBytes()); +          log.error(msg); +          throw new SignatureCardException(msg); +        } +      } + +      if (pin.length > 7) { +        log.error("Invalid PIN"); +        throw new SignatureCardException("Invalid PIN"); +      } +      byte length = (byte) (0x20 | pin.length * 2); + +      byte[] apdu = new byte[]{ +        (byte) 0x00, (byte) 0x24, (byte) 0x01, kid, (byte) 0x08, +        (byte) length, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF}; +      for (int i = 0; i < pin.length; i++) { +        apdu[i + 6] = pin[i]; +      } + +      CommandAPDU verifyAPDU = new CommandAPDU(apdu); +      ResponseAPDU responseAPDU = channel.transmit(verifyAPDU); + +      if (responseAPDU.getSW() != 0x9000) { +        String msg = "Failed to activate PIN " + SMCCHelper.toString(new byte[]{kid}) + ": " + SMCCHelper.toString(responseAPDU.getBytes()); +        log.error(msg); +        throw new SignatureCardException(msg); +      } + + +      icc.endExclusive(); + + +    } catch (CardException ex) { +      log.error("Failed to get PIN status: " + ex.getMessage()); +      throw new SignatureCardException("Failed to get PIN status", ex); +    } +  } + +  private void changePIN(byte kid, byte[] contextAID, byte[] oldPIN, byte[] newPIN) throws SignatureCardException { +    try { +      Card icc = card.getCard(); +      icc.beginExclusive(); +      CardChannel channel = icc.getBasicChannel(); + +      if (contextAID != null) { +        CommandAPDU selectAPDU = new CommandAPDU(0x00, 0xa4, 0x04, 0x0c, contextAID); +        ResponseAPDU responseAPDU = channel.transmit(selectAPDU); +        if (responseAPDU.getSW() != 0x9000) { +          String msg = "Failed to change PIN " + SMCCHelper.toString(new byte[]{kid}) + +                  ": Failed to select AID " + SMCCHelper.toString(contextAID) + +                  ": " + SMCCHelper.toString(responseAPDU.getBytes()); +          log.error(msg); +          throw new SignatureCardException(msg); +        } +      } + +      if (oldPIN.length > 7 || newPIN.length > 7) { +        log.error("Invalid PIN"); +        throw new SignatureCardException("Invalid PIN"); +      } +      byte oldLength = (byte) (0x20 | oldPIN.length * 2); +      byte newLength = (byte) (0x20 | newPIN.length * 2); + +      byte[] apdu = new byte[]{ +        (byte) 0x00, (byte) 0x24, (byte) 0x00, kid, (byte) 0x10, +        oldLength, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, +        newLength, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF}; +      for (int i = 0; i < oldPIN.length; i++) { +        apdu[i + 6] = oldPIN[i]; +      } +      for (int i = 0; i < newPIN.length; i++) { +        apdu[i + 14] = newPIN[i]; +      } + +      CommandAPDU verifyAPDU = new CommandAPDU(apdu); +      ResponseAPDU responseAPDU = channel.transmit(verifyAPDU); + +      if (responseAPDU.getSW() != 0x9000) { +        String msg = "Failed to change PIN " + SMCCHelper.toString(new byte[]{kid}) + ": " + SMCCHelper.toString(responseAPDU.getBytes()); +        log.error(msg); +        throw new SignatureCardException(msg); +      } + + +      icc.endExclusive(); + + +    } catch (CardException ex) { +      log.error("Failed to get PIN status: " + ex.getMessage()); +      throw new SignatureCardException("Failed to get PIN status", ex); +    } +  } + +  public Map<PINSpec, STATUS> getPINStatuses() throws SignatureCardException { +    try { +      Card icc = card.getCard(); +      icc.beginExclusive(); +      CardChannel channel = icc.getBasicChannel(); + +      HashMap<PINSpec, STATUS> pinStatuses = new HashMap<PINSpec, STATUS>(); +      List<PINSpec> pins = card.getPINSpecs(); + +      //select DF_SichereSignatur 00 A4 04 0C 08 D0 40 00 00 17 00 12 01 +//      CommandAPDU selectAPDU = new CommandAPDU(new byte[]{(byte) 0x00, (byte) 0xa4, (byte) 0x04, (byte) 0x0c, (byte) 0x08, +//                (byte) 0xd0, (byte) 0x40, (byte) 0x00, (byte) 0x00, (byte) 0x17, (byte) 0x00, (byte) 0x12, (byte) 0x01}); +//      ResponseAPDU rAPDU = channel.transmit(selectAPDU); +//      log.debug("SELECT FILE DF_SichereSignatur: " + SMCCHelper.toString(rAPDU.getBytes())); + +      //select DF_SIG DF 70 +//      CommandAPDU selectAPDU = new CommandAPDU(new byte[]{(byte) 0x00, (byte) 0xa4, (byte) 0x00, (byte) 0x0c, (byte) 0x02, +//                (byte) 0xdf, (byte) 0x70 }); +//      ResponseAPDU rAPDU = channel.transmit(selectAPDU); +//      log.debug("SELECT FILE DF_SIG: " + SMCCHelper.toString(rAPDU.getBytes())); + +      //select DF_DEC DF 71 +//      CommandAPDU selectAPDU = new CommandAPDU(new byte[]{(byte) 0x00, (byte) 0xa4, (byte) 0x04, (byte) 0x0c, (byte) 0x08, +//                (byte) 0xd0, (byte) 0x40, (byte) 0x00, (byte) 0x00, (byte) 0x17, (byte) 0x00, (byte) 0x12, (byte) 0x01}); +//      ResponseAPDU rAPDU = channel.transmit(selectAPDU); +//      log.debug("SELECT FILE DF_SichereSignatur: " + SMCCHelper.toString(rAPDU.getBytes())); + +      for (PINSpec pinSpec : pins) { +        byte kid = pinSpec.getKID(); +        byte[] contextAID = pinSpec.getContextAID(); + +        if (contextAID != null) { +          CommandAPDU selectAPDU = new CommandAPDU(0x00, 0xa4, 0x04, 0x0c, contextAID); +          ResponseAPDU responseAPDU = channel.transmit(selectAPDU); +          if (responseAPDU.getSW() != 0x9000) { +            String msg = "Failed to activate PIN " + SMCCHelper.toString(new byte[]{kid}) + +                    ": Failed to select AID " + SMCCHelper.toString(contextAID) + +                    ": " + SMCCHelper.toString(responseAPDU.getBytes()); +            log.error(msg); +            throw new SignatureCardException(msg); +          } +        } + +        CommandAPDU verifyAPDU = new CommandAPDU(new byte[]{(byte) 0x00, (byte) 0x20, (byte) 00, kid}); +        ResponseAPDU responseAPDU = channel.transmit(verifyAPDU); + +        STATUS status = STATUS.UNKNOWN; +        if (responseAPDU.getSW() == 0x6984) { +          status = STATUS.NOT_ACTIV; +        } else if (responseAPDU.getSW() == 0x63c0) { +          status = STATUS.BLOCKED; +        } else if (responseAPDU.getSW1() == 0x63) { +          status = STATUS.ACTIV; +        } +        if (log.isDebugEnabled()) { +          log.debug("PIN " + pinSpec.getLocalizedName() + " status: " + SMCCHelper.toString(responseAPDU.getBytes())); +        } + +        pinStatuses.put(pinSpec, status); +      } +      icc.endExclusive(); + +      return pinStatuses; + +    } catch (CardException ex) { +      log.error("Failed to get PIN status: " + ex.getMessage()); +      throw new SignatureCardException("Failed to get PIN status", ex); +    } +  } + +  private byte[] encodePIN(char[] pinChars) { +    int length = (int) Math.ceil(pinChars.length/2); +    byte[] pin = new byte[length]; +    for (int i = 0; i < length; i++) { +      pin[i] = (byte) (16*Character.digit(pinChars[i*2], 16) + Character.digit(pinChars[i*2+1], 16)); +    } +    log.trace("***** "  + SMCCHelper.toString(pin) + " ******"); +    return pin; +  } + +  private void showPINManagementDialog(PINManagementGUIFacade gui) { +    try { +      Map<PINSpec, STATUS> pins = getPINStatuses(); +      gui.showPINManagementDialog(pins,  +              this, "activate_enterpin", "change_enterpin", "unblock_enterpuk", +              this, "cancel"); +    } catch (SignatureCardException ex) { +      gui.showErrorDialog(BKUGUIFacade.ERR_UNKNOWN_WITH_PARAM,  +              new Object[]{"FAILED TO GET PIN STATUSES: " + ex.getMessage()}, +              this, "cancel"); +    } +  } +} diff --git a/BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext/PINMgmtRequestHandler.java b/BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext/PINMgmtRequestHandler.java deleted file mode 100644 index b2d34ff2..00000000 --- a/BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext/PINMgmtRequestHandler.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2008 Federal Chancellery Austria and - * Graz University of Technology - *  - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *  - *     http://www.apache.org/licenses/LICENSE-2.0 - *  - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package at.gv.egiz.bku.smccstal.ext; - -import at.gv.egiz.bku.gui.PINStatusProvider; -import at.gv.egiz.bku.smccstal.AbstractRequestHandler; -import at.gv.egiz.smcc.SignatureCardException; -import at.gv.egiz.stal.ErrorResponse; -import at.gv.egiz.stal.STALRequest; -import at.gv.egiz.stal.STALResponse; -import at.gv.egiz.stal.ext.ActivatePINRequest; -import at.gv.egiz.stal.ext.ChangePINRequest; -import at.gv.egiz.stal.ext.UnblockPINRequest; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.smartcardio.Card; -import javax.smartcardio.CardChannel; -import javax.smartcardio.CardException; -import javax.smartcardio.CommandAPDU; -import javax.smartcardio.ResponseAPDU; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * - * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> - */ -public class PINMgmtRequestHandler extends AbstractRequestHandler implements PINStatusProvider { - -  protected static final Log log = LogFactory.getLog(PINMgmtRequestHandler.class); - -  @Override -  public STALResponse handleRequest(STALRequest request) throws InterruptedException { -    if (request instanceof ActivatePINRequest) { -      log.error("not implemented yet"); -      return new ErrorResponse(1000); - -    } else if (request instanceof ChangePINRequest) { -      log.error("not implemented yet"); -      return new ErrorResponse(1000); - -    } else if (request instanceof UnblockPINRequest) { -      log.error("not implemented yet"); -      return new ErrorResponse(1000); - -    } else { -      log.error("Got unexpected STAL request: " + request); -      return new ErrorResponse(1000); -    } -  } - -  @Override -  public boolean requireCard() { -    return true; -  } - -  @Override -  public STATUS getPINStatus(int pin) throws SignatureCardException { -    try { -      Card icc = card.getCard(); -      icc.beginExclusive(); -      CardChannel channel = icc.getBasicChannel(); -      CommandAPDU verifyAPDU = new CommandAPDU(new byte[] {(byte) 0x00} ); -      ResponseAPDU responseAPDU = channel.transmit(verifyAPDU); -      byte sw1 = (byte) responseAPDU.getSW1(); -      byte[] sw = new byte[] { -                (byte) (0xFF & responseAPDU.getSW1()), -                (byte) (0xFF & responseAPDU.getSW2()) }; - -      icc.endExclusive(); -      return STATUS.ACTIV; -    } catch (CardException ex) { -      log.error("Failed to get PIN status: " + ex.getMessage()); -      throw new SignatureCardException("Failed to get PIN status", ex); -    } -  } - -} | 
