Files
vsmartcard/pace-gui/src/pinpad.py
2010-06-10 08:54:18 +00:00

186 lines
6.1 KiB
Python

#!/usr/bin/env python
import sys, os
import subprocess
try:
import pygtk
pygtk.require("2.0")
except:
pass
try:
import gtk, gobject, glib
import pango
except:
sys.exit(1)
#glade_dir is set by the build system
from pinpad_globals import glade_dir
class PinpadGTK:
"""This a simple GTK based GUI to enter a PIN"""
def __init__(self):
btn_names = ["btnOne", "btnTwo", "btnThree", "btnFour", "btnFive",
"btnSix", "btnSeven", "btnEight", "btnNine", "btnDel",
"btnZero", "btnOk"]
self.pin = ""
#Set the Glade file
self.gladefile = glade_dir + "/pinpad.glade"
self.builder = gtk.Builder()
try:
self.builder.add_from_file(self.gladefile)
except glib.GError, e:
popup = gtk.MessageDialog(None, gtk.DIALOG_MODAL,
gtk.MESSAGE_WARNING, gtk.BUTTONS_OK,
e.message)
popup.run()
popup.destroy()
raise e
#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" : gtk.main_quit,
"on_MainWindow_destroy" : gtk.main_quit }
self.builder.connect_signals(dic)
#Change the font for the text field
txtOutput = self.builder.get_object("txtOutput")
font = pango.FontDescription("Monospace")
txtOutput.modify_font(pango.FontDescription("sans 24"))
#Change the font for the buttons
#For this you have to retrieve the label of each button and change
#its font
for name in btn_names:
btn = self.builder.get_object(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 (name == "btnOk" or name == "btnDel"):
lbl.modify_font(pango.FontDescription("sans 16"))
else:
lbl.modify_font(pango.FontDescription("sans 20"))
#Prepare the Progress Bar window for later use
self.progressWindow = Popup(self.builder)
#Display Main Window
self.window = self.builder.get_object("MainWindow")
self.window.show()
if (self.window):
self.window.connect("destroy", gtk.main_quit)
def digit_clicked(self, widget):
c = widget.get_label()
lbl = self.builder.get_object("txtOutput")
txt = lbl.get_text()
if len(txt) < 6:
lbl.set_text(txt + '*')
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
rdio = self.builder.get_object("rdioCAN")
rdioGrp = rdio.get_group()
rdioActive = [r for r in rdioGrp if r.get_active()]
env_arg = os.environ
env_arg[rdioActive[0].get_label()] = self.pin
#We have to provide the type of secret to use via a command line parameter
param = "--" + rdioActive[0].get_label().lower()
try:
p = subprocess.Popen(["pace-tool", param, "-v"],
stdout=subprocess.PIPE, env=env_arg, close_fds=True)
except OSError, e:
popup = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL |
gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR,
gtk.BUTTONS_OK, "pace-tool wurde nicht gefunden.")
popup.run()
popup.destroy()
return
line = p.stdout.readline()
self.progressWindow.show()
while gtk.events_pending():
gtk.main_iteration()
while line:
self.progressWindow.inc_fraction()
while gtk.events_pending():
gtk.main_iteration()
line = p.stdout.readline()
ret = p.poll()
self.progressWindow.hide()
if (ret == 0):
popup = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL |
gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO,
gtk.BUTTONS_OK, "PIN wurde korrekt eingegeben")
res = popup.run()
gtk.main_quit()
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.pin = ""
def btnDel_clicked(self, widget):
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) * '*')
class Popup(object):
def __init__(self, builder):
self.builder = builder
self.window = self.builder.get_object("progWindow")
self.progbar = self.builder.get_object("progBar")
def show(self):
self.window.show()
def hide(self):
self.window.hide()
def inc_fraction(self):
fraction = self.progbar.get_fraction()
if fraction < 1.0:
fraction += 0.1
else:
fraction = 0.0
self.progbar.set_fraction(fraction)
if __name__ == "__main__":
pinpad = PinpadGTK()
gtk.main()