From 3f54fc75c3cf1910d8e62903e099ac645e7c80d8 Mon Sep 17 00:00:00 2001 From: tkellner Date: Tue, 11 Mar 2014 23:32:51 +0000 Subject: Always regain exclusive access, even when pinGUI fails git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@1307 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4 --- .../at/gv/egiz/smcc/reader/PinpadCardReader.java | 72 ++++++++++++++-------- 1 file changed, 45 insertions(+), 27 deletions(-) (limited to 'smcc/src/main/java/at/gv/egiz/smcc/reader/PinpadCardReader.java') diff --git a/smcc/src/main/java/at/gv/egiz/smcc/reader/PinpadCardReader.java b/smcc/src/main/java/at/gv/egiz/smcc/reader/PinpadCardReader.java index 56d2233c..9a7206ec 100644 --- a/smcc/src/main/java/at/gv/egiz/smcc/reader/PinpadCardReader.java +++ b/smcc/src/main/java/at/gv/egiz/smcc/reader/PinpadCardReader.java @@ -596,22 +596,28 @@ public class PinpadCardReader extends DefaultCardReader { byte[] s = createPINVerifyStructure(apduSpec, pinSpec); Card icc = channel.getCard(); - boolean regain; if (VERIFY) { - regain = dropExclusive(icc); - pinGUI.enterPIN(pinSpec, retries); - resp = new ResponseAPDU(verifyPin(icc, s, pinGUI)); + boolean regain = dropExclusive(icc); + try { + pinGUI.enterPIN(pinSpec, retries); + resp = new ResponseAPDU(verifyPin(icc, s, pinGUI)); + } finally { + regainExclusive(icc, regain); + } } else if (VERIFY_DIRECT) { - regain = dropExclusive(icc); - pinGUI.enterPINDirect(pinSpec, retries); - log.debug("VERIFY_PIN_DIRECT [{}]", FEATURES[FEATURE_VERIFY_PIN_DIRECT]); - resp = new ResponseAPDU(VERIFY_PIN_DIRECT(icc, s)); + boolean regain = dropExclusive(icc); + try { + pinGUI.enterPINDirect(pinSpec, retries); + log.debug("VERIFY_PIN_DIRECT [{}]", FEATURES[FEATURE_VERIFY_PIN_DIRECT]); + resp = new ResponseAPDU(VERIFY_PIN_DIRECT(icc, s)); + } finally { + regainExclusive(icc, regain); + } } else { log.warn("Falling back to default pin-entry."); return super.verify(channel, apduSpec, pinGUI, pinSpec, retries); } - regainExclusive(icc, regain); switch (resp.getSW()) { case 0x6400: @@ -643,22 +649,28 @@ public class PinpadCardReader extends DefaultCardReader { byte[] s = createPINModifyStructure(apduSpec, pinSpec); Card icc = channel.getCard(); - boolean regain; if (MODIFY) { - regain = dropExclusive(icc); - pinGUI.enterCurrentPIN(pinSpec, retries); - resp = new ResponseAPDU(modifyPin(icc, s, pinGUI, pinSpec)); + boolean regain = dropExclusive(icc); + try { + pinGUI.enterCurrentPIN(pinSpec, retries); + resp = new ResponseAPDU(modifyPin(icc, s, pinGUI, pinSpec)); + } finally { + regainExclusive(icc, regain); + } } else if (MODIFY_DIRECT) { - regain = dropExclusive(icc); - pinGUI.modifyPINDirect(pinSpec, retries); - log.debug("MODIFY_PIN_DIRECT [{}]", FEATURES[FEATURE_MODIFY_PIN_DIRECT]); - resp = new ResponseAPDU(MODIFY_PIN_DIRECT(icc, s)); + boolean regain = dropExclusive(icc); + try { + pinGUI.modifyPINDirect(pinSpec, retries); + log.debug("MODIFY_PIN_DIRECT [{}]", FEATURES[FEATURE_MODIFY_PIN_DIRECT]); + resp = new ResponseAPDU(MODIFY_PIN_DIRECT(icc, s)); + } finally { + regainExclusive(icc, regain); + } } else { log.warn("Falling back to default pin-entry."); return super.modify(channel, apduSpec, pinGUI, pinSpec, retries); } - regainExclusive(icc, regain); switch (resp.getSW()) { case 0x6400: @@ -694,22 +706,28 @@ public class PinpadCardReader extends DefaultCardReader { byte[] s = createPINModifyStructure(apduSpec, pinSpec); Card icc = channel.getCard(); - boolean regain; if (MODIFY) { - regain = dropExclusive(icc); - pinGUI.enterNewPIN(pinSpec); - resp = new ResponseAPDU(modifyPin(icc, s, pinGUI, pinSpec)); + boolean regain = dropExclusive(icc); + try { + pinGUI.enterNewPIN(pinSpec); + resp = new ResponseAPDU(modifyPin(icc, s, pinGUI, pinSpec)); + } finally { + regainExclusive(icc, regain); + } } else if (MODIFY_DIRECT) { - regain = dropExclusive(icc); - pinGUI.modifyPINDirect(pinSpec, -1); - log.debug("MODIFY_PIN_DIRECT [{}]", FEATURES[FEATURE_MODIFY_PIN_DIRECT]); - resp = new ResponseAPDU(MODIFY_PIN_DIRECT(icc, s)); + boolean regain = dropExclusive(icc); + try { + pinGUI.modifyPINDirect(pinSpec, -1); + log.debug("MODIFY_PIN_DIRECT [{}]", FEATURES[FEATURE_MODIFY_PIN_DIRECT]); + resp = new ResponseAPDU(MODIFY_PIN_DIRECT(icc, s)); + } finally { + regainExclusive(icc, regain); + } } else { log.warn("Falling back to default pin-entry."); return super.modify(channel, apduSpec, pinGUI, pinSpec); } - regainExclusive(icc, regain); switch (resp.getSW()) { case 0x6400: -- cgit v1.2.3