Date: Thu, 11 Dec 2008 08:32:21 +0200 From: Giorgos Keramidas <keramida@ceid.upatras.gr> To: "Sheldon Givens" <sheldon@sigsegv.ca> Cc: freebsd-hackers@freebsd.org Subject: Re: Small Change to chpass.c Message-ID: <87vdtr9q8a.fsf@kobe.laptop> In-Reply-To: <f4ecc0930812101800g601d9f10jc008e83d82b54a81@mail.gmail.com> (Sheldon Givens's message of "Wed, 10 Dec 2008 18:00:25 -0800") References: <f4ecc0930812101800g601d9f10jc008e83d82b54a81@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 10 Dec 2008 18:00:25 -0800, "Sheldon Givens" <sheldon@sigsegv.ca> wrote: > Hi guys, > > When I was doing some user management today I noticed that chpass, and > all the utilities that use chpass.c, only give one attempt to > authenticate to make the change. After I messed this up once or twice > (and after doing 4-5 minutes of editing only to have it lost when I > typo'd the password) I wrote this little change in to chpass.c. This seems useful, thanks for submitting the patch :) > ---snip--- > --- /usr/src/usr.bin/chpass.c 2008-12-11 01:55:27.000000000 -0800 > +++ /usr/src/usr.bin/chpass.c 2008-12-11 01:57:09.000000000 -0800 > @@ -80,10 +80,11 @@ > { > enum { NEWSH, LOADENTRY, EDITENTRY, NEWPW, NEWEXP } op; > struct passwd lpw, *old_pw, *pw; > - int ch, pfd, tfd; > + int ch, pfd, tfd, itr, auth; > const char *password; > char *arg = NULL; > uid_t uid; > + int max_retries = 3; > #ifdef YP > struct ypclnt *ypclnt; > const char *yp_domain = NULL, *yp_host = NULL; > @@ -227,9 +228,16 @@ > } > > if (old_pw && !master_mode) { > - password = getpass("Password: "); > - if (strcmp(crypt(password, old_pw->pw_passwd), > - old_pw->pw_passwd) != 0) > + auth = 0; > + for(itr=0;itr<max_retries;itr++) { > + password = getpass("Password:"); > + if(strcmp(crypt(password, old_pw->pw_passwd), > + old_pw->pw_passwd) == 0) { > + auth=1; > + break; > + } > + } > + if (!auth) > baduser(); > } else { > password = ""; > ---snip--- You can probably do away with `auth' and reset password to NULL when strcmp() fails (note that we also use whitespace in for statements to separate everything more clearly): if (old_pw && !master_mode) { for (itr = 0; itr < max_retries; itr++) { password = getpass("Password:"); if (strcmp(crypt(password, old_pw->pw_passwd), old_pw->pw_passwd) != 0) break; password = NULL; } if (password == NULL) baduser(); } else { password = "";
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?87vdtr9q8a.fsf>