diff --git a/pam/pam_fprintd.c b/pam/pam_fprintd.c
index 4cb30c6..0b5e84e 100644
--- a/pam/pam_fprintd.c
+++ b/pam/pam_fprintd.c
@@ -72,19 +72,6 @@ static const char *verify_result_str(int result)
}
}
-enum fp_finger {
- LEFT_THUMB = 1, /** thumb (left hand) */
- LEFT_INDEX, /** index finger (left hand) */
- LEFT_MIDDLE, /** middle finger (left hand) */
- LEFT_RING, /** ring finger (left hand) */
- LEFT_LITTLE, /** little finger (left hand) */
- RIGHT_THUMB, /** thumb (right hand) */
- RIGHT_INDEX, /** index finger (right hand) */
- RIGHT_MIDDLE, /** middle finger (right hand) */
- RIGHT_RING, /** ring finger (right hand) */
- RIGHT_LITTLE, /** little finger (right hand) */
-};
-
static gboolean send_info_msg(pam_handle_t *pamh, const char *msg)
{
const struct pam_message mymsg = {
@@ -127,24 +114,33 @@ static gboolean send_err_msg(pam_handle_t *pamh, const char *msg)
return (pc->conv(1, &msgp, &resp, pc->appdata_ptr) == PAM_SUCCESS);
}
+struct {
+ const char *dbus_name;
+ const char *finger_name;
+} fingers[11] = {
+ { "left-thumb", "Left thumb" },
+ { "left-index-finger", "Left index finger" },
+ { "left-middle-finger", "Left middle finger" },
+ { "left-ring-finger", "Left ring finger" },
+ { "left-little-finger", "Left little finger" },
+ { "right-thumb", "Right thumb" },
+ { "right-index-finger", "Right index finger" },
+ { "right-middle-finger", "Right middle finger" },
+ { "right-ring-finger", "Right ring finger" },
+ { "right-little-finger" "Right little finger" },
+ { NULL, NULL }
+};
-static const char *fingerstr(enum fp_finger finger)
+static const char *fingerstr(const char *finger_name)
{
- const char *names[] = {
- [LEFT_THUMB] = "left thumb",
- [LEFT_INDEX] = "left index",
- [LEFT_MIDDLE] = "left middle",
- [LEFT_RING] = "left ring",
- [LEFT_LITTLE] = "left little",
- [RIGHT_THUMB] = "right thumb",
- [RIGHT_INDEX] = "right index",
- [RIGHT_MIDDLE] = "right middle",
- [RIGHT_RING] = "right ring",
- [RIGHT_LITTLE] = "right little",
- };
- if (finger < LEFT_THUMB || finger > RIGHT_LITTLE)
- return "UNKNOWN";
- return names[finger];
+ guint i;
+
+ for (i = 0; fingers[i].dbus_name != NULL; i++) {
+ if (g_str_equal (fingers[i].dbus_name, finger_name))
+ return fingers[i].finger_name;
+ }
+
+ return NULL;
}
static DBusGProxy *create_manager (DBusGConnection **ret_conn, GMainLoop **ret_loop)
@@ -253,15 +249,15 @@ static void verify_result(GObject *object, int result, gpointer user_data)
}
}
-static void verify_finger_selected(GObject *object, int finger, gpointer user_data)
+static void verify_finger_selected(GObject *object, const char *finger_name, gpointer user_data)
{
verify_data *data = user_data;
char *msg;
- if (finger == -1) {
+ if (g_str_equal (finger_name, "any")) {
msg = g_strdup_printf ("Scan finger on %s", data->driver);
} else {
- msg = g_strdup_printf ("Scan %s finger on %s", fingerstr(finger), data->driver);
+ msg = g_strdup_printf ("Scan %s finger on %s", fingerstr(finger_name), data->driver);
}
D(g_message ("verify_finger_selected %s", msg));
send_info_msg (data->pamh, msg);
diff --git a/src/device.c b/src/device.c
index c77119a..e2d5b4c 100644
--- a/src/device.c
+++ b/src/device.c
@@ -33,6 +33,19 @@
#include "storage.h"
#include "egg-dbus-monitor.h"
+static char *fingers[] = {
+ "left-thumb",
+ "left-index-finger",
+ "left-middle-finger",
+ "left-ring-finger",
+ "left-little-finger",
+ "right-thumb",
+ "right-index-finger",
+ "right-middle-finger",
+ "right-ring-finger",
+ "right-little-finger"
+};
+
extern DBusGConnection *fprintd_dbus_conn;
static void fprint_device_claim(FprintDevice *rdev,
@@ -41,11 +54,11 @@ static void fprint_device_claim(FprintDevice *rdev,
static void fprint_device_release(FprintDevice *rdev,
DBusGMethodInvocation *context);
static void fprint_device_verify_start(FprintDevice *rdev,
- guint32 print_id, DBusGMethodInvocation *context);
+ const char *finger_name, DBusGMethodInvocation *context);
static void fprint_device_verify_stop(FprintDevice *rdev,
DBusGMethodInvocation *context);
static void fprint_device_enroll_start(FprintDevice *rdev,
- guint32 finger_num, DBusGMethodInvocation *context);
+ const char *finger_name, DBusGMethodInvocation *context);
static void fprint_device_enroll_stop(FprintDevice *rdev,
DBusGMethodInvocation *context);
static void fprint_device_list_enrolled_fingers(FprintDevice *rdev,
@@ -196,7 +209,7 @@ static void fprint_device_class_init(FprintDeviceClass *klass)
g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
signals[SIGNAL_VERIFY_FINGER_SELECTED] = g_signal_new("verify-finger-selected",
G_TYPE_FROM_CLASS(gobject_class), G_SIGNAL_RUN_LAST, 0, NULL, NULL,
- g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+ g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_STRING);
}
static gboolean
@@ -264,6 +277,33 @@ guint32 _fprint_device_get_id(FprintDevice *rdev)
return DEVICE_GET_PRIVATE(rdev)->id;
}
+static const char *
+finger_num_to_name (int finger_num)
+{
+ if (finger_num == -1)
+ return "any";
+ if (finger_num < LEFT_THUMB || finger_num > RIGHT_LITTLE)
+ return NULL;
+ return fingers[finger_num - 1];
+}
+
+static int
+finger_name_to_num (const char *finger_name)
+{
+ guint i;
+
+ if (finger_name == NULL || *finger_name == '\0' || g_str_equal (finger_name, "any"))
+ return -1;
+
+ for (i = 0; i < G_N_ELEMENTS (fingers); i++) {
+ if (g_str_equal (finger_name, fingers[i]))
+ return i + 1;
+ }
+
+ /* Invalid, let's try that */
+ return -1;
+}
+
static gboolean
_fprint_device_check_claimed (FprintDevice *rdev,
DBusGMethodInvocation *context,
@@ -665,12 +705,13 @@ static void identify_cb(struct fp_dev *dev, int r,
}
static void fprint_device_verify_start(FprintDevice *rdev,
- guint32 finger_num, DBusGMethodInvocation *context)
+ const char *finger_name, DBusGMethodInvocation *context)
{
FprintDevicePrivate *priv = DEVICE_GET_PRIVATE(rdev);
struct fp_print_data **gallery = NULL;
struct fp_print_data *data = NULL;
GError *error = NULL;
+ guint finger_num = finger_name_to_num (finger_name);
int r;
if (_fprint_device_check_claimed(rdev, context, &error) == FALSE) {
@@ -769,7 +810,8 @@ static void fprint_device_verify_start(FprintDevice *rdev,
/* Emit VerifyFingerSelected telling the front-end which finger
* we selected for auth */
- g_signal_emit(rdev, signals[SIGNAL_VERIFY_FINGER_SELECTED], 0, finger_num);
+ g_signal_emit(rdev, signals[SIGNAL_VERIFY_FINGER_SELECTED],
+ 0, finger_num_to_name (finger_num));
if (r < 0) {
@@ -860,13 +902,22 @@ static void enroll_stage_cb(struct fp_dev *dev, int result,
}
static void fprint_device_enroll_start(FprintDevice *rdev,
- guint32 finger_num, DBusGMethodInvocation *context)
+ const char *finger_name, DBusGMethodInvocation *context)
{
FprintDevicePrivate *priv = DEVICE_GET_PRIVATE(rdev);
struct session_data *session = priv->session;
+ int finger_num = finger_name_to_num (finger_name);
GError *error = NULL;
int r;
+ if (finger_num == -1) {
+ g_set_error(&error, FPRINT_ERROR, FPRINT_ERROR_NO_SUCH_LOADED_PRINT,
+ "Invalid print name");
+ dbus_g_method_return_error(context, error);
+ g_error_free (error);
+ return;
+ }
+
if (_fprint_device_check_claimed(rdev, context, &error) == FALSE) {
dbus_g_method_return_error (context, error);
return;
@@ -955,7 +1006,7 @@ static void fprint_device_list_enrolled_fingers(FprintDevice *rdev,
GError *error = NULL;
GSList *prints;
GSList *item;
- GArray *ret;
+ GPtrArray *ret;
char *user, *sender;
user = _fprint_device_check_for_username (rdev,
@@ -988,14 +1039,16 @@ static void fprint_device_list_enrolled_fingers(FprintDevice *rdev,
return;
}
- ret = g_array_new(FALSE, FALSE, sizeof(int));
+ ret = g_ptr_array_new ();
for (item = prints; item; item = item->next) {
- ret = g_array_append_val(ret, item->data);
+ int finger_num = GPOINTER_TO_INT (item->data);
+ g_ptr_array_add (ret, g_strdup (finger_num_to_name (finger_num)));
}
+ g_ptr_array_add (ret, NULL);
g_slist_free(prints);
- dbus_g_method_return(context, ret);
+ dbus_g_method_return(context, g_ptr_array_free (ret, FALSE));
}
static void fprint_device_delete_enrolled_fingers(FprintDevice *rdev,
diff --git a/src/device.xml b/src/device.xml
index a0e07a7..c84e7e8 100644
--- a/src/device.xml
+++ b/src/device.xml
@@ -6,7 +6,7 @@
-
+
@@ -25,7 +25,7 @@
-
+
@@ -34,7 +34,7 @@
-
+
@@ -42,7 +42,7 @@
-
+
diff --git a/tests/enroll.c b/tests/enroll.c
index c924388..e1df99e 100644
--- a/tests/enroll.c
+++ b/tests/enroll.c
@@ -57,19 +57,6 @@ static const char *enroll_result_str(int result)
}
}
-enum fp_finger {
- LEFT_THUMB = 1, /** thumb (left hand) */
- LEFT_INDEX, /** index finger (left hand) */
- LEFT_MIDDLE, /** middle finger (left hand) */
- LEFT_RING, /** ring finger (left hand) */
- LEFT_LITTLE, /** little finger (left hand) */
- RIGHT_THUMB, /** thumb (right hand) */
- RIGHT_INDEX, /** index finger (right hand) */
- RIGHT_MIDDLE, /** middle finger (right hand) */
- RIGHT_RING, /** ring finger (right hand) */
- RIGHT_LITTLE, /** little finger (right hand) */
-};
-
static void create_manager(void)
{
GError *error = NULL;
@@ -138,7 +125,7 @@ static void do_enroll(DBusGProxy *dev)
&enroll_completed, NULL);
g_print("Enrolling right index finger.\n");
- if (!net_reactivated_Fprint_Device_enroll_start(dev, RIGHT_INDEX, &error))
+ if (!net_reactivated_Fprint_Device_enroll_start(dev, "right-index-finger", &error))
g_error("EnrollStart failed: %s", error->message);
while (!enroll_completed)
diff --git a/tests/list.c b/tests/list.c
index e49e137..1ddec95 100644
--- a/tests/list.c
+++ b/tests/list.c
@@ -26,47 +26,6 @@
static DBusGProxy *manager = NULL;
static DBusGConnection *connection = NULL;
-enum fp_finger {
- LEFT_THUMB = 1, /** thumb (left hand) */
- LEFT_INDEX, /** index finger (left hand) */
- LEFT_MIDDLE, /** middle finger (left hand) */
- LEFT_RING, /** ring finger (left hand) */
- LEFT_LITTLE, /** little finger (left hand) */
- RIGHT_THUMB, /** thumb (right hand) */
- RIGHT_INDEX, /** index finger (right hand) */
- RIGHT_MIDDLE, /** middle finger (right hand) */
- RIGHT_RING, /** ring finger (right hand) */
- RIGHT_LITTLE, /** little finger (right hand) */
-};
-
-static const char *fingerstr(guint32 fingernum)
-{
- switch (fingernum) {
- case LEFT_THUMB:
- return "Left thumb";
- case LEFT_INDEX:
- return "Left index finger";
- case LEFT_MIDDLE:
- return "Left middle finger";
- case LEFT_RING:
- return "Left ring finger";
- case LEFT_LITTLE:
- return "Left little finger";
- case RIGHT_THUMB:
- return "Right thumb";
- case RIGHT_INDEX:
- return "Right index finger";
- case RIGHT_MIDDLE:
- return "Right middle finger";
- case RIGHT_RING:
- return "Right ring finger";
- case RIGHT_LITTLE:
- return "Right little finger";
- default:
- return "Unknown finger";
- }
-}
-
static void create_manager(void)
{
GError *error = NULL;
@@ -118,15 +77,14 @@ static DBusGProxy *open_device(void)
static void list_fingerprints(DBusGProxy *dev, const char *username)
{
GError *error = NULL;
- GArray *fingers;
+ char **fingers;
GHashTable *props;
guint i;
- int fingernum;
if (!net_reactivated_Fprint_Device_list_enrolled_fingers(dev, username, &fingers, &error))
g_error("ListEnrolledFingers failed: %s", error->message);
- if (fingers->len == 0) {
+ if (fingers == NULL || g_strv_length (fingers) == 0) {
g_print("User %s has no fingers enrolled for this device.\n", username);
return;
}
@@ -135,14 +93,13 @@ static void list_fingerprints(DBusGProxy *dev, const char *username)
g_error("GetProperties failed: %s", error->message);
g_print("Fingerprints for user %s on %s:\n", username, (char *) g_hash_table_lookup (props, "Name"));
- for (i = 0; i < fingers->len; i++) {
- fingernum = g_array_index(fingers, guint32, i);
- g_print(" - #%d: %s\n", fingernum, fingerstr(fingernum));
+ g_hash_table_destroy (props);
+
+ for (i = 0; fingers[i] != NULL; i++) {
+ g_print(" - #%d: %s\n", i, fingers[i]);
}
- fingernum = g_array_index(fingers, guint32, 0);
- g_array_free(fingers, TRUE);
- g_hash_table_destroy (props);
+ g_strfreev (fingers);
}
int main(int argc, char **argv)
diff --git a/tests/verify.c b/tests/verify.c
index fbfae4f..f7e5076 100644
--- a/tests/verify.c
+++ b/tests/verify.c
@@ -19,13 +19,14 @@
#include
#include
+#include
#include
#include "manager-dbus-glue.h"
#include "device-dbus-glue.h"
static DBusGProxy *manager = NULL;
static DBusGConnection *connection = NULL;
-static int finger_num = -1;
+static char *finger_name = "any";
static gboolean g_fatal_warnings = FALSE;
static char **usernames = NULL;
@@ -58,49 +59,6 @@ static const char *verify_result_str(int result)
}
}
-enum fp_finger {
- LEFT_THUMB = 1, /** thumb (left hand) */
- LEFT_INDEX, /** index finger (left hand) */
- LEFT_MIDDLE, /** middle finger (left hand) */
- LEFT_RING, /** ring finger (left hand) */
- LEFT_LITTLE, /** little finger (left hand) */
- RIGHT_THUMB, /** thumb (right hand) */
- RIGHT_INDEX, /** index finger (right hand) */
- RIGHT_MIDDLE, /** middle finger (right hand) */
- RIGHT_RING, /** ring finger (right hand) */
- RIGHT_LITTLE, /** little finger (right hand) */
-};
-
-static const char *fingerstr(guint32 fingernum)
-{
- switch (fingernum) {
- case LEFT_THUMB:
- return "Left thumb";
- case LEFT_INDEX:
- return "Left index finger";
- case LEFT_MIDDLE:
- return "Left middle finger";
- case LEFT_RING:
- return "Left ring finger";
- case LEFT_LITTLE:
- return "Left little finger";
- case RIGHT_THUMB:
- return "Right thumb";
- case RIGHT_INDEX:
- return "Right index finger";
- case RIGHT_MIDDLE:
- return "Right middle finger";
- case RIGHT_RING:
- return "Right ring finger";
- case RIGHT_LITTLE:
- return "Right little finger";
- case -1:
- return "First fingerprint available";
- default:
- return "Unknown finger";
- }
-}
-
static void create_manager(void)
{
GError *error = NULL;
@@ -155,26 +113,26 @@ static DBusGProxy *open_device(const char *username)
static void find_finger(DBusGProxy *dev, const char *username)
{
GError *error = NULL;
- GArray *fingers;
+ char **fingers;
guint i;
- int fingernum;
if (!net_reactivated_Fprint_Device_list_enrolled_fingers(dev, username, &fingers, &error))
g_error("ListEnrolledFingers failed: %s", error->message);
- if (fingers->len == 0) {
+ if (fingers == NULL || g_strv_length (fingers) == 0) {
g_print("No fingers enrolled for this device.\n");
exit(1);
}
g_print("Listing enrolled fingers:\n");
- for (i = 0; i < fingers->len; i++) {
- fingernum = g_array_index(fingers, guint32, i);
- g_print(" - #%d: %s\n", fingernum, fingerstr(fingernum));
+ for (i = 0; fingers[i] != NULL; i++) {
+ g_print(" - #%d: %s\n", i, fingers[i]);
}
- fingernum = g_array_index(fingers, guint32, 0);
- g_array_free(fingers, TRUE);
+ if (strcmp (finger_name, "any") == 0)
+ finger_name = fingers[0];
+
+ g_strfreev (fingers);
}
static void verify_result(GObject *object, int result, void *user_data)
@@ -185,9 +143,9 @@ static void verify_result(GObject *object, int result, void *user_data)
*verify_completed = TRUE;
}
-static void verify_finger_selected(GObject *object, int finger, void *user_data)
+static void verify_finger_selected(GObject *object, const char *name, void *user_data)
{
- g_print("Verifying: %s\n", fingerstr(finger));
+ g_print("Verifying: %s\n", name);
}
static void do_verify(DBusGProxy *dev)
@@ -202,7 +160,7 @@ static void do_verify(DBusGProxy *dev)
dbus_g_proxy_connect_signal(dev, "VerifyFingerSelected", G_CALLBACK(verify_finger_selected),
NULL, NULL);
- if (!net_reactivated_Fprint_Device_verify_start(dev, finger_num, &error))
+ if (!net_reactivated_Fprint_Device_verify_start(dev, finger_name, &error))
g_error("VerifyStart failed: %s", error->message);
while (!verify_completed)
@@ -223,7 +181,7 @@ static void release_device(DBusGProxy *dev)
}
static const GOptionEntry entries[] = {
- { "finger", 'f', 0, G_OPTION_ARG_INT, &finger_num, "Finger selected to verify (default is automatic)", NULL },
+ { "finger", 'f', 0, G_OPTION_ARG_STRING, &finger_name, "Finger selected to verify (default is automatic)", NULL },
{"g-fatal-warnings", 0, 0, G_OPTION_ARG_NONE, &g_fatal_warnings, "Make all warnings fatal", NULL},
{ G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &usernames, NULL, "[username]" },
{ NULL }