X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fchkpw.c;h=02e3c59b38bc623e885bdf259e14ccf9a45bdbd1;hb=de8a29ba5870a337d54c2ca012ae8be75437b721;hp=ac3f779ca9e128a9b4829739015efcf39a003d48;hpb=dba163badaa9fae3f922f84e371593ae33e994d9;p=citadel.git diff --git a/citadel/chkpw.c b/citadel/chkpw.c index ac3f779ca..02e3c59b3 100644 --- a/citadel/chkpw.c +++ b/citadel/chkpw.c @@ -1,6 +1,9 @@ -/* - * - */ +// +// Copyright (c) 1987-2021 by the citadel.org team +// +// This program is open source software. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. +// The program is distributed without any warranty, expressed or implied. #include #include @@ -12,9 +15,16 @@ #include #include #include +#include +#include #include #include +#include + +#include "citadel.h" +#include "sysdep.h" +#include "citadel_dirs.h" /* 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]; @@ -25,12 +35,24 @@ int chkpwd_read_pipe[2]; static int validpw(uid_t uid, const char *pass) { char buf[256]; + int rv; - 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); + rv = write(chkpwd_write_pipe[1], &uid, sizeof(uid_t)); + if (rv == -1) { + printf( "Communicatino with chkpwd broken: %s\n", strerror(errno)); + return 0; + } + rv = write(chkpwd_write_pipe[1], pass, 256); + if (rv == -1) { + printf( "Communicatino with chkpwd broken: %s\n", strerror(errno)); + return 0; + } + rv = read(chkpwd_read_pipe[0], buf, 4); + if (rv == -1) { + printf( "Communicatino with chkpwd broken: %s\n", strerror(errno)); + return 0; + } if (!strncmp(buf, "PASS", 4)) { printf("pass\n"); return(1); @@ -45,10 +67,16 @@ static int validpw(uid_t uid, const char *pass) */ void start_chkpwd_daemon(void) { pid_t chkpwd_pid; + struct stat filestats; int i; printf("Starting chkpwd daemon for host authentication mode\n"); + if ((stat(file_chkpwd, &filestats)==-1) || + (filestats.st_size==0)){ + printf("didn't find chkpwd daemon in %s: %s\n", file_chkpwd, strerror(errno)); + abort(); + } if (pipe(chkpwd_write_pipe) != 0) { printf("Unable to create pipe for chkpwd daemon: %s\n", strerror(errno)); abort(); @@ -67,7 +95,7 @@ void start_chkpwd_daemon(void) { dup2(chkpwd_write_pipe[0], 0); dup2(chkpwd_read_pipe[1], 1); for (i=2; i<256; ++i) close(i); - execl("./chkpwd", "chkpwd", NULL); + execl(file_chkpwd, file_chkpwd, NULL); printf("Unable to exec chkpwd daemon: %s\n", strerror(errno)); abort(); exit(errno); @@ -80,13 +108,19 @@ int main(int argc, char **argv) { char buf[256]; struct passwd *p; int uid; + char ctdldir[PATH_MAX]=CTDLDIR; printf("\n\n ** host auth mode test utility **\n\n"); start_chkpwd_daemon(); + if (getuid() != 0){ + printf("\n\nERROR: you need to be root to run this!\n\n"); + return(1); + } while(1) { printf("\n\nUsername: "); - gets(buf); + fgets(buf, sizeof buf, stdin); + buf[strlen(buf)-1] = 0; p = getpwnam(buf); if (p == NULL) { printf("Not found\n"); @@ -95,7 +129,8 @@ int main(int argc, char **argv) { uid = p->pw_uid; printf(" uid: %d\n", uid); printf("Password: "); - gets(buf); + fgets(buf, sizeof buf, stdin); + buf[strlen(buf)-1] = 0; validpw(uid, buf); } }