Blame tests/dbusmock/fprintd.py

Packit Service 8ebd8e
# -*- coding: utf-8 -*-
Packit Service 8ebd8e
Packit Service 8ebd8e
'''fprintd mock template
Packit Service 8ebd8e
Packit Service 8ebd8e
This creates the expected methods and properties of the
Packit Service 8ebd8e
net.reactivated.Fprint.Manager object (/net/reactivated/Fprint/Manager)
Packit Service 8ebd8e
but no devices.
Packit Service 8ebd8e
'''
Packit Service 8ebd8e
Packit Service 8ebd8e
# This program is free software; you can redistribute it and/or modify it under
Packit Service 8ebd8e
# the terms of the GNU Lesser General Public License as published by the Free
Packit Service 8ebd8e
# Software Foundation; either version 3 of the License, or (at your option) any
Packit Service 8ebd8e
# later version.  See http://www.gnu.org/copyleft/lgpl.html for the full text
Packit Service 8ebd8e
# of the license.
Packit Service 8ebd8e
Packit Service 8ebd8e
__author__ = 'Bastien Nocera'
Packit Service 8ebd8e
__email__ = 'hadess@hadess.net'
Packit Service 8ebd8e
__copyright__ = '(c) 2020 Red Hat Inc.'
Packit Service 8ebd8e
__license__ = 'LGPL 3+'
Packit Service 8ebd8e
Packit Service 8ebd8e
import sys
Packit Service 8ebd8e
from gi.repository import GLib
Packit Service 8ebd8e
import dbus
Packit Service 8ebd8e
import asyncio
Packit Service 8ebd8e
Packit Service 8ebd8e
from dbusmock import MOCK_IFACE, mockobject
Packit Service 8ebd8e
Packit Service 8ebd8e
BUS_NAME = 'net.reactivated.Fprint'
Packit Service 8ebd8e
MAIN_OBJ = '/net/reactivated/Fprint/Manager'
Packit Service 8ebd8e
SYSTEM_BUS = True
Packit Service 8ebd8e
IS_OBJECT_MANAGER = False
Packit Service 8ebd8e
Packit Service 8ebd8e
MAIN_IFACE = 'net.reactivated.Fprint.Manager'
Packit Service 8ebd8e
MANAGER_MOCK_IFACE = 'net.reactivated.Fprint.Manager.Mock'
Packit Service 8ebd8e
Packit Service 8ebd8e
DEVICE_IFACE = 'net.reactivated.Fprint.Device'
Packit Service 8ebd8e
DEVICE_MOCK_IFACE = 'net.reactivated.Fprint.Device.Mock'
Packit Service 8ebd8e
Packit Service 8ebd8e
VALID_FINGER_NAMES = [
Packit Service 8ebd8e
    'left-thumb',
Packit Service 8ebd8e
    'left-index-finger',
Packit Service 8ebd8e
    'left-middle-finger',
Packit Service 8ebd8e
    'left-ring-finger',
Packit Service 8ebd8e
    'left-little-finger',
Packit Service 8ebd8e
    'right-thumb',
Packit Service 8ebd8e
    'right-index-finger',
Packit Service 8ebd8e
    'right-middle-finger',
Packit Service 8ebd8e
    'right-ring-finger',
Packit Service 8ebd8e
    'right-little-finger'
Packit Service 8ebd8e
]
Packit Service 8ebd8e
Packit Service 8ebd8e
VALID_VERIFY_STATUS = [
Packit Service 8ebd8e
    'verify-no-match',
Packit Service 8ebd8e
    'verify-match',
Packit Service 8ebd8e
    'verify-retry-scan',
Packit Service 8ebd8e
    'verify-swipe-too-short',
Packit Service 8ebd8e
    'verify-finger-not-centered',
Packit Service 8ebd8e
    'verify-remove-and-retry',
Packit Service 8ebd8e
    'verify-disconnected',
Packit Service 8ebd8e
    'verify-unknown-error'
Packit Service 8ebd8e
]
Packit Service 8ebd8e
Packit Service 8ebd8e
VALID_ENROLL_STATUS = [
Packit Service 8ebd8e
    'enroll-completed',
Packit Service 8ebd8e
    'enroll-failed',
Packit Service 8ebd8e
    'enroll-stage-passed',
Packit Service 8ebd8e
    'enroll-retry-scan',
Packit Service 8ebd8e
    'enroll-swipe-too-short',
Packit Service 8ebd8e
    'enroll-finger-not-centered',
Packit Service 8ebd8e
    'enroll-remove-and-retry',
Packit Service 8ebd8e
    'enroll-data-full',
Packit Service 8ebd8e
    'enroll-disconnected',
Packit Service 8ebd8e
    'enroll-unknown-error'
Packit Service 8ebd8e
]
Packit Service 8ebd8e
Packit Service 8ebd8e
def load(mock, parameters):
Packit Service 8ebd8e
    fprintd = mockobject.objects[MAIN_OBJ]
Packit Service 8ebd8e
    mock.last_device_id = 0
Packit Service 8ebd8e
    fprintd.fingers = {}
Packit Service 8ebd8e
    mock.loop = asyncio.new_event_loop()
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(MAIN_IFACE,
Packit Service 8ebd8e
                     in_signature='', out_signature='ao')
Packit Service 8ebd8e
def GetDevices(self):
Packit Service 8ebd8e
    return [(k) for k in mockobject.objects.keys() if "/Device/" in k]
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(MAIN_IFACE,
Packit Service 8ebd8e
                     in_signature='', out_signature='o')
Packit Service 8ebd8e
def GetDefaultDevice(self):
Packit Service 8ebd8e
    devices = self.GetDevices()
Packit Service 8ebd8e
    if len(devices) < 1:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'No devices available',
Packit Service 8ebd8e
            name='net.reactivated.Fprint.Error.NoSuchDevice')
Packit Service 8ebd8e
    return devices[0]
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(MANAGER_MOCK_IFACE,
Packit Service 8ebd8e
                     in_signature='sisb', out_signature='s')
Packit Service 8ebd8e
def AddDevice(self, device_name, num_enroll_stages, scan_type,
Packit Service 8ebd8e
    has_identification=False):
Packit Service 8ebd8e
    '''Convenience method to add a fingerprint reader device
Packit Service 8ebd8e
Packit Service 8ebd8e
    You have to specify a device name, the number of enrollment
Packit Service 8ebd8e
    stages it would use (> 0) and the scan type, as a string
Packit Service 8ebd8e
    (either 'press' or 'swipe')
Packit Service 8ebd8e
    '''
Packit Service 8ebd8e
Packit Service 8ebd8e
    if scan_type not in ['swipe', 'press']:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Invalid scan_type \'%s\'.' % scan_type,
Packit Service 8ebd8e
            name='org.freedesktop.DBus.Error.InvalidArgs')
Packit Service 8ebd8e
Packit Service 8ebd8e
    if num_enroll_stages <= 0:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Invalid num_enroll_stages \'%s\'.' % num_enroll_stages,
Packit Service 8ebd8e
            name='org.freedesktop.DBus.Error.InvalidArgs')
Packit Service 8ebd8e
Packit Service 8ebd8e
    self.last_device_id += 1
Packit Service 8ebd8e
    path = '/net/reactivated/Fprint/Device/%d' % self.last_device_id
Packit Service 8ebd8e
    device_properties = {
Packit Service 8ebd8e
        'name': dbus.String(device_name, variant_level=1),
Packit Service 8ebd8e
        'num-enroll-stages': dbus.Int32(num_enroll_stages, variant_level=1),
Packit Service 8ebd8e
        'scan-type': scan_type
Packit Service 8ebd8e
    }
Packit Service 8ebd8e
Packit Service 8ebd8e
    self.AddObject(path,
Packit Service 8ebd8e
                   DEVICE_IFACE,
Packit Service 8ebd8e
                   # Properties
Packit Service 8ebd8e
                   device_properties,
Packit Service 8ebd8e
                   # Methods
Packit Service 8ebd8e
                   [
Packit Service 8ebd8e
                       ('ListEnrolledFingers', 's', 'as', ListEnrolledFingers),
Packit Service 8ebd8e
                       ('DeleteEnrolledFingers', 's', '', DeleteEnrolledFingers),
Packit Service 8ebd8e
                       ('DeleteEnrolledFingers2', '', '', DeleteEnrolledFingers2),
Packit Service 8ebd8e
                       ('Claim', 's', '', Claim),
Packit Service 8ebd8e
                       ('Release', '', '', Release),
Packit Service 8ebd8e
                       ('VerifyStart', 's', '', VerifyStart),
Packit Service 8ebd8e
                       ('VerifyStop', '', '', VerifyStop),
Packit Service 8ebd8e
                       ('EnrollStart', 's', '', EnrollStart),
Packit Service 8ebd8e
                       ('EnrollStop', '', '', EnrollStop)
Packit Service 8ebd8e
    ])
Packit Service 8ebd8e
Packit Service 8ebd8e
    device = mockobject.objects[path]
Packit Service 8ebd8e
    device.fingers = {}
Packit Service 8ebd8e
    device.has_identification = has_identification
Packit Service 8ebd8e
    device.claimed_user = None
Packit Service 8ebd8e
    device.action = None
Packit Service 8ebd8e
    device.selected_finger = None
Packit Service 8ebd8e
    device.verify_script = []
Packit Service 8ebd8e
Packit Service 8ebd8e
    return path
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(MANAGER_MOCK_IFACE,
Packit Service 8ebd8e
                     in_signature='o')
Packit Service 8ebd8e
def RemoveDevice(self, path):
Packit Service 8ebd8e
    # This isn't compatible with hotplugging devices, which fprintd doesn't
Packit Service 8ebd8e
    # support yet, but it's meant to remove devices added to the mock for
Packit Service 8ebd8e
    # testing purposes.
Packit Service 8ebd8e
    if not path:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Invalid empty path.',
Packit Service 8ebd8e
            name='org.freedesktop.DBus.Error.InvalidArgs')
Packit Service 8ebd8e
Packit Service 8ebd8e
    self.RemoveObject(path)
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(DEVICE_IFACE,
Packit Service 8ebd8e
                     in_signature='s', out_signature='as')
Packit Service 8ebd8e
def ListEnrolledFingers(device, user):
Packit Service 8ebd8e
    if user in device.fingers:
Packit Service 8ebd8e
        return device.fingers[user]
Packit Service 8ebd8e
    raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
        'No enrolled prints in device %s for user %s' % (device.path, user),
Packit Service 8ebd8e
        name='net.reactivated.Fprint.Error.NoEnrolledPrints')
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(DEVICE_IFACE,
Packit Service 8ebd8e
                     in_signature='s', out_signature='')
Packit Service 8ebd8e
def DeleteEnrolledFingers(device, user):
Packit Service 8ebd8e
    device.fingers[user] = []
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(DEVICE_IFACE,
Packit Service 8ebd8e
                     in_signature='', out_signature='')
Packit Service 8ebd8e
def DeleteEnrolledFingers2(device):
Packit Service 8ebd8e
    if not device.claimed_user:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Device was not claimed before use',
Packit Service 8ebd8e
            name='net.reactivated.Fprint.Error.ClaimDevice')
Packit Service 8ebd8e
    device.fingers[device.claimed_user] = []
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(DEVICE_IFACE,
Packit Service 8ebd8e
                     in_signature='s', out_signature='')
Packit Service 8ebd8e
def Claim(device, user):
Packit Service 8ebd8e
    if device.claimed_user:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Device already in use by %s' % device.claimed_user,
Packit Service 8ebd8e
            name='net.reactivated.Fprint.Error.AlreadyInUse')
Packit Service 8ebd8e
Packit Service 8ebd8e
    device.claimed_user = user
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(DEVICE_IFACE,
Packit Service 8ebd8e
                     in_signature='', out_signature='')
Packit Service 8ebd8e
def Release(device):
Packit Service 8ebd8e
    if not device.claimed_user:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Device was not claimed before use',
Packit Service 8ebd8e
            name='net.reactivated.Fprint.Error.ClaimDevice')
Packit Service 8ebd8e
    device.claimed_user = None
Packit Service 8ebd8e
    device.action = None
Packit Service 8ebd8e
    device.selected_finger = None
Packit Service 8ebd8e
Packit Service 8ebd8e
def can_verify_finger(device, finger_name):
Packit Service 8ebd8e
    # We should already have checked that there are enrolled fingers
Packit Service 8ebd8e
    if finger_name == 'any':
Packit Service 8ebd8e
        return True
Packit Service 8ebd8e
    if finger_name in device.fingers[device.claimed_user]:
Packit Service 8ebd8e
        return True
Packit Service 8ebd8e
    return False
Packit Service 8ebd8e
Packit Service 8ebd8e
def glib_sleep(timeout):
Packit Service 8ebd8e
    waiting = True
Packit Service 8ebd8e
Packit Service 8ebd8e
    def done_waiting():
Packit Service 8ebd8e
        nonlocal waiting
Packit Service 8ebd8e
        waiting = False
Packit Service 8ebd8e
Packit Service 8ebd8e
    GLib.timeout_add(timeout, done_waiting)
Packit Service 8ebd8e
    while (waiting):
Packit Service 8ebd8e
        GLib.main_context_default().iteration(True)
Packit Service 8ebd8e
Packit Service 8ebd8e
def device_run_script(device, result, done):
Packit Service 8ebd8e
    if result == 'MOCK: quit':
Packit Service 8ebd8e
        sys.exit(0)
Packit Service 8ebd8e
Packit Service 8ebd8e
    # Emit signal
Packit Service 8ebd8e
    device.EmitSignal(DEVICE_IFACE, 'VerifyStatus', 'sb', [
Packit Service 8ebd8e
                        result,
Packit Service 8ebd8e
                        done
Packit Service 8ebd8e
                      ])
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(DEVICE_IFACE,
Packit Service 8ebd8e
                     in_signature='s', out_signature='')
Packit Service 8ebd8e
def VerifyStart(device, finger_name):
Packit Service 8ebd8e
    if not device.claimed_user:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Device was not claimed before use',
Packit Service 8ebd8e
            name='net.reactivated.Fprint.Error.ClaimDevice')
Packit Service 8ebd8e
    if device.claimed_user not in device.fingers:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'No enrolled prints for user \'%s\'' % device.claimed_user,
Packit Service 8ebd8e
            name='net.reactivated.Fprint.Error.NoEnrolledPrints')
Packit Service 8ebd8e
    if not finger_name:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Invalid empty finger_name.',
Packit Service 8ebd8e
            name='org.freedesktop.DBus.Error.InvalidArgs')
Packit Service 8ebd8e
    if not can_verify_finger(device, finger_name):
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Finger \'%s\' not enrolled.' % finger_name,
Packit Service 8ebd8e
            name='org.freedesktop.DBus.Error.Internal')
Packit Service 8ebd8e
    if device.action:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Action \'%s\' already in progress' % device.action,
Packit Service 8ebd8e
            name='net.reactivated.Fprint.Error.AlreadyInUse')
Packit Service 8ebd8e
    device.action = 'verify'
Packit Service 8ebd8e
Packit Service 8ebd8e
    if finger_name == 'any' and not device.has_identification:
Packit Service 8ebd8e
        finger_name = device.fingers[device.claimed_user][0]
Packit Service 8ebd8e
    device.selected_finger = finger_name
Packit Service 8ebd8e
    # Needs to happen after method return
Packit Service 8ebd8e
    GLib.idle_add(device.EmitSignal,
Packit Service 8ebd8e
                  DEVICE_IFACE, 'VerifyFingerSelected', 's', [
Packit Service 8ebd8e
                    device.selected_finger
Packit Service 8ebd8e
                  ])
Packit Service 8ebd8e
Packit Service 8ebd8e
    error = None
Packit Service 8ebd8e
    base_delay = 0
Packit Service 8ebd8e
    while device.verify_script is not None and len(device.verify_script) > 0:
Packit Service 8ebd8e
        result, done, timeout = device.verify_script.pop(0)
Packit Service 8ebd8e
Packit Service 8ebd8e
        # We stop when "timeout >= 0 and done"
Packit Service 8ebd8e
        if result == 'MOCK: no-prints':
Packit Service 8ebd8e
            # Special case to change return value of DBus call, ignores timeout
Packit Service 8ebd8e
            error = dbus.exceptions.DBusException(
Packit Service 8ebd8e
                'No enrolled prints for user \'%s\'' % device.claimed_user,
Packit Service 8ebd8e
                name='net.reactivated.Fprint.Error.NoEnrolledPrints')
Packit Service 8ebd8e
Packit Service 8ebd8e
        elif timeout < 0:
Packit Service 8ebd8e
            # Negative timeouts mean emitting before the DBus call returns
Packit Service 8ebd8e
            device_run_script(device, result, done)
Packit Service 8ebd8e
            glib_sleep(-timeout)
Packit Service 8ebd8e
Packit Service 8ebd8e
        else:
Packit Service 8ebd8e
            # Positive or zero means emitting afterwards the given timeout
Packit Service 8ebd8e
            base_delay += timeout
Packit Service 8ebd8e
            GLib.timeout_add(base_delay,
Packit Service 8ebd8e
                             device_run_script,
Packit Service 8ebd8e
                             device,
Packit Service 8ebd8e
                             result,
Packit Service 8ebd8e
                             done)
Packit Service 8ebd8e
Packit Service 8ebd8e
            # Stop processing commands when the done flag is set
Packit Service 8ebd8e
            if done:
Packit Service 8ebd8e
                break
Packit Service 8ebd8e
Packit Service 8ebd8e
    if error:
Packit Service 8ebd8e
        raise error
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(DEVICE_MOCK_IFACE,
Packit Service 8ebd8e
                     in_signature='sb', out_signature='')
Packit Service 8ebd8e
def EmitVerifyStatus(device, result, done):
Packit Service 8ebd8e
    if (not device.action) or (device.action != 'verify'):
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Cannot send verify statuses when not verifying',
Packit Service 8ebd8e
            name='org.freedesktop.DBus.Error.InvalidArgs')
Packit Service 8ebd8e
    if result not in VALID_VERIFY_STATUS:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Unknown verify status \'%s\'' % result,
Packit Service 8ebd8e
            name='org.freedesktop.DBus.Error.InvalidArgs')
Packit Service 8ebd8e
    device.EmitSignal(DEVICE_IFACE, 'VerifyStatus', 'sb', [
Packit Service 8ebd8e
                          result,
Packit Service 8ebd8e
                          done
Packit Service 8ebd8e
                      ])
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(DEVICE_IFACE,
Packit Service 8ebd8e
                     in_signature='', out_signature='')
Packit Service 8ebd8e
def VerifyStop(device):
Packit Service 8ebd8e
    if device.action != 'verify':
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'No verification to stop',
Packit Service 8ebd8e
            name='net.reactivated.Fprint.Error.NoActionInProgress')
Packit Service 8ebd8e
    device.action = None
Packit Service 8ebd8e
    device.selected_finger = None
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(DEVICE_IFACE,
Packit Service 8ebd8e
                     in_signature='s', out_signature='')
Packit Service 8ebd8e
def EnrollStart(device, finger_name):
Packit Service 8ebd8e
    if finger_name not in VALID_FINGER_NAMES:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Invalid finger name \'%s\'' % finger_name,
Packit Service 8ebd8e
            name='net.reactivated.Fprint.Error.InvalidFingername')
Packit Service 8ebd8e
    if not device.claimed_user:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Device was not claimed before use',
Packit Service 8ebd8e
            name='net.reactivated.Fprint.Error.ClaimDevice')
Packit Service 8ebd8e
    if device.action:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Action \'%s\' already in progress' % device.action,
Packit Service 8ebd8e
            name='net.reactivated.Fprint.Error.AlreadyInUse')
Packit Service 8ebd8e
    device.action = 'enroll'
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(DEVICE_MOCK_IFACE,
Packit Service 8ebd8e
                     in_signature='sb', out_signature='')
Packit Service 8ebd8e
def EmitEnrollStatus(device, result, done):
Packit Service 8ebd8e
    if (not device.action) or (device.action != 'enroll'):
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Cannot send enroll statuses when not enrolling',
Packit Service 8ebd8e
            name='org.freedesktop.DBus.Error.InvalidArgs')
Packit Service 8ebd8e
    if result not in VALID_ENROLL_STATUS:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Unknown enroll status \'%s\'' % result,
Packit Service 8ebd8e
            name='org.freedesktop.DBus.Error.InvalidArgs')
Packit Service 8ebd8e
    device.EmitSignal(DEVICE_IFACE, 'EnrollStatus', 'sb', [
Packit Service 8ebd8e
                          result,
Packit Service 8ebd8e
                          done
Packit Service 8ebd8e
                      ])
Packit Service 8ebd8e
    # FIXME save enrolled finger?
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(DEVICE_IFACE,
Packit Service 8ebd8e
                     in_signature='', out_signature='')
Packit Service 8ebd8e
def EnrollStop(device):
Packit Service 8ebd8e
    if device.action != 'enroll':
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'No enrollment to stop',
Packit Service 8ebd8e
            name='net.reactivated.Fprint.Error.NoActionInProgress')
Packit Service 8ebd8e
    device.action = None
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(DEVICE_MOCK_IFACE,
Packit Service 8ebd8e
                     in_signature='sas', out_signature='')
Packit Service 8ebd8e
def SetEnrolledFingers(device, user, fingers):
Packit Service 8ebd8e
    '''Convenience method to set the list of enrolled fingers.
Packit Service 8ebd8e
Packit Service 8ebd8e
    The device_path is the return value from AddDevice(), and the
Packit Service 8ebd8e
    array of fingers must only contain valid finger names.
Packit Service 8ebd8e
Packit Service 8ebd8e
    Returns nothing.
Packit Service 8ebd8e
    '''
Packit Service 8ebd8e
Packit Service 8ebd8e
    for k in fingers:
Packit Service 8ebd8e
        if k not in VALID_FINGER_NAMES:
Packit Service 8ebd8e
            raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
                'Invalid finger name \'%s\'' % k,
Packit Service 8ebd8e
                name='org.freedesktop.DBus.Error.InvalidArgs')
Packit Service 8ebd8e
Packit Service 8ebd8e
    device.fingers[user] = fingers
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(DEVICE_MOCK_IFACE,
Packit Service 8ebd8e
                     in_signature='', out_signature='s')
Packit Service 8ebd8e
def GetSelectedFinger(device):
Packit Service 8ebd8e
    '''Convenience method to get the finger under verification
Packit Service 8ebd8e
Packit Service 8ebd8e
    Returns the finger name that the user has selected for verifying
Packit Service 8ebd8e
    '''
Packit Service 8ebd8e
    if not device.selected_finger:
Packit Service 8ebd8e
        raise dbus.exceptions.DBusException(
Packit Service 8ebd8e
            'Device is not verifying',
Packit Service 8ebd8e
            name='net.reactivated.Fprint.Error.NoActionInProgress')
Packit Service 8ebd8e
Packit Service 8ebd8e
    return device.selected_finger
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(DEVICE_MOCK_IFACE,
Packit Service 8ebd8e
                     in_signature='', out_signature='b')
Packit Service 8ebd8e
def HasIdentification(device):
Packit Service 8ebd8e
    '''Convenience method to get if a device supports identification
Packit Service 8ebd8e
Packit Service 8ebd8e
    Returns whether identification is supported.
Packit Service 8ebd8e
    '''
Packit Service 8ebd8e
Packit Service 8ebd8e
    return device.has_identification
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(DEVICE_MOCK_IFACE,
Packit Service 8ebd8e
                     in_signature='a(sbi)', out_signature='')
Packit Service 8ebd8e
def SetVerifyScript(device, script):
Packit Service 8ebd8e
    '''Convenience method to set the verification script.
Packit Service 8ebd8e
Packit Service 8ebd8e
    After VerifyStart is called, signal results will be sent in order after
Packit Service 8ebd8e
    a certain timeout declared in seconds. The array contains each
Packit Service 8ebd8e
    'result' followed by the 'done' argument for VerifyStatus, and the
Packit Service 8ebd8e
    amount of time to wait before each signal is sent.
Packit Service 8ebd8e
Packit Service 8ebd8e
    Returns nothing.
Packit Service 8ebd8e
    '''
Packit Service 8ebd8e
Packit Service 8ebd8e
    device.verify_script = script
Packit Service 8ebd8e
Packit Service 8ebd8e
@dbus.service.method(DEVICE_MOCK_IFACE,
Packit Service 8ebd8e
                     in_signature='s', out_signature='')
Packit Service 8ebd8e
def SetClaimed(device, user):
Packit Service 8ebd8e
    if user == '':
Packit Service 8ebd8e
        device.claimed_user = None
Packit Service 8ebd8e
    else:
Packit Service 8ebd8e
        device.claimed_user = user