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

Reply via email to