from .tls import tls from .util import assert_status from binascii import hexlify from .blobs import db_write_enable from .flash import call_cleanups from .sid import * class UserStorage(): def __init__(self, dbid, name): self.dbid=dbid self.name=name self.users=[] def __repr__(self): return '' % (self.dbid, repr(self.name), repr(self.users)) class User(): def __init__(self, dbid, identity): self.dbid=dbid self.identity=identity self.fingers=[] def __repr__(self): return '' % (self.dbid, repr(self.identity), repr(self.fingers)) def subtype_to_string(s): if s < 0xf5 or s > 0xfe: return 'Unknown' return 'WINBIO_FINGER_UNSPECIFIED_POS_%02d' % (s - 0xf5 + 1) def parse_user_storage(rsp): rc, = unpack(' 0: raise Exception('Junk at the end of the storage info response: %s' % rsp.hex()) storage=UserStorage(recid, name) while len(usrtab) > 0: rec, usrtab = usrtab[:4], usrtab[4:] urid, valsz = unpack(' 0: raise Exception('Junk at the end of the user info response: %s' % rsp.hex()) identity = parse_identity(identity) user=User(recid, identity) while len(fingertab) > 0: rec, fingertab = fingertab[:8], fingertab[8:] frid, subtype, stgid, valsz = unpack('' % ( self.dbid, self.type, self.storage, repr(self.value), repr(self.children) ) class Db(): class Info(): def __init__(self, total, used, free, records, roots): self.total = total # partition size self.used = used # used (not deleted) self.free = free # unallocated space self.records = records # total number, including deleted self.roots = roots def __repr__(self): return 'Db.Info(total=%d, used=%d, free=%d, records=%d, roots=%s)' % ( self.total, self.used, self.free, self.records, repr(self.roots)) def get_user_storage(self, dbid=0, name=''): name=name.encode() if len(name) > 0: name += b'\0' return parse_user_storage(tls.cmd(pack(' 80: val = val[:80] + '...' print('%s%d (type %d) %s' % (' '*depth, rec.dbid, rec.type, val)) rec = self.get_record_children(root) for c in rec.children: self.dump_raw(c['dbid'], depth+1) def dump_all(self): stg = self.get_user_storage(name='StgWindsor') usrs = [self.get_user(u['dbid']) for u in stg.users] for u in usrs: print('%2d: User %s with %d fingers:' % (u.dbid, repr(u.identity), len(u.fingers))) for f in u.fingers: print(' %2d: %02x (%s)' % (f['dbid'], f['subtype'], subtype_to_string(f['subtype']))) db = Db()