Enlightenment CVS committal

Author  : sebastid
Project : e17
Module  : apps/entrance

Dir     : e17/apps/entrance/src/client


Modified Files:
        Makefile.am entrance_auth.c entrance_auth.h entrance_login.c 
        entrance_session.c 


Log Message:
Handle pam sessions correctly.

===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/entrance/src/client/Makefile.am,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -3 -r1.15 -r1.16
--- Makefile.am 27 Jun 2004 17:05:27 -0000      1.15
+++ Makefile.am 28 May 2005 09:31:14 -0000      1.16
@@ -19,10 +19,14 @@
 entrance_LDADD = @edje_libs@ @ecore_libs@ @edb_libs@ @evas_libs@ \
 @esmart_libs@ -lesmart_container -lesmart_text_entry
 
-entrance_login_SOURCES = entrance_login.c
+entrance_login_SOURCES = \
+       entrance_login.c \
+       entrance_auth.c entrance_auth.h \
+       util.c util.h
 
-entrance_edit_SOURCES = entrance_edit.c \
-               entrance_config.c entrance_user.c \
-               util.c entrance_x_session.c entrance_smart.c
+entrance_edit_SOURCES = \
+       entrance_edit.c \
+       entrance_config.c entrance_user.c \
+       util.c entrance_x_session.c entrance_smart.c
 entrance_edit_LDADD = @edje_libs@ @ecore_libs@ @edb_libs@ @evas_libs@ \
 @esmart_libs@ -lesmart_container -lesmart_text_entry
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/entrance/src/client/entrance_auth.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -3 -r1.23 -r1.24
--- entrance_auth.c     5 Jan 2005 23:10:28 -0000       1.23
+++ entrance_auth.c     28 May 2005 09:31:14 -0000      1.24
@@ -2,7 +2,7 @@
 @file entrance_auth.c
 @brief Variables and data relating to system authentication
 */
-#include"entrance_auth.h"
+#include "entrance_auth.h"
 #include "util.h"
 
 static char *
@@ -87,7 +87,6 @@
 #if HAVE_PAM
    if (e->pam.handle)
    {
-      pam_close_session(e->pam.handle, 0);
       pam_end(e->pam.handle, PAM_SUCCESS);
       e->pam.handle = NULL;
    }
@@ -144,15 +143,14 @@
    memset(e->pass, 0, sizeof(e->pass));
 }
 
-
 #if HAVE_PAM
 /**
- * _entrance_auth_pam_initialize - initialize PAM session, structures etc.
+ * entrance_auth_pam_initialize - initialize PAM session, structures etc.
  * This function will call pam_start() and set the conversation
  * function and others.
  */
-static int
-_entrance_auth_pam_initialize(Entrance_Auth * e, const char *display)
+int
+entrance_auth_pam_initialize(Entrance_Auth * e, const char *display)
 {
    int pamerr;
 
@@ -213,7 +211,7 @@
    int result = AUTH_FAIL;
    int pamerr;
 
-   if (_entrance_auth_pam_initialize(e, display) != E_SUCCESS)
+   if (entrance_auth_pam_initialize(e, display) != E_SUCCESS)
       return ERROR_NO_PAM_INIT;
 
    if ((pamerr = pam_authenticate(e->pam.handle, 0)) == PAM_SUCCESS)
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/entrance/src/client/entrance_auth.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -3 -r1.12 -r1.13
--- entrance_auth.h     27 Dec 2004 06:45:14 -0000      1.12
+++ entrance_auth.h     28 May 2005 09:31:14 -0000      1.13
@@ -62,6 +62,10 @@
 };
 typedef struct _Entrance_Auth Entrance_Auth;
 
+#ifdef HAVE_PAM
+int entrance_auth_pam_initialize(Entrance_Auth * e, const char *display);
+#endif
+
 Entrance_Auth *entrance_auth_new(void);
 void entrance_auth_free(Entrance_Auth * e);
 void entrance_auth_session_end(Entrance_Auth * e);
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/entrance/src/client/entrance_login.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- entrance_login.c    4 Feb 2004 20:59:35 -0000       1.2
+++ entrance_login.c    28 May 2005 09:31:14 -0000      1.3
@@ -4,16 +4,88 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 
+#include "../config.h"
+
+#include "entrance_auth.h"
+
+#ifdef HAVE_PAM
+int
+entrance_end_user_session(Entrance_Auth * e)
+{
+   int pamerr;
+
+   if (!e->pam.handle)
+      return ERROR_NO_PAM_INIT;
+
+   syslog(LOG_INFO, "Ending PAM session for user \"%s\".", e->user);
+
+   if ((pamerr = pam_close_session(e->pam.handle, PAM_SILENT)) != PAM_SUCCESS)
+   {
+      syslog(LOG_CRIT, "PAM: %s.", pam_strerror(e->pam.handle, pamerr));
+      return ERROR_NO_PAM_INIT;
+   }
+
+   return E_SUCCESS;
+}
+#endif
+
 int
 main(int argc, char **argv)
 {
-   pid_t pid;
+   pid_t pid = -1;
+   char *user = NULL;
+   char *display = NULL;
+
+#ifdef HAVE_PAM
+   Entrance_Auth *e = NULL;
+#endif
+
+   openlog("entrance_login", LOG_PID, LOG_DAEMON);
 
-   if (argc != 2)
+   if ((argc != 2) && (argc != 4))
+   {
+      syslog(LOG_CRIT, "Wrong number of arguments: %d!", argc);
       return 0;
+   }
+
+   if (getuid() != 0)
+   {
+      syslog(LOG_CRIT, "Not running as root!");
+      exit(1);
+   }
 
    pid = atoi(argv[1]);
+   if (argc == 4)
+   {
+      user = argv[2];
+      display = argv[3];
+   }
+
+#ifdef HAVE_PAM
+   if (user && display)
+   {
+      e = entrance_auth_new();
+      if (entrance_auth_user_set(e, user))
+      {
+         syslog(LOG_CRIT, "Can't set user %s!", user);
+         exit(1);
+      }
+      entrance_auth_pam_initialize(e, display);
+   }
+#endif
+
    if (waitpid(pid, NULL, 0) == pid)
+   {
+#ifdef HAVE_PAM
+      if (e)
+      {
+         if (entrance_end_user_session(e) != E_SUCCESS)
+            syslog(LOG_INFO, "Error Shutting down PAM");
+         entrance_auth_free(e);
+      }
+#endif
+      closelog();
       exit(0);
+   }
    return -1;
 }
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/apps/entrance/src/client/entrance_session.c,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -3 -r1.70 -r1.71
--- entrance_session.c  30 Apr 2005 07:16:22 -0000      1.70
+++ entrance_session.c  28 May 2005 09:31:14 -0000      1.71
@@ -364,6 +364,7 @@
    pid_t pid;
    char buf[PATH_MAX];
    char *shell = NULL;
+   struct passwd *pwent = NULL;
 
    entrance_auth_setup_environment(e->auth, e->display);
    if ((e->session) && (strlen(e->session) > 0))
@@ -392,6 +393,7 @@
       ecore_evas_free(e->ee);
       e->ee = NULL;
    }
+   edje_shutdown();
    ecore_evas_shutdown();
    ecore_x_sync();
    entrance_ipc_shutdown();
@@ -404,49 +406,67 @@
       /* Tell PAM that session has begun */
       if (pam_open_session(e->auth->pam.handle, 0) != PAM_SUCCESS)
       {
-        syslog(LOG_NOTICE, "Cannot open pam session for user \"%s\".", 
e->auth->user);
+         syslog(LOG_NOTICE, "Cannot open pam session for user \"%s\".", 
e->auth->user);
          if (!e->config->autologin.mode)
          {
             syslog(LOG_CRIT, "Unable to open PAM session. Aborting.");
             return;
          }
       }
+      syslog(LOG_INFO, "Opened PAM session. %s : %s.", e->auth->pw->pw_name,
+             e->display);
    }
 #endif
-
+   /* avoid doubling up pam handles before the fork */
+   pwent = struct_passwd_dup(e->auth->pw);
+   entrance_auth_free(e->auth);
+   e->auth = NULL;
    switch ((pid = fork()))
    {
      case 0:
-        if (initgroups(e->auth->pw->pw_name, e->auth->pw->pw_gid))
+        if (initgroups(pwent->pw_name, pwent->pw_gid))
            syslog(LOG_CRIT,
                   "Unable to initialize group (is entrance running as 
root?).");
-        if (setgid(e->auth->pw->pw_gid))
+        if (setgid(pwent->pw_gid))
            syslog(LOG_CRIT, "Unable to set group id.");
-        if (setuid(e->auth->pw->pw_uid))
+        if (setuid(pwent->pw_uid))
            syslog(LOG_CRIT, "Unable to set user id.");
-        shell = strdup(e->auth->pw->pw_shell);
-        entrance_session_free(e);
-        syslog(LOG_NOTICE, "Exec session \"%s\".", buf);
-        execl(shell, "-", "-c", buf, NULL);
-        exit(0);
+        shell = strdup(pwent->pw_shell);
         break;
      case -1:
         syslog(LOG_INFO, "FORK FAILED, UH OH");
         exit(0);
      default:
+        syslog(LOG_NOTICE, "Replacing Entrance with simple login program to 
wait for session end.");
+#ifdef HAVE_PAM
+        if (e->config->auth == ENTRANCE_USE_PAM)
+        {
+           snprintf(buf, sizeof(buf), "%s/entrance_login %i %s %s",
+                    PACKAGE_BIN_DIR, (int) pid, pwent->pw_name, e->display);
+        }
+        else
+#endif
+        {
+           snprintf(buf, sizeof(buf), "%s/entrance_login %i", PACKAGE_BIN_DIR,
+                    (int) pid);
+        }
+        _entrance_session_user_list_fix(e);
+        shell = strdup("/bin/sh");
+        /* this bypasses a race condition where entrance loses its x
+           connection before the wm gets it and x goes and resets itself */
+        sleep(10);
+        /*
+         * FIXME These should be called!
+        ecore_x_shutdown();
+        ecore_shutdown();
+        */
         break;
    }
-   _entrance_session_user_list_fix(e);
+   struct_passwd_free(pwent);
    entrance_session_free(e);
-   /* this bypasses a race condition where entrance loses its x connection */
-   /* before the wm gets it and x goes and resets itself */
-   sleep(10);
    /* replace this rpcoess with a clean small one that just waits for its */
    /* child to exit.. passed on the cmd-line */
-   syslog(LOG_NOTICE, "Replacing Entrance with simple login program to wait 
for session end.");
-   snprintf(buf, sizeof(buf), "%s/entrance_login %i", PACKAGE_BIN_DIR,
-            (int) pid);
-   execl("/bin/sh", "/bin/sh", "-c", buf, NULL);
+   execl(shell, shell, "-c", buf, NULL);
 }
 
 




-------------------------------------------------------
This SF.Net email is sponsored by Yahoo.
Introducing Yahoo! Search Developer Network - Create apps using Yahoo!
Search APIs Find out how you can build Yahoo! directly into your own
Applications - visit http://developer.yahoo.net/?fr=offad-ysdn-ostg-q22005
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to