164 lines
4.8 KiB
Python
164 lines
4.8 KiB
Python
|
|
import dbus
|
|
import dbus.mainloop.glib
|
|
import dbus.service
|
|
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
|
|
from gi.repository import GObject, GLib
|
|
import logging
|
|
|
|
from proto9x import init
|
|
from proto9x.tls import tls
|
|
from proto9x.usb import usb
|
|
from proto9x.sid import sid_from_string
|
|
from proto9x.db import subtype_to_string, db
|
|
from proto9x.sensor import sensor, reboot
|
|
import pwd
|
|
import atexit
|
|
import signal
|
|
|
|
GLib.threads_init()
|
|
|
|
INTERFACE_NAME='io.github.uunicorn.Fprint.Device'
|
|
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
|
|
|
|
bus = dbus.SystemBus()
|
|
bus_name = dbus.service.BusName('io.github.uunicorn.Fprint', bus)
|
|
|
|
loop = GObject.MainLoop()
|
|
|
|
usb.quit = lambda e: loop.quit()
|
|
|
|
|
|
def uid2identity(uid):
|
|
sidstr='S-1-5-21-111111111-1111111111-1111111111-%d' % uid
|
|
return sid_from_string(sidstr)
|
|
|
|
class Device(dbus.service.Object):
|
|
def __init__(self):
|
|
dbus.service.Object.__init__(self, bus_name, '/io/github/uunicorn/Fprint/Device')
|
|
|
|
@dbus.service.method(dbus_interface=INTERFACE_NAME,
|
|
in_signature="s",
|
|
out_signature="as")
|
|
def ListEnrolledFingers(self, usr):
|
|
try:
|
|
logging.debug('In ListEnrolledFingers %s' % usr)
|
|
|
|
pw=pwd.getpwnam(usr)
|
|
uid=pw.pw_uid
|
|
usr=db.lookup_user(uid2identity(uid))
|
|
|
|
if usr == None:
|
|
return []
|
|
|
|
rc = [subtype_to_string(f['subtype']) for f in usr.fingers]
|
|
print(repr(rc))
|
|
return rc
|
|
except Exception as e:
|
|
raise e
|
|
|
|
@dbus.service.method(dbus_interface=INTERFACE_NAME,
|
|
in_signature='s',
|
|
out_signature='')
|
|
def DeleteEnrolledFingers(self, user):
|
|
logging.debug('In DeleteEnrolledFingers %s' % user)
|
|
pw=pwd.getpwnam(user)
|
|
usr=db.lookup_user(uid2identity(pw.pw_uid))
|
|
|
|
if usr == None:
|
|
return
|
|
|
|
db.del_record(usr.dbid)
|
|
|
|
def do_scan(self):
|
|
if self.capturing:
|
|
return
|
|
|
|
try:
|
|
self.capturing = True
|
|
z=identify()
|
|
except Exception as e:
|
|
#loop.quit();
|
|
raise e
|
|
finally:
|
|
self.capturing = False
|
|
|
|
@dbus.service.method(dbus_interface=INTERFACE_NAME,
|
|
in_signature='ss',
|
|
out_signature='')
|
|
def VerifyStart(self, user, finger):
|
|
logging.debug('In VerifyStart %s' % finger)
|
|
|
|
def complete_cb(rsp, e):
|
|
if e is not None:
|
|
self.VerifyStatus('verify-no-match', True)
|
|
else:
|
|
self.VerifyStatus('verify-match', True)
|
|
usrid, subtype, hsh = rsp
|
|
# TODO pass down the user DB id
|
|
# check that a correct finger was identified
|
|
|
|
def update_cb(e):
|
|
self.VerifyStatus('verify-retry-scan', False)
|
|
|
|
sensor.identify(update_cb, complete_cb)
|
|
|
|
@dbus.service.method(dbus_interface=INTERFACE_NAME,
|
|
in_signature='',
|
|
out_signature='')
|
|
def Cancel(self):
|
|
sensor.cancel()
|
|
|
|
def do_enroll(self, finger_name, uid):
|
|
# it is pointless to try and remember username passed in claim as Gnome does not seem to be passing anything useful anyway
|
|
try:
|
|
# TODO hardcode the username and finger for now
|
|
z=enroll(uid2identity(uid), 0xf5)
|
|
print('Enroll was successfull')
|
|
self.EnrollStatus('enroll-completed', True)
|
|
except Exception as e:
|
|
self.EnrollStatus('enroll-failed', True)
|
|
#loop.quit();
|
|
raise e
|
|
|
|
@dbus.service.method(dbus_interface=INTERFACE_NAME,
|
|
in_signature='ss',
|
|
out_signature='')
|
|
def EnrollStart(self, user, finger_name):
|
|
logging.debug('In EnrollStart %s for %s' % (finger_name, user))
|
|
pw=pwd.getpwnam(user)
|
|
uid=pw.pw_uid
|
|
def update_cb(rsp, e):
|
|
if e is not None:
|
|
self.EnrollStatus('enroll-retry-scan', False)
|
|
else:
|
|
self.EnrollStatus('enroll-stage-passed', False)
|
|
|
|
def complete_cb(rsp, e):
|
|
if e is not None:
|
|
self.EnrollStatus('enroll-failed', True)
|
|
else:
|
|
self.EnrollStatus('enroll-completed', True)
|
|
|
|
sensor.enroll(uid2identity(uid), 0xf5, update_cb, complete_cb) # TODO parse the finger name
|
|
|
|
@dbus.service.signal(dbus_interface=INTERFACE_NAME, signature='sb')
|
|
def VerifyStatus(self, result, done):
|
|
logging.debug('VerifyStatus')
|
|
|
|
@dbus.service.signal(dbus_interface=INTERFACE_NAME, signature='sb')
|
|
def EnrollStatus(self, result, done):
|
|
logging.debug('EnrollStatus')
|
|
|
|
|
|
init.open()
|
|
|
|
usb.trace_enabled = True
|
|
tls.trace_enabled = True
|
|
|
|
svc = Device()
|
|
loop.run()
|
|
|
|
print("Normal exit")
|