home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / X / mit / clients / xdm / verify.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-07-18  |  5.0 KB  |  237 lines

  1. /*
  2.  * xdm - display manager daemon
  3.  *
  4.  * $XConsortium: verify.c,v 1.24 91/07/18 22:22:45 rws Exp $
  5.  *
  6.  * Copyright 1988 Massachusetts Institute of Technology
  7.  *
  8.  * Permission to use, copy, modify, and distribute this software and its
  9.  * documentation for any purpose and without fee is hereby granted, provided
  10.  * that the above copyright notice appear in all copies and that both that
  11.  * copyright notice and this permission notice appear in supporting
  12.  * documentation, and that the name of M.I.T. not be used in advertising or
  13.  * publicity pertaining to distribution of the software without specific,
  14.  * written prior permission.  M.I.T. makes no representations about the
  15.  * suitability of this software for any purpose.  It is provided "as is"
  16.  * without express or implied warranty.
  17.  *
  18.  * Author:  Keith Packard, MIT X Consortium
  19.  */
  20.  
  21. /*
  22.  * verify.c
  23.  *
  24.  * typical unix verification routine.
  25.  */
  26.  
  27. # include    "dm.h"
  28. # include    <pwd.h>
  29. # ifdef NGROUPS_MAX
  30. # include    <grp.h>
  31. # endif
  32. #ifdef USESHADOW
  33. # include    <shadow.h>
  34. #endif
  35. #ifdef X_NOT_STDC_ENV
  36. char *getenv();
  37. #endif
  38.  
  39. struct passwd joeblow = {
  40.     "Nobody", "***************"
  41. };
  42.  
  43. #ifdef USESHADOW
  44. struct spwd spjoeblow = {
  45.     "Nobody", "**************"
  46. };
  47. #endif
  48.  
  49. static char *envvars[] = {
  50. #if defined(sony) && !defined(SYSTYPE_SYSV)
  51.     "bootdev",
  52.     "boothowto",
  53.     "cputype",
  54.     "ioptype",
  55.     "machine",
  56.     "model",
  57.     "CONSDEVTYPE",
  58.     "SYS_LANGUAGE",
  59.     "SYS_CODE",
  60.     "TZ",
  61. #endif
  62.     NULL
  63. };
  64.  
  65. Verify (d, greet, verify)
  66. struct display        *d;
  67. struct greet_info    *greet;
  68. struct verify_info    *verify;
  69. {
  70.     struct passwd    *p;
  71. #ifdef USESHADOW
  72.     struct spwd    *sp;
  73. #endif
  74.     char        *crypt ();
  75.     char        **userEnv (), **systemEnv (), **parseArgs ();
  76.     char        *shell, *home;
  77.     char        **argv;
  78.  
  79.     Debug ("Verify %s ...\n", greet->name);
  80.     p = getpwnam (greet->name);
  81.     if (!p || strlen (greet->name) == 0)
  82.         p = &joeblow;
  83. #ifdef USESHADOW
  84.     sp = getspnam(greet->name);
  85.     if (sp == NULL) {
  86.         sp = &spjoeblow;
  87.         Debug ("getspnam() failed.  Are you root?\n");
  88.     }
  89.     endspent();
  90.  
  91.     if (strcmp (crypt (greet->password, sp->sp_pwdp), sp->sp_pwdp))
  92. #else
  93.     if (strcmp (crypt (greet->password, p->pw_passwd), p->pw_passwd))
  94. #endif
  95.     {
  96.         Debug ("verify failed\n");
  97.         bzero(greet->password, strlen(greet->password));
  98.         return 0;
  99.     }
  100.     Debug ("verify succeeded\n");
  101. /*    bzero(greet->password, strlen(greet->password)); */
  102.     verify->uid = p->pw_uid;
  103. #ifdef NGROUPS_MAX
  104.     getGroups (greet->name, verify, p->pw_gid);
  105. #else
  106.     verify->gid = p->pw_gid;
  107. #endif
  108.     home = p->pw_dir;
  109.     shell = p->pw_shell;
  110.     argv = 0;
  111.     if (d->session)
  112.         argv = parseArgs (argv, d->session);
  113.     if (greet->string)
  114.         argv = parseArgs (argv, greet->string);
  115.     if (!argv)
  116.         argv = parseArgs (argv, "xsession");
  117.     verify->argv = argv;
  118.     verify->userEnviron = userEnv (d, p->pw_uid == 0,
  119.                        greet->name, home, shell);
  120.     Debug ("user environment:\n");
  121.     printEnv (verify->userEnviron);
  122.     verify->systemEnviron = systemEnv (d, greet->name, home);
  123.     Debug ("system environment:\n");
  124.     printEnv (verify->systemEnviron);
  125.     Debug ("end of environments\n");
  126.     return 1;
  127. }
  128.  
  129. extern char **setEnv ();
  130.  
  131. char **
  132. defaultEnv ()
  133. {
  134.     char    **env, **exp, *value;
  135.  
  136.     env = 0;
  137.     for (exp = exportList; exp && *exp; ++exp)
  138.     {
  139.     value = getenv (*exp);
  140.     if (value)
  141.         env = setEnv (env, *exp, value);
  142.     }
  143.     return env;
  144. }
  145.  
  146. char **
  147. userEnv (d, useSystemPath, user, home, shell)
  148. struct display    *d;
  149. int    useSystemPath;
  150. char    *user, *home, *shell;
  151. {
  152.     char    **env;
  153.     char    **envvar;
  154.     char    *str;
  155.     
  156.     env = defaultEnv ();
  157.     env = setEnv (env, "DISPLAY", d->name);
  158.     env = setEnv (env, "HOME", home);
  159.     env = setEnv (env, "USER", user);
  160.     env = setEnv (env, "PATH", useSystemPath ? d->systemPath : d->userPath);
  161.     env = setEnv (env, "SHELL", shell);
  162.     for (envvar = envvars; *envvar; envvar++)
  163.     {
  164.     if (str = getenv(*envvar))
  165.         env = setEnv (env, *envvar, str);
  166.     }
  167.     return env;
  168. }
  169.  
  170. char **
  171. systemEnv (d, user, home)
  172. struct display    *d;
  173. char    *user, *home;
  174. {
  175.     char    **env;
  176.     
  177.     env = defaultEnv ();
  178.     env = setEnv (env, "DISPLAY", d->name);
  179.     if (home)
  180.     env = setEnv (env, "HOME", home);
  181.     if (user)
  182.     env = setEnv (env, "USER", user);
  183.     env = setEnv (env, "PATH", d->systemPath);
  184.     env = setEnv (env, "SHELL", d->systemShell);
  185.     if (d->authFile)
  186.         env = setEnv (env, "XAUTHORITY", d->authFile);
  187.     return env;
  188. }
  189.  
  190. #ifdef NGROUPS_MAX
  191. groupMember (name, members)
  192. char    *name;
  193. char    **members;
  194. {
  195.     while (*members) {
  196.         if (!strcmp (name, *members))
  197.             return 1;
  198.         ++members;
  199.     }
  200.     return 0;
  201. }
  202.  
  203. getGroups (name, verify, gid)
  204. char            *name;
  205. struct verify_info    *verify;
  206. int            gid;
  207. {
  208.     int        ngroups;
  209.     struct group    *g;
  210.     int        i;
  211.  
  212.     ngroups = 0;
  213.     verify->groups[ngroups++] = gid;
  214.     setgrent ();
  215.     /* SUPPRESS 560 */
  216.     while (g = getgrent()) {
  217.         /*
  218.          * make the list unique
  219.          */
  220.         for (i = 0; i < ngroups; i++)
  221.             if (verify->groups[i] == g->gr_gid)
  222.                 break;
  223.         if (i != ngroups)
  224.             continue;
  225.         if (groupMember (name, g->gr_mem)) {
  226.             if (ngroups >= NGROUPS_MAX)
  227.                 LogError ("%s belongs to more than %d groups, %s ignored\n",
  228.                     name, NGROUPS_MAX, g->gr_name);
  229.             else
  230.                 verify->groups[ngroups++] = g->gr_gid;
  231.         }
  232.     }
  233.     verify->ngroups = ngroups;
  234.     endgrent ();
  235. }
  236. #endif
  237.