From: Art Cancro Date: Tue, 19 Jun 2007 15:10:50 +0000 (+0000) Subject: Added 'chkpw.c' utility for manually checking passwords. X-Git-Tag: v7.86~3297 X-Git-Url: https://code.citadel.org/?a=commitdiff_plain;h=dba163badaa9fae3f922f84e371593ae33e994d9;p=citadel.git Added 'chkpw.c' utility for manually checking passwords. This is not yet integrated into the build. --- diff --git a/citadel/chkpw.c b/citadel/chkpw.c new file mode 100644 index 000000000..ac3f779ca --- /dev/null +++ b/citadel/chkpw.c @@ -0,0 +1,104 @@ +/* + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* These pipes are used to talk to the chkpwd daemon, which is forked during startup */ +int chkpwd_write_pipe[2]; +int chkpwd_read_pipe[2]; + +/* + * Validate a password on the host unix system by talking to the chkpwd daemon + */ +static int validpw(uid_t uid, const char *pass) +{ + char buf[256]; + + snprintf(buf, sizeof buf, "%016d", uid); + write(chkpwd_write_pipe[1], buf, 16); + write(chkpwd_write_pipe[1], pass, 256); + read(chkpwd_read_pipe[0], buf, 4); + + if (!strncmp(buf, "PASS", 4)) { + printf("pass\n"); + return(1); + } + + printf("fail\n"); + return 0; +} + +/* + * Start up the chkpwd daemon so validpw() has something to talk to + */ +void start_chkpwd_daemon(void) { + pid_t chkpwd_pid; + int i; + + printf("Starting chkpwd daemon for host authentication mode\n"); + + if (pipe(chkpwd_write_pipe) != 0) { + printf("Unable to create pipe for chkpwd daemon: %s\n", strerror(errno)); + abort(); + } + if (pipe(chkpwd_read_pipe) != 0) { + printf("Unable to create pipe for chkpwd daemon: %s\n", strerror(errno)); + abort(); + } + + chkpwd_pid = fork(); + if (chkpwd_pid < 0) { + printf("Unable to fork chkpwd daemon: %s\n", strerror(errno)); + abort(); + } + if (chkpwd_pid == 0) { + dup2(chkpwd_write_pipe[0], 0); + dup2(chkpwd_read_pipe[1], 1); + for (i=2; i<256; ++i) close(i); + execl("./chkpwd", "chkpwd", NULL); + printf("Unable to exec chkpwd daemon: %s\n", strerror(errno)); + abort(); + exit(errno); + } +} + + + +int main(int argc, char **argv) { + char buf[256]; + struct passwd *p; + int uid; + + printf("\n\n ** host auth mode test utility **\n\n"); + start_chkpwd_daemon(); + + while(1) { + printf("\n\nUsername: "); + gets(buf); + p = getpwnam(buf); + if (p == NULL) { + printf("Not found\n"); + } + else { + uid = p->pw_uid; + printf(" uid: %d\n", uid); + printf("Password: "); + gets(buf); + validpw(uid, buf); + } + } + + return(0); +}