mirror of
https://gitlab.freedesktop.org/libfprint/fprintd.git
synced 2026-05-08 18:18:08 +02:00
device: Clear storage before enrolling the first print
Clear the device storage before we enroll the first print. At that point, we know that the storage should be completely empty and we have no way of deleting "garbage" prints later if the device does not support listing prints.
This commit is contained in:
parent
9e8139e6d4
commit
f44233461f
2 changed files with 36 additions and 3 deletions
23
src/device.c
23
src/device.c
|
|
@ -1797,8 +1797,9 @@ enroll_cb (FpDevice *dev, GAsyncResult *res, void *user_data)
|
|||
* enough. */
|
||||
if (g_error_matches (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_DATA_FULL))
|
||||
{
|
||||
g_debug ("Device storage is full, trying to garbage collect old prints");
|
||||
if (try_delete_print (rdev))
|
||||
g_debug ("Device storage is full");
|
||||
if (fp_device_has_feature (priv->dev, FP_DEVICE_FEATURE_STORAGE_LIST) &&
|
||||
try_delete_print (rdev))
|
||||
{
|
||||
/* Success? Then restart the operation */
|
||||
fp_device_enroll (priv->dev,
|
||||
|
|
@ -1939,6 +1940,15 @@ enroll_identify_cb (FpDevice *dev, GAsyncResult *res, void *user_data)
|
|||
enroll_start (rdev);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_first_enrollment (FprintDevice * rdev)
|
||||
{
|
||||
g_autoptr(GPtrArray) host_prints = NULL;
|
||||
host_prints = load_all_prints (rdev);
|
||||
|
||||
return host_prints->len == 0;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
fprint_device_enroll_start (FprintDBusDevice *dbus_dev,
|
||||
GDBusMethodInvocation *invocation,
|
||||
|
|
@ -1991,6 +2001,15 @@ fprint_device_enroll_start (FprintDBusDevice *dbus_dev,
|
|||
priv->enroll_data = finger;
|
||||
priv->current_action = ACTION_ENROLL;
|
||||
|
||||
if (is_first_enrollment (rdev))
|
||||
{
|
||||
g_autoptr(GError) clear_err = NULL;
|
||||
|
||||
if (!fp_device_clear_storage_sync (priv->dev, NULL, &clear_err))
|
||||
g_warning ("Failed to clear storage before first enrollment: %s",
|
||||
clear_err->message);
|
||||
}
|
||||
|
||||
if (fp_device_has_feature (priv->dev, FP_DEVICE_FEATURE_IDENTIFY))
|
||||
{
|
||||
g_autoptr(GPtrArray) all_prints = load_all_prints (rdev);
|
||||
|
|
|
|||
|
|
@ -850,7 +850,7 @@ class FPrintdVirtualStorageDeviceBaseTest(FPrintdVirtualDeviceBaseTest):
|
|||
self.assertIn(command, ['INSERT', 'REMOVE', 'SCAN', 'ERROR', 'RETRY',
|
||||
'FINGER', 'UNPLUG', 'SLEEP', 'SET_ENROLL_STAGES', 'SET_SCAN_TYPE',
|
||||
'SET_CANCELLATION_ENABLED', 'LIST', 'IGNORED_COMMAND',
|
||||
'SET_KEEP_ALIVE'])
|
||||
'SET_KEEP_ALIVE', 'CONT'])
|
||||
|
||||
with Connection(self.sockaddr) as con:
|
||||
res = self._send_command(con, command, *args)
|
||||
|
|
@ -935,6 +935,8 @@ class FPrintdVirtualStorageDeviceTests(FPrintdVirtualStorageDeviceBaseTest):
|
|||
'FP1-20201231-7-ABCDEFGH-testuser' : 'right-index-finger',
|
||||
'no-metadata-new' : 'left-middle-finger',
|
||||
}
|
||||
# Explicitly fail initial cleanup (not needed, but faster)
|
||||
self.send_command('ERROR', 0)
|
||||
for i, f in enrolled_prints.items():
|
||||
self.enroll_print(i, f)
|
||||
|
||||
|
|
@ -973,6 +975,8 @@ class FPrintdVirtualStorageDeviceTests(FPrintdVirtualStorageDeviceBaseTest):
|
|||
self.device.Claim('(s)', 'testuser')
|
||||
|
||||
self.assertEqual(self.get_stored_prints(), ['stored-print'])
|
||||
# Explicitly fail initial cleanup (not needed, but faster)
|
||||
self.send_command('ERROR', 0)
|
||||
self.device.EnrollStart('(s)', 'right-thumb')
|
||||
self.send_image('stored-print') # During identify
|
||||
self.wait_for_result('enroll-stage-passed')
|
||||
|
|
@ -990,6 +994,8 @@ class FPrintdVirtualStorageDeviceTests(FPrintdVirtualStorageDeviceBaseTest):
|
|||
self.device.Claim('(s)', 'testuser')
|
||||
|
||||
self.assertEqual(self.get_stored_prints(), ['stored-print'])
|
||||
# Explicitly fail initial cleanup (not needed, but faster)
|
||||
self.send_command('ERROR', 0)
|
||||
self.device.EnrollStart('(s)', 'right-thumb')
|
||||
self.send_image('stored-print') # During identify
|
||||
self.send_error(FPrint.DeviceError.PROTO) # During garbage collecting
|
||||
|
|
@ -3065,6 +3071,10 @@ class FPrintdUtilsTest(FPrintdVirtualStorageDeviceBaseTest):
|
|||
self.set_keep_alive(True)
|
||||
self.device.Release()
|
||||
|
||||
# Open and clear storage
|
||||
self.send_command('CONT')
|
||||
self.send_command('CONT')
|
||||
|
||||
finger_name = self.get_finger_name(FPrint.Finger.LEFT_THUMB)
|
||||
enroll, out = self.util_start('enroll', [self.get_current_user(),
|
||||
'-f', finger_name])
|
||||
|
|
@ -3105,6 +3115,10 @@ class FPrintdUtilsTest(FPrintdVirtualStorageDeviceBaseTest):
|
|||
self.set_keep_alive(True)
|
||||
self.device.Release()
|
||||
|
||||
# Open and clear storage
|
||||
self.send_command('CONT')
|
||||
self.send_command('CONT')
|
||||
|
||||
finger_name = self.get_finger_name(FPrint.Finger.LEFT_MIDDLE)
|
||||
enroll, out = self.util_start('enroll', [self.get_current_user(),
|
||||
'-f', finger_name])
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue