Better support for shadow passwords.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@817 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -56,6 +56,10 @@ static char STRING[] = "****************"; | |||||||
| #define XNLOCK_CTRL 1 | #define XNLOCK_CTRL 1 | ||||||
| #define XNLOCK_NOCTRL 0 | #define XNLOCK_NOCTRL 0 | ||||||
|  |  | ||||||
|  | #ifndef min | ||||||
|  | #define min(x,y) (((x)<(y))?(x):(y)) | ||||||
|  | #endif | ||||||
|  |  | ||||||
| static XtAppContext	app; | static XtAppContext	app; | ||||||
| static Display        *dpy; | static Display        *dpy; | ||||||
| static unsigned short	Width, Height; | static unsigned short	Width, Height; | ||||||
| @@ -66,7 +70,8 @@ static char	       *ProgName, *words; | |||||||
| static int		x, y; | static int		x, y; | ||||||
| static Pixel		Black, White; | static Pixel		Black, White; | ||||||
| static XFontStruct    *font; | static XFontStruct    *font; | ||||||
| static struct passwd  *pw; | static char		root_cpass[16]; | ||||||
|  | static char		user_cpass[16]; | ||||||
| static char		root_pw[16]; | static char		root_pw[16]; | ||||||
| static int		time_left, prompt_x, prompt_y, time_x, time_y; | static int		time_left, prompt_x, prompt_y, time_x, time_y; | ||||||
| static unsigned long	interval; | static unsigned long	interval; | ||||||
| @@ -166,7 +171,9 @@ get_words(void) | |||||||
|     return appres.text; |     return appres.text; | ||||||
| } | } | ||||||
|  |  | ||||||
| void usage(void) | static | ||||||
|  | void | ||||||
|  | usage(void) | ||||||
| { | { | ||||||
|     fprintf(stderr, "usage: %s [options] [message]\n", ProgName); |     fprintf(stderr, "usage: %s [options] [message]\n", ProgName); | ||||||
|     fprintf(stderr, "-fg color     foreground color\n"); |     fprintf(stderr, "-fg color     foreground color\n"); | ||||||
| @@ -523,9 +530,10 @@ verify(char *password) | |||||||
|     /* |     /* | ||||||
|      * First try with root password, if allowed. |      * First try with root password, if allowed. | ||||||
|      */ |      */ | ||||||
|      |     if (   appres.accept_root | ||||||
|     if(appres.accept_root && unix_verify_user("root", password) == 0) | 	&& strcmp(crypt(password, root_cpass), root_cpass) == 0) | ||||||
| 	return 0; |       return 0; | ||||||
|  |  | ||||||
|     /* |     /* | ||||||
|      * Password that log out user |      * Password that log out user | ||||||
|      */ |      */ | ||||||
| @@ -559,7 +567,13 @@ verify(char *password) | |||||||
|     } |     } | ||||||
|      |      | ||||||
|     /* |     /* | ||||||
|      * Try to verify as user. |      * Try copy of users password. | ||||||
|  |      */ | ||||||
|  |     if (strcmp(crypt(password, user_cpass), user_cpass) == 0) | ||||||
|  |       return 0; | ||||||
|  |  | ||||||
|  |     /* | ||||||
|  |      * Try to verify as user in case password change. | ||||||
|      */ |      */ | ||||||
|     if(unix_verify_user(name, password) == 0) |     if(unix_verify_user(name, password) == 0) | ||||||
| 	return 0; | 	return 0; | ||||||
| @@ -587,7 +601,7 @@ GetPasswd(Widget w, XEvent *_event, String *_s, Cardinal *_n) | |||||||
| 	/* guy is running around--change to post prompt box. */ | 	/* guy is running around--change to post prompt box. */ | ||||||
| 	XtRemoveTimeOut(timeout_id); | 	XtRemoveTimeOut(timeout_id); | ||||||
| 	state = GET_PASSWD; | 	state = GET_PASSWD; | ||||||
| 	if (appres.ignore_passwd || !strlen(pw->pw_passwd)) | 	if (appres.ignore_passwd || !strlen(user_cpass)) | ||||||
| 	    leave(); | 	    leave(); | ||||||
| 	post_prompt_box(XtWindow(w)); | 	post_prompt_box(XtWindow(w)); | ||||||
| 	cnt = 0; | 	cnt = 0; | ||||||
| @@ -837,6 +851,29 @@ main (int argc, char **argv) | |||||||
|     Widget override; |     Widget override; | ||||||
|     XGCValues gcvalues; |     XGCValues gcvalues; | ||||||
|  |  | ||||||
|  |     /* | ||||||
|  |      * Must be setuid root to read /etc/shadow, copy encrypted | ||||||
|  |      * passwords here and then switch to sane uid. | ||||||
|  |      */ | ||||||
|  |     { | ||||||
|  |       struct passwd *pw; | ||||||
|  |       if (!(pw = k_getpwuid(0))) | ||||||
|  | 	{ | ||||||
|  | 	  fprintf(stderr, "%s: can't get root's passwd!\n", ProgName); | ||||||
|  | 	  exit(1); | ||||||
|  | 	} | ||||||
|  |       strcpy(root_cpass, pw->pw_passwd); | ||||||
|  |  | ||||||
|  |       if (!(pw = k_getpwuid(getuid()))) | ||||||
|  | 	{ | ||||||
|  | 	  fprintf(stderr, "%s: Can't get your password entry!\n", ProgName); | ||||||
|  | 	  exit(1); | ||||||
|  | 	}  | ||||||
|  |       strcpy(user_cpass, pw->pw_passwd); | ||||||
|  |       setuid(getuid()); | ||||||
|  |       /* Now we're no longer running setuid root. */ | ||||||
|  |     } | ||||||
|  |  | ||||||
|     srand(getpid()); |     srand(getpid()); | ||||||
|     for (i = 0; i < STRING_LENGTH; i++) |     for (i = 0; i < STRING_LENGTH; i++) | ||||||
| 	STRING[i] = ((unsigned long)rand() % ('~' - ' ')) + ' '; | 	STRING[i] = ((unsigned long)rand() % ('~' - ' ')) + ' '; | ||||||
| @@ -848,17 +885,6 @@ main (int argc, char **argv) | |||||||
|     else |     else | ||||||
| 	ProgName = *argv; | 	ProgName = *argv; | ||||||
|  |  | ||||||
|     /* getpwuid() returns static pointer, so get root's passwd first */ |  | ||||||
|     if (!(pw = getpwuid(0))){ |  | ||||||
| 	fprintf(stderr, "%s: can't get root's passwd!\n", ProgName); |  | ||||||
| 	exit(1); |  | ||||||
|     } |  | ||||||
|     strcpy(root_pw, pw->pw_passwd); |  | ||||||
|     if (!(pw = getpwuid(getuid()))){ |  | ||||||
|       fprintf(stderr, "%s: Can't get your password entry!\n", ProgName); |  | ||||||
|       exit(1); |  | ||||||
|     }  |  | ||||||
|  |  | ||||||
|     krb_get_default_principal(name, inst, realm); |     krb_get_default_principal(name, inst, realm); | ||||||
|      |      | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Björn Groenvall
					Björn Groenvall