diff options
| author | clemenso <clemenso@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4> | 2010-01-05 10:06:47 +0000 | 
|---|---|---|
| committer | clemenso <clemenso@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4> | 2010-01-05 10:06:47 +0000 | 
| commit | 3da4655d011dfc2f04f9e4ac28b38aee42d01bc0 (patch) | |
| tree | d9b524ca4ccfd6e48573dfecf5191ccba48278af /smccSTALExt/src/main/java/at | |
| parent | ecc11bdb13ae27385486ad1c944ee01ffd0440e7 (diff) | |
| download | mocca-3da4655d011dfc2f04f9e4ac28b38aee42d01bc0.tar.gz mocca-3da4655d011dfc2f04f9e4ac28b38aee42d01bc0.tar.bz2 mocca-3da4655d011dfc2f04f9e4ac28b38aee42d01bc0.zip | |
Features
[#437] Handle pinpad [64:03] response apdu correctly
[#445] pin entry feedback for VERIFY_PIN_START/FINISH
[#471] Provide SecureViewer Link before Pinpad PinEntry timeout starts
Bugs
[#479] PIN Managment Applet allows unmatching new pin and pin confirmation
[#480] PIN Management displays blocked PINs as ACTIVE
[#486] Not possible to select 3 times in series the same item from signedReferencesList for display in secureViewer
[#506] change pin dialog (gui) issues
[#508] e-card G3 PIN activation (with TransportPIN) not supported
[#509] closing secure viewer window (WINDOW_CLOSING) leaves "signature data is displayed in viewer" dialog in applet
git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@565 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4
Diffstat (limited to 'smccSTALExt/src/main/java/at')
4 files changed, 340 insertions, 293 deletions
| diff --git a/smccSTALExt/src/main/java/at/gv/egiz/bku/pin/gui/ManagementPINGUI.java b/smccSTALExt/src/main/java/at/gv/egiz/bku/pin/gui/ManagementPINGUI.java new file mode 100644 index 00000000..26a24609 --- /dev/null +++ b/smccSTALExt/src/main/java/at/gv/egiz/bku/pin/gui/ManagementPINGUI.java @@ -0,0 +1,88 @@ +/* + * 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.pin.gui; + +import at.gv.egiz.bku.gui.BKUGUIFacade; +import at.gv.egiz.bku.gui.PINManagementGUIFacade; +import at.gv.egiz.bku.gui.PINManagementGUIFacade.DIALOG; +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.PINSpec; +import at.gv.egiz.smcc.pin.gui.ModifyPINGUI; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class ManagementPINGUI extends ManagementPINProvider implements ModifyPINGUI { + +  protected static final Log log = LogFactory.getLog(ManagementPINGUI.class); + +  private boolean retry = false; + +  public ManagementPINGUI(PINManagementGUIFacade gui, DIALOG type) { +    super(gui, type); +  } + +  @Override +  public void modifyPINDirect(PINSpec spec, int retries) +          throws CancelledException, InterruptedException {     +    gui.showModifyPINDirect(type, spec, (retry) ? retries : -1); +    retry = true; +  } + +  @Override +  public void finishDirect() { +    gui.showMessageDialog(BKUGUIFacade.TITLE_WAIT, BKUGUIFacade.MESSAGE_WAIT); +  } + +  @Override +  public void enterCurrentPIN(PINSpec spec, int retries) { +    gui.showEnterCurrentPIN(type, spec, (retry) ? retries : -1); +    retry = true; +  } + +  @Override +  public void enterNewPIN(PINSpec spec) { +    gui.showEnterNewPIN(type, spec); +    retry = true; +  } + +  @Override +  public void confirmNewPIN(PINSpec spec) { +    gui.showConfirmNewPIN(type, spec); +    retry = true; +  } + + +  @Override +  public void validKeyPressed() { +    gui.validKeyPressed(); +  } + +  @Override +  public void correctionButtonPressed() { +    gui.correctionButtonPressed(); +  } + +  @Override +  public void allKeysCleared() { +    gui.allKeysCleared(); +  } + +  @Override +  public void finish() { +    gui.showMessageDialog(BKUGUIFacade.TITLE_WAIT, BKUGUIFacade.MESSAGE_WAIT); +  } +} diff --git a/smccSTALExt/src/main/java/at/gv/egiz/bku/pin/gui/ManagementPINProvider.java b/smccSTALExt/src/main/java/at/gv/egiz/bku/pin/gui/ManagementPINProvider.java new file mode 100644 index 00000000..8d842d13 --- /dev/null +++ b/smccSTALExt/src/main/java/at/gv/egiz/bku/pin/gui/ManagementPINProvider.java @@ -0,0 +1,89 @@ +/* + * 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.pin.gui; + +import at.gv.egiz.bku.gui.BKUGUIFacade; +import at.gv.egiz.bku.gui.PINManagementGUIFacade; +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.PINSpec; +import at.gv.egiz.smcc.pin.gui.ModifyPINProvider; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class ManagementPINProvider extends AbstractPINProvider implements ModifyPINProvider { + +  protected static final Log log = LogFactory.getLog(ManagementPINProvider.class); +  protected PINManagementGUIFacade gui; +  protected PINManagementGUIFacade.DIALOG type; +  private boolean retry = false; + +  public ManagementPINProvider(PINManagementGUIFacade gui, PINManagementGUIFacade.DIALOG type) { +    this.gui = gui; +    this.type = type; +  } + +  @Override +  public char[] provideCurrentPIN(PINSpec spec, int retries) +          throws CancelledException, InterruptedException { + +    gui.showPINDialog(type, spec, (retry) ? retries : -1, +            this, "change", +            this, "cancel"); + +    log.trace("[" + Thread.currentThread().getName() + "] wait for action"); +    waitForAction(); +    log.trace("[" + Thread.currentThread().getName() + "] received action " + action); + +    gui.showMessageDialog(BKUGUIFacade.TITLE_WAIT, +            BKUGUIFacade.MESSAGE_WAIT); + +    if ("cancel".equals(action)) { +      throw new CancelledException(spec.getLocalizedName() + +              " entry cancelled"); +    } +    retry = true; +    return gui.getOldPin(); +  } + +  @Override +  public char[] provideNewPIN(PINSpec spec) +          throws CancelledException, InterruptedException { +     +    char[] pin = gui.getPin(); +    if (pin != null) { +      // change pin dialog also returns new pin +      return pin; +    } + +    gui.showPINDialog(type, spec, -1, +            this, "activate", +            this, "cancel"); + +    log.trace("[" + Thread.currentThread().getName() + "] wait for action"); +    waitForAction(); +    log.trace("[" + Thread.currentThread().getName() + "] received action " + action); + +    gui.showMessageDialog(BKUGUIFacade.TITLE_WAIT, +              BKUGUIFacade.MESSAGE_WAIT); + +    if ("cancel".equals(action)) { +      throw new CancelledException(spec.getLocalizedName() + +              " entry cancelled"); +    } +    return gui.getPin(); +  } +} diff --git a/smccSTALExt/src/main/java/at/gv/egiz/bku/smccstal/ManagementPINProviderFactory.java b/smccSTALExt/src/main/java/at/gv/egiz/bku/smccstal/ManagementPINProviderFactory.java deleted file mode 100644 index 493733b8..00000000 --- a/smccSTALExt/src/main/java/at/gv/egiz/bku/smccstal/ManagementPINProviderFactory.java +++ /dev/null @@ -1,246 +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; - -import at.gv.egiz.bku.gui.BKUGUIFacade; -import at.gv.egiz.smcc.ChangePINProvider; -import at.gv.egiz.bku.gui.PINManagementGUIFacade; -import at.gv.egiz.bku.smccstal.AbstractPINProvider; -import at.gv.egiz.bku.smccstal.PINProviderFactory; -import at.gv.egiz.smcc.CancelledException; -import at.gv.egiz.smcc.ccid.CCID; -import at.gv.egiz.smcc.PINProvider; -import at.gv.egiz.smcc.PINSpec; -import at.gv.egiz.smcc.SignatureCard; - -/** - * - * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> - */ -public class ManagementPINProviderFactory extends PINProviderFactory { - -  public ManagementPINProviderFactory(CCID reader, PINManagementGUIFacade gui) { -    super(reader, gui); -  } -   -//  public static ManagementPINProviderFactory getInstance(SignatureCard forCard, -//          PINManagementGUIFacade gui) { -//    if (forCard.getReader().hasFeature(CCID.FEATURE_VERIFY_PIN_DIRECT)) { -//      return new PinpadPINProviderFactory(gui); -// -//    } else { -//      return new SoftwarePINProviderFactory(gui); -//    } -//  } - -  public PINProvider getVerifyPINProvider() { -    if (reader.hasFeature(CCID.FEATURE_VERIFY_PIN_START)) { -      return new PinpadGenericPinProvider(PINManagementGUIFacade.DIALOG.VERIFY); -    } else if (reader.hasFeature(CCID.FEATURE_VERIFY_PIN_DIRECT)) { -      return new PinpadGenericPinProvider(PINManagementGUIFacade.DIALOG.VERIFY); -    } else { -      return new SoftwareGenericPinProvider(PINManagementGUIFacade.DIALOG.VERIFY); -    } -  } - -  public PINProvider getActivatePINProvider() { -    if (reader.hasFeature(CCID.FEATURE_MODIFY_PIN_START)) { -      return new PinpadGenericPinProvider(PINManagementGUIFacade.DIALOG.ACTIVATE); -    } else if (reader.hasFeature(CCID.FEATURE_MODIFY_PIN_DIRECT)) { -      return new PinpadGenericPinProvider(PINManagementGUIFacade.DIALOG.ACTIVATE); -    } else { -      return new SoftwareGenericPinProvider(PINManagementGUIFacade.DIALOG.ACTIVATE); -    } -  } - -  public ChangePINProvider getChangePINProvider() { -    if (reader.hasFeature(CCID.FEATURE_MODIFY_PIN_START)) { -      return new PinpadGenericPinProvider(PINManagementGUIFacade.DIALOG.CHANGE); -    } else if (reader.hasFeature(CCID.FEATURE_MODIFY_PIN_DIRECT)) { -      return new PinpadGenericPinProvider(PINManagementGUIFacade.DIALOG.CHANGE); -    } else { -      return new ChangePinProvider(); -    } -  } - -  public PINProvider getUnblockPINProvider() { -    if (reader.hasFeature(CCID.FEATURE_VERIFY_PIN_START)) { -      return new PinpadGenericPinProvider(PINManagementGUIFacade.DIALOG.UNBLOCK); -    } else if (reader.hasFeature(CCID.FEATURE_VERIFY_PIN_DIRECT)) { -      return new PinpadGenericPinProvider(PINManagementGUIFacade.DIALOG.UNBLOCK); -    } else { -      return new SoftwareGenericPinProvider(PINManagementGUIFacade.DIALOG.UNBLOCK); -    } -  } - -  class PinpadGenericPinProvider extends AbstractPINProvider -          implements ChangePINProvider { - -    protected PINManagementGUIFacade.DIALOG type; - -    private PinpadGenericPinProvider(PINManagementGUIFacade.DIALOG type) { -      this.type = type; -    } - -    @Override -    public char[] providePIN(PINSpec spec, int retries) -            throws CancelledException, InterruptedException { - -      showPinpadPINDialog(retries, spec); -      retry = true; -      return null; -    } - -    /** -     * do not call this method without calling providePIN() -     * (no message is displayed) -     * @param spec -     * @param retries -     * @return -     */ -    @Override -    public char[] provideOldPIN(PINSpec spec, int retries) { -      return null; -    } - -    private void showPinpadPINDialog(int retries, PINSpec pinSpec) { -      String title, message; -      Object[] params; -      if (retry) { -        if (retries == 1) { -          message = BKUGUIFacade.MESSAGE_LAST_RETRY_PINPAD; -        } else { -          message = BKUGUIFacade.MESSAGE_RETRIES_PINPAD; -        } -        title = BKUGUIFacade.TITLE_RETRY; -        params = new Object[]{String.valueOf(retries)}; -      } else if (type == PINManagementGUIFacade.DIALOG.VERIFY) { -        title = PINManagementGUIFacade.TITLE_VERIFY_PIN; -        message = BKUGUIFacade.MESSAGE_ENTERPIN_PINPAD; -        params = new Object[]{pinSpec.getLocalizedName(), pinSpec.getLocalizedLength()}; -      } else if (type == PINManagementGUIFacade.DIALOG.ACTIVATE) { -        title = PINManagementGUIFacade.TITLE_ACTIVATE_PIN; -        message = PINManagementGUIFacade.MESSAGE_ACTIVATEPIN_PINPAD; -        params = new Object[]{pinSpec.getLocalizedName(), pinSpec.getLocalizedLength()}; -      } else if (type == PINManagementGUIFacade.DIALOG.CHANGE) { -        title = PINManagementGUIFacade.TITLE_CHANGE_PIN; -        message = PINManagementGUIFacade.MESSAGE_CHANGEPIN_PINPAD; -        params = new Object[]{pinSpec.getLocalizedName(), pinSpec.getLocalizedLength()}; -      } else { //if (type == DIALOG.UNBLOCK) { -        title = PINManagementGUIFacade.TITLE_UNBLOCK_PIN; -        message = PINManagementGUIFacade.MESSAGE_UNBLOCKPIN_PINPAD; -        params = new Object[]{pinSpec.getLocalizedName(), pinSpec.getLocalizedLength()}; -      } -      gui.showMessageDialog(title, message, params); -    } -  } - - -  class SoftwareGenericPinProvider extends AbstractPINProvider { - -//    protected PINManagementGUIFacade gui; -    protected PINManagementGUIFacade.DIALOG type; - -    private SoftwareGenericPinProvider(PINManagementGUIFacade.DIALOG type) { -      this.type = type; -    } - -    @Override -    public char[] providePIN(PINSpec spec, int retries) -            throws CancelledException, InterruptedException { - -      ((PINManagementGUIFacade) gui).showPINDialog(type, spec, -              (retry) ? retries : -1, -              this, "exec", -              this, "back"); - -      waitForAction(); - -      if ("exec".equals(action)) { -        gui.showMessageDialog(BKUGUIFacade.TITLE_WAIT, -                BKUGUIFacade.MESSAGE_WAIT); -        retry = true; -        return gui.getPin(); -      } else if ("back".equals(action)) { -        throw new CancelledException(); -      } else { -        log.error("unsupported command " + action); -        throw new CancelledException(); -      } -    } -  } - -  class ChangePinProvider extends AbstractPINProvider -          implements ChangePINProvider { - -//    protected PINManagementGUIFacade gui; - -    private char[] oldPin; -    private char[] newPin; - -    private ChangePinProvider() { -    } - -    @Override -    public char[] providePIN(PINSpec spec, int retries) -            throws CancelledException, InterruptedException { -      if (newPin == null) { -        getPINs(spec, retries); -      } -      char[] pin = newPin; -      newPin = null; -      return pin; -    } - -    @Override -    public char[] provideOldPIN(PINSpec spec, int retries) -            throws CancelledException, InterruptedException { -      if (oldPin == null) { -        getPINs(spec, retries); -      } -      char[] pin = oldPin; -      oldPin = null; -      return pin; -    } - -    private void getPINs(PINSpec spec, int retries) -            throws InterruptedException, CancelledException { - -      ((PINManagementGUIFacade) gui).showPINDialog( -              PINManagementGUIFacade.DIALOG.CHANGE, spec, -              (retry) ? retries : -1, -              this, "exec", -              this, "back"); - -      waitForAction(); - -      if ("exec".equals(action)) { -        gui.showMessageDialog(BKUGUIFacade.TITLE_WAIT, -                BKUGUIFacade.MESSAGE_WAIT); -        retry = true; -        oldPin = ((PINManagementGUIFacade) gui).getOldPin(); -        newPin = gui.getPin(); -      } else if ("back".equals(action)) { -        throw new CancelledException(); -      } else { -        log.error("unsupported command " + action); -        throw new CancelledException(); -      } -    } -  } -} diff --git a/smccSTALExt/src/main/java/at/gv/egiz/bku/smccstal/PINManagementRequestHandler.java b/smccSTALExt/src/main/java/at/gv/egiz/bku/smccstal/PINManagementRequestHandler.java index bfeb90b0..0d49afd0 100644 --- a/smccSTALExt/src/main/java/at/gv/egiz/bku/smccstal/PINManagementRequestHandler.java +++ b/smccSTALExt/src/main/java/at/gv/egiz/bku/smccstal/PINManagementRequestHandler.java @@ -23,9 +23,11 @@ import org.apache.commons.logging.Log;  import org.apache.commons.logging.LogFactory;  import at.gv.egiz.bku.gui.BKUGUIFacade; +import at.gv.egiz.bku.gui.PINManagementGUI;  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.bku.pin.gui.ManagementPINGUI; +import at.gv.egiz.bku.pin.gui.VerifyPINGUI;  import at.gv.egiz.smcc.CancelledException;  import at.gv.egiz.smcc.LockedException;  import at.gv.egiz.smcc.NotActivatedException; @@ -96,40 +98,15 @@ public class PINManagementRequestHandler extends AbstractRequestHandler {              throw new NullPointerException("no PIN selected for activation/change");            } -          ManagementPINProviderFactory ppfac = -                  new ManagementPINProviderFactory(card.getReader(), gui); -            try {              if ("activate_enterpin".equals(actionCommand)) { -              log.info("activate " + selectedPIN.getLocalizedName()); -              ((PINMgmtSignatureCard) card).activatePIN(selectedPIN, -                      ppfac.getActivatePINProvider()); -              updatePINState(selectedPIN, STATUS.ACTIV); -              gui.showMessageDialog(PINManagementGUIFacade.TITLE_ACTIVATE_SUCCESS, -                      PINManagementGUIFacade.MESSAGE_ACTIVATE_SUCCESS, -                      new Object[] {selectedPIN.getLocalizedName()}, -                      BKUGUIFacade.BUTTON_OK, this, "ok"); -              waitForAction(); +              activatePIN(selectedPIN);              } else if ("change_enterpin".equals(actionCommand)) { -              log.info("change " + selectedPIN.getLocalizedName()); -              ((PINMgmtSignatureCard) card).changePIN(selectedPIN,  -                      ppfac.getChangePINProvider()); -              updatePINState(selectedPIN, STATUS.ACTIV); -              gui.showMessageDialog(PINManagementGUIFacade.TITLE_CHANGE_SUCCESS, -                      PINManagementGUIFacade.MESSAGE_CHANGE_SUCCESS, -                      new Object[] {selectedPIN.getLocalizedName()}, -                      BKUGUIFacade.BUTTON_OK, this, "ok"); -              waitForAction(); - +              changePIN(selectedPIN);              } else if ("unblock_enterpuk".equals(actionCommand)) { -              log.info("unblock " + selectedPIN.getLocalizedName()); -              ((PINMgmtSignatureCard) card).unblockPIN(selectedPIN, -                      ppfac.getUnblockPINProvider()); +              unblockPIN(selectedPIN);              } else if ("verify_enterpin".equals(actionCommand)) { -              log.info("verify " + selectedPIN.getLocalizedName()); -              ((PINMgmtSignatureCard) card).verifyPIN(selectedPIN, -                      ppfac.getVerifyPINProvider()); -              updatePINState(selectedPIN, STATUS.ACTIV); +              verifyPIN(selectedPIN);              }            } catch (CancelledException ex) {              log.trace("cancelled"); @@ -154,29 +131,17 @@ public class PINManagementRequestHandler extends AbstractRequestHandler {                      new Object[] {selectedPIN.getLocalizedName()},                      this, null);              waitForAction(); -          } catch (PINConfirmationException ex) { -            log.error("confirmation pin does not match new " + selectedPIN.getLocalizedName()); -            gui.showErrorDialog(PINManagementGUIFacade.ERR_PIN_CONFIRMATION, -                    new Object[] {selectedPIN.getLocalizedName()}, -                    this, null); -            waitForAction(); + +            // inner loop for pinConfirmation and pinFormat ex +//          } catch (PINConfirmationException ex) { +//          } catch (PINFormatException ex) { +            } catch (PINOperationAbortedException ex) {              log.error("pin operation aborted without further details");              gui.showErrorDialog(PINManagementGUIFacade.ERR_PIN_OPERATION_ABORTED,                      new Object[] {selectedPIN.getLocalizedName()},                      this, null);              waitForAction(); -          } catch (PINFormatException ex) { -            log.error("wrong format of new " + selectedPIN.getLocalizedName()); -//            updatePINStatus(selectedPIN, STATUS.NOT_ACTIV); -            String pinSize = String.valueOf(selectedPIN.getMinLength()); -            if (selectedPIN.getMinLength() != selectedPIN.getMaxLength()) { -                pinSize += "-" + selectedPIN.getMaxLength(); -            } -            gui.showErrorDialog(PINManagementGUIFacade.ERR_PIN_FORMAT, -                    new Object[] {selectedPIN.getLocalizedName(), pinSize}, -                    this, null); -            waitForAction();            }          } // end if @@ -206,6 +171,157 @@ public class PINManagementRequestHandler extends AbstractRequestHandler {      }    } +  private void activatePIN(PINSpec selectedPIN) +          throws InterruptedException, SignatureCardException, GetPINStatusException { + +    log.info("activate " + selectedPIN.getLocalizedName()); +    ManagementPINGUI pinGUI = new ManagementPINGUI((PINManagementGUI) gui, +            PINManagementGUIFacade.DIALOG.ACTIVATE); + +    boolean reentry; +    do { +      try { +        reentry = false; +        ((PINMgmtSignatureCard) card).activatePIN(selectedPIN, pinGUI); +      } catch (PINConfirmationException ex) { +        reentry = true; +        log.error("confirmation pin does not match new " + selectedPIN.getLocalizedName()); +        gui.showErrorDialog(PINManagementGUIFacade.ERR_PIN_CONFIRMATION, +                new Object[] {selectedPIN.getLocalizedName()}, +                this, null); +        waitForAction(); +      } catch (PINFormatException ex) { +        reentry = true; +        log.error("wrong format of new " + selectedPIN.getLocalizedName()); +        String pinSize = String.valueOf(selectedPIN.getMinLength()); +        if (selectedPIN.getMinLength() != selectedPIN.getMaxLength()) { +            pinSize += "-" + selectedPIN.getMaxLength(); +        } +        gui.showErrorDialog(PINManagementGUIFacade.ERR_PIN_FORMAT, +                new Object[] {selectedPIN.getLocalizedName(), pinSize}, +                this, null); +        waitForAction(); +      } +    } while (reentry); + +    updatePINState(selectedPIN, STATUS.ACTIV); +    gui.showMessageDialog(PINManagementGUIFacade.TITLE_ACTIVATE_SUCCESS, +            PINManagementGUIFacade.MESSAGE_ACTIVATE_SUCCESS, +            new Object[]{selectedPIN.getLocalizedName()}, +            BKUGUIFacade.BUTTON_OK, this, "ok"); +    waitForAction(); +  } + +  private void verifyPIN(PINSpec selectedPIN) +          throws InterruptedException, SignatureCardException, GetPINStatusException { + +    log.info("verify " + selectedPIN.getLocalizedName()); +    VerifyPINGUI pinGUI = new VerifyPINGUI(gui); + +    boolean reentry; +    do { +      try { +        reentry = false; +        ((PINMgmtSignatureCard) card).verifyPIN(selectedPIN, pinGUI); +      } catch (PINFormatException ex) { +        reentry = true; +        log.error("wrong format of new " + selectedPIN.getLocalizedName()); +        String pinSize = String.valueOf(selectedPIN.getMinLength()); +        if (selectedPIN.getMinLength() != selectedPIN.getMaxLength()) { +            pinSize += "-" + selectedPIN.getMaxLength(); +        } +        gui.showErrorDialog(PINManagementGUIFacade.ERR_PIN_FORMAT, +                new Object[] {selectedPIN.getLocalizedName(), pinSize}, +                this, null); +        waitForAction(); +      } +    } while (reentry); + +    updatePINState(selectedPIN, STATUS.ACTIV); +  } + +  private void changePIN(PINSpec selectedPIN) +          throws SignatureCardException, GetPINStatusException, InterruptedException { + +    log.info("change " + selectedPIN.getLocalizedName()); +    ManagementPINGUI pinGUI = new ManagementPINGUI((PINManagementGUI) gui, +            PINManagementGUIFacade.DIALOG.CHANGE); + +    boolean reentry; +    do { +      try { +        reentry = false; +        ((PINMgmtSignatureCard) card).changePIN(selectedPIN, pinGUI); +      } catch (PINConfirmationException ex) { +        reentry = true; +        log.error("confirmation pin does not match new " + selectedPIN.getLocalizedName()); +        gui.showErrorDialog(PINManagementGUIFacade.ERR_PIN_CONFIRMATION, +                new Object[] {selectedPIN.getLocalizedName()}, +                this, null); +        waitForAction(); +      } catch (PINFormatException ex) { +        reentry = true; +        log.error("wrong format of new " + selectedPIN.getLocalizedName()); +        String pinSize = String.valueOf(selectedPIN.getMinLength()); +        if (selectedPIN.getMinLength() != selectedPIN.getMaxLength()) { +            pinSize += "-" + selectedPIN.getMaxLength(); +        } +        gui.showErrorDialog(PINManagementGUIFacade.ERR_PIN_FORMAT, +                new Object[] {selectedPIN.getLocalizedName(), pinSize}, +                this, null); +        waitForAction(); +      } +    } while (reentry); + +    updatePINState(selectedPIN, STATUS.ACTIV); +    gui.showMessageDialog(PINManagementGUIFacade.TITLE_CHANGE_SUCCESS, +            PINManagementGUIFacade.MESSAGE_CHANGE_SUCCESS, +            new Object[]{selectedPIN.getLocalizedName()}, +            BKUGUIFacade.BUTTON_OK, this, "ok"); +    waitForAction(); +  } + +  private void unblockPIN(PINSpec selectedPIN) +          throws SignatureCardException, GetPINStatusException, InterruptedException { + +    log.info("unblock " + selectedPIN.getLocalizedName()); +    ManagementPINGUI pinGUI = new ManagementPINGUI((PINManagementGUI) gui, +            PINManagementGUIFacade.DIALOG.UNBLOCK); + +    boolean reentry; +    do { +      try { +        reentry = false; +        ((PINMgmtSignatureCard) card).unblockPIN(selectedPIN, pinGUI); +      } catch (PINConfirmationException ex) { +        reentry = true; +        log.error("confirmation pin does not match new " + selectedPIN.getLocalizedName()); +        gui.showErrorDialog(PINManagementGUIFacade.ERR_PIN_CONFIRMATION, +                new Object[] {selectedPIN.getLocalizedName()}, +                this, null); +        waitForAction(); +      } catch (PINFormatException ex) { +        reentry = true; +        log.error("wrong format of new " + selectedPIN.getLocalizedName()); +        String pinSize = String.valueOf(selectedPIN.getMinLength()); +        if (selectedPIN.getMinLength() != selectedPIN.getMaxLength()) { +            pinSize += "-" + selectedPIN.getMaxLength(); +        } +        gui.showErrorDialog(PINManagementGUIFacade.ERR_PIN_FORMAT, +                new Object[] {selectedPIN.getLocalizedName(), pinSize}, +                this, null); +        waitForAction(); +      } +    } while (reentry); + +    updatePINState(selectedPIN, STATUS.ACTIV); +    gui.showMessageDialog(PINManagementGUIFacade.TITLE_UNBLOCK_SUCCESS, +            PINManagementGUIFacade.MESSAGE_UNBLOCK_SUCCESS, +            new Object[]{selectedPIN.getLocalizedName()}, +            BKUGUIFacade.BUTTON_OK, this, "ok"); +    waitForAction(); +  } +    @Override    public boolean requireCard() {      return true; | 
