[gdm] Add Solaris logindevperm support. Fixes bug #531651.



commit 6e199dfefc9a15a6a5067c16f9f6004e404ac96c
Author: Brian Cameron <Brian Cameron sun com>
Date:   Mon Aug 24 15:42:16 2009 -0500

    Add Solaris logindevperm support.  Fixes bug #531651.

 configure.ac                |    6 ++++++
 daemon/gdm-session-worker.c |   41 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 0 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 9006020..e709dcc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1056,6 +1056,12 @@ AC_SUBST(EXTRA_SETUP_LIBS)
 AC_SUBST(EXTRA_TEST_LIBS)
 AC_SUBST(EXTRA_GREETER_LIBS)
 
+# Check for Solaris logindevperm support
+#
+AC_CHECK_LIB(devinfo, di_devperm_login, [
+                        AC_DEFINE(HAVE_LOGINDEVPERM)
+                            PAM_LIBS="$PAM_LIBS -ldevinfo" ])
+
 dnl ---------------------------------------------------------------------------
 dnl - Check for X Server location
 dnl ---------------------------------------------------------------------------
diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
index c1331df..13e08b1 100644
--- a/daemon/gdm-session-worker.c
+++ b/daemon/gdm-session-worker.c
@@ -32,6 +32,10 @@
 #include <grp.h>
 #include <pwd.h>
 
+#ifdef  HAVE_LOGINDEVPERM
+#include <libdevinfo.h>
+#endif  /* HAVE_LOGINDEVPERM */
+
 #include <security/pam_appl.h>
 
 #include <glib.h>
@@ -977,6 +981,22 @@ gdm_session_worker_uninitialize_pam (GdmSessionWorker *worker,
         if (worker->priv->state >= GDM_SESSION_WORKER_STATE_SESSION_OPENED) {
                 pam_close_session (worker->priv->pam_handle, 0);
                 gdm_session_auditor_report_logout (worker->priv->auditor);
+
+#ifdef  HAVE_LOGINDEVPERM
+                /*
+                 * Only do logindevperm processing if /dev/console or
+                 * a device associated with a VT
+                 */
+                if (worker->priv->display_device != NULL &&
+                   (strncmp (worker->priv->display_device, "/dev/vt/", strlen ("/dev/vt/")) == 0 ||
+                    strcmp  (worker->priv->display_device, "/dev/console") == 0)) {
+                        g_debug ("Logindevperm logout for user %s, device %s",
+                                 worker->priv->username,
+                                 worker->priv->display_device);
+                        (void) di_devperm_logout (worker->priv->display_device);
+                }
+#endif  /* HAVE_LOGINDEVPERM */
+
         } else {
                 void *p;
 
@@ -1729,6 +1749,7 @@ static gboolean
 gdm_session_worker_start_user_session (GdmSessionWorker  *worker,
                                        GError           **error)
 {
+        struct passwd *passwd_entry;
         pid_t session_pid;
         int   error_code;
 
@@ -1737,6 +1758,26 @@ gdm_session_worker_start_user_session (GdmSessionWorker  *worker,
 
         register_ck_session (worker);
 
+        passwd_entry = getpwnam (worker->priv->username);
+
+#ifdef  HAVE_LOGINDEVPERM
+        /*
+         * Only do logindevperm processing if /dev/console or
+         * a device associated with a VT
+         */
+        if (worker->priv->display_device != NULL &&
+           (strncmp (worker->priv->display_device, "/dev/vt/", strlen ("/dev/vt/")) == 0 ||
+            strcmp  (worker->priv->display_device, "/dev/console") == 0)) {
+                g_debug ("Logindevperm login for user %s, device %s",
+                         worker->priv->username,
+                         worker->priv->display_device);
+                (void) di_devperm_login (worker->priv->display_device,
+                                         passwd_entry->pw_uid,
+                                         passwd_entry->pw_gid,
+                                         NULL);
+        }
+#endif  /* HAVE_LOGINDEVPERM */
+
         g_debug ("GdmSessionWorker: opening user session with program '%s'",
                  worker->priv->arguments[0]);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]