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 @@ True False + 10 0 - 0.5 True out True