|
|
#include <sys/types.h> #include <prot.h>int smp_generate_pw(cleartext, hyphenp, usrp, reasonp) char *cleartext; char **hyphenp; struct smp_user_info *usrp; char **reasonp;
The password is generated by first calculating minimum and maximum password lengths. Then get_seed(S) is called to get a seed value and finally randomword(S) is called to generate the password.
smp_generate_pw copies the generated password to a pre-defined array, pointed to by cleartext. A hyphenated version is stored in the pre-defined array pointed to by *hyphenp. usrp points to a smp_user_info structure which has been created by the previous call to smp_check_user.
reasonp is used with certain return values to store a descriptive message.
... put("login: "); switch (smp_check_user(SMP_LOGIN, gets(line), ttyname(0), 0, &usrp, &pwtries, &reason)) { ... case SMP_PWREQ: put("\nmust set password now\n");if ((pwtype=smp_pw_choice(usrp, &reason)) == SMP_CHOOSE) { put("generate a password? "); if (tolower(*gets(line))=='y') pwtype = SMP_GENERATE; else pwtype = SMP_PICK; } else if (pwtype == SMP_EXTFAIL) { put(reason); put("\n"); exit(1); }
noecho(); for (;;) { if (pwtries < 1) { put("too many tries\n"); echo(); smp_audit_fail(usrp); exit(1); }
noecho(); switch (pwtype) { case SMP_PICK: ... break; case SMP_GENERATE: put("generating a password"); for (;;) { char *hyphen; if (smp_generate_pw(newpw, &hyphen, usrp, &reason) == SMP_EXTFAIL) { echo(); put(reason); put("\n"); exit(1); } put("\npassword: "); put(newpw); put(" hyphenated: "); put(hyphen); put(" enter password:"); if (strcmp(newpw, gets(line)) == 0) break; /* user takes this one */ if (strcmp(line, "quit") == 0) { put("\n"); echo(); smp_audit_fail(usrp); exit(1); } if (*line == '\0') continue; /* just return gets another one */ put("\nno match"); /* and go around again */ } put("\n"); break; } put("re-enter password: "); switch (smp_set_pw(gets(line), newpw, usrp, &pwtries, &reason)) { ... } break; } ... }