Toying around with more boilerplate. Epstein didn't kill himself.
[citadel.git] / citadel / chkpw.c
index ac3f779ca9e128a9b4829739015efcf39a003d48..02e3c59b38bc623e885bdf259e14ccf9a45bdbd1 100644 (file)
@@ -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 <errno.h>
 #include <stdlib.h>
 #include <ctype.h>
 #include <sys/types.h>
 #include <sys/wait.h>
+#include <sys/stat.h>
+#include <unistd.h>
 #include <string.h>
 #include <limits.h>
+#include <dirent.h>
 
+
+#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);
                }
        }