diff --git a/src/device.c b/src/device.c
index 9127896..651f56f 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1841,10 +1841,27 @@ fprint_device_list_enrolled_fingers (FprintDBusDevice *dbus_dev,
return TRUE;
}
-static void
-delete_enrolled_fingers (FprintDevice *rdev,
+static gboolean
+user_has_print_enrolled (FprintDevice *rdev,
const char *user,
FpFinger finger)
+{
+ g_autoptr(GSList) prints = NULL;
+ FprintDevicePrivate *priv = fprint_device_get_instance_private (rdev);
+
+ prints = store.discover_prints (priv->dev, user);
+
+ if (finger == FP_FINGER_UNKNOWN)
+ return prints != NULL;
+
+ return g_slist_find (prints, GUINT_TO_POINTER (finger)) != NULL;
+}
+
+static gboolean
+delete_enrolled_fingers (FprintDevice *rdev,
+ const char *user,
+ FpFinger finger,
+ GError **error)
{
FprintDevicePrivate *priv = fprint_device_get_instance_private (rdev);
guint i;
@@ -1855,6 +1872,14 @@ delete_enrolled_fingers (FprintDevice *rdev,
else
g_debug ("Deleting enrolled fingers for user %s", user);
+ if (!user_has_print_enrolled (rdev, user, finger))
+ {
+ g_set_error (error, FPRINT_ERROR, FPRINT_ERROR_NO_ENROLLED_PRINTS,
+ "Fingerprint for finger %s is not enrolled",
+ fp_finger_to_name (finger));
+ return FALSE;
+ }
+
/* First try deleting the print from the device, we don't consider it
* fatal if this does not work. */
if (fp_device_has_storage (priv->dev))
@@ -1875,14 +1900,14 @@ delete_enrolled_fingers (FprintDevice *rdev,
if (print)
{
- g_autoptr(GError) error = NULL;
+ g_autoptr(GError) local_error = NULL;
if (finger != FP_FINGER_UNKNOWN && fp_print_get_finger (print) != finger)
continue;
- if (!fp_device_delete_print_sync (priv->dev, print, NULL, &error))
+ if (!fp_device_delete_print_sync (priv->dev, print, NULL, &local_error))
{
- g_warning ("Error deleting print from device: %s", error->message);
+ g_warning ("Error deleting print from device: %s", local_error->message);
g_warning ("This might indicate an issue in the libfprint driver or in the fingerprint device.");
}
}
@@ -1890,14 +1915,12 @@ delete_enrolled_fingers (FprintDevice *rdev,
}
if (finger != FP_FINGER_UNKNOWN)
- {
- store.print_data_delete (priv->dev, finger, user);
- }
+ store.print_data_delete (priv->dev, finger, user);
else
- {
- for (i = FP_FINGER_FIRST; i <= FP_FINGER_LAST; i++)
- store.print_data_delete (priv->dev, i, user);
- }
+ for (i = FP_FINGER_FIRST; i <= FP_FINGER_LAST; i++)
+ store.print_data_delete (priv->dev, i, user);
+
+ return TRUE;
}
#ifdef __linux__
@@ -2002,7 +2025,7 @@ fprint_device_delete_enrolled_fingers (FprintDBusDevice *dbus_dev,
g_assert (user);
g_assert (g_str_equal (username, "") || g_str_equal (user, username));
- delete_enrolled_fingers (rdev, user, FP_FINGER_UNKNOWN);
+ delete_enrolled_fingers (rdev, user, FP_FINGER_UNKNOWN, NULL);
if (!opened && fp_device_has_storage (priv->dev))
fp_device_close_sync (priv->dev, NULL, NULL);
@@ -2040,7 +2063,7 @@ fprint_device_delete_enrolled_fingers2 (FprintDBusDevice *dbus_dev,
session = session_data_get (priv);
- delete_enrolled_fingers (rdev, session->username, FP_FINGER_UNKNOWN);
+ delete_enrolled_fingers (rdev, session->username, FP_FINGER_UNKNOWN, NULL);
fprint_dbus_device_complete_delete_enrolled_fingers2 (dbus_dev,
invocation);
@@ -2084,8 +2107,12 @@ fprint_device_delete_enrolled_finger (FprintDBusDevice *dbus_dev,
session = session_data_get (priv);
- /* FIXME: Should we return an error if the requested finger is not enrolled?! */
- delete_enrolled_fingers (rdev, session->username, finger);
+ if (!delete_enrolled_fingers (rdev, session->username, finger, &error))
+ {
+ priv->current_action = ACTION_NONE;
+ g_dbus_method_invocation_return_gerror (invocation, error);
+ return TRUE;
+ }
priv->current_action = ACTION_NONE;
diff --git a/src/device.xml b/src/device.xml
index 1dd922f..2646d83 100644
--- a/src/device.xml
+++ b/src/device.xml
@@ -355,6 +355,8 @@
if the caller lacks the appropriate PolicyKit authorization
if the device was not claimed
if the finger name passed is invalid
+ if the chosen user doesn't have the requsted fingerprint enrolled
+ if there was an internal error
diff --git a/tests/fprintd.py b/tests/fprintd.py
index 3e7e784..8bdd180 100755
--- a/tests/fprintd.py
+++ b/tests/fprintd.py
@@ -1134,6 +1134,10 @@ class FPrintdVirtualDeviceClaimedTest(FPrintdVirtualDeviceBaseTest):
with self.assertFprintError('InvalidFingername'):
self.device.DeleteEnrolledFinger('(s)', 'sixth-left-finger')
+ def test_delete_with_no_enrolled_prints(self):
+ with self.assertFprintError('NoEnrolledPrints'):
+ self.device.DeleteEnrolledFinger('(s)', 'left-index-finger')
+
def test_verify_with_no_enrolled_prints(self):
with self.assertFprintError('NoEnrolledPrints'):
self.device.VerifyStart('(s)', 'any')