Initial release of pace-gui, a small GUI for pace-tool
git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@133 96b47cad-a561-4643-ad3b-153ac7d7599c
This commit is contained in:
20
pace-gui/src/Makefile.am
Normal file
20
pace-gui/src/Makefile.am
Normal file
@@ -0,0 +1,20 @@
|
||||
EXTRA_DIST = pinpad.in
|
||||
|
||||
pinpaddir = $(pythondir)
|
||||
|
||||
pinpad_PYTHON = pinpad.py
|
||||
|
||||
all-local:
|
||||
perl -ne "s|PYTHONDIR|$(pythondir)| ; print" $(srcdir)/pinpad.in > tmp
|
||||
perl -ne "s|PYTHONBIN|$(PYTHON)| ; print" tmp > pinpad
|
||||
rm -f tmp
|
||||
|
||||
install-exec-local: all-local
|
||||
$(mkinstalldirs) $(DESTDIR)$(bindir)
|
||||
$(INSTALL_SCRIPT) pinpad $(DESTDIR)$(bindir)/pinpad
|
||||
|
||||
uninstall-local:
|
||||
rm -f $(DESTDIR)$(bindir)/pinpad
|
||||
|
||||
clean-local:
|
||||
rm -f pinpad
|
||||
326
pace-gui/src/pinpad.glade
Normal file
326
pace-gui/src/pinpad.glade
Normal file
@@ -0,0 +1,326 @@
|
||||
<?xml version="1.0"?>
|
||||
<interface>
|
||||
<requires lib="gtk+" version="2.16"/>
|
||||
<!-- interface-naming-policy project-wide -->
|
||||
<object class="GtkWindow" id="MainWindow">
|
||||
<property name="visible">True</property>
|
||||
<property name="title" translatable="yes">Pinpad</property>
|
||||
<property name="window_position">center</property>
|
||||
<property name="default_width">480</property>
|
||||
<property name="default_height">640</property>
|
||||
<property name="icon_name">security-medium</property>
|
||||
<signal name="destroy" handler="on_MainWindow_destroy"/>
|
||||
<signal name="destroy_event" handler="on_MainWindow_destroy_event"/>
|
||||
<child>
|
||||
<object class="GtkVBox" id="vbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="lblInstruction">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes"><span font_weight="bold" font="11">Bitte PIN eingeben</span></property>
|
||||
<property name="use_markup">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkHSeparator" id="hseparator2">
|
||||
<property name="visible">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkEntry" id="txtOutput">
|
||||
<property name="visible">True</property>
|
||||
<property name="editable">False</property>
|
||||
<property name="invisible_char">●</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="truncate_multiline">True</property>
|
||||
<property name="shadow_type">out</property>
|
||||
<property name="invisible_char_set">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="padding">10</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkHSeparator" id="hseparator1">
|
||||
<property name="visible">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTable" id="table1">
|
||||
<property name="visible">True</property>
|
||||
<property name="n_rows">5</property>
|
||||
<property name="n_columns">3</property>
|
||||
<property name="homogeneous">True</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="btnOne">
|
||||
<property name="label" translatable="yes">1</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_btnOne_clicked"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="top_attach">1</property>
|
||||
<property name="bottom_attach">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="btnTwo">
|
||||
<property name="label" translatable="yes">2</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_btnTwo_clicked"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">1</property>
|
||||
<property name="bottom_attach">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="btnThree">
|
||||
<property name="label" translatable="yes">3</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_btnThree_clicked"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
<property name="right_attach">3</property>
|
||||
<property name="top_attach">1</property>
|
||||
<property name="bottom_attach">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="btnFour">
|
||||
<property name="label" translatable="yes">4</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_btnFour_clicked"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="top_attach">2</property>
|
||||
<property name="bottom_attach">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="btnFive">
|
||||
<property name="label" translatable="yes">5</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_btnFive_clicked"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">2</property>
|
||||
<property name="bottom_attach">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="btnSix">
|
||||
<property name="label" translatable="yes">6</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_btnSix_clicked"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
<property name="right_attach">3</property>
|
||||
<property name="top_attach">2</property>
|
||||
<property name="bottom_attach">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="btnSeven">
|
||||
<property name="label" translatable="yes">7</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_btnSeven_clicked"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="top_attach">3</property>
|
||||
<property name="bottom_attach">4</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="btnEight">
|
||||
<property name="label" translatable="yes">8</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_btnEight_clicked"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">3</property>
|
||||
<property name="bottom_attach">4</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="btnNine">
|
||||
<property name="label" translatable="yes">9</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_btnNine_clicked"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
<property name="right_attach">3</property>
|
||||
<property name="top_attach">3</property>
|
||||
<property name="bottom_attach">4</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="btnZero">
|
||||
<property name="label" translatable="yes">0</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_btnZero_clicked"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">4</property>
|
||||
<property name="bottom_attach">5</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="btnOk">
|
||||
<property name="label">Ok</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_btnOk_clicked"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
<property name="right_attach">3</property>
|
||||
<property name="top_attach">4</property>
|
||||
<property name="bottom_attach">5</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="btnDel">
|
||||
<property name="label">Entf</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_btnDel_clicked"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="top_attach">4</property>
|
||||
<property name="bottom_attach">5</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkRadioButton" id="rdioPUK">
|
||||
<property name="label" translatable="yes">PUK</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
<property name="group">rdioCAN</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
<property name="right_attach">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkRadioButton" id="rdioPIN">
|
||||
<property name="label" translatable="yes">PIN</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
<property name="group">rdioCAN</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkRadioButton" id="rdioCAN">
|
||||
<property name="label" translatable="yes">CAN</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="active">True</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">4</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkWindow" id="progWindow">
|
||||
<property name="type">popup</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="default_width">240</property>
|
||||
<property name="default_height">120</property>
|
||||
<property name="destroy_with_parent">True</property>
|
||||
<property name="type_hint">popup-menu</property>
|
||||
<property name="skip_taskbar_hint">True</property>
|
||||
<property name="deletable">False</property>
|
||||
<property name="transient_for">MainWindow</property>
|
||||
<property name="opacity">0.90000000022351745</property>
|
||||
<child>
|
||||
<object class="GtkVBox" id="vbox2">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="lblCaption">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes"><span font_weight="bold" font="11">PACE Progress</span></property>
|
||||
<property name="use_markup">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkProgressBar" id="progBar">
|
||||
<property name="visible">True</property>
|
||||
<property name="activity_mode">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</interface>
|
||||
4
pace-gui/src/pinpad.in
Normal file
4
pace-gui/src/pinpad.in
Normal file
@@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
|
||||
cd "PYTHONDIR"
|
||||
PYTHONBIN "PYTHONDIR/pinpad.py" "$@"
|
||||
172
pace-gui/src/pinpad.py
Normal file
172
pace-gui/src/pinpad.py
Normal file
@@ -0,0 +1,172 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import sys, os
|
||||
import subprocess
|
||||
import time
|
||||
try:
|
||||
import pygtk
|
||||
pygtk.require("2.0")
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
import gtk, gobject
|
||||
import pango
|
||||
except:
|
||||
sys.exit(1)
|
||||
|
||||
#GUITARGET is set by the build system
|
||||
PATH = GUITARGET
|
||||
|
||||
class PinpadGTK:
|
||||
"""This a simple GTK based GUI to enter a PIN"""
|
||||
|
||||
btn_names = ["btnOne", "btnTwo", "btnThree", "btnFour", "btnFive", "btnSix",
|
||||
"btnSeven", "btnEight", "btnNine", "btnDel", "btnZero", "btnOk" ]
|
||||
|
||||
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 = PATH+"pinpad.glade"
|
||||
self.builder = gtk.Builder()
|
||||
self.builder.add_from_file(self.gladefile)
|
||||
|
||||
#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()
|
||||
|
||||
p = subprocess.Popen(["pace-tool", param, "-v"], stdout=subprocess.PIPE,
|
||||
env=env_arg, close_fds=True)
|
||||
|
||||
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()
|
||||
Reference in New Issue
Block a user