rpms/gnome-screensaver/devel gnome-screensaver-2.26.0-securitytoken.patch, NONE, 1.1

Matthias Clasen mclasen at fedoraproject.org
Thu Mar 19 04:29:58 UTC 2009


Author: mclasen

Update of /cvs/pkgs/rpms/gnome-screensaver/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv31242

Added Files:
	gnome-screensaver-2.26.0-securitytoken.patch 
Log Message:
missing patch


gnome-screensaver-2.26.0-securitytoken.patch:

--- NEW FILE gnome-screensaver-2.26.0-securitytoken.patch ---
diff -up gnome-screensaver-2.26.0/configure.ac.securitytoken gnome-screensaver-2.26.0/configure.ac
--- gnome-screensaver-2.26.0/configure.ac.securitytoken	2009-03-18 13:20:20.000000000 -0400
+++ gnome-screensaver-2.26.0/configure.ac	2009-03-19 00:10:49.586195203 -0400
@@ -45,6 +45,7 @@ GNOME_DESKTOP_REQUIRED_VERSION=2.23.2
 
 GLADE_REQUIRED_VERSION=2.5.0
 LIBGNOMEKBDUI_REQUIRED_VERSION=0.1
+NSS_REQUIRED_VERSION=3.11.2
 
 AC_CHECK_HEADERS(unistd.h)
 AC_CHECK_HEADERS(crypt.h sys/select.h)
@@ -59,7 +60,8 @@ PKG_CHECK_MODULES(GNOME_SCREENSAVER,
         dbus-glib-1 >= $DBUS_REQUIRED_VERSION
         gconf-2.0 >= $GCONF_REQUIRED_VERSION
         gnome-desktop-2.0 >= $GNOME_DESKTOP_REQUIRED_VERSION
-        libgnome-menu >= $LIBGNOME_MENU_REQUIRED_VERSION)
+        libgnome-menu >= $LIBGNOME_MENU_REQUIRED_VERSION
+        nss >= $NSS_REQUIRED_VERSION)
 AC_SUBST(GNOME_SCREENSAVER_CFLAGS)
 AC_SUBST(GNOME_SCREENSAVER_LIBS)
 
@@ -96,8 +98,6 @@ AC_PATH_PROG(GCONFTOOL, gconftool-2)
 
 AM_GCONF_SOURCE_2
 
-GNOME_COMPILE_WARNINGS(yes)
-
 # Solaris requires libresolv for daemon()
 case "$host" in
 	*-*-solaris*)
@@ -171,6 +171,13 @@ PKG_CHECK_MODULES(LIB_GNOME_MENU,
 AC_SUBST(LIB_GNOME_MENU_CFLAGS)
 AC_SUBST(LIB_GNOME_MENU_LIBS)
 
+# security token support
+PKG_CHECK_MODULES(SECURITY_TOKEN,
+        gobject-2.0 >= $GLIB_REQUIRED_VERSION
+        nss >= $NSS_REQUIRED_VERSION)
+AC_SUBST(SECURITY_TOKEN_CFLAGS)
+AC_SUBST(SECURITY_TOKEN_LIBS)
+
 dnl ---------------------------------------------------------------------------
 dnl - Where should we put documentation ?
 dnl ---------------------------------------------------------------------------
diff -up gnome-screensaver-2.26.0/src/gs-auth-pam.c.securitytoken gnome-screensaver-2.26.0/src/gs-auth-pam.c
--- gnome-screensaver-2.26.0/src/gs-auth-pam.c.securitytoken	2009-03-18 11:39:58.000000000 -0400
+++ gnome-screensaver-2.26.0/src/gs-auth-pam.c	2009-03-19 00:10:49.588195131 -0400
@@ -354,6 +354,13 @@ close_pam_handle (int status)
                                    status2,
                                    (status2 == PAM_SUCCESS ? "Success" : "Failure"));
                 }
+
+		/* iterate the glib event loop inbetween processing pam
+		 * messages so that the user interface can be updated
+		 * to reflect changes that are a result of the pam
+		 * messages
+		 */
+		while (g_main_context_iteration (NULL, FALSE));
         }
 
         if (message_handled_condition != NULL) {
diff -up gnome-screensaver-2.26.0/src/gs-monitor.c.securitytoken gnome-screensaver-2.26.0/src/gs-monitor.c
--- gnome-screensaver-2.26.0/src/gs-monitor.c.securitytoken	2009-03-18 11:39:58.000000000 -0400
+++ gnome-screensaver-2.26.0/src/gs-monitor.c	2009-03-19 00:18:11.671197701 -0400
@@ -41,10 +41,15 @@
 #include "gs-prefs.h"
 #include "gs-debug.h"
 
+#include "securitytokenmonitor.h"
+
 static void     gs_monitor_class_init (GSMonitorClass *klass);
 static void     gs_monitor_init       (GSMonitor      *monitor);
 static void     gs_monitor_finalize   (GObject        *object);
 
+static void     gs_monitor_simulate_user_activity (GSMonitor *monitor);
+static void     gs_monitor_lock_screen (GSMonitor *monitor);
+
 #define GS_MONITOR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GS_TYPE_MONITOR, GSMonitorPrivate))
 
 struct GSMonitorPrivate
@@ -56,6 +61,7 @@ struct GSMonitorPrivate
         GSFade         *fade;
         GSGrab         *grab;
         guint           release_grab_id;
+        ScSecurityTokenMonitor *security_token_monitor;
 };
 
 #define FADE_TIMEOUT 10000
@@ -85,6 +91,36 @@ manager_deactivated_cb (GSManager *manag
         gs_listener_set_active (monitor->priv->listener, FALSE);
 }
 
+static void
+security_token_inserted_cb (ScSecurityTokenMonitor *token_monitor,
+                            ScSecurityToken        *token,
+                            GSMonitor              *monitor)
+{
+        gs_monitor_simulate_user_activity (monitor);
+}
+
+static gboolean
+gs_monitor_should_lock_on_login_security_token_removal (void)
+{
+        /* FIXME: lame hack
+         */
+        return system ("pkcs11_setup rm_action | grep -q lock") == 0;
+}
+
+static void
+security_token_removed_cb (ScSecurityTokenMonitor *token_monitor,
+                           ScSecurityToken        *token,
+                           GSMonitor              *monitor)
+{
+        if (gs_monitor_should_lock_on_login_security_token_removal () &&
+            sc_security_token_is_login_token (token))
+                gs_monitor_lock_screen (monitor);
+
+        /* If we're already locked and the lock dialog is up, kill it.
+         */
+        gs_manager_cancel_unlock_request (monitor->priv->manager);
+}
+
 static gboolean
 watcher_idle_cb (GSWatcher *watcher,
                  gboolean   is_idle,
@@ -165,35 +201,6 @@ watcher_idle_notice_cb (GSWatcher *watch
 }
 
 static void
-gs_monitor_lock_screen (GSMonitor *monitor)
-{
-        gboolean res;
-        gboolean locked;
-
-        /* set lock flag before trying to activate screensaver
-           in case something tries to react to the ActiveChanged signal */
-
-        gs_manager_get_lock_active (monitor->priv->manager, &locked);
-        gs_manager_set_lock_active (monitor->priv->manager, TRUE);
-        res = gs_listener_set_active (monitor->priv->listener, TRUE);
-        if (! res) {
-                /* If we've failed then restore lock status */
-                gs_manager_set_lock_active (monitor->priv->manager, locked);
-                gs_debug ("Unable to lock the screen");
-        }
-}
-
-static void
-gs_monitor_simulate_user_activity (GSMonitor *monitor)
-{
-        /* FIXME: reset the xsync timer? */
-
-        /* request that the manager unlock -
-           will pop up a dialog if necessary */
-        gs_manager_request_unlock (monitor->priv->manager);
-}
-
-static void
 listener_lock_cb (GSListener *listener,
                   GSMonitor  *monitor)
 {
@@ -401,6 +408,27 @@ connect_manager_signals (GSMonitor *moni
 }
 
 static void
+disconnect_security_token_monitor_signals (GSMonitor *monitor)
+{
+        g_signal_handlers_disconnect_by_func (monitor->priv->security_token_monitor,
+					      security_token_removed_cb, monitor);
+
+        g_signal_handlers_disconnect_by_func (monitor->priv->security_token_monitor,
+					      security_token_inserted_cb, monitor);
+}
+
+static void
+connect_security_token_monitor_signals (GSMonitor *monitor)
+{
+	g_signal_connect (monitor->priv->security_token_monitor, 
+			  "security-token-removed",
+			  G_CALLBACK (security_token_removed_cb), monitor);
+	g_signal_connect (monitor->priv->security_token_monitor, 
+			  "security-token-inserted",
+			  G_CALLBACK (security_token_inserted_cb), monitor);
+}
+
+static void
 disconnect_prefs_signals (GSMonitor *monitor)
 {
         g_signal_handlers_disconnect_by_func (monitor->priv->prefs, _gs_monitor_update_from_prefs, monitor);
@@ -434,6 +462,26 @@ gs_monitor_init (GSMonitor *monitor)
         monitor->priv->manager = gs_manager_new ();
         connect_manager_signals (monitor);
 
+	/* PKCS11_LOGIN_TOKEN_NAME is set if the user logged in with a
+	 * security token.
+	 */
+	if (g_getenv ("PKCS11_LOGIN_TOKEN_NAME") != NULL) {
+		monitor->priv->security_token_monitor = sc_security_token_monitor_new (NULL);
+		sc_security_token_monitor_start (monitor->priv->security_token_monitor,
[...2512 lines suppressed...]
+
+	    _exit (0);
+    }
+
+    close (write_fd);
+
+#ifndef SC_SECURITY_TOKEN_MONITOR_DRIVER_CAN_BE_RELOADED_AFTER_BEING_DESTROYED
+    g_array_append_val (monitor->priv->fds_to_close_on_fork, read_fd);
+#endif
+
+    if (worker_pid)
+	    *worker_pid = child_pid;
+
+    if (worker_fd)
+	    *worker_fd = read_fd;
+
+    return TRUE;
+}
+
+#ifdef SC_SECURITY_TOKEN_MONITOR_ENABLE_TEST
+#include <glib.h>
+
+static GMainLoop *event_loop;
+static gboolean should_exit_on_next_remove = FALSE;
+
+static gboolean 
+on_timeout (ScSecurityTokenMonitor *monitor)
+{
+    GError *error;
+    g_print ("Re-enabling monitor.\n");
+
+    if (!sc_security_token_monitor_start (monitor, &error)) {
+	    g_warning ("could not start security token monitor - %s",
+		       error->message);
+	    g_error_free (error);
+	    return 1;
+    }
+    g_print ("Please re-insert security token\n");
+
+    should_exit_on_next_remove = TRUE;
+
+    return FALSE;
+}
+
+static void
+on_device_inserted (ScSecurityTokenMonitor * monitor,
+		    ScSecurityToken *token)
+{
+    g_print ("security token inserted!\n");
+    g_print ("Please remove it.\n");
+}
+
+static void
+on_device_removed (ScSecurityTokenMonitor * monitor,
+		   ScSecurityToken *token)
+{
+    g_print ("security token removed!\n");
+
+    if (should_exit_on_next_remove)
+	    g_main_loop_quit (event_loop);
+    else {
+	    g_print ("disabling monitor for 2 seconds\n");
+	    sc_security_token_monitor_stop (monitor);
+	    g_timeout_add (2000, (GSourceFunc) on_timeout, monitor);
+    }
+}
+
+int 
+main (int   argc, 
+      char *argv[])
+{
+    ScSecurityTokenMonitor *monitor;
+    GError *error;
+
+    g_log_set_always_fatal (G_LOG_LEVEL_ERROR
+			    | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING);
+
+    g_type_init ();
+
+    g_message ("creating instance of 'security token monitor' object...");
+    monitor = sc_security_token_monitor_new (NULL);
+    g_message ("'security token monitor' object created successfully");
+
+    g_signal_connect (monitor, "security-token-inserted",
+		      G_CALLBACK (on_device_inserted), NULL);
+
+    g_signal_connect (monitor, "security-token-removed",
+		      G_CALLBACK (on_device_removed), NULL);
+
+    g_message ("starting listener...");
+
+    error = NULL;
+    if (!sc_security_token_monitor_start (monitor, &error)) {
+	    g_warning ("could not start security token monitor - %s",
+		       error->message);
+	    g_error_free (error);
+	    return 1;
+    }
+
+    event_loop = g_main_loop_new (NULL, FALSE);
+    g_main_loop_run (event_loop);
+    g_main_loop_unref (event_loop);
+    event_loop = NULL;
+
+    g_message ("destroying previously created 'security token monitor' object...");
+    g_object_unref (monitor);
+    monitor = NULL;
+    g_message ("'security token monitor' object destroyed successfully");
+
+    return 0;
+}
+#endif
diff -up /dev/null gnome-screensaver-2.26.0/src/securitytokenmonitor.h
--- /dev/null	2009-03-18 22:51:48.055015100 -0400
+++ gnome-screensaver-2.26.0/src/securitytokenmonitor.h	2009-03-19 00:10:49.622199713 -0400
@@ -0,0 +1,84 @@
+/* securitytokenmonitor.h - monitor for security token insertion and
+ *                          removal events
+ *
+ * Copyright (C) 2006 Ray Strode
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.  
+ */
+#ifndef SC_SECURITY_TOKEN_MONITOR_H
+#define SC_SECURITY_TOKEN_MONITOR_H
+
+#define SC_SECURITY_TOKEN_ENABLE_INTERNAL_API
+#include "securitytoken.h"
+
+#include <glib.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+#define SC_TYPE_SECURITY_TOKEN_MONITOR            (sc_security_token_monitor_get_type ())
+#define SC_SECURITY_TOKEN_MONITOR(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), SC_TYPE_SECURITY_TOKEN_MONITOR, ScSecurityTokenMonitor))
+#define SC_SECURITY_TOKEN_MONITOR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), SC_TYPE_SECURITY_TOKEN_MONITOR, ScSecurityTokenMonitorClass))
+#define SC_IS_SECURITY_TOKEN_MONITOR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SC_TYPE_SECURITY_TOKEN_MONITOR))
+#define SC_IS_SECURITY_TOKEN_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SC_TYPE_SECURITY_TOKEN_MONITOR))
+#define SC_SECURITY_TOKEN_MONITOR_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), SC_TYPE_SECURITY_TOKEN_MONITOR, ScSecurityTokenMonitorClass))
+#define SC_SECURITY_TOKEN_MONITOR_ERROR           (sc_security_token_monitor_error_quark ())
+typedef struct _ScSecurityTokenMonitor ScSecurityTokenMonitor;
+typedef struct _ScSecurityTokenMonitorClass ScSecurityTokenMonitorClass;
+typedef struct _ScSecurityTokenMonitorPrivate ScSecurityTokenMonitorPrivate;
+typedef enum _ScSecurityTokenMonitorError ScSecurityTokenMonitorError;
+
+struct _ScSecurityTokenMonitor {
+    GObject parent;
+
+    /*< private > */
+    ScSecurityTokenMonitorPrivate *priv;
+};
+
+struct _ScSecurityTokenMonitorClass {
+    GObjectClass parent_class;
+
+    /* Signals */
+    void (*security_token_inserted) (ScSecurityTokenMonitor *monitor,
+				     ScSecurityToken *token);
+    void (*security_token_removed) (ScSecurityTokenMonitor *monitor,
+				    ScSecurityToken *token);
+    void (*error) (ScSecurityTokenMonitor *monitor, 
+		   GError                 *error);
+};
+
+enum _ScSecurityTokenMonitorError {
+    SC_SECURITY_TOKEN_MONITOR_ERROR_GENERIC = 0,
+    SC_SECURITY_TOKEN_MONITOR_ERROR_WITH_NSS,
+    SC_SECURITY_TOKEN_MONITOR_ERROR_LOADING_DRIVER,
+    SC_SECURITY_TOKEN_MONITOR_ERROR_WATCHING_FOR_EVENTS,
+    SC_SECURITY_TOKEN_MONITOR_ERROR_REPORTING_EVENTS
+};
+
+GType sc_security_token_monitor_get_type (void) G_GNUC_CONST;
+GQuark sc_security_token_monitor_error_quark (void) G_GNUC_CONST;
+
+ScSecurityTokenMonitor *sc_security_token_monitor_new (const gchar *module);
+
+gboolean sc_security_token_monitor_start (ScSecurityTokenMonitor  *monitor, 
+				 	  GError                 **error);
+
+void sc_security_token_monitor_stop (ScSecurityTokenMonitor *monitor);
+
+gchar *sc_security_token_monitor_get_module_path (ScSecurityTokenMonitor *monitor);
+gboolean sc_security_token_monitor_login_token_is_inserted (ScSecurityTokenMonitor *monitor);
+
+G_END_DECLS
+#endif				/* SC_SECURITY_TOKEN_MONITOR_H */




More information about the fedora-extras-commits mailing list