Hi, here's my first pam_fprint improvements.
With my patch you can enroll two or more fingers and use one of them to
authenticate.
Regards
Vasily
From 3877543fcef46e1dce9fcae89157871a6d144ca9 Mon Sep 17 00:00:00 2001
From: Vasily Khoruzhick <[EMAIL PROTECTED]>
Date: Fri, 15 Feb 2008 15:48:50 +0200
Subject: [PATCH] Use fp_identify_finger instead of verify
Signed-off-by: Vasily Khoruzhick <[EMAIL PROTECTED]>
---
src/pam_fprint.c | 91 ++++++++++++++++++++++++++++++++++++------------------
1 files changed, 61 insertions(+), 30 deletions(-)
diff --git a/src/pam_fprint.c b/src/pam_fprint.c
index 847d2f0..3e7e7d9 100644
--- a/src/pam_fprint.c
+++ b/src/pam_fprint.c
@@ -70,6 +70,7 @@ static int send_err_msg(pam_handle_t *pamh, char *msg)
return pc->conv(1, &msgp, &resp, pc->appdata_ptr);
}
+/*
static const char *fingerstr(enum fp_finger finger)
{
const char *names[] = {
@@ -88,42 +89,73 @@ static const char *fingerstr(enum fp_finger finger)
return "UNKNOWN";
return names[finger];
}
+*/
-static int find_dev_and_print(struct fp_dscv_dev **ddevs,
- struct fp_dscv_print **prints, struct fp_dscv_dev **_ddev,
- struct fp_dscv_print **_print)
+static struct fp_print_data **find_dev_and_prints(struct fp_dscv_dev **ddevs,
+ struct fp_dscv_print **prints, struct fp_dscv_dev **_ddev)
{
- int i = 0;
+ int i = 0, j = 0, err;
struct fp_dscv_print *print;
- struct fp_dscv_dev *ddev;
+ struct fp_dscv_dev *ddev = NULL;
+ uint16_t driver_id, driver_id_cur;
+ size_t prints_count = 0;
+ struct fp_print_data **gallery;
+ /* TODO: add device selection */
while (print = prints[i++]) {
- ddev = fp_dscv_dev_for_dscv_print(ddevs, print);
- if (ddev) {
+ if (!ddev) {
+ ddev = fp_dscv_dev_for_dscv_print(ddevs, print);
+ driver_id = fp_dscv_print_get_driver_id(print);
*_ddev = ddev;
- *_print = print;
- return 0;
+ }
+ if (ddev)
+ {
+ driver_id_cur = fp_dscv_print_get_driver_id(print);
+ if (driver_id_cur == driver_id) {
+ prints_count++;
+ }
+ }
+ }
+
+ if (prints_count == 0) {
+ return NULL;
+ }
+
+ gallery = malloc(sizeof(*gallery) * (prints_count + 1));
+ gallery[prints_count] = NULL;
+
+ i = 0, j = 0;
+ while (print = prints[i++]) {
+ driver_id_cur = fp_dscv_print_get_driver_id(print);
+ if (driver_id_cur == driver_id) {
+ err = fp_print_data_from_dscv_print(print, & (gallery[j]));
+ if (err != 0) {
+ gallery[j] = NULL;
+ break;
+ }
+ j++;
}
}
- return 1;
+
+ return gallery;
}
-static int do_verify(pam_handle_t *pamh, struct fp_dev *dev,
- struct fp_print_data *data, enum fp_finger finger)
+static int do_identify(pam_handle_t *pamh, struct fp_dev *dev,
+ struct fp_print_data **gallery)
{
int max_tries = 5;
+ size_t offset;
const char *driver_name = fp_driver_get_full_name(fp_dev_get_driver(dev));
- const char *fstr = fingerstr(finger);
-
+
do {
int r;
char msg[128];
- snprintf(msg, sizeof(msg), "Scan %s finger on %s", fstr, driver_name);
+ snprintf(msg, sizeof(msg), "Scan finger on %s", driver_name);
msg[sizeof(msg) - 1] = 0;
send_info_msg(pamh, msg);
- r = fp_verify_finger(dev, data);
+ r = fp_identify_finger(dev, gallery, &offset);
if (r < 0) {
snprintf(msg, sizeof(msg), "Fingerprint verification error %d", r);
msg[sizeof(msg) - 1] = 0;
@@ -164,8 +196,7 @@ static int do_auth(pam_handle_t *pamh)
struct fp_dscv_dev *ddev;
struct fp_dscv_print *print;
struct fp_dev *dev;
- struct fp_print_data *data;
- enum fp_finger finger;
+ struct fp_print_data **gallery, **gallery_iter;
r = fp_init();
if (r < 0)
@@ -180,9 +211,9 @@ static int do_auth(pam_handle_t *pamh)
fp_dscv_devs_free(ddevs);
return PAM_AUTHINFO_UNAVAIL;
}
-
- r = find_dev_and_print(ddevs, prints, &ddev, &print);
- if (r) {
+
+ gallery = find_dev_and_prints(ddevs, prints, &ddev);
+ if (!gallery || gallery[0] == NULL) {
fp_dscv_prints_free(prints);
fp_dscv_devs_free(ddevs);
send_info_msg(pamh, "Could not locate any suitable fingerprints "
@@ -197,17 +228,17 @@ static int do_auth(pam_handle_t *pamh)
return PAM_AUTHINFO_UNAVAIL;
}
- finger = fp_dscv_print_get_finger(print);
-
- r = fp_print_data_from_dscv_print(print, &data);
fp_dscv_prints_free(prints);
- if (r) {
- fp_dev_close(dev);
- return PAM_AUTHINFO_UNAVAIL;
- }
- r = do_verify(pamh, dev, data, finger);
- fp_print_data_free(data);
+ r = do_identify(pamh, dev, gallery);
+
+ gallery_iter = gallery;
+ while (*gallery_iter)
+ {
+ fp_print_data_free(*gallery_iter);
+ gallery_iter++;
+ }
+ free(gallery);
fp_dev_close(dev);
return r;
}
--
1.5.4
_______________________________________________
fprint mailing list
[email protected]
http://lists.reactivated.net/mailman/listinfo/fprint