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 librararies 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 strcpy(last_sess,home);
196 strcat(last_sess,LAST_SESSION_FILE);
198 if((lastsession = fopen(last_sess,"r")) == NULL) {
200 * if no lastsession file, execute the logically
201 * first alternate desktop
203 if((argv = setDt(d,argv,notify_dt)) == NULL)
205 argv = parseArgs (argv,d->session);
206 /* No altdts, set the Default Regular session */
207 Debug ("No AltDestops in the resources file \n");
211 strcpy(last_sess,"\0");
212 fgets(last_sess,MAXPATHLEN,lastsession);
214 if(access(last_sess, X_OK) != 0) {
215 if((argv = setDt(d,argv,notify_dt)) == NULL)
217 argv = parseArgs (argv,d->session);
218 /* No altdts, set the Default Regular session */
219 Debug ("No AltDestops in the resources file setting to %s \n",argv[0]);
223 argv = parseArgs (argv, last_sess);
233 argv = parseArgs (argv, greet->string);
235 argv = parseArgs (argv, "xsession");
237 verify->userEnviron = userEnv (d, greet->name, home, shell,p);
238 Debug ("User environment:\n");
239 printEnv (verify->userEnviron);
240 verify->systemEnviron = systemEnv (d, greet->name, home);
241 Debug ("System environment:\n");
242 printEnv (verify->systemEnviron);
243 Debug ("End of environments\n");
245 if (setlogin(greet->name) == -1) {
246 Debug ("setlogin failed for %s, errno = %d\n", greet->name,
260 char *resources = NULL;
261 char altdts[MAXPATHLEN];
262 char altdtsclass[MAXPATHLEN];
263 char altdtstart[MAXPATHLEN];
264 char altdtstartclass[MAXPATHLEN];
273 Debug ("Verify - No resources \n");
278 if(dt_type == NOTIFY_LAST_DT) {
279 sprintf(altdts,"%s","Dtlogin*altDts");
280 sprintf(altdtsclass,"%s","Dtlogin*AltDts");
282 if(XrmGetResource(XresourceDB, altdts, altdtsclass,
283 &rmtype, &value_dts) == True){
284 adts = atoi(value_dts.addr);
285 for(i = 0; i < adts; i++) {
286 sprintf(altdtstart,"%s%d","Dtlogin*altDtStart",i+1);
287 sprintf(altdtstartclass,"%s%d","Dtlogin*AltDtStart",i+1);
288 if(XrmGetResource(XresourceDB, altdtstart, altdtstartclass,
289 &rmtype, &rmvalue) == True){
290 Debug ("Start up file is %s\n",rmvalue.addr);
291 argv = parseArgs (argv, rmvalue.addr);
298 altdtrequested = d->sessionType - NOTIFY_ALT_DTS;
300 sprintf(altdtstart,"%s%d",
301 "Dtlogin*altDtStart",altdtrequested);
302 sprintf(altdtstartclass,"%s%d",
303 "Dtlogin*AltDtStart",altdtrequested);
305 if(XrmGetResource(XresourceDB, altdtstart, altdtstartclass,
306 &rmtype, &rmvalue) == True){
307 Debug ("Start up file is %s\n",rmvalue.addr);
308 argv = parseArgs (argv, rmvalue.addr);
332 * For AIX, we must delimit protected variables. This is done by
333 * adding special tags to the environment list. The setpenv()
334 * routine serched the environent for these special tags.
336 * NOTE: If you change the location of PENV_SYSSTR or PENV_USRSTR
337 * in this environment list, you MUST change the index
338 * in session.c prior to the call to setpenv().
341 env = setEnv(env,PENV_SYSSTR,""); /* protected vars */
342 env = setEnv(env,"LOGNAME",user);
343 env = setEnv(env,"LOGIN",user);
344 env = setEnv(env,PENV_USRSTR,""); /* regular vars */
348 env = setEnv (env,"LOGNAME", user);
351 for (exp = exportList; exp && *exp; ++exp)
353 value = getenv (*exp);
355 env = setEnv (env, *exp, value);
358 env = setEnv (env, "DISPLAY", d->name);
359 env = setEnv (env, "HOME", home);
360 env = setEnv (env, "USER", user);
363 if ((Def_path = login_defaults(p,d)) != NULL)
364 env = setEnv (env, "PATH", Def_path);
366 if (d->userPath && strlen(d->userPath) > 0)
367 env = setEnv (env, "PATH", d->userPath);
370 env = setEnv (env, "SHELL", shell);
372 if (timeZone && strlen(timeZone) > 0 )
373 env = setEnv(env, "TZ", timeZone);
375 if ( d->langList && strlen(d->langList) > 0 )
376 langlist = d->langList;
377 #if defined (ENABLE_DYNAMIC_LANGLIST)
378 if (d->language && strlen(d->language) > 0)
379 langlist = d->language;
381 else if (languageList && strlen(languageList) > 0 )
382 langlist = languageList;
383 #endif /* ENABLE_DYNAMIC_LANGLIST */
385 if (d->language && strlen(d->language) > 0)
386 env = setLang(d, env, langlist);
388 #if 0 /* setting LC_ALL can cause undesirable side effects -- bf@hp */
390 * Don't set LC_MESSAGES to LANG since:
391 * 1) if LC_MESSAGES is unset, it will by default take on the value of LANG
392 * 2) if set, we don't want to override the user's setting
394 env = setEnv (env, "LC_ALL", d->language);
395 env = setEnv (env, "LC_MESSAGES", d->language);
398 #if 0 /* setting XAUTHORITY here is a bug, needs further study... */
400 env = setEnv (env, "XAUTHORITY", d->authFile);
403 if (d->displayType.location != Local)
404 env = setEnv (env, XFORCEINTERNET, "True");
406 if (d->environStr && strlen(d->environStr) > 0)
407 env = parseEnv(env, d->environStr);
410 * set SESSIONTYPE environment variable if requested by user, or
411 * if the "dtlite" resource is set...
413 * Note: the dtlite resource takes precedence over xdmMode.
416 if (d->dtlite == True)
417 d->sessionType = NOTIFY_DTLITE;
418 else if (d->xdmMode == True)
419 d->sessionType = NOTIFY_XDM;
421 switch (d->sessionType) {
424 Debug("Setting SESSIONTYPE to 'dtlite'.\n");
425 env = setEnv(env, SESSIONTYPE, "dtlite");
429 Debug("Setting SESSIONTYPE to 'xdm'.\n");
430 env = setEnv(env, SESSIONTYPE, "xdm");
434 Debug("Setting SESSIONTYPE to 'dt'.\n");
435 env = setEnv(env, SESSIONTYPE, "dt");
439 Debug("SESSIONTYPE NOT set.\n");
448 * read login defaults
456 extern int defcntl();
460 char final_path[MAXPATHLEN];
464 if (defopen(Pndefault) == 0) {
467 * code taken from login.c
469 flags = defcntl(DC_GETFLAGS, 0);
470 TURNOFF(flags, DC_CASE);
471 defcntl(DC_SETFLAGS, flags);
473 if ( p->pw_uid == 0 ) {
474 if ((Def_path = defread("SUPATH=")) != NULL)
475 Def_path = strdup(Def_path);
477 Def_path = DEF_SUPATH;
480 if ((Def_path = defread("PATH=")) != NULL)
481 Def_path = strdup(Def_path);
488 * close the file..(/etc/default/login)
490 (void) defopen((char *)NULL);
492 Debug ("login_defaults(): \n");
494 if (d->userPath && strlen(d->userPath) > 0) {
495 if(Def_path && strlen(Def_path) > 0)
496 element = strtok(Def_path,":");
500 strcpy(final_path,d->userPath);
503 if((strstr(d->userPath,element)) == NULL) {
504 strcat (final_path,":");
505 strcat (final_path,element);
507 element = strtok(NULL,":");
512 if(Def_path && strlen(Def_path) > 0)
521 systemEnv( struct display *d, char *user, char *home )
530 for (exp = exportList; exp && *exp; ++exp)
532 value = getenv (*exp);
534 env = setEnv (env, *exp, value);
537 value = getenv("TZ");
539 env = setEnv (env, "TZ", value);
540 else if (timeZone && strlen(timeZone) > 0 )
541 env = setEnv(env, "TZ", timeZone);
543 env = setEnv (env, "DISPLAY", d->name);
545 env = setEnv (env, "HOME", home);
547 env = setEnv (env, "USER", user);
548 env = setEnv (env, "PATH", d->systemPath);
549 env = setEnv (env, "SHELL", d->systemShell);
551 if ( d->langList && strlen(d->langList) > 0 )
552 langlist = d->langList;
553 #if defined (ENABLE_DYNAMIC_LANGLIST)
554 else if (d->language && strlen(d->language) > 0 )
555 langlist = d->language;
557 else if (languageList && strlen(languageList) > 0 )
558 langlist = languageList;
559 #endif /* ENABLE_DYNAMIC_LANGLIST */
561 if (d->language && strlen(d->language) > 0)
562 env = setLang(d, env, langlist);
564 if (d->displayType.location != Local)
565 env = setEnv (env, XFORCEINTERNET, "True");
568 if (getEnv (env, "OPENWINHOME") == NULL)
569 env = setEnv(env, "OPENWINHOME", "/usr/openwin");
580 * groupMember() not used in HP-UX
589 if (!strcmp (name, *members))
595 #endif /* ! __hpux */
601 struct verify_info *verify,
609 verify->groups[ngroups++] = gid;
613 * if your system does not support "initgroups(3C)", activate
617 #if !(defined(__hpux) || defined(__osf__))
618 while ( (g = getgrent()) != NULL ) {
620 * make the list unique
622 for (i = 0; i < ngroups; i++)
623 if (verify->groups[i] == g->gr_gid)
627 if (groupMember (name, g->gr_mem)) {
628 if (ngroups >= NGROUPS)
629 LogError(ReadCatalog(MC_LOG_SET,
630 MC_LOG_MORE_GRP,MC_DEF_LOG_MORE_GRP),
631 name, NGROUPS, g->gr_name);
633 verify->groups[ngroups++] = g->gr_gid;
637 verify->ngroups = ngroups;