2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
24 * (c) Copyright 1993, 1994 Hewlett-Packard Company *
25 * (c) Copyright 1993, 1994 International Business Machines Corp. *
26 * (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
27 * (c) Copyright 1993, 1994 Novell, Inc. *
30 * xdm - display manager daemon
32 * $TOG: verify.c /main/7 1998/11/02 15:25:40 mgreess $
34 * Copyright 1988 Massachusetts Institute of Technology
36 * Permission to use, copy, modify, and distribute this software and its
37 * documentation for any purpose and without fee is hereby granted, provided
38 * that the above copyright notice appear in all copies and that both that
39 * copyright notice and this permission notice appear in supporting
40 * documentation, and that the name of M.I.T. not be used in advertising or
41 * publicity pertaining to distribution of the software without specific,
42 * written prior permission. M.I.T. makes no representations about the
43 * suitability of this software for any purpose. It is provided "as is"
44 * without express or implied warranty.
46 * Author: Keith Packard, MIT X Consortium
52 * typical unix verification routine.
59 #include <X11/Xresource.h>
74 struct passwd nobody = {
75 "Nobody", "***************"
78 static char *Pndefault = "/etc/default/login";
84 extern char *_ExpandLang( char *string, char *lang );
89 struct greet_info *greet,
90 struct verify_info *verify )
96 char last_sess[MAXPATHLEN];
100 Debug ("Verify(): %s\n", greet->name);
103 * The user has already been verified by the Greeter. This is
104 * really just to look up the rest of his environment. Better
105 * performance would be realized by having the Greeter look this up
106 * and pass it back in the pipe (saving an additional getpwnam).
109 p = getpwnam (greet->name);
110 if (!p || strlen (greet->name) == 0) {
111 Debug ("Can't get user information for %s\n", greet->name);
116 Debug ("BypassLogin = %d\n",d->bypassLogin);
117 if ( d->bypassLogin ) {
119 if ( !strcmp (p->pw_name, "Nobody" ))
120 s = "Greetless login failed; user invalid\n";
121 else if ( access ( p->pw_dir, F_OK ))
122 s = "Greetless login failed; bad user home dir access\n";
123 else if ( p->pw_uid == 0 )
124 s = "Greetless login failed; root bypass disallowed\n";
126 Debug(s); LogError((unsigned char *) s);
127 bzero(greet->password, strlen(greet->password));
131 #endif /* BYPASSLOGIN */
135 if (strcmp(crypt(greet->password,p->pw_passwd),p->pw_passwd)
136 && !d->bypassLogin) {
138 if (strcmp(crypt(greet->password,p->pw_passwd),p->pw_passwd)) {
139 #endif /* BYPASSLOGIN */
140 Debug ("verify failed\n");
141 bzero(greet->password, strlen(greet->password));
144 Debug ("verify succeeded\n");
145 bzero(greet->password, strlen(greet->password));
147 Debug ("User information for %s acquired\n", greet->name);
150 verify->uid = p->pw_uid;
153 if ( IsVerifyName(VN_AFS) ) {
154 (void)setgid(p->pw_gid);
155 verify->groups[2] = p->pw_gid;
159 getGroups (greet->name, verify, p->pw_gid);
161 verify->gid = p->pw_gid;
166 verify->audid = p->pw_audid;
167 verify->audflg = p->pw_audflg;
174 if(d->sessionType > NOTIFY_ALT_DTS)
175 notify_dt = NOTIFY_ALT_DTS;
177 notify_dt = d->sessionType;
183 argv = parseArgs (argv,d->session);
186 if((argv = setDt(d,argv,notify_dt)) == NULL)
187 /*if no startup file, startup the regular desktop*/
189 argv = parseArgs (argv,d->session);
191 Debug ("No Startup file \n");
195 snprintf(last_sess, sizeof(last_sess), "%s%s", home, LAST_SESSION_FILE);
197 if((lastsession = fopen(last_sess,"r")) == NULL) {
199 * if no lastsession file, execute the logically
200 * first alternate desktop
202 if((argv = setDt(d,argv,notify_dt)) == NULL)
204 argv = parseArgs (argv,d->session);
205 /* No altdts, set the Default Regular session */
206 Debug ("No AltDestops in the resources file \n");
210 strcpy(last_sess,"\0");
211 fgets(last_sess,MAXPATHLEN,lastsession);
213 if(access(last_sess, X_OK) != 0) {
214 if((argv = setDt(d,argv,notify_dt)) == NULL)
216 argv = parseArgs (argv,d->session);
217 /* No altdts, set the Default Regular session */
218 Debug ("No AltDestops in the resources file setting to %s \n",argv[0]);
222 argv = parseArgs (argv, last_sess);
232 argv = parseArgs (argv, greet->string);
234 argv = parseArgs (argv, "xsession");
236 verify->userEnviron = userEnv (d, greet->name, home, shell,p);
237 Debug ("User environment:\n");
238 printEnv (verify->userEnviron);
239 verify->systemEnviron = systemEnv (d, greet->name, home);
240 Debug ("System environment:\n");
241 printEnv (verify->systemEnviron);
242 Debug ("End of environments\n");
253 char *resources = NULL;
254 char altdts[MAXPATHLEN];
255 char altdtsclass[MAXPATHLEN];
256 char altdtstart[MAXPATHLEN];
257 char altdtstartclass[MAXPATHLEN];
266 Debug ("Verify - No resources \n");
271 if(dt_type == NOTIFY_LAST_DT) {
272 sprintf(altdts,"%s","Dtlogin*altDts");
273 sprintf(altdtsclass,"%s","Dtlogin*AltDts");
275 if(XrmGetResource(XresourceDB, altdts, altdtsclass,
276 &rmtype, &value_dts) == True){
277 adts = atoi(value_dts.addr);
278 for(i = 0; i < adts; i++) {
279 sprintf(altdtstart,"%s%d","Dtlogin*altDtStart",i+1);
280 sprintf(altdtstartclass,"%s%d","Dtlogin*AltDtStart",i+1);
281 if(XrmGetResource(XresourceDB, altdtstart, altdtstartclass,
282 &rmtype, &rmvalue) == True){
283 Debug ("Start up file is %s\n",rmvalue.addr);
284 argv = parseArgs (argv, rmvalue.addr);
291 altdtrequested = d->sessionType - NOTIFY_ALT_DTS;
293 sprintf(altdtstart,"%s%d",
294 "Dtlogin*altDtStart",altdtrequested);
295 sprintf(altdtstartclass,"%s%d",
296 "Dtlogin*AltDtStart",altdtrequested);
298 if(XrmGetResource(XresourceDB, altdtstart, altdtstartclass,
299 &rmtype, &rmvalue) == True){
300 Debug ("Start up file is %s\n",rmvalue.addr);
301 argv = parseArgs (argv, rmvalue.addr);
321 char *langlist = NULL;
325 * For AIX, we must delimit protected variables. This is done by
326 * adding special tags to the environment list. The setpenv()
327 * routine serched the environent for these special tags.
329 * NOTE: If you change the location of PENV_SYSSTR or PENV_USRSTR
330 * in this environment list, you MUST change the index
331 * in session.c prior to the call to setpenv().
334 env = setEnv(env,PENV_SYSSTR,""); /* protected vars */
335 env = setEnv(env,"LOGNAME",user);
336 env = setEnv(env,"LOGIN",user);
337 env = setEnv(env,PENV_USRSTR,""); /* regular vars */
341 env = setEnv (env,"LOGNAME", user);
344 for (exp = exportList; exp && *exp; ++exp)
346 value = getenv (*exp);
348 env = setEnv (env, *exp, value);
351 env = setEnv (env, "DISPLAY", d->name);
352 env = setEnv (env, "HOME", home);
353 env = setEnv (env, "USER", user);
356 if ((Def_path = login_defaults(p,d)) != NULL) {
357 env = setEnv (env, "PATH", Def_path);
361 if (d->userPath && strlen(d->userPath) > 0)
362 env = setEnv (env, "PATH", d->userPath);
365 env = setEnv (env, "SHELL", shell);
367 if (timeZone && strlen(timeZone) > 0 )
368 env = setEnv(env, "TZ", timeZone);
370 if ( d->langList && strlen(d->langList) > 0 )
371 langlist = d->langList;
372 #if defined (ENABLE_DYNAMIC_LANGLIST)
373 if (d->language && strlen(d->language) > 0)
374 langlist = d->language;
376 else if ( strlen(languageList) > 0 )
377 langlist = languageList;
378 #endif /* ENABLE_DYNAMIC_LANGLIST */
380 if (env && d->language && strlen(d->language) > 0)
381 env = setLang(d, env, langlist);
383 #if 0 /* setting LC_ALL can cause undesirable side effects -- bf@hp */
385 * Don't set LC_MESSAGES to LANG since:
386 * 1) if LC_MESSAGES is unset, it will by default take on the value of LANG
387 * 2) if set, we don't want to override the user's setting
389 env = setEnv (env, "LC_ALL", d->language);
390 env = setEnv (env, "LC_MESSAGES", d->language);
393 #if 0 /* setting XAUTHORITY here is a bug, needs further study... */
395 env = setEnv (env, "XAUTHORITY", d->authFile);
398 if (d->displayType.location != Local)
399 env = setEnv (env, XFORCEINTERNET, "True");
401 if (d->environStr && strlen(d->environStr) > 0)
402 env = parseEnv(env, d->environStr);
405 * set SESSIONTYPE environment variable if requested by user, or
406 * if the "dtlite" resource is set...
408 * Note: the dtlite resource takes precedence over xdmMode.
411 if (d->dtlite == True)
412 d->sessionType = NOTIFY_DTLITE;
413 else if (d->xdmMode == True)
414 d->sessionType = NOTIFY_XDM;
416 switch (d->sessionType) {
419 Debug("Setting SESSIONTYPE to 'dtlite'.\n");
420 env = setEnv(env, SESSIONTYPE, "dtlite");
424 Debug("Setting SESSIONTYPE to 'xdm'.\n");
425 env = setEnv(env, SESSIONTYPE, "xdm");
429 Debug("Setting SESSIONTYPE to 'dt'.\n");
430 env = setEnv(env, SESSIONTYPE, "dt");
434 Debug("SESSIONTYPE NOT set.\n");
443 * read login defaults
451 extern int defcntl();
455 char *final_path = malloc(MAXPATHLEN);
459 if (defopen(Pndefault) == 0) {
462 * code taken from login.c
464 flags = defcntl(DC_GETFLAGS, 0);
465 TURNOFF(flags, DC_CASE);
466 defcntl(DC_SETFLAGS, flags);
468 if ( p->pw_uid == 0 ) {
469 if ((Def_path = defread("SUPATH=")) != NULL)
470 Def_path = strdup(Def_path);
472 Def_path = strdup(DEF_SUPATH);
475 if ((Def_path = defread("PATH=")) != NULL)
476 Def_path = strdup(Def_path);
478 Def_path = strdup(DEF_PATH);
483 * close the file..(/etc/default/login)
485 (void) defopen((char *)NULL);
487 Debug ("login_defaults(): \n");
489 if (d->userPath && strlen(d->userPath) > 0) {
490 if(Def_path && strlen(Def_path) > 0)
491 element = strtok(Def_path,":");
495 strcpy(final_path,d->userPath);
498 if((strstr(d->userPath,element)) == NULL) {
499 strcat (final_path,":");
500 strcat (final_path,element);
502 element = strtok(NULL,":");
507 if(Def_path && strlen(Def_path) > 0)
516 systemEnv( struct display *d, char *user, char *home )
521 char *langlist = NULL;
525 for (exp = exportList; exp && *exp; ++exp)
527 value = getenv (*exp);
529 env = setEnv (env, *exp, value);
532 value = getenv("TZ");
534 env = setEnv (env, "TZ", value);
535 else if (timeZone && strlen(timeZone) > 0 )
536 env = setEnv(env, "TZ", timeZone);
538 env = setEnv (env, "DISPLAY", d->name);
540 env = setEnv (env, "HOME", home);
542 env = setEnv (env, "USER", user);
543 env = setEnv (env, "PATH", d->systemPath);
544 env = setEnv (env, "SHELL", d->systemShell);
546 if ( d->langList && strlen(d->langList) > 0 )
547 langlist = d->langList;
548 #if defined (ENABLE_DYNAMIC_LANGLIST)
549 else if (d->language && strlen(d->language) > 0 )
550 langlist = d->language;
552 else if ( strlen(languageList) > 0 )
553 langlist = languageList;
554 #endif /* ENABLE_DYNAMIC_LANGLIST */
556 if (d->language && strlen(d->language) > 0)
557 env = setLang(d, env, langlist);
559 if (d->displayType.location != Local)
560 env = setEnv (env, XFORCEINTERNET, "True");
563 if (getEnv (env, "OPENWINHOME") == NULL)
564 env = setEnv(env, "OPENWINHOME", "/usr/openwin");
575 * groupMember() not used in HP-UX
584 if (!strcmp (name, *members))
590 #endif /* ! __hpux */
596 struct verify_info *verify,
604 verify->groups[ngroups++] = gid;
608 * if your system does not support "initgroups(3C)", activate
612 #if !(defined(__hpux))
613 while ( (g = getgrent()) != NULL ) {
615 * make the list unique
617 for (i = 0; i < ngroups; i++)
618 if (verify->groups[i] == g->gr_gid)
622 if (groupMember (name, g->gr_mem)) {
623 if (ngroups >= NGROUPS)
624 LogError(ReadCatalog(MC_LOG_SET,
625 MC_LOG_MORE_GRP,MC_DEF_LOG_MORE_GRP),
626 name, NGROUPS, g->gr_name);
628 verify->groups[ngroups++] = g->gr_gid;
632 verify->ngroups = ngroups;