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_NOCTRL 0
|
||||
|
||||
#ifndef min
|
||||
#define min(x,y) (((x)<(y))?(x):(y))
|
||||
#endif
|
||||
|
||||
static XtAppContext app;
|
||||
static Display *dpy;
|
||||
static unsigned short Width, Height;
|
||||
@@ -66,7 +70,8 @@ static char *ProgName, *words;
|
||||
static int x, y;
|
||||
static Pixel Black, White;
|
||||
static XFontStruct *font;
|
||||
static struct passwd *pw;
|
||||
static char root_cpass[16];
|
||||
static char user_cpass[16];
|
||||
static char root_pw[16];
|
||||
static int time_left, prompt_x, prompt_y, time_x, time_y;
|
||||
static unsigned long interval;
|
||||
@@ -166,7 +171,9 @@ get_words(void)
|
||||
return appres.text;
|
||||
}
|
||||
|
||||
void usage(void)
|
||||
static
|
||||
void
|
||||
usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [options] [message]\n", ProgName);
|
||||
fprintf(stderr, "-fg color foreground color\n");
|
||||
@@ -523,9 +530,10 @@ verify(char *password)
|
||||
/*
|
||||
* First try with root password, if allowed.
|
||||
*/
|
||||
|
||||
if(appres.accept_root && unix_verify_user("root", password) == 0)
|
||||
return 0;
|
||||
if ( appres.accept_root
|
||||
&& strcmp(crypt(password, root_cpass), root_cpass) == 0)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* 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)
|
||||
return 0;
|
||||
@@ -587,7 +601,7 @@ GetPasswd(Widget w, XEvent *_event, String *_s, Cardinal *_n)
|
||||
/* guy is running around--change to post prompt box. */
|
||||
XtRemoveTimeOut(timeout_id);
|
||||
state = GET_PASSWD;
|
||||
if (appres.ignore_passwd || !strlen(pw->pw_passwd))
|
||||
if (appres.ignore_passwd || !strlen(user_cpass))
|
||||
leave();
|
||||
post_prompt_box(XtWindow(w));
|
||||
cnt = 0;
|
||||
@@ -837,6 +851,29 @@ main (int argc, char **argv)
|
||||
Widget override;
|
||||
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());
|
||||
for (i = 0; i < STRING_LENGTH; i++)
|
||||
STRING[i] = ((unsigned long)rand() % ('~' - ' ')) + ' ';
|
||||
@@ -848,17 +885,6 @@ main (int argc, char **argv)
|
||||
else
|
||||
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);
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user