Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:12.2:PowerPC
gnome-screensaver
gnome-screensaver-finger-print.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File gnome-screensaver-finger-print.patch of Package gnome-screensaver
Index: configure.ac =================================================================== --- configure.ac.orig +++ configure.ac @@ -677,6 +677,21 @@ if test "x$have_libgnomekbdui" = "xyes"; fi dnl --------------------------------------------------------------------------- +dnl libfprint +dnl --------------------------------------------------------------------------- + +have_libfprint=yes +AC_ARG_WITH(libfprint,[ --without-libfprint disable finger print support]) +if test x$with_libfprint != xno; then + PKG_CHECK_MODULES(LIBFPRINT, libfprint, have_libfprint=yes, have_libfprint=no) +fi +if test "x$have_libfprint" = "xyes"; then + AC_SUBST(LIBFPRINT_CFLAGS) + AC_SUBST(LIBFPRINT_LIBS) + AC_DEFINE(WITH_LIBFPRINT, 1, [Define for finger print support]) +fi + +dnl --------------------------------------------------------------------------- dnl Finish dnl --------------------------------------------------------------------------- Index: src/gnome-screensaver-dialog.c =================================================================== --- src/gnome-screensaver-dialog.c.orig +++ src/gnome-screensaver-dialog.c @@ -31,6 +31,11 @@ #include <unistd.h> #include <signal.h> +#ifdef WITH_LIBFPRINT +#include <pthread.h> +#include <signal.h> +#include <libfprint/fprint.h> +#endif #include <glib/gi18n.h> #include <gdk/gdkx.h> #include <gtk/gtk.h> @@ -74,6 +79,12 @@ static GOptionEntry entries [] = { { NULL } }; +#ifdef WITH_LIBFPRINT +static struct fp_dscv_dev *fp_ddev, **fp_discovered_devs; +static struct fp_dev *fp_dev; +static struct fp_print_data *fp_data; +#endif + static char * get_id_string (GtkWidget *widget) { @@ -360,12 +371,118 @@ quit_timeout_cb (gpointer data) return FALSE; } +#ifdef WITH_LIBFPRINT +typedef struct { + gchar *message; + GSLockPlug *plug; +} AuthMessageHandlerIdleData; + +static gboolean +auth_message_handler_idle_cb (AuthMessageHandlerIdleData *idle_data) +{ + char *response; + + auth_message_handler (GS_AUTH_MESSAGE_TEXT_INFO, + idle_data->message, + &response, + idle_data->plug); + + g_free (idle_data->message); + g_free (idle_data); + + return FALSE; +} + +static void +auth_message_handler_idle (const gchar *message, GSLockPlug *plug) +{ + AuthMessageHandlerIdleData *idle_data; + + idle_data = g_new0 (AuthMessageHandlerIdleData, 1); + idle_data->message = g_strdup (message); + idle_data->plug = plug; + + g_idle_add ((GSourceFunc) auth_message_handler_idle_cb, idle_data); +} + +static gpointer +fprint_thread_func (gpointer user_data) +{ + GSLockPlug *plug = (GSLockPlug *) user_data; + + if (fp_dev && fp_data) { + gboolean result = FALSE; + gboolean retry; + struct fp_img *img = NULL; + + auth_message_handler_idle (_("Please enter password or swipe your finger"), plug); + + do { + int r; + + retry = FALSE; + + r = fp_verify_finger_img (fp_dev, fp_data, &img); + fp_img_free (img); + + switch (r) { + case FP_VERIFY_NO_MATCH : + retry = TRUE; + break; + case FP_VERIFY_MATCH : + result = TRUE; + break; + case FP_VERIFY_RETRY : + retry = TRUE; + auth_message_handler_idle (_("Scan didn't quite work. Please try again"), + plug); + break; + case FP_VERIFY_RETRY_TOO_SHORT : + retry = TRUE; + auth_message_handler_idle (_("Swipe was too short. Please try again"), + plug); + break; + case FP_VERIFY_RETRY_CENTER_FINGER : + retry = TRUE; + auth_message_handler_idle (_("Please center your finger on the sensor and try again"), + plug); + break; + case FP_VERIFY_RETRY_REMOVE_FINGER : + retry = TRUE; + auth_message_handler_idle (_("Please remove finger from the sensor and try again"), + plug); + break; + default : + retry = TRUE; + g_debug ("Finger print verification failed with error: %d", r); + break; + } + } while (retry); + + if (result) { + g_idle_add ((GSourceFunc) quit_response_ok, NULL); + } + } + + return NULL; +} +#endif + static gboolean auth_check_idle (GSLockPlug *plug) { gboolean res; gboolean again; static guint loop_counter = 0; +#ifdef WITH_LIBFPRINT + static pthread_t fprint_thread = -1; + + if (fp_dev && fp_data && fprint_thread == -1) { + if (pthread_create (&fprint_thread, NULL, fprint_thread_func, plug)) { + gs_debug ("Thread creation for finger print auth failed"); + } + } +#endif again = TRUE; res = do_auth_check (plug); @@ -568,6 +685,22 @@ lock_initialization (int *argc, return TRUE; } +#ifdef WITH_LIBFPRINT +static struct fp_dscv_dev +*discover_fingerprint_device (struct fp_dscv_dev **discovered_devs) +{ + struct fp_dscv_dev *ddev = discovered_devs[0]; + struct fp_driver *drv; + if (!ddev) + return NULL; + + drv = fp_dscv_dev_get_driver (ddev); + g_debug ("Found device claimed by %s driver\n", fp_driver_get_full_name (drv)); + + return ddev; +} +#endif + int main (int argc, char **argv) @@ -587,6 +720,34 @@ main (int argc, g_thread_init (NULL); } +#ifdef WITH_LIBFPRINT + /* Initialize fprint for fingerprint reading for authentication */ + if (fp_init () < 0) { + g_debug ("Failed to initialize libfprint"); + } else { + fp_data = NULL; + fp_discovered_devs = fp_discover_devs (); + if (fp_discovered_devs) { + fp_ddev = discover_fingerprint_device (fp_discovered_devs); + if (fp_ddev) { + fp_dev = fp_dev_open (fp_ddev); + if (fp_dev) { + if (fp_print_data_load (fp_dev, RIGHT_INDEX, &fp_data) == 0) { + } else { + g_debug ("Failed to load fingerprint"); + g_debug ("Did you remember to enroll your right index finger first?"); + } + } else + g_debug ("Could not open fingerprint device"); + } else + g_debug ("No fingerprint devices detected"); + + fp_dscv_devs_free (fp_discovered_devs); + } else + g_debug ("Could not discover fingerprint devices"); + } +#endif + g_type_init (); gs_profile_start (NULL); @@ -599,7 +760,7 @@ main (int argc, error = NULL; if (! gtk_init_with_args (&argc, &argv, NULL, entries, NULL, &error)) { if (error != NULL) { - fprintf (stderr, "%s", error->message); + g_debug ("%s", error->message); g_error_free (error); } exit (1); @@ -644,6 +805,14 @@ main (int argc, if (xvkbd_running) kill (xvkbd_pid, 9); +#ifdef WITH_LIBFPRINT + fp_print_data_free (fp_data); + if (fp_dev) + fp_dev_close (fp_dev); + + fp_exit (); +#endif + gs_profile_end (NULL); gs_debug_shutdown (); Index: src/Makefile.am =================================================================== --- src/Makefile.am.orig +++ src/Makefile.am @@ -29,6 +29,7 @@ INCLUDES = \ $(LIBGNOMEKBDUI_CFLAGS) \ $(LIBNOTIFY_CFLAGS) \ $(SYSTEMD_CFLAGS) \ + $(LIBFPRINT_CFLAGS) \ $(NULL) bin_PROGRAMS = \ @@ -154,6 +155,7 @@ gnome_screensaver_dialog_LDADD = \ $(AUTH_LIBS) \ $(LIBGNOMEKBDUI_LIBS) \ $(LIBNOTIFY_LIBS) \ + $(LIBFPRINT_LIBS) \ $(NULL) BUILT_SOURCES = \
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor