From f7186c7ff0ea9995d9911dfd8a3aa16abbeba764 Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Thu, 20 Nov 2008 16:51:46 +0000 Subject: [PATCH] Remove all uses of enums in the API The clients aren't supposed to know the magic numbers for enums, so use strings instead. --- TODO | 2 -- pam/pam_fprintd.c | 49 ++++++++++++++++++++++++------------- src/device.c | 62 +++++++++++++++++++++++++++++++++++++++++------ src/device.xml | 4 +-- tests/enroll.c | 40 ++++-------------------------- tests/verify.c | 37 ++++------------------------ 6 files changed, 98 insertions(+), 96 deletions(-) diff --git a/TODO b/TODO index c1021da..2fd4cb8 100644 --- a/TODO +++ b/TODO @@ -5,8 +5,6 @@ Enforce command sequences: force VerifyStop after non-retry verify result comes in etc -Rethink enums and results passed, should be strings and D-Bus errors - Verify PAM messages fit with GDM/gnome-screensaver Add API docs (see doc/dbus and doc subdir): diff --git a/pam/pam_fprintd.c b/pam/pam_fprintd.c index 23a2ae0..8a4256d 100644 --- a/pam/pam_fprintd.c +++ b/pam/pam_fprintd.c @@ -143,6 +143,19 @@ static const char *fingerstr(const char *finger_name) return NULL; } +static const char *resulstr(const char *result) +{ + if (g_str_equal (result, "verify-retry-scan")) + return "Try scanning your finger again"; + if (g_str_equal (result, "verify-swipe-too-short")) + return "Swipe was too short, try scanning your finger again"; + if (g_str_equal (result, "verify-finger-not-centered")) + return "Your finger was not centered, try scanning your finger again"; + if (g_str_equal (result, "verify-remove-and-retry")) + return "Remove your finger, and try scanning your finger again"; + g_assert_not_reached (); +} + static DBusGProxy *create_manager (DBusGConnection **ret_conn, GMainLoop **ret_loop) { DBusGConnection *connection; @@ -223,8 +236,7 @@ static DBusGProxy *open_device(DBusGConnection *connection, DBusGProxy *manager, typedef struct { guint max_tries; - int result; - gboolean verify_completed; + char *result; gboolean timed_out; pam_handle_t *pamh; GMainLoop *loop; @@ -232,17 +244,22 @@ typedef struct { char *driver; } verify_data; -static void verify_result(GObject *object, int result, gpointer user_data) +static void verify_result(GObject *object, const char *result, gpointer user_data) { verify_data *data = user_data; + const char *msg; - D(g_message("Verify result: %s (%d)\n", verify_result_str(result), result)); - if (result == VERIFY_NO_MATCH || result == VERIFY_MATCH) { - data->verify_completed = TRUE; - data->result = result; - + D(g_message("Verify result: %s\n", result)); + if (g_str_equal (result, "verify-no-match") || + g_str_equal (result, "verify-match") || + g_str_equal (result, "verify-unknown-error")) { + data->result = g_strdup (result); g_main_loop_quit (data->loop); + return; } + + msg = resulstr (result); + send_err_msg (data->pamh, msg); } static void verify_finger_selected(GObject *object, const char *finger_name, gpointer user_data) @@ -265,10 +282,7 @@ static gboolean verify_timeout_cb (gpointer user_data) verify_data *data = user_data; data->timed_out = TRUE; - data->verify_completed = TRUE; - send_info_msg (data->pamh, "Verification timed out"); - g_main_loop_quit (data->loop); return FALSE; @@ -312,9 +326,7 @@ static int do_verify(DBusGConnection *connection, GMainLoop *loop, pam_handle_t timeout_id = g_source_attach (source, g_main_loop_get_context (loop)); g_source_set_callback (source, verify_timeout_cb, data, NULL); - data->verify_completed = FALSE; data->timed_out = FALSE; - data->result = 0; if (!dbus_g_proxy_call (dev, "VerifyStart", &error, G_TYPE_UINT, -1, G_TYPE_INVALID, G_TYPE_INVALID)) { D(g_message("VerifyStart failed: %s", error->message)); @@ -337,18 +349,21 @@ static int do_verify(DBusGConnection *connection, GMainLoop *loop, pam_handle_t ret = PAM_AUTHINFO_UNAVAIL; break; } else { - if (data->result == VERIFY_NO_MATCH) { + if (g_str_equal (data->result, "verify-no-match")) { send_err_msg (data->pamh, "Failed to match fingerprint"); ret = PAM_AUTH_ERR; - } else if (data->result == VERIFY_MATCH) + } else if (g_str_equal (data->result, "verify-match")) ret = PAM_SUCCESS; - else if (data->result < 0) + else if (g_str_equal (data->result, "verify-unknown-error")) ret = PAM_AUTHINFO_UNAVAIL; else { - send_info_msg (data->pamh, verify_result_str (data->result)); + send_info_msg (data->pamh, "An unknown error occured"); ret = PAM_AUTH_ERR; + g_free (data->result); break; } + g_free (data->result); + data->result = NULL; } data->max_tries--; } diff --git a/src/device.c b/src/device.c index e2d5b4c..0619fa8 100644 --- a/src/device.c +++ b/src/device.c @@ -203,13 +203,13 @@ static void fprint_device_class_init(FprintDeviceClass *klass) signals[SIGNAL_VERIFY_STATUS] = g_signal_new("verify-status", 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__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); signals[SIGNAL_ENROLL_STATUS] = g_signal_new("enroll-status", 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__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); 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_STRING); + g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); } static gboolean @@ -304,6 +304,50 @@ finger_name_to_num (const char *finger_name) return -1; } +static const char * +verify_result_to_name (int result) +{ + switch (result) { + case FP_VERIFY_NO_MATCH: + return "verify-no-match"; + case FP_VERIFY_MATCH: + return "verify-match"; + case FP_VERIFY_RETRY: + return "verify-retry-scan"; + case FP_VERIFY_RETRY_TOO_SHORT: + return "verify-swipe-too-short"; + case FP_VERIFY_RETRY_CENTER_FINGER: + return "verify-finger-not-centered"; + case FP_VERIFY_RETRY_REMOVE_FINGER: + return "verify-remove-and-retry"; + default: + return "verify-unknown-error"; + } +} + +static const char * +enroll_result_to_name (int result) +{ + switch (result) { + case FP_ENROLL_COMPLETE: + return "enroll-completed"; + case FP_ENROLL_FAIL: + return "enroll-failed"; + case FP_ENROLL_PASS: + return "enroll-stage-passed"; + case FP_ENROLL_RETRY: + return "enroll-retry-scan"; + case FP_ENROLL_RETRY_TOO_SHORT: + return "enroll-swipe-too-short"; + case FP_ENROLL_RETRY_CENTER_FINGER: + return "enroll-finger-not-centered"; + case FP_ENROLL_RETRY_REMOVE_FINGER: + return "enroll-remove-and-retry"; + default: + return "enroll-unknown-error"; + } +} + static gboolean _fprint_device_check_claimed (FprintDevice *rdev, DBusGMethodInvocation *context, @@ -688,9 +732,10 @@ static void verify_cb(struct fp_dev *dev, int r, struct fp_img *img, void *user_data) { struct FprintDevice *rdev = user_data; - g_message("verify_cb: result %d", r); + const char *name = verify_result_to_name (r); + g_message("verify_cb: result %s (%d)", name, r); - g_signal_emit(rdev, signals[SIGNAL_VERIFY_STATUS], 0, r); + g_signal_emit(rdev, signals[SIGNAL_VERIFY_STATUS], 0, name); fp_img_free(img); } @@ -698,9 +743,10 @@ static void identify_cb(struct fp_dev *dev, int r, size_t match_offset, struct fp_img *img, void *user_data) { struct FprintDevice *rdev = user_data; - g_message("identify_cb: result %d", r); + const char *name = verify_result_to_name (r); + g_message("identify_cb: result %s (%d)", name, r); - g_signal_emit(rdev, signals[SIGNAL_VERIFY_STATUS], 0, r); + g_signal_emit(rdev, signals[SIGNAL_VERIFY_STATUS], 0, name); fp_img_free(img); } @@ -896,7 +942,7 @@ static void enroll_stage_cb(struct fp_dev *dev, int result, result = FP_ENROLL_FAIL; } - g_signal_emit(rdev, signals[SIGNAL_ENROLL_STATUS], 0, result); + g_signal_emit(rdev, signals[SIGNAL_ENROLL_STATUS], 0, enroll_result_to_name (result)); fp_img_free(img); fp_print_data_free(print); } diff --git a/src/device.xml b/src/device.xml index c84e7e8..a4cdcab 100644 --- a/src/device.xml +++ b/src/device.xml @@ -38,7 +38,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/tests/enroll.c b/tests/enroll.c index 8a871a4..02db828 100644 --- a/tests/enroll.c +++ b/tests/enroll.c @@ -25,38 +25,6 @@ static DBusGProxy *manager = NULL; static DBusGConnection *connection = NULL; -enum enroll_result { - ENROLL_COMPLETE = 1, - ENROLL_FAIL, - ENROLL_PASS, - ENROLL_RETRY = 100, - ENROLL_RETRY_TOO_SHORT = 101, - ENROLL_RETRY_CENTER_FINGER = 102, - ENROLL_RETRY_REMOVE_FINGER = 103, -}; - -static const char *enroll_result_str(int result) -{ - switch (result) { - case ENROLL_COMPLETE: - return "Enroll completed."; - case ENROLL_FAIL: - return "Enroll failed :("; - case ENROLL_PASS: - return "Enroll stage passed. Please scan again for next stage."; - case ENROLL_RETRY: - return "Retry scan"; - case ENROLL_RETRY_TOO_SHORT: - return "Swipe too short, please retry"; - case ENROLL_RETRY_CENTER_FINGER: - return "Finger not centered, please retry"; - case ENROLL_RETRY_REMOVE_FINGER: - return "Please remove finger and retry"; - default: - return "Unknown"; - } -} - static void create_manager(void) { GError *error = NULL; @@ -97,11 +65,13 @@ static DBusGProxy *open_device(const char *username) return dev; } -static void enroll_result(GObject *object, int result, void *user_data) +static void enroll_result(GObject *object, const char *result, void *user_data) { gboolean *enroll_completed = user_data; - g_print("Enroll result: %s (%d)\n", enroll_result_str(result), result); - if (result == ENROLL_COMPLETE || result == ENROLL_FAIL) + g_print("Enroll result: %s\n", result); + if (g_str_equal(result, "enroll-completed") || + g_str_equal(result, "enroll-failed") || + g_str_equal(result, "enroll-unknown-error")) *enroll_completed = TRUE; } diff --git a/tests/verify.c b/tests/verify.c index 1f02b9d..c370f85 100644 --- a/tests/verify.c +++ b/tests/verify.c @@ -30,35 +30,6 @@ static char *finger_name = "any"; static gboolean g_fatal_warnings = FALSE; static char **usernames = NULL; -enum fp_verify_result { - VERIFY_NO_MATCH = 0, - VERIFY_MATCH = 1, - VERIFY_RETRY = 100, - VERIFY_RETRY_TOO_SHORT = 101, - VERIFY_RETRY_CENTER_FINGER = 102, - VERIFY_RETRY_REMOVE_FINGER = 103, -}; - -static const char *verify_result_str(int result) -{ - switch (result) { - case VERIFY_NO_MATCH: - return "No match"; - case VERIFY_MATCH: - return "Match!"; - case VERIFY_RETRY: - return "Retry scan"; - case VERIFY_RETRY_TOO_SHORT: - return "Swipe too short, please retry"; - case VERIFY_RETRY_CENTER_FINGER: - return "Finger not centered, please retry"; - case VERIFY_RETRY_REMOVE_FINGER: - return "Please remove finger and retry"; - default: - return "Unknown"; - } -} - static void create_manager(void) { GError *error = NULL; @@ -125,11 +96,13 @@ static void find_finger(DBusGProxy *dev, const char *username) g_strfreev (fingers); } -static void verify_result(GObject *object, int result, void *user_data) +static void verify_result(GObject *object, const char *result, void *user_data) { gboolean *verify_completed = user_data; - g_print("Verify result: %s (%d)\n", verify_result_str(result), result); - if (result == VERIFY_NO_MATCH || result == VERIFY_MATCH) + g_print("Verify result: %s\n", result); + if (g_str_equal (result, "verify-no-match") || + g_str_equal (result, "verify-match") || + g_str_equal (result, "verify-unknown-error")) *verify_completed = TRUE; }