/* ----------------------------
This program requires
-lsecurity -ldb -laud -lm
libraries to work
You should rename checkpassword-C2.c on checkpassword.c and compile it with
checkpassword-0.90 files.
------------------------------ */
#include "error.h"
#include "pathexec.h"
#include "prot.h"
extern char *dispcrypt();
#include
static struct passwd *pw;
#include
#include
#include
#include
static struct es_passwd *es_pw;
static char up[513];
static int uplen;
main(int argc,char **argv)
{
char *login;
char *password;
char *encrypted;
char *uxpass;
int r;
int i;
int argc1;
char *argv1;
uchar_t crypt_alg;
(void) set_auth_parameters(argc1, argv1);
if (!argv[1]) _exit(2);
uplen = 0;
for (;;) {
do
r = read(3,up + uplen,sizeof(up) - uplen);
while ((r == -1) && (errno == error_intr));
if (r == -1) _exit(111);
if (r == 0) break;
uplen += r;
if (uplen >= sizeof(up)) _exit(1);
}
close(3);
i = 0;
if (i >= uplen) _exit(2);
login = up + i;
while (up[i++]) if (i >= uplen) _exit(2);
password = up + i;
if (i >= uplen) _exit(2);
while (up[i++]) if (i >= uplen) _exit(2);
pw = getpwnam(login);
if (pw)
uxpass = pw->pw_passwd;
else {
if (errno == error_txtbsy) _exit(111);
_exit(1);
}
setprpwent();
es_pw = getespwnam(login);
if (es_pw)
{
uxpass = es_pw->ufld->fd_encrypt;
crypt_alg = es_pw->ufld->fd_oldcrypt;
}
else
if (errno == error_txtbsy) _exit(111);
if (!uxpass) _exit(1);
encrypted = dispcrypt(password,uxpass,crypt_alg);
for (i = 0;i < sizeof(up);++i) up[i] = 0;
r = 0;
if (!*uxpass || strcmp(encrypted,uxpass)) r = 1;
if (prot_gid((int) pw->pw_gid) == -1) r = 1;
if (prot_uid((int) pw->pw_uid) == -1) r = 1;
if (r == 1)
{
endprpwent();
_exit(1);
}
r = 0;
if (chdir(pw->pw_dir) == -1) r = 1;
if (!pathexec_env("USER",pw->pw_name)) r = 1;
if (!pathexec_env("HOME",pw->pw_dir)) r = 1;
if (!pathexec_env("SHELL",pw->pw_shell)) r = 1;
if (r == 1)
{
endprpwent();
_exit(1);
}
pathexec(argv + 1);
endprpwent();
// _exit(111);
}