device: Delete existing print in EnrollStart

gnome-control-center expects to be able to re-enroll an existing print
when calling EnrollStart without deleting it first. As such, implicitly
delete the existing print rather than throwing an error.

Ideally, we'll change the API, but we need to give API users time to
adjust to the world.
This commit is contained in:
Benjamin Berg
2021-06-30 12:09:30 +02:00
parent 9ec1747b84
commit f398d09b23
2 changed files with 28 additions and 12 deletions

View File

@ -54,6 +54,11 @@ static gboolean action_authorization_handler (GDBusInterfaceSkeleton *,
GDBusMethodInvocation *, GDBusMethodInvocation *,
gpointer user_data); gpointer user_data);
static gboolean delete_enrolled_fingers (FprintDevice *rdev,
const char *user,
FpFinger finger,
GError **error);
static GQuark quark_auth_user = 0; static GQuark quark_auth_user = 0;
typedef enum { typedef enum {
@ -1979,22 +1984,21 @@ fprint_device_enroll_start (FprintDBusDevice *dbus_dev,
store.print_data_load (priv->dev, finger, store.print_data_load (priv->dev, finger,
session->username, &existing_print); session->username, &existing_print);
if (existing_print)
{
g_set_error (&error, FPRINT_ERROR, FPRINT_ERROR_FINGER_ALREADY_ENROLLED,
"Finger %d has already been enrolled for user %s", finger, session->username);
g_dbus_method_invocation_return_gerror (invocation,
error);
return TRUE;
}
if (!can_start_action (rdev, &error)) if (!can_start_action (rdev, &error))
{ {
g_dbus_method_invocation_return_gerror (invocation, error); g_dbus_method_invocation_return_gerror (invocation, error);
return TRUE; return TRUE;
} }
if (existing_print)
{
if (!delete_enrolled_fingers (rdev, session->username, finger, &error))
{
g_dbus_method_invocation_return_gerror (invocation, error);
return TRUE;
}
}
g_debug ("start enrollment device %d finger %d", priv->id, finger); g_debug ("start enrollment device %d finger %d", priv->id, finger);
priv->current_cancellable = g_cancellable_new (); priv->current_cancellable = g_cancellable_new ();

View File

@ -2315,9 +2315,21 @@ class FPrintdVirtualDeviceEnrollTests(FPrintdVirtualDeviceBaseTest):
def test_enroll_already_enrolled_finger(self): def test_enroll_already_enrolled_finger(self):
self.enroll_image('whorl', start=False) self.enroll_image('whorl', start=False)
self.stop_on_teardown = False # We can enroll a new image deleting the first
with self.assertFprintError('FingerAlreadyEnrolled'):
self.device.EnrollStart('(s)', 'left-middle-finger') self.device.EnrollStart('(s)', 'left-middle-finger')
self.enroll_image('arch', start=False)
self.stop_on_teardown = False
# If we verify, 'arch' will match, 'whorl' will not match
self.device.VerifyStart('(s)', 'any')
self.send_image('whorl')
self.assertVerifyNoMatch()
self.device.VerifyStop()
self.device.VerifyStart('(s)', 'any')
self.send_image('arch')
self.assertVerifyMatch()
self.device.VerifyStop()
def test_enroll_duplicate_image(self): def test_enroll_duplicate_image(self):
self.enroll_image('whorl', finger='left-thumb', start=False) self.enroll_image('whorl', finger='left-thumb', start=False)