Enlightenment CVS committal

Author  : xcomputerman
Project : e17
Module  : apps/entrance

Dir     : e17/apps/entrance/src/client


Modified Files:
        entrance_auth.c entrance_auth.h entrance_config.h 
        entrance_session.c entrance_session.h main.c 


Log Message:
Authentication bugfixes:
- Reorganize handling of pam, crypt and shadow auth modes
- Don't pass entire cfg struct to auth functions
- Change the way display is sent to auth for setting up environment
- Miscellaneous bugfixes and cleanups

Shout out to atmos for his help in putting this together.


===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/entrance/src/client/entrance_auth.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -3 -r1.21 -r1.22
--- entrance_auth.c     20 Dec 2004 03:07:04 -0000      1.21
+++ entrance_auth.c     27 Dec 2004 06:45:14 -0000      1.22
@@ -124,6 +124,7 @@
    if (e->pw)
       e->pw = struct_passwd_free(e->pw);
 
+   memset(e->user, 0, sizeof(e->user));
    memset(e->pass, 0, sizeof(e->pass));
    entrance_auth_session_end(e);
    free(e);
@@ -151,7 +152,7 @@
  * function and others.
  */
 static int
-_entrance_auth_pam_initialize(Entrance_Auth * e)
+_entrance_auth_pam_initialize(Entrance_Auth * e, const char *display)
 {
    int pamerr;
 
@@ -171,7 +172,7 @@
 
    /* Set TTY to DISPLAY */
    if ((pamerr =
-        pam_set_item(e->pam.handle, PAM_TTY, e->display)) != PAM_SUCCESS)
+        pam_set_item(e->pam.handle, PAM_TTY, display)) != PAM_SUCCESS)
    {
       syslog(LOG_CRIT, "Error: Unable to configure PAM_TTY.");
       return ERROR_PAM_SET;
@@ -206,13 +207,13 @@
  * @e The Entrance_Auth struct to attempt to validate on the system
  * @return - 0 on success, 1 on error
  */
-int
-entrance_auth_cmp_pam(Entrance_Auth * e)
+static int
+entrance_auth_cmp_pam(Entrance_Auth * e, const char *display)
 {
-   int result = 0;
+   int result = AUTH_FAIL;
    int pamerr;
 
-   if (_entrance_auth_pam_initialize(e) != 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)
@@ -251,25 +252,43 @@
 }
 #endif
 
-int
-entrance_auth_cmp_crypt(Entrance_Auth * e, Entrance_Config * cfg)
+static int
+entrance_auth_cmp_crypt(Entrance_Auth * e)
 {
    char *encrypted;
-   char *correct = e->pw->pw_passwd;
+   char *correct;
+   
+   correct = e->pw->pw_passwd;
 
-#if HAVE_SHADOW
+   /* Only successfully auth blank password *if* a blank password is given */
+   if ((!correct || !correct[0]) && !strcmp(e->pass, ""))
+      return AUTH_SUCCESS;
+
+   encrypted = crypt(e->pass, correct);
+
+   return (strcmp(encrypted, correct)) ? ERROR_BAD_PASS : AUTH_SUCCESS;
+}
+
+static int
+entrance_auth_cmp_shadow(Entrance_Auth * e)
+{
+   char *encrypted;
+   char *correct;
    struct spwd *sp;
+   
+   sp = getspnam(e->pw->pw_name);
+   endspent();
 
-   if (cfg->auth == ENTRANCE_USE_SHADOW)
+   if (sp)
+      correct = sp->sp_pwdp;
+   else
    {
-      sp = getspnam(e->pw->pw_name);
-      endspent();
-
-      if (sp)
-         correct = sp->sp_pwdp;
+      syslog(LOG_CRIT, "FATAL: Unable to fetch shadow password.");
+      return AUTH_FAIL;
    }
-#endif
-   if (!correct || !correct[0])
+   
+   /* Don't authenticate blank password unless blank password is given */
+   if ((!correct || !correct[0]) && !strcmp(e->pass, ""))
       return AUTH_SUCCESS;
 
    encrypted = crypt(e->pass, correct);
@@ -277,6 +296,38 @@
    return (strcmp(encrypted, correct)) ? ERROR_BAD_PASS : AUTH_SUCCESS;
 }
 
+int
+entrance_auth_cmp(Entrance_Auth * e, const char *display, int mode)
+{
+   switch (mode)
+   {
+     case ENTRANCE_USE_PAM:
+#if HAVE_PAM
+        return (entrance_auth_cmp_pam(e, display));
+#else
+        syslog(LOG_CRIT, "FATAL: PAM authentication support unavailable.");
+        return (1);
+#endif
+        break;
+     case ENTRANCE_USE_SHADOW:
+#if HAVE_SHADOW
+        return (entrance_auth_cmp_shadow(e));
+#else
+        syslog(LOG_CRIT, "FATAL: Shadow authentication support unavailable.");
+        return (1);
+#endif
+        break;
+     case ENTRANCE_USE_CRYPT:
+        return (entrance_auth_cmp_crypt(e));
+        break;
+     default:
+        syslog(LOG_CRIT, "FATAL: Invalid authentication mode %d requested", 
mode);
+        break;
+   }
+   return AUTH_FAIL;
+
+}
+
 /**
  * entrance_auth_set_pass: keep the error checking here
  * Pass it a char* and it'll set it if it should
@@ -326,7 +377,7 @@
  * I'm not sure if this is correct, but for now it works.
  */
 void
-entrance_auth_setup_environment(Entrance_Auth * e)
+entrance_auth_setup_environment(Entrance_Auth * e, const char *display)
 {
    extern char **environ;
    int size;
@@ -353,8 +404,7 @@
    setenv("USER", e->pw->pw_name, 1);
    setenv("LOGNAME", e->pw->pw_name, 1);
 
-   if (e->display)
-      setenv("DISPLAY", e->display, 1);
+   setenv("DISPLAY", display, 1);
 
    size = (strlen(_PATH_MAILDIR) + strlen(e->pw->pw_name) + 2);
    mail = (char *) malloc(sizeof(char) * size);
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/entrance/src/client/entrance_auth.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- entrance_auth.h     20 Dec 2004 03:07:05 -0000      1.11
+++ entrance_auth.h     27 Dec 2004 06:45:14 -0000      1.12
@@ -33,12 +33,13 @@
 
 #define AUTH_SUCCESS 0
 #define E_SUCCESS 0
-#define ERROR_NO_PAM_INIT 1
-#define ERROR_BAD_PASS 2
-#define ERROR_PAM_SET 3
-#define ERROR_NO_PERMS 4
-#define ERROR_CRED_EXPIRED 5
-#define ERROR_BAD_CRED 6
+#define AUTH_FAIL 1
+#define ERROR_NO_PAM_INIT 2
+#define ERROR_BAD_PASS 3
+#define ERROR_PAM_SET 4
+#define ERROR_NO_PERMS 5
+#define ERROR_CRED_EXPIRED 6
+#define ERROR_BAD_CRED 7
 
 /**
  * Collection of data relating to authenticating off of the system
@@ -58,7 +59,6 @@
    char user[PATH_MAX];
    char pass[PATH_MAX];
    char **env;
-   char *display;
 };
 typedef struct _Entrance_Auth Entrance_Auth;
 
@@ -68,13 +68,12 @@
 void entrance_auth_clear_pass(Entrance_Auth * e);
 
 /* 0 on success, 1 on failure */
-int entrance_auth_cmp_pam(Entrance_Auth * e);
-int entrance_auth_cmp_crypt(Entrance_Auth * e, Entrance_Config * cfg);
+int entrance_auth_cmp(Entrance_Auth * e, const char *display, int mode);
 void entrance_auth_pass_set(Entrance_Auth * e, const char *str);
 
 /* 0 on success, 1 on no user by that name */
 int entrance_auth_user_set(Entrance_Auth * e, const char *str);
-void entrance_auth_setup_environment(Entrance_Auth * e);
+void entrance_auth_setup_environment(Entrance_Auth * e, const char *display);
 void entrance_auth_reset(Entrance_Auth * e);
 
 #endif
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/apps/entrance/src/client/entrance_config.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -3 -r1.15 -r1.16
--- entrance_config.h   10 Apr 2004 22:20:24 -0000      1.15
+++ entrance_config.h   27 Dec 2004 06:45:14 -0000      1.16
@@ -15,6 +15,7 @@
 #include <unistd.h>
 #include <syslog.h>
 
+#define ENTRANCE_USE_CRYPT 0
 #define ENTRANCE_USE_PAM 1
 #define ENTRANCE_USE_SHADOW 2
 
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/apps/entrance/src/client/entrance_session.c,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -3 -r1.66 -r1.67
--- entrance_session.c  20 Dec 2004 03:07:05 -0000      1.66
+++ entrance_session.c  27 Dec 2004 06:45:14 -0000      1.67
@@ -32,7 +32,7 @@
  * Also Allocates the auth, and parse the config struct 
  */
 Entrance_Session *
-entrance_session_new(const char *config, char *display, int testing)
+entrance_session_new(const char *config, const char *display, int testing)
 {
    Entrance_Session *e;
    char *db;
@@ -46,9 +46,12 @@
    memset(e, 0, sizeof(struct _Entrance_Session));
 
    openlog("entrance", LOG_NOWAIT, LOG_DAEMON);
-   e->display = display;
+   if (!display)
+      e->display = strdup(getenv("DISPLAY"));
+   else
+      e->display = strdup(display);
+
    e->auth = entrance_auth_new();
-   e->auth->display = display;
    e->config = entrance_config_parse(db);
    if (!e->config)
    {
@@ -196,12 +199,7 @@
 int
 entrance_session_auth_user(Entrance_Session * e)
 {
-#if HAVE_PAM
-   if (e->config->auth == ENTRANCE_USE_PAM)
-      return (entrance_auth_cmp_pam(e->auth));
-   else
-#endif
-      return (entrance_auth_cmp_crypt(e->auth, e->config));
+   return (entrance_auth_cmp(e->auth, e->display, e->config->auth));
 }
 
 /**
@@ -215,13 +213,9 @@
    {
       Evas_Object *obj = NULL;
 
-#if 0
       if (e->auth)
          entrance_auth_free(e->auth);
       e->auth = entrance_auth_new();
-#else
-      entrance_auth_reset(e->auth);
-#endif
       if ((obj =
            edje_object_part_swallow_get(e->edje, "entrance.user.avatar")))
       {
@@ -341,7 +335,7 @@
 {
    char *homedir;
 
-   entrance_auth_setup_environment(e->auth);
+   entrance_auth_setup_environment(e->auth, e->display);
    homedir = getenv("HOME");
    if (entrance_ipc_connected_get())
       entrance_ipc_request_xauth(homedir, e->auth->pw->pw_uid,
@@ -364,7 +358,7 @@
    char buf[PATH_MAX];
    char *shell = NULL;
 
-   entrance_auth_setup_environment(e->auth);
+   entrance_auth_setup_environment(e->auth, e->display);
    if ((e->session) && (strlen(e->session) > 0))
    {
       if (!strcmp(e->session, "default"))
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/apps/entrance/src/client/entrance_session.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -3 -r1.21 -r1.22
--- entrance_session.h  20 Dec 2004 03:07:05 -0000      1.21
+++ entrance_session.h  27 Dec 2004 06:45:14 -0000      1.22
@@ -41,8 +41,8 @@
 
 typedef struct _Entrance_Session Entrance_Session;
 
-Entrance_Session *entrance_session_new(const char *config, char *display,
-                                       int testing);
+Entrance_Session *entrance_session_new(const char *config,
+                                       const char *display, int testing);
 void entrance_session_ecore_evas_set(Entrance_Session * e, Ecore_Evas * ee);
 void entrance_session_free(Entrance_Session * e);
 void entrance_session_run(Entrance_Session * e);
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/entrance/src/client/main.c,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -3 -r1.66 -r1.67
--- main.c      27 Dec 2004 03:31:21 -0000      1.66
+++ main.c      27 Dec 2004 06:45:14 -0000      1.67
@@ -692,7 +692,7 @@
            config = strdup(optarg);
            break;
         case 'z':
-           printf("entrance: main: z optarg = %s\n", optarg);
+           /* printf("entrance: main: z optarg = %s\n", optarg); */
            server_pid = (pid_t) atoi(optarg);
            break;
         default:




-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now. 
http://productguide.itmanagersjournal.com/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to