From 559d5c551c8274c42f16bc647a5a33ba0b7dfe09 Mon Sep 17 00:00:00 2001 From: oepen Date: Wed, 28 Jul 2010 14:25:18 +0000 Subject: [PATCH] Restructured the complete code to make it more modular git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@232 96b47cad-a561-4643-ad3b-153ac7d7599c --- eID_gui/AUTHORS | 1 + eID_gui/COPYING | 1 + eID_gui/ChangeLog | 8 + eID_gui/INSTALL | 1 + eID_gui/Makefile.am | 1 + eID_gui/NEWS | 0 eID_gui/README | 0 eID_gui/configure.ac | 31 ++ eID_gui/images/Makefile.am | 10 + eID_gui/images/OpenPACElogo.png | Bin 0 -> 31948 bytes eID_gui/images/apply.png | Bin 0 -> 3643 bytes eID_gui/images/error.png | Bin 0 -> 4066 bytes eID_gui/images/info.png | Bin 0 -> 1774 bytes eID_gui/images/wait.gif | Bin 0 -> 21398 bytes eID_gui/src/Makefile.am | 15 + eID_gui/src/eid/__init__.py | 0 eID_gui/src/eid/eid_gui_globals.py.in | 91 +++++ eID_gui/src/eid/logic.py | 55 +++ eID_gui/src/eid/widgets.py | 65 ++++ eID_gui/src/eid/windows.py | 537 ++++++++++++++++++++++++++ eID_gui/src/eid_gui.py | 18 + eID_gui/src/pace-gui.desktop.in | 11 + eID_gui/src/pinpad.glade | 272 +++++++++++++ 23 files changed, 1117 insertions(+) create mode 100644 eID_gui/AUTHORS create mode 120000 eID_gui/COPYING create mode 100644 eID_gui/ChangeLog create mode 120000 eID_gui/INSTALL create mode 100644 eID_gui/Makefile.am create mode 100644 eID_gui/NEWS create mode 100644 eID_gui/README create mode 100644 eID_gui/configure.ac create mode 100644 eID_gui/images/Makefile.am create mode 100644 eID_gui/images/OpenPACElogo.png create mode 100644 eID_gui/images/apply.png create mode 100644 eID_gui/images/error.png create mode 100644 eID_gui/images/info.png create mode 100644 eID_gui/images/wait.gif create mode 100644 eID_gui/src/Makefile.am create mode 100644 eID_gui/src/eid/__init__.py create mode 100644 eID_gui/src/eid/eid_gui_globals.py.in create mode 100644 eID_gui/src/eid/logic.py create mode 100644 eID_gui/src/eid/widgets.py create mode 100644 eID_gui/src/eid/windows.py create mode 100644 eID_gui/src/eid_gui.py create mode 100644 eID_gui/src/pace-gui.desktop.in create mode 100644 eID_gui/src/pinpad.glade diff --git a/eID_gui/AUTHORS b/eID_gui/AUTHORS new file mode 100644 index 0000000..4067889 --- /dev/null +++ b/eID_gui/AUTHORS @@ -0,0 +1 @@ +Dominik Oepen diff --git a/eID_gui/COPYING b/eID_gui/COPYING new file mode 120000 index 0000000..6168a39 --- /dev/null +++ b/eID_gui/COPYING @@ -0,0 +1 @@ +/usr/share/automake-1.11/COPYING \ No newline at end of file diff --git a/eID_gui/ChangeLog b/eID_gui/ChangeLog new file mode 100644 index 0000000..e8a5707 --- /dev/null +++ b/eID_gui/ChangeLog @@ -0,0 +1,8 @@ +2010-07-01 11:26 frankmorgner + + * .: added ChangeLog for distribution package + +2010-06-08 07:26 oepen + + * .: Working on autotools scripts + diff --git a/eID_gui/INSTALL b/eID_gui/INSTALL new file mode 120000 index 0000000..cbd1c80 --- /dev/null +++ b/eID_gui/INSTALL @@ -0,0 +1 @@ +/usr/share/automake-1.11/INSTALL \ No newline at end of file diff --git a/eID_gui/Makefile.am b/eID_gui/Makefile.am new file mode 100644 index 0000000..bc3c0b2 --- /dev/null +++ b/eID_gui/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src images diff --git a/eID_gui/NEWS b/eID_gui/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/eID_gui/README b/eID_gui/README new file mode 100644 index 0000000..e69de29 diff --git a/eID_gui/configure.ac b/eID_gui/configure.ac new file mode 100644 index 0000000..bbe749c --- /dev/null +++ b/eID_gui/configure.ac @@ -0,0 +1,31 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.64]) +AC_INIT(eid_gui, 0.2, oepen@informatik.hu-berlin.de) +AM_INIT_AUTOMAKE +AC_CONFIG_MACRO_DIR([m4]) + +# Checks for programs. +AC_PROG_INSTALL +AC_PROG_LN_S +AM_PATH_PYTHON + +# Checks for libraries. +PKG_CHECK_MODULES(PYGTK, pygtk-2.0) +AC_SUBST(PYGTK_CFLAGS) +AC_SUBST(PYGTK_LIBS) + +# Checks for header files. + +# Checks for typedefs, structures, and compiler characteristics. + +# Checks for library functions. + +AC_CONFIG_FILES([Makefile + src/Makefile + src/pace-gui.desktop + src/eid/Makefile + src/eid/eid_gui_globals.py + images/Makefile]) +AC_OUTPUT diff --git a/eID_gui/images/Makefile.am b/eID_gui/images/Makefile.am new file mode 100644 index 0000000..05571db --- /dev/null +++ b/eID_gui/images/Makefile.am @@ -0,0 +1,10 @@ +pixmapsdir = $(datadir)/pace-gui/ +pixmaps_DATA = \ + OpenPACElogo.png \ + apply.png \ + error.png \ + wait.gif \ + info.png + +EXTRA_DIST = \ + $(pixmaps_DATA) diff --git a/eID_gui/images/OpenPACElogo.png b/eID_gui/images/OpenPACElogo.png new file mode 100644 index 0000000000000000000000000000000000000000..f0a48d27f22b6cf0dfb4a19ced0a29416df7ce3d GIT binary patch literal 31948 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%0D!j9E;Ese+hWUq9E-&UV$uC+eIl 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 N002ovPDHLkV1lVj{tEyA literal 0 HcmV?d00001 diff --git a/eID_gui/images/error.png b/eID_gui/images/error.png new file mode 100644 index 0000000000000000000000000000000000000000..fa5f5d472b8f522b0cc45b784a0738c1cca70788 GIT binary patch literal 4066 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 UV?+LBTL1t607*qoM6N<$f@bTVoB#j- literal 0 HcmV?d00001 diff --git a/eID_gui/images/info.png b/eID_gui/images/info.png new file mode 100644 index 0000000000000000000000000000000000000000..e8361145107c20c046d2fa3a00808308b6b9925d GIT binary patch literal 1774 zcmVR8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H125U(~K~zYIotJHFTUQy!f9Kw7U%w=F9VcntnkKC6+EMY+EKFLb zjY*TxXkm0n1BpqDNp+-66-azRf=_(lMQEKEVp82Nj1Pz*UiM*36cF76A7Guetjk!t z^d(J}I7=Mcacp1v-h0mFgX7e8?4;vJkIuEP@BRPI^E~JAbA;!4+{qAAsZRo51|9^4 zOr7DNPwQT{_~Ci#8m2qyHB*)I1peiQ$?v}(RkS4_~9r+ zF_YBw0&mUc@me92qF8n~|N1iJNKf&R!PUg6;lll-esT8E!(k5gn|!cTqEvOUsuHU{S6n=)80!l*dF{YJ2&>|@n1fYuh=mOv zJ`|>!UWvbSYyZzIsUO=0Af{3}@Z$ZWrg3!8d@pk&uR%N(tcmpC0fN zG8A(w7F9_D!1foG%QnCM$3h!1)d9dm;1TyL)^Z!s-+wsr=+q}}ybH`2z+~9RNMD!E z#zuvFv2pcvfZey>4*~GR z@gYu5?xicJH{64l-&o+~i?_D9y%i=JHW2eU^3{>M=Stzev2dy10PgDx3Ty?_OEw0I zEk+KcFl+B;(9%>yOlCGl} z2Hl362Rsc}%$8ijeyxKGTYx(C4|Rw;0rC5Z`Ry!F)`01pE$A|}&MR-VcH+Bi!7cOo zAQ0eaq;LzcG~kuIG%!T1)9JYK)==ygf=&?8DBXs8^GKwy24pngU(#dk>Z;A2kbY-g z*vb8k!tEg9arTExmo}eV(7baK5;*%#RxlJZn}wy^4kBge5Hu!gJBU~eJsd2b8eY5z zl!3K+Kk&RG^o12$$KNRo4dyqR`WQ@~wq3jx0$^x}Bay%Q!=|QGOrIWd@i?&M(lJ>XIzk+{00 z*`_Pj1G;>nBK2p;WFVJo&iuyG+V=l{bLGJx?AwRGJD7WXc=6{C_pe+Bt|k(ROHF#6 z4kq2t{^#k6)X%z(jFQPfp#ZMi4_kK0OiwEA*9RY(NKB%zWCbP_r`KdKmnKm zZnhpqJ~lvoB$G)WFa!**R?WVg?e7^6mu#P=Y-)wY0#<+z6NyB}^I+rnA1sL-3^Nc{ Qt^fc407*qoM6N<$f|N9FA^-pY literal 0 HcmV?d00001 diff --git a/eID_gui/images/wait.gif b/eID_gui/images/wait.gif new file mode 100644 index 0000000000000000000000000000000000000000..9a4c8d500d46f98bc417981db386b4cf84285006 GIT binary patch literal 21398 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 literal 0 HcmV?d00001 diff --git a/eID_gui/src/Makefile.am b/eID_gui/src/Makefile.am new file mode 100644 index 0000000..8841587 --- /dev/null +++ b/eID_gui/src/Makefile.am @@ -0,0 +1,15 @@ +SUBDIRS = eid +bin_SCRIPTS = eid_gui.py + +paceguidir = $(prefix)/bin + +uidir = $(datadir)/eid_gui +ui_DATA = pinpad.glade + +appdir = $(datadir)/applications/ +app_DATA = pace-gui.desktop + +EXTRA_DIST = \ + $(bin_SCRIPTS) \ + $(app_DATA) \ + $(ui_DATA) diff --git a/eID_gui/src/eid/__init__.py b/eID_gui/src/eid/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/eID_gui/src/eid/eid_gui_globals.py.in b/eID_gui/src/eid/eid_gui_globals.py.in new file mode 100644 index 0000000..97bf15d --- /dev/null +++ b/eID_gui/src/eid/eid_gui_globals.py.in @@ -0,0 +1,91 @@ +#coding: utf-8 + +name = "pace-gui" +version = "@VERSION@" +image_dir = "@prefix@/share/" + name +glade_dir = "@prefix@/share/" + name + +GLADE_FILE = glade_dir + "/pinpad.glade" + +STR_NO_CARD = "Ausweis" +STR_CARD_FOUND = "Ausweis" + +FILE_NO_CARD = image_dir + "/error.png" +FILE_CARD_FOUND = image_dir + "/apply.png" + +EPA_ATR = "3b:84:80:01:00:00:90:00:95" + +#The following strings are used as help texts for eID access rights +DOC_AGE_VERIFICATION = u"Die Altersverifikation erlaubt die Überprüfung, ob ein Nutzer alt genug ist um einen Dienst zu nutzen, ohne sein Geburtsdatum zu übertragen" +DOC_COMMUNITY_ID_VERIFICATION = u"Die Wohnort Verifikation erlaubt die Überprüfung, ob ein Nutzer in einem bestimmten Gebiet wohnt, ohne seine tatsächliche Adresse zu übertragen" +DOC_RESTRICTED_ID = u"Die Pseudonymfunktion macht einen Nutzer für den Dienstanbieter wiedererkennbar, ohne weitere Daten von ihm zu erfassen" +DOC_PRIVILEGED_TERMINAL = u"Ein privilegiertes Terminal darf auf den Kartenindividuellen Schlüssel des Ausweis zugreifen" +DOC_CAN_ALLOWED = u"Das Terminal darf die Funktionen des Ausweises mit der CAN nutzen" +DOC_PIN_MANAGMENT = u"Das Terminal darf die eID-Funktion (de-)aktivieren und eine neue eID-PIN setzen" +DOC_INSTALL_CERTIFICATE = u"Der Dienstanbieter darf ein Zertifikat im Ausweis installieren" +DOC_INSTALL_QC = u"Der Dienstanbieter darf ein qualifiziertes Zertifikat im Ausweis installieren" +DOC_DOCUMENT_TYPE = u"Der Dienstanbieter darf den Dokumenttyp (z.B. Personalausweis oder Aufenthaltstitel) auslesen" +DOC_STATE = u"Der Dienstanbieter darf die Staatzugehörigkeit des Ausweisinhabers lesen" +DOC_EXPIRY_DATE = u"Der Dienstanbieter darf das Ablaufdatum des Ausweises auslesen" + +IMAGES = { + "apply": image_dir + "/apply.png", + "error": image_dir + "/error.png", + "info" : image_dir + "/info.png", + "wait" : image_dir + "/wait.gif" +} + +#Authentication Terminal CHAT +AT_CHAT_STRINGS = { + #Age Verification + 0: ("Altersverifikation", DOC_AGE_VERIFICATION), + #Community ID Verification + 1: (u"Gemeindeschlüssel Verifikation", DOC_COMMUNITY_ID_VERIFICATION), + #Restrictied Identification + 2: ("Pseudonymfunktion", DOC_RESTRICTED_ID), + #Privileged Terminal + 3: ("Priviligiertes Terminal", DOC_PRIVILEGED_TERMINAL), + #CAN allowed + 4: ("Verwendung der CAN", DOC_CAN_ALLOWED), + 5: ("PIN Managment", DOC_PIN_MANAGMENT), + #Install Certificate + 6: ("Zertifikat einspielen", DOC_INSTALL_CERTIFICATE), + #Install Qualified Certificate + 7: ("Qualifiziertes Zertifikat einspielen", DOC_INSTALL_QC), + #Read DG 1 + 8: ("Dokumenttyp", DOC_DOCUMENT_TYPE), + #Read DG 2 + 9: ("Ausstellender Staat", DOC_STATE), + 10: ("Ablaufdatum", DOC_EXPIRY_DATE), #Read DG 3 + 11: ("Vorname", None), #Read DG 4 + 12: ("Nachname", None), #Read DG 5 + 13: (u"Künstlername", None), #Read DG 6 + 14: ("Doktorgrad", None), #Read DG 7 + 15: ("Geburtsdatum", None), #Read DG 8 + 16: ("Geburtsort", None), #Read DG 9 + 17: (u"Ungültig", None), #Read DG 10 + 18: (u"Ungültig", None), #Read DG 11 + 19: (u"Ungültig", None),#Read DG 12 + 20: (u"Ungültig", None),#Read DG 13 + 21: (u"Ungültig", None),#Read DG 14 + 22: (u"Ungültig", None),#Read DG 15 + 23: (u"Ungültig", None),#Read DG 16 + 24: ("Adresse", None), #Read DG 17 + 25: (u"Gemeindeschlüssel lesen", None),#Read DG 18 + 26: (u"Ungültig", None),#Read DG 19 + 27: (u"Ungültig", None),#Read DG 20 + 28: (u"Ungültig", None),#Read DG 21 + 29: (u"Ungültig", None),#RFU + 30: (u"Ungültig", None),#RFU + 31: (u"Ungültig", None),#RFU + 32: (u"Ungültig", None),#RFU + 33: (u"Ungültig", None),#Write DG 21 + 34: (u"Ungültig", None),#Write DG 20 + 35: (u"Ungültig", None),#Write DG 19 + 36: (u"Gemeindeschlüssel schreiben", None),#Write DG 18 + 37: (u"Adresse schreiben", None)#Write DG 17" +} + +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" + +TEST_DESCRIPTION = "\x30\x82\x01\x90\x06\x0A\x04\x00\x7F\x00\x07\x03\x01\x03\x01\x01\xA1\x16\x0C\x14\x42\x75\x6E\x64\x65\x73\x64\x72\x75\x63\x6B\x65\x72\x65\x69\x20\x47\x6D\x62\x48\xA2\x24\x13\x22\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x62\x75\x6E\x64\x65\x73\x64\x72\x75\x63\x6B\x65\x72\x65\x69\x2E\x64\x65\x2F\x64\x76\x63\x61\xA3\x18\x0C\x16\x44\x65\x75\x74\x73\x63\x68\x65\x20\x4B\x72\x65\x64\x69\x74\x62\x61\x6E\x6B\x20\x41\x47\xA4\x13\x13\x11\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x64\x6B\x62\x2E\x64\x65\xA5\x82\x01\x13\x0C\x82\x01\x0F\x54\x61\x75\x62\x65\x6E\x73\x74\x72\x2E\x20\x37\x2D\x39\x0D\x0A\x31\x30\x31\x31\x37\x20\x42\x65\x72\x6C\x69\x6E\x0D\x0A\x69\x6E\x66\x6F\x40\x64\x6B\x62\x2E\x64\x65\x0D\x0A\x45\x72\xC3\xB6\x66\x66\x6E\x75\x6E\x67\x20\x65\x69\x6E\x65\x73\x20\x4B\x6F\x6E\x74\x6F\x73\x0D\x0A\x42\x65\x72\x6C\x69\x6E\x65\x72\x20\x42\x65\x61\x75\x66\x74\x72\x61\x67\x74\x65\x72\x20\x66\xC3\xBC\x72\x20\x44\x61\x74\x65\x6E\x73\x63\x68\x75\x74\x7A\x20\x75\x6E\x64\x20\x49\x6E\x66\x6F\x72\x6D\x61\x74\x69\x6F\x6E\x73\x66\x72\x65\x69\x68\x65\x69\x74\x2C\x20\x41\x6E\x20\x64\x65\x72\x20\x55\x72\x61\x6E\x69\x61\x20\x34\x2D\x31\x30\x2C\x20\x31\x30\x37\x38\x37\x20\x42\x65\x72\x6C\x69\x6E\x2C\x20\x30\x33\x30\x2F\x31\x33\x20\x38\x38\x39\x2D\x30\x2C\x20\x6D\x61\x69\x6C\x62\x6F\x78\x40\x64\x61\x74\x65\x6E\x73\x63\x68\x75\x74\x7A\x2D\x62\x65\x72\x6C\x69\x6E\x2E\x64\x65\x2C\x20\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x64\x61\x74\x65\x6E\x73\x63\x68\x75\x74\x7A\x2D\x62\x65\x72\x6C\x69\x6E\x2E\x64\x65\x0D\x0A\x45\x72\xC3\xB6\x66\x66\x6E\x75\x6E\x67\x20\x65\x69\x6E\x65\x73\x20\x4B\x6F\x6E\x74\x6F\x73\x0D\x0A" diff --git a/eID_gui/src/eid/logic.py b/eID_gui/src/eid/logic.py new file mode 100644 index 0000000..88c1b0a --- /dev/null +++ b/eID_gui/src/eid/logic.py @@ -0,0 +1,55 @@ +import gobject + +import subprocess +from threading import Thread, Event +from eid_gui_globals import STR_CARD_FOUND, STR_NO_CARD, IMAGES + +class cardChecker(Thread): + """ This class searches for a card with a given ATR and displays + wether or not using a label and an image """ + + def __init__(self, lbl, img, atr, intervall=1): + Thread.__init__(self) + self._finished = Event() + self._paused = Event() + self.lbl = lbl + self.img = img + self.target_atr = atr + self.intervall = intervall + + def _check_card(self): + """ + Actually this method should make use of pyscard, but I couldn't make + it run on the OpenMoko yet. Therefor we call opensc-tool instead, which + leads to higher delays """ + + proc = subprocess.Popen(["opensc-tool", "--atr"], + stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) + + line = proc.stdout.readline().rstrip() + if line == self.target_atr: + gobject.idle_add(self.lbl.set_label, STR_CARD_FOUND) + gobject.idle_add(self.img.set_from_file, IMAGES["apply"]) + else: + gobject.idle_add(self.lbl.set_label, STR_NO_CARD) + gobject.idle_add(self.img.set_from_file, IMAGES["error"]) + + def run(self): + """Main loop: Poll the card if the thread is not paused or finished""" + while (True): + if self._finished.isSet(): + return + if self._paused.isSet(): + continue + self._check_card() + self._finished.wait(self.intervall) + + def stop(self): + self._finished.set() + + def pause(self): + self._paused.set() + + def resume(self): + self._paused.clear() + diff --git a/eID_gui/src/eid/widgets.py b/eID_gui/src/eid/widgets.py new file mode 100644 index 0000000..ac48fdc --- /dev/null +++ b/eID_gui/src/eid/widgets.py @@ -0,0 +1,65 @@ +import sys +try: + import pygtk + pygtk.require("2.0") + import gtk, pango +except ImportError: + sys.exit(1) + +from eid_gui_globals import AT_CHAT_STRINGS, IMAGES + +class customCheckButton(object): + """This class provides a custom version of gtk.CheckButton. + The main difference isthat the checkbox can be placed at the right + side of the label and that we can store an index with the button""" + + def __init__(self, index, vbox): + self.idx = index + #Fetch name and (possibly empty) helptext + strings = AT_CHAT_STRINGS[index] + self.label = strings[0] + self.helptext = strings[1] + self.parent = vbox.get_parent_window() + + #Setup a label with the name of the access right + self.lbl = gtk.Label(self.label) + self.lbl.set_alignment(0.0, 0.5) + self.lbl.set_padding(20, 0) + self.lbl.modify_font(pango.FontDescription("bold")) + + #If we have a helptext, put an image at the left side of the label + self.info_box = None + if self.helptext is not None: + self.info_box = gtk.EventBox() + img = gtk.Image() + img.set_from_file(IMAGES["info"]) + self.info_box.add(img) + self.info_box.connect("button_release_event", self._show_info) + + #...and a checkbox on the right side of the label + self.chk = gtk.CheckButton("") + self.chk.set_active(True) + self.chk.set_alignment(1.0, 0.5) + + #Insert the label and the checkbox in the vbox and add a seperator + hbox = gtk.HBox() + if self.info_box is not None: + hbox.pack_start(self.info_box, False, False) + else: #pack empty label for spacing + spacer = gtk.Label("") + spacer.set_size_request(32, 32) + hbox.pack_start(spacer, False, False) + hbox.pack_start(self.lbl, True, True) + hbox.pack_start(self.chk, False, False) + vbox.pack_start(gtk.HSeparator()) + vbox.pack_start(hbox) + + def is_active(self): + return self.chk.get_active() + + def _show_info(self, widget=None, data=None): + """Show a messagebox containing info about the access right in + question""" + help = MsgBox(self.parent, self.helptext, "info", + gtk.DIALOG_DESTROY_WITH_PARENT) + diff --git a/eID_gui/src/eid/windows.py b/eID_gui/src/eid/windows.py new file mode 100644 index 0000000..73152e2 --- /dev/null +++ b/eID_gui/src/eid/windows.py @@ -0,0 +1,537 @@ +#coding: utf-8 + +import sys, subprocess, os +try: + import pygtk + pygtk.require("2.0") + import gtk, gobject, glib, pango +except ImportError: + sys.exit(1) + +try: + import pace +except ImportError: + print >> sys.stderr, "Could not import pace module, please install pyPACE" + sys.exit(1) + +from eid_gui_globals import IMAGES, GLADE_FILE, EPA_ATR +from widgets import customCheckButton +from logic import cardChecker + +class MokoWindow(gtk.Window): + """ + Base class for all our dialogues. It's a simple gtk.Window, with a title at + the top and to buttons at the bottom. In the middle there is a vBox where + we can put custom stuff for each dialoge. + All the dialoges are stored as a double-linked list, so the navigation from + one window to another is easy + """ + + def __init__(self, title, predecessor): + super(MokoWindow, self).__init__() + + self.title_str = title + self.predecessor = predecessor + + assert(isinstance(self.title_str, basestring)) + + self.connect("destroy", gtk.main_quit) + #Display resolution of OpenMoko minus height of the SHR toolbar + self.set_size_request(480, 586) + #self.set_resizable(False) + + #Main VBox, which consists of the title, the body, and the buttons + self.__vb = gtk.VBox(False, 5) + self.add(self.__vb) + + #Title label at the top of the window + lbl_title = gtk.Label(self.title_str) + lbl_title.modify_font(pango.FontDescription("sans 14")) + lbl_title.set_alignment(0.5, 0.0) + self.__vb.pack_start(lbl_title, False, False) + + #Body VBox for custom widgets + self.body = gtk.VBox(False) + #Add a scrollbar in case we must display lots of information + #Only use a vertical spacebar, not a horizontal one + scrolled_window = gtk.ScrolledWindow() + scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) + scrolled_window.set_shadow_type(gtk.SHADOW_ETCHED_OUT) + self.__vb.pack_start(scrolled_window) + scrolled_window.add_with_viewport(self.body) + + #Add two buttons at the bottom of the window + hbox = gtk.HBox(True, 5) + if self.predecessor is None: + btnBack = gtk.Button("Abbrechen") + else: + btnBack = gtk.Button(u"Zurück") + btnBack.set_size_request(150, 75) + btnBack.connect("clicked", self.btnBack_clicked, None) + if isinstance(btnBack.child, gtk.Label): + lbl = btnBack.child + else: + raise ValueError("Button does not have a label") + lbl.modify_font(pango.FontDescription("sans 12")) + hbox.pack_start(btnBack, True, True) + + btnForward = gtk.Button("Weiter") + btnForward.set_size_request(150, 75) + btnForward.connect("clicked", self.btnForward_clicked, None) + if isinstance(btnForward.child, gtk.Label): + lbl = btnForward.child + else: + raise ValueError("Button does not have a label") + hbox.pack_start(btnForward, True, True) + lbl.modify_font(pango.FontDescription("sans 12")) + self.__vb.pack_start(hbox, False, False) + + #Place window in the center of the screen + self.set_position(gtk.WIN_POS_CENTER_ALWAYS) + + def btnBack_clicked(self, widget, data=None): + """Go back to the previous window. If there is no previous window, + do nothing""" + if self.predecessor is None: + gtk.main_quit() + else: + self.predecessor.show_all() + self.hide() + + def btnForward_clicked(self, widget, data=None): + """Go to the next window. If there is no next window, do nothing""" + if self.successor is None: + pass + else: + self.successor.show_all() + self.hide() + + +class MsgBox(gtk.Dialog): + """The gtk.MessageDialog looks like crap on the Moko, so we write our own""" + + def __init__(self, parent, msg, img_type, flags): + #img is a string which is used as a key for the IMAGES dictionary + if img_type is not None: + assert IMAGES.has_key(img_type) + + super(MsgBox, self).__init__(title="", parent=parent, flags=flags) + + #Dialog will be resized to screen width no matter what. Therefore we + #use the whole width from the beginning to avoid being resized + self.set_size_request(480, 160) + + hbox_top = gtk.HBox() + lbl = gtk.Label(msg) + lbl.set_width_chars(20) + lbl.set_line_wrap(True) + btn = gtk.Button("Ok") + btn.connect("clicked", self.__destroy) + img = gtk.Image() + img.set_from_file(IMAGES[img_type]) + hbox_top.pack_start(img, False, False) + hbox_top.pack_start(lbl, True, True) + self.vbox.pack_start(hbox_top) + #self.vbox.pack_start(gtk.HSeparator()) + hbox_bottom = gtk.HBox() + spacer = gtk.Label("") + spacer.set_size_request(380, 25) + hbox_bottom.pack_start(spacer, False, False) + hbox_bottom.pack_start(btn, True, True) + self.vbox.pack_start(hbox_bottom) + #hbox.pack_start(vbox) + #self.add(hbox) + + #self.set_decorated(False) + self.set_modal(True) + + self.show_all() + + def __destroy(self, widget=None, data=None): + self.destroy() + + +class CertificateDescriptionWindow(MokoWindow): + """This window is used to display information about the service provider, + extracted from the terminal certificate and the appendant certificate + description""" + + def __init__(self, binDescription, binCert): + super(CertificateDescriptionWindow, self).__init__("Dienstanbieter", None) + + #binDesciption contains the Certificate Description as a octet string + desc = pace.d2i_CVC_CERTIFICATE_DESCRIPTION(binDescription) + + self.successor = CVCWindow(binCert, self) + + #Display the validity period: + cvc = pace.d2i_CV_CERT(binCert) + effective_date = self.formatDate(pace.get_effective_date(cvc)) + expiration_date = self.formatDate(pace.get_expiration_date(cvc)) + validity_period = effective_date + " - " + expiration_date + #self.addRow(u"Gültig ab:", effective_date) + #self.addRow(u"Gültig bis:", expiration_date) + self.addRow(u"Gültigkeitszeitraum:", validity_period) + + #Display issuer Name and possibly URL and subject name and possibly URL + issuer_name = pace.get_issuer_name(desc) + issuer_url = pace.get_issuer_url(desc) + self.addRow("Zertifikatsaussteller:", issuer_name) + if issuer_url is not None: + self.addRow("", issuer_url, True) + subject_name = pace.get_subject_name(desc) + subject_url = pace.get_subject_url(desc) + self.addRow("Zertifikatsinhaber:", subject_name) + if subject_url is not None: + self.addRow("", subject_url, True) + self.set_focus(None) + + #Extract, format and display the terms of usage + terms = pace.get_termsOfUsage(desc) + formated_terms = self.formatTOU(terms) + self.addRow("Beschreibung:", formated_terms) + + self.show_all() + + def formatDate(self, date): + """Take a date string in the form that is included in CV Certificates + (YYMMDD) and return it in a better readable format (DD.MM.YYYY)""" + + assert(isinstance(date, basestring)) + assert(len(date) == 6) + + year = date[:2] + month = date[2:4] + day = date[4:6] #Cut off trailing \0 + + #Implicit assumption: 2000 <= year < 3000 + return day + "." + month + "." + "20" + year + + def formatTOU(self, terms): + +# for s in self.terms_array: +# s = s.replace(", ", "\n").strip() +# lbl = gtk.Label(s) +# lbl.set_alignment(0.0, 0.0) +# lbl.set_width_chars(60) +# lbl.set_line_wrap(True) #XXX: Doesn't work on the Moko +# lbl.modify_font(pango.FontDescription("bold")) +# self.body.pack_start(gtk.HSeparator()) +# self.body.pack_start(lbl, False, False, 2) + + return terms.replace(", ", "\r\n") + + def addRow(self, title, text, url=False): + if not url: #URL has no title + lbl_title = gtk.Label(title) + lbl_title.set_width_chars(20) + lbl_title.set_alignment(0.0, 0.5) + lbl_title.modify_font(pango.FontDescription("bold")) + self.body.pack_start(lbl_title) + hbox = gtk.HBox() + lbl = gtk.Label("") #Empty label for spacing + lbl.set_width_chars(3) + hbox.pack_start(lbl) + if url: + lblText = gtk.LinkButton(text, text) + if isinstance(lblText.child, gtk.Label): + lbl = lblText.child + else: + raise ValueError("Button does not have a label") + lbl.set_width_chars(40) + + else: + lblText = gtk.Label(text) + lblText.set_width_chars(40) + + lblText.set_alignment(0.0, 0.0) + hbox.pack_start(lblText) + self.body.pack_start(hbox) + +class CVCWindow(MokoWindow): + """This window is used to display and modify the access encoded in the CHAT + of a CV Certificate""" + + def __init__(self, binCert, predecessor): + super(CVCWindow, self).__init__("Zugriffsrechte", predecessor) + + self.successor = PinpadGTK("pin", None) + + #Convert the binary certificate to the internal representation and + #extract the relative authorization from the chat + cvc = pace.d2i_CV_CERT(binCert) + chat = pace.cvc_get_chat(cvc) + self.chat_oid = pace.get_chat_oid(chat) + self.chat = pace.get_binary_chat(chat) + self.rel_auth = [] + for char in self.chat: + self.rel_auth.append(ord(char)) + self.rel_auth_len = len(self.rel_auth) + + #Extract the access rights from the CHAT and display them in the window + self.access_rights = [] + j = 0 + for i in range((self.rel_auth_len - 1) * 8 - 2): + if (i % 8 == 0): + j += 1 + if self.rel_auth[self.rel_auth_len - j] & (1 << (i % 8)): + chk = customCheckButton(i, self.body) + self.access_rights.append(chk) + + def btnForward_clicked(self, widget, data=None): + """ Check wether any access right have been deselected and modify the + CHAT accordingly """ + + for right in self.access_rights: + if not right.is_active(): + idx = right.idx + self.rel_auth[len(self.chat) - 1 - idx / 8] ^= (1 << (idx % 8)) + + #super(CVCWindow, self).btnForward_clicked(widget, data) + new_chat_list = [] + for byte in self.chat_oid: + new_chat_list.append(ord(byte)) + new_chat_list.append(len(self.rel_auth)) + new_chat_list.extend(self.rel_auth) + new_chat = self.__formatHexString(new_chat_list) + self.successor.set_chat(new_chat) + self.successor.show() + self.hide() + + def __formatHexString(self, int_list): + """Take a list of integers and convert it to a hex string, where the + individual bytes are seperated by a colon (e.g. "0f:00:00")""" + hex_str = "" + for i in int_list: + byte = hex(i)[2:] + if len(byte) == 1: byte = "0" + byte + hex_str += byte + ":" + + return hex_str[:-1] + +class PinpadGTK: + """This a simple GTK based GUI to enter a PIN/PUK/CAN""" + + 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_FILE + self.builder = gtk.Builder() + try: + self.builder.add_from_file(self.gladefile) + except glib.GError, err: + #If we encounter an exception at startup, we display a popup with + #the error message + popup = MsgBox(None, err.message, "error", None) + popup.run() + popup.destroy() + raise err + + #Get the Main Window, and connect the "destroy" event + #Create our dictionay and connect it + dic = { "on_btnOne_clicked" : self.digit_clicked, + "on_btnTwo_clicked" : self.digit_clicked, + "on_btnThree_clicked" : self.digit_clicked, + "on_btnFour_clicked" : self.digit_clicked, + "on_btnFive_clicked" : self.digit_clicked, + "on_btnSix_clicked" : self.digit_clicked, + "on_btnSeven_clicked" : self.digit_clicked, + "on_btnEight_clicked" : self.digit_clicked, + "on_btnNine_clicked" : self.digit_clicked, + "on_btnZero_clicked" : self.digit_clicked, + "on_btnOk_clicked" : self.btnOk_clicked, + "on_btnDel_clicked" : self.btnDel_clicked, + "on_MainWindow_destroy_event" : self.shutdown, + "on_MainWindow_destroy" : self.shutdown } + + self.builder.connect_signals(dic) + + #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 + self.lbl_cardStatus = self.builder.get_object("lbl_cardStatus") + #Fetch the status image + self.img_cardStatus = self.builder.get_object("img_cardStatus") + self.img_cardStatus.set_from_file(IMAGES["error"]) + + #We only start the thread for polling the card when the window + #is shown + self.cardChecker = None + + #Change the font for the buttons + #For this you have to retrieve the label of each button and change + #its font + for btn_name in btn_names: + btn = self.builder.get_object(btn_name) + if btn.get_use_stock(): + lbl = btn.child.get_children()[1] + elif isinstance(btn.child, gtk.Label): + lbl = btn.child + else: + raise ValueError("Button does not have a label") + + if (btn_name == "btnOk" or btn_name == "btnDel"): + lbl.modify_font(pango.FontDescription("sans 14")) + else: + lbl.modify_font(pango.FontDescription("sans 18")) + + #Display Main Window + self.window = self.builder.get_object("MainWindow") + self.window.connect("destroy", self.shutdown) + self.window.hide() + + def show(self): + """Start the polling thread, then show the window""" + if self.cardChecker is None: + self.cardChecker = cardChecker(self.lbl_cardStatus, self.img_cardStatus, + EPA_ATR) + gobject.idle_add(self.cardChecker.start) + self.window.show_all() + + def set_chat(self, chat): + self.chat = chat + + def shutdown(self, widget): + """Stop the cardChecker thread before exiting the application""" + if self.cardChecker is not None: + self.cardChecker.stop() + self.cardChecker.join() + 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""" + digit = widget.get_label() + assert digit.isdigit() + txt = self.output.get_text() + if len(self.pin) < self.secret_len: +# self.output.set_text(txt.replace("_", digit, 1)) + idx = txt.find('_') + output = txt[:idx] + digit + txt[idx+1:] + self.output.set_text(output) + gobject.timeout_add(750, self.hide_digits, idx) + self.pin += digit + + def hide_digits(self, idx): + """Change character number idx of self.output text to a '*' """ + output = "" + txt = self.output.get_text() + if txt[idx].isdigit(): + output = txt[:idx] + '*' + txt[idx+1:] + self.output.set_text(output) + return False + + def btnOk_clicked(self, widget): + """Pass the entered secret to pace-tool. If pace-tool is run + sucessfully exit, otherwise restart the PIN entry""" + + env_args = os.environ + + #cmd contains the command and all the parameters for our subproccess + cmd = ["pace-tool"] + + #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) + + cmd.append("-v") + + #Try to call pace-tool. This is a blocking call. An animation is being + #shown while the subprocess is running + try: + #Stop polling the card while PACE is running + self.cardChecker.pause() + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, env=env_args, + close_fds=True) + except OSError: + popup = MsgBox(self.window, "pace-tool wurde nicht gefunden", + "error", gtk.DIALOG_DESTROY_WITH_PARENT) + popup.run() + popup.destroy() + self.cardChecker.resume() #Restart cardChecker + return + + #Show the animation to indicate that the program is not dead + waiting = gtk.Window(gtk.WINDOW_POPUP) + animation = gtk.gdk.PixbufAnimation(IMAGES["wait"]) + img = gtk.Image() + img.set_from_animation(animation) + waiting.add(img) + waiting.set_position(gtk.WIN_POS_CENTER_ALWAYS) + waiting.set_modal(True) + waiting.set_transient_for(self.window) + waiting.set_decorated(False) + waiting.show_all() + + #Try to keep the GUI responsive by taking care of the event queue + line = proc.stdout.readline() + while line: + while gtk.events_pending(): + gtk.main_iteration() + line = proc.stdout.readline() + + #Get the return value of the pace-tool process + ret = proc.poll() + waiting.destroy() + self.cardChecker.resume() + + if (ret == 0): + popup = MsgBox(self.window, "Pin wurde korrekt eingegeben", "apply", + gtk.DIALOG_DESTROY_WITH_PARENT) + popup.run() + popup.destroy() + #XXX: Actually we should return to the application that started + #the PIN entry + self.shutdown(None) + else: + popup = MsgBox(self.window, "PIN wurde falsch eingegeben", "error", + gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT) + popup.run() + popup.destroy() + 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] + num_digits = len(self.pin) + output = num_digits * '*' + (self.secret_len - num_digits) * "_" + self.output.set_text(output) + diff --git a/eID_gui/src/eid_gui.py b/eID_gui/src/eid_gui.py new file mode 100644 index 0000000..f8a1ae2 --- /dev/null +++ b/eID_gui/src/eid_gui.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# coding: utf-8 + +import sys, os, subprocess +try: + import pygtk + pygtk.require("2.0") + import gtk, gobject +except ImportError: + sys.exit(1) + +from eid.eid_gui_globals import TEST_DESCRIPTION, TEST_CVC +from eid.windows import CertificateDescriptionWindow + +if __name__ == "__main__": + gobject.threads_init() + CertificateDescriptionWindow(TEST_DESCRIPTION, TEST_CVC) + gtk.main() diff --git a/eID_gui/src/pace-gui.desktop.in b/eID_gui/src/pace-gui.desktop.in new file mode 100644 index 0000000..f3fe0ef --- /dev/null +++ b/eID_gui/src/pace-gui.desktop.in @@ -0,0 +1,11 @@ +[Desktop Entry] +Version=@VERSION@ +Encoding=UTF-8 +Name=PACE-GUI +Comment=GUI zur Eingabe einer PIN/CAN/PUK fuer pace-tool +Exec=eid_gui.py +Icon=@prefix@/share/pace-gui/OpenPACElogo.png +Terminal=false +Type=Application +Categories=Utility +StartupNotify=false diff --git a/eID_gui/src/pinpad.glade b/eID_gui/src/pinpad.glade new file mode 100644 index 0000000..aab5264 --- /dev/null +++ b/eID_gui/src/pinpad.glade @@ -0,0 +1,272 @@ + + + + + + True + Pinpad + center + 480 + 586 + OpenPACElogo.png + + + + + True + + + True + <span font_weight="bold" font="11">Bitte PIN eingeben</span> + True + + + False + 0 + + + + + True + + + False + 1 + + + + + True + False + False + 10 + + 0 + True + out + True + False + + + False + 5 + 2 + + + + + True + + + False + 3 + + + + + True + + + True + 0.89999997615814209 + <span fgcolor="red" font="12">Ausweis</span> + True + + + 0 + + + + + True + 0.10000000149011612 + error.png + + + 1 + + + + + 4 + + + + + True + 4 + 3 + True + + + 1 + True + True + True + + + + + + 4 + True + True + True + + + + 1 + 2 + + + + + 7 + True + True + True + + + + 2 + 3 + + + + + Entf + True + True + True + + + + 3 + 4 + + + + + 2 + True + True + True + + + + 1 + 2 + + + + + 5 + True + True + True + + + + 1 + 2 + 1 + 2 + + + + + 8 + True + True + True + + + + 1 + 2 + 2 + 3 + + + + + 0 + True + True + True + + + + 1 + 2 + 3 + 4 + + + + + 3 + True + True + True + + + + 2 + 3 + + + + + 6 + True + True + True + + + + 2 + 3 + 1 + 2 + + + + + 9 + True + True + True + + + + 2 + 3 + 2 + 3 + + + + + Ok + True + True + True + + + + 2 + 3 + 3 + 4 + + + + + 5 + + + + + +