diff --git a/pace-gui/src/pace-gui.py b/pace-gui/src/pace-gui.py
index 11c7e5b..7c17042 100644
--- a/pace-gui/src/pace-gui.py
+++ b/pace-gui/src/pace-gui.py
@@ -271,11 +271,21 @@ class CVCWindow(MokoWindow):
for right in self.access_rights:
if not right.is_active():
idx = right.idx
- self.chat_array[len(self.chat) - 1 - idx / 8] ^= (1 << (idx % 8))
+ self.rel_auth[len(self.chat) - 1 - idx / 8] ^= (1 << (idx % 8))
#super(CVCWindow, self).btnForward_clicked(widget, data)
self.hide()
- PinpadGTK()
+ newCHAT = self.__formatHexString(self.rel_auth)
+ PinpadGTK("pin", newCHAT)
+
+ def __formatHexString(self, int_list):
+ hex_str = ""
+ for i in int_list:
+ c = hex(i)[2:]
+ if len(c) == 1: c = "0" + c
+ hex_str += c + ":"
+
+ return hex_str[:-1]
class customCheckButton(object):
"""This class provides a custom version of gtk.CheckButton.
@@ -308,12 +318,24 @@ class customCheckButton(object):
class PinpadGTK:
"""This a simple GTK based GUI to enter a PIN"""
- def __init__(self):
+ def __init__(self, secret="pin", chat=None, cert=None):
btn_names = ["btnOne", "btnTwo", "btnThree", "btnFour", "btnFive",
"btnSix", "btnSeven", "btnEight", "btnNine", "btnDel",
"btnZero", "btnOk"]
self.pin = ""
+ self.secret = secret
+ if self.secret == "pin" or self.secret == "can":
+ self.secret_len = 6
+ elif self.secret == "transport":
+ self.secret_len = 5
+ elif self.secret == "puk":
+ self.secret_len = 10
+ else:
+ raise ValueError("Unknwon secret type: %s" % self.secret)
+ gtk.main_quit()
+ self.chat = chat
+ self.cert = cert
#Set the Glade file
self.gladefile = glade_dir + "/pinpad.glade"
@@ -343,14 +365,16 @@ class PinpadGTK:
"on_btnZero_clicked" : self.digit_clicked,
"on_btnOk_clicked" : self.btnOk_clicked,
"on_btnDel_clicked" : self.btnDel_clicked,
- "on_MainWindow_destroy_event" : gtk.main_quit,
- "on_MainWindow_destroy" : gtk.main_quit }
+ "on_MainWindow_destroy_event" : self.shutdown,
+ "on_MainWindow_destroy" : self.shutdown }
self.builder.connect_signals(dic)
- #Change the font for the text field
- txtOutput = self.builder.get_object("txtOutput")
- txtOutput.modify_font(pango.FontDescription("Monospace 16"))
+ #Change the font for the text field and set it up up properly for the
+ #type of secret we are using
+ self.output = self.builder.get_object("txtOutput")
+ self.output.modify_font(pango.FontDescription("Monospace 16"))
+ self.output.set_text(self.secret_len * "_")
#Look for card and set the label accordingly
lbl_cardStatus = self.builder.get_object("lbl_cardStatus")
@@ -390,27 +414,43 @@ class PinpadGTK:
gtk.main_quit()
def digit_clicked(self, widget):
+ """We indicate the ammount of digits with underscores
+ For every digit that is enterd we replace one underscore with a star
+ We only accept secret_len digits and ignore every additional digit"""
c = widget.get_label()
- lbl = self.builder.get_object("txtOutput")
- txt = lbl.get_text()
- if len(txt) < 6:
- lbl.set_text(txt + '*')
+ txt = self.output.get_text()
+ if len(self.pin) < self.secret_len:
+ self.output.set_text(txt.replace("_", "*", 1))
self.pin += widget.get_label()
def btnOk_clicked(self, widget):
- #Check which radio button is checked, so we know what kind of secret to
- #use for PACE
- env_arg = os.environ
- env_arg["PIN"] = self.pin #We alway use the eID-PIN
+ env_args = os.environ
+ cmd = ["pace-tool"] #Contains the command and all the parameters for our subproccess
- #We have to provide the type of secret to use via a command line parameter
- param = "--pin"
+ #We have to select the type of secret to use via a command line parameter
+ #and provide the actual secret via an environment variable
+ if self.secret == "pin" or self.secret == "transport":
+ cmd.append("--pin")
+ env_args["PIN"] = self.pin
+ elif self.secret == "can":
+ cmd.append("--can")
+ env_args["CAN"] = self.pin
+ elif self.secret == "puk":
+ cmd.append("--puk")
+ env_args["PUK"] = self.pin
+ else:
+ raise ValueError("Unknown secret type: %s" % self.secret)
+ #If we have a CHAT, we pass it to pace-tool
+ if (self.chat):
+ cmd.append("--chat=" + self.chat)
+
+ #Try to call pace-tool. This is a blocking call. A progress bar is being
+ #shown while the subprocess is running
try:
self.cardChecker.pause() #Stop polling the card while PACE is running
- p = subprocess.Popen(["pace-tool", param, "-v"],
- stdout=subprocess.PIPE, env=env_arg, close_fds=True)
+ p = subprocess.Popen(cmd, stdout=subprocess.PIPE, env=env_args, close_fds=True)
except OSError, e:
popup = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL |
gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR,
@@ -420,6 +460,7 @@ class PinpadGTK:
self.cardChecker.resume() #Restart cardChecker
return
+ #Animate the progress bar
line = p.stdout.readline()
self.progressWindow.show()
while gtk.events_pending():
@@ -430,9 +471,10 @@ class PinpadGTK:
gtk.main_iteration()
line = p.stdout.readline()
+ #Get the return value of the pace-tool process
ret = p.poll()
self.progressWindow.hide()
- self.cardChecker.resume() #Restart cardChecker
+ self.cardChecker.resume()
if (ret == 0):
popup = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL |
@@ -442,23 +484,22 @@ class PinpadGTK:
popup.destroy()
self.shutdown() #FIXME
else:
- lbl = self.builder.get_object("txtOutput")
popup = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL |
gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_WARNING,
gtk.BUTTONS_OK,
"PIN wurde falsch eingegeben. Bitte erneut versuchen")
res = popup.run()
popup.destroy()
- lbl.set_text("")
+ self.output.set_text(self.secret_len * "_")
self.pin = ""
def btnDel_clicked(self, widget):
+ """Remove one digit from the pin and replace the last * in the output
+ field with an underscore"""
self.pin = self.pin[:-1]
- lbl = self.builder.get_object("txtOutput")
- txt = lbl.get_text()
- if len(txt) < 6:
- lbl.set_text(len(self.pin) * '*')
-
+ txt = self.output.get_text()
+ idx = txt.rfind("*")
+ self.output.set_text(txt[:idx] + "_" + txt[idx + 1:])
class Popup(object):
@@ -515,7 +556,7 @@ class cardChecker(Thread):
def run(self):
while (True):
if self._finished.isSet(): return
- if self._paused.isSet(): continue
+ if self._paused.isSet(): continue
self.__cardCheck()
self._finished.wait(self.intervall)
@@ -529,5 +570,6 @@ class cardChecker(Thread):
self._paused.clear()
if __name__ == "__main__":
+ gobject.threads_init()
CertificateDescriptionWindow(TEST_DESCRIPTION, TEST_CVC)
gtk.main()
diff --git a/pace-gui/src/pace_gui_globals.py.in b/pace-gui/src/pace_gui_globals.py.in
index e6fce35..adba30d 100644
--- a/pace-gui/src/pace_gui_globals.py.in
+++ b/pace-gui/src/pace_gui_globals.py.in
@@ -3,8 +3,8 @@ version = "@VERSION@"
image_dir = "@prefix@/share/pixmaps"
glade_dir = "@prefix@/share/" + name
-STR_NO_CARD = "Keine Karte\ngefunden"
-STR_CARD_FOUND = "Karte gefunden"
+STR_NO_CARD = "Keine Karte\ngefunden"
+STR_CARD_FOUND = "Karte gefunden"
ePA_ATR = "3b:84:80:01:00:00:90:00:95"
TEST_CVC = "\x7F\x21\x82\x01\x41\x7F\x4E\x81\xFA\x5F\x29\x01\x00\x42\x0D\x5A\x5A\x44\x56\x43\x41\x41\x54\x41\x30\x30\x30\x33\x7F\x49\x4F\x06\x0A\x04\x00\x7F\x00\x07\x02\x02\x02\x02\x03\x86\x41\x04\x19\xD1\x75\x45\xD3\xFE\x0B\x34\x3E\x7E\xE2\xAE\x4E\x2B\xC9\x2D\x51\x35\x1C\xC1\x17\xA4\x7F\xA9\x51\x9A\xDB\x1E\x40\x5E\xE6\xB8\x12\x12\x80\xBC\xC2\xFF\xF0\x35\x7A\x19\x7D\xE7\x39\xA7\xFD\x2E\xF0\x22\x10\xEF\x34\x3C\xDB\xE7\x9E\xF9\x4B\x8E\x28\x59\x1B\xB9\x5F\x20\x0B\x5A\x5A\x44\x4B\x42\x32\x30\x30\x30\x30\x52\x7F\x4C\x12\x06\x09\x04\x00\x7F\x00\x07\x03\x01\x02\x02\x53\x05\x00\x03\x01\xDF\x04\x5F\x25\x06\x01\x00\x00\x02\x01\x07\x5F\x24\x06\x01\x00\x00\x03\x03\x01\x65\x5E\x73\x2D\x06\x09\x04\x00\x7F\x00\x07\x03\x01\x03\x01\x80\x20\x75\xE0\xC4\xAC\x36\xC2\x5A\x33\xAC\x0E\x9A\x75\xEB\x79\x2A\x72\xF3\x31\xA5\x1E\x28\x63\x4E\xCC\x2E\xD6\x2E\x54\xF3\xC6\x93\xDA\x73\x2D\x06\x09\x04\x00\x7F\x00\x07\x03\x01\x03\x02\x80\x20\x18\x12\x65\x74\x49\xFC\xF1\xD3\xDA\xD8\x3D\x13\x14\x29\x17\x5C\x61\x8B\x21\xBA\xF0\xAF\x44\xAC\xE3\x8C\xB2\xC1\x2C\xEB\x2A\x56\x5F\x37\x40\x54\x0F\x85\x09\x12\xAB\xD3\x51\xF8\xF5\x56\x9B\x53\x4A\x5C\x8F\x64\x54\x5B\x51\xA7\x34\x70\xBE\x5A\xD2\x89\xC1\x9A\x5E\x13\x52\x53\xD3\xBB\x15\x52\x26\x21\x7B\x41\xE7\xF0\x68\xB3\x52\x3F\x3A\x63\x92\x22\xAF\x2B\x62\x8C\x39\x7D\x4F\xD4\x02\x1E\xDE\x00\xDC"
diff --git a/pace-gui/src/pinpad.glade b/pace-gui/src/pinpad.glade
index b70651c..1970418 100644
--- a/pace-gui/src/pinpad.glade
+++ b/pace-gui/src/pinpad.glade
@@ -39,9 +39,9 @@