Hardware authentication for Linux using ordinary USB Flash Drives.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

157 lines
5.3 KiB

#!/usr/bin/env python2.4
import dbus
import sys
from xml.dom import minidom
class Device:
def __init__(self, udi):
self.__udi = udi
self.__findStorageDevice()
deviceObj = bus.get_object('org.freedesktop.Hal',
udi)
deviceProperties = deviceObj.GetAllProperties(
dbus_interface = 'org.freedesktop.Hal.Device')
self.vendor = deviceProperties['usb_device.vendor']
self.product = deviceProperties['info.product']
self.serialNumber = deviceProperties['usb_device.serial']
def __findStorageDevice(self):
for child in halManager.FindDeviceByCapability('storage'):
obj = bus.get_object('org.freedesktop.Hal',
child)
properties = obj.GetAllProperties(
dbus_interface = 'org.freedesktop.Hal.Device')
if properties['storage.physical_device'] == self.__udi + '_if0':
self.__storageUdi = child
return
raise Exception, '%s is not a storage device.' % self.__udi
def __repr__(self):
return "%s %s (%s)" % (self.vendor, self.product, self.serialNumber)
def volumes(self):
vols = []
for volume in halManager.FindDeviceByCapability('volume'):
deviceObj = bus.get_object('org.freedesktop.Hal',
volume)
deviceProperties = deviceObj.GetAllProperties(
dbus_interface = 'org.freedesktop.Hal.Device')
if deviceProperties['block.storage_device'] != self.__storageUdi:
continue
vols.append({'uuid' : deviceProperties['volume.uuid'],
'device' : deviceProperties['block.device']})
return vols
def listOptions(question, options, force = False):
if force == False and len(options) == 1:
return 0
while True:
try:
print question
for i in range(len(options)):
print "%d) %s" % (i, options[i])
print
sys.stdout.write('[%s-%s]: ' % (0, len(options) - 1))
optionId = int(sys.stdin.readline())
print
if optionId not in range(len(options)):
raise Exception
return optionId
except KeyboardInterrupt: sys.exit()
except Exception: pass
else: break
def addDevice(options):
devices = []
for udi in halManager.FindDeviceStringMatch('info.bus', 'usb_device'):
try:
devices.append(Device(udi))
except Exception, ex:
pass
if len(devices) == 0:
print 'No devices detected.'
sys.exit()
device = devices[listOptions("Please select the device you wish to add.",
devices, force = options['force'])]
volumes = device.volumes()
volume = volumes[listOptions("Which volume would you like to use for " \
"storing data ?",
["%s (UUID: %s)" % (volume['device'],
volume['uuid'])
for volume in volumes],
force = options['force'])]
print 'Name\t\t: %s' % options['deviceName']
print 'Vendor\t\t: %s' % device.vendor
print 'Model\t\t: %s' % device.product
print 'Serial\t\t: %s' % device.serialNumber
print 'Volume UUID\t: %s (%s)' % (volume['uuid'], volume['device'])
print
print 'Save device to %s ?' % options['configFile']
sys.stdout.write('[y/n] ')
if sys.stdin.readline().strip() != 'y':
sys.exit(1)
doc = minidom.parse(options['configFile'])
devs = doc.getElementsByTagName('devices')
dev = doc.createElement('device')
dev.attributes['id'] = options['deviceName']
devs[0].appendChild(dev)
for name, value in (('vendor', device.vendor),
('model', device.product),
('serial', device.serialNumber),
('volume_uuid', volume['uuid'])):
e = doc.createElement(name)
t = doc.createTextNode(value)
e.appendChild(t)
dev.appendChild(e)
f = open(options['configFile'], 'w')
f.write(doc.toxml())
f.close()
print 'Done.'
def usage():
print 'Usage: %s [--config file] --add-device <name> [--no-autodetect]' % sys.argv[0]
sys.exit(1)
import getopt
try:
opts, args = getopt.getopt(sys.argv[1:], "ha:nc:",
["help", "add-device=", "no-autodetect",
"config="])
except getopt.GetoptError:
usage()
if len(args) != 0:
usage()
options = { 'force' : False, 'deviceName' : None,
'configFile' : '/etc/pam_usb/pusb.conf' }
for o, a in opts:
if o in ("-h", "--help"):
usage()
if o in ("-a", "--add-device"):
options['deviceName'] = a
if o in ("-n", "--no-autodetect"):
options['force'] = True
if o in ("-c", "--config"):
options['configFile'] = a
if options['deviceName'] is None:
usage()
bus = dbus.SystemBus()
halService = bus.get_object('org.freedesktop.Hal',
'/org/freedesktop/Hal/Manager')
halManager = dbus.Interface(halService, 'org.freedesktop.Hal.Manager')
addDevice(options)