]> andersk Git - moira.git/blobdiff - clients/userreg/userreg.c
re-order includes, so kadm.h and kadm_err.h set things up so krb.h
[moira.git] / clients / userreg / userreg.c
index ebd0f93d934b54d874cefa876551d855f66346d6..e5f3c5a399e196d8f191bbb19c4c8202587b98d9 100644 (file)
@@ -3,29 +3,43 @@
  * $Author$
  * $Locker$
  * $Header$ 
+ *
+ *  (c) Copyright 1988 by the Massachusetts Institute of Technology.
+ *  For copying and distribution information, please see the file
+ *  <mit-copyright.h>.
  */
 
 #ifndef lint
 static char    *rcsid_userreg_c = "$Header$";
 #endif lint
 
+#include <mit-copyright.h>
+#include <string.h>
 #include <curses.h>
 #include <signal.h>
 #include <sys/time.h>
 #include <setjmp.h>
 #include <ctype.h>
+#include <kadm.h>
+#include <kadm_err.h>
 #include <krb.h>
+#include <des.h>
 #include <errno.h>
 #include "userreg.h"
 #include "ureg_err.h"
 
+/* 7.2 release compatibility */
+#ifndef KADM_INSECURE_PW
+#define KADM_INSECURE_PW       (-1783126240L)
+#endif
+
 #define EXIT -1
 
 
 struct user     user, db_user;
 struct alias    alias;
 char            typed_mit_id[100];
-
+char           realm[REALM_SZ];
 jmp_buf         redo;
 int             restart();
 
@@ -33,10 +47,21 @@ extern int      errno;
 int             user_is_valid = 0;
 int            user_has_login = 0;
 int             already_registered = 0;
+int            enrollment = 0;
+extern char *disabled();
 
 fix_display(sig)
 {
+#ifdef POSIX
+       struct sigaction act;
+
+       sigemptyset(&act.sa_mask);
+       act.sa_flags = 0;
+       act.sa_handler= (void (*)()) SIG_IGN;
+       sigaction(sig, &act, NULL);
+#else
        signal(sig, SIG_IGN);   /* let us clean up, please */
+#endif
        noraw();
        echo();
        endwin();
@@ -49,29 +74,57 @@ main(argc, argv)
 {
        register int    ntimes;
        register int    reencrypt;
-       char            line[100];
+       char            line[100], *when, *msg;
        int status;
        char tmpfirst[100], tmplast[100], tmpmid[100];
-       
+#ifdef POSIX
+       struct sigaction act;
+#endif
+
        status = ureg_init();
        if (status) {
                com_err(argv[0], status, "while trying to initialize");
                exit(1);
        }
 
+       if (when = disabled(&msg)) {
+           printf("We're sorry, the registration service is unavailable right now\n");
+           if (msg)
+             printf("because %s\n", msg);
+           printf("You should be able to register after %s", when);
+           printf("\nPress ENTER or RETURN to continue ");
+           fflush(stdout);
+           getchar();
+           exit(0);
+       }
+
+       /* stash the realm for later use */
+       if ((status = krb_get_lrealm(realm, 1)) != KSUCCESS) {
+           printf("System error; please try another workstation.");
+           exit(1);
+       }
+
        setup_display();
 
+#ifdef POSIX
+       sigemptyset(&act.sa_mask);
+       act.sa_flags = 0;       
+       act.sa_handler= (void (*)()) fix_display;
+       sigaction(SIGINT, &act, NULL);
+       sigaction(SIGQUIT, &act, NULL);
+       sigaction(SIGHUP, &act, NULL);
+#else
        signal(SIGINT, fix_display);
        signal(SIGQUIT, fix_display);
        signal(SIGHUP, fix_display);
+#endif
 
-       do {
-               
+       while (1) {
                setjmp(redo);
                reset();
                ntimes = 0;
 
-               display_text(WELCOME);
+               display_text(WELCOME, "");
 
                gfirst();
                gmi();
@@ -86,14 +139,15 @@ main(argc, argv)
                while (dolook()) {
                        ntimes++;
                        if (ntimes > 3) {
+                               display_text_line(0);
                                display_text_line("Sorry, you still cannot be found in the database.");
                                display_text_line(" ");
-                               display_text_line("Please call the account administrator at x1325 for help.");
-                               sleep(8);
+                               display_text_line("Please call an accounts consultant at x3-1325 for help.");
+                               wait_for_user();
                                break;
                        }
                        display_text_line(0);   /* clear the window */
-                       display_text_line("I'm afraid I was unable to find you in the database.");
+                       display_text_line("You could not be found in the database.");
                        display_text_line("Do you want to change some input (for example, the spelling");
                        display_text_line("of part of your name) and try again?");
                        if (askyn("Do you want to try again ? ") == YES) {
@@ -137,7 +191,8 @@ main(argc, argv)
                                        reencrypt = 0;
                                }
                                if (reencrypt) {
-                                       encrypt_mitid();
+                                   EncryptID(user.u_mit_id, typed_mit_id,
+                                             user.u_first, user.u_last);
                                }
                        } else
                                break;
@@ -158,20 +213,26 @@ main(argc, argv)
                        continue;
                }
                sleep(1);
-               display_text_line(0);
-               display_text_line("You are now registered to get an Athena account.");
-               sprintf(line, "Please remember your username of \"%s\" and the password",
-                       user.u_login);
-               display_text_line(line);
-               display_text_line("you typed in earlier.");
-               display_text_line("");
-               display_text_line("Your account should be created within about 12 hours\n");
-               
-               display_text_line("");
-               display_text_line("You are now finished. Thank you!");
-               sleep(5);
+               if (!enrollment)
+                 display_text(FINISHED, user.u_login);
+               else {
+                   display_text(FINISHEDE, user.u_login);
+                   if (askyn("Do you wish to set your mailbox now? (Yes or No) ")) {
+                       clear();
+                       refresh();
+                       noraw();
+                       echo();
+                       kinit(user.u_login, user.u_password);
+                       system(NAMESPACE_PROG);
+                       dest_tkt();
+                       qexit();
+                       exit(0);
+                   }
+               }
+               wait_for_user();
                qexit();
-       } while (getuid() == 0);/* Loop forever if we're root */
+               break;
+       }
        restore_display();
        exit(0);
 }
@@ -179,9 +240,10 @@ main(argc, argv)
 reset()
 {
        reset_display();
-       bzero(&user, sizeof(user));
+       memset(&user, 0, sizeof(user));
        user_is_valid = 0;
        already_registered = 0;
+       enrollment = 0;
        redisp();
 }
 
@@ -196,20 +258,26 @@ dolook()
                return (0);
        }
        display_text_line(0);
-       display_text_line(
-        "Looking you up in the database.... This may take a few minutes.");
+       display_text_line("Looking you up in the database.... This may take from 30 seconds to 10");
+       display_text_line("minutes, depending on how busy the system is at the moment.");
 
        timer_off();
        result = verify_user(user.u_first, user.u_last,
                             typed_mit_id, user.u_mit_id, db_user.u_login);
+       wfeep();
+       display_text_line(0);
        timer_on();
        switch(result) {
        case 0:
+       case UREG_ENROLLED:
                display_text_line("You have been located in the user registration database.");
                user_is_valid = 1;
                user_has_login = 0;
                sleep(1);
                return 0;
+       case UREG_HALF_ENROLLED:
+               enrollment = 1;
+               /* fall through to: */
        case UREG_NO_PASSWD_YET:
                user_is_valid = 1;
                user_has_login = 1;
@@ -232,135 +300,284 @@ dolook()
                display_text_line("You are already registered.  An account for you probably already exists");
                display_text_line("(if not, it will appear within 12 hours).");
                display_text_line("");
-               display_text_line("Refer to the documents 'Essential Athena' and 'Essential Unix'");
+               display_text_line("Refer to the document 'Getting Started on Athena' for help logging in.");
                strcpy(user.u_login, db_user.u_login);
-               sprintf(line, "for help logging in.  Remember, the username you chose was '%s'",
+               sprintf(line, "Remember, the username you chose was '%s'",
                        db_user.u_login);
                display_text_line(line);
                redisp();
-               sleep(5);
+               wait_for_user();
                return (0);
+       case UREG_DELETED:
+               display_text(DELETED_ACCT, db_user.u_login);
+               wait_for_user();
+               restore_display();
+               exit(0);
+       case UREG_NOT_ALLOWED:
+               display_text(OFFER_ENROLL, db_user.u_login);
+               redisp();
+               if (!askyn("Continue choosing a name and password (Y/N)? ")) {
+                   already_registered = 1;
+                   return(0);
+               }
+               user_has_login = 0;
+               user_is_valid = 1;
+               enrollment = 1;
+               return(0);
+       case UREG_ENROLL_NOT_ALLOWED:
+               display_text(NOT_ALLOWED, db_user.u_login);
+               wait_for_user();
+               restore_display();
+               exit(0);
+       case UREG_KRB_TAKEN:
+               display_text(IMPROPER_LOGIN, db_user.u_login);
+               wait_for_user();
+               return(0);
        case UREG_USER_NOT_FOUND:
                return (1);
 
        case ECONNREFUSED:
        case ETIMEDOUT:
-               display_text(NETWORK_DOWN);
+       case UREG_MISC_ERROR:
+               display_text(NETWORK_DOWN, db_user.u_login);
+               display_text_line(" ");
+               sprintf(line, "The specific error was: %s",
+                       error_message(result));
+               display_text_line(line);
+               wait_for_user();
                return (0);
                
        default:
                display_text_line("An unexpected error occurred while trying to access the database");
                display_text_line(error_message(result));
                redisp();
-               sleep(5);
+               wait_for_user();
                return(1);
        }
 }
 
+
+/* Get a login name from the user and register it.  There are several steps
+ * to this: display help message, get name, check name, display confirmation
+ * message, get confirmation, register name.
+ */
+
 negotiate_login()
 {
-       register int    result, result2;
-       int             same;
-       char            line[100];
-       char            old_login[LOGIN_SIZE];
-       char            old_password[PASSWORD_SIZE];
-       char            realm[REALM_SZ];
-       int             i;
-       char *cp;
+    int result, i;
+    char line[100], old_login[LOGIN_SIZE+2];
+    char *error, *cp;
        
-       display_text(USERNAME_BLURB);
-       cp = user.u_login;
-       if (isalpha(user.u_first[0]))
-               *cp++ = user.u_first[0];
-       if (isalpha(user.u_mid_init[0]))
-               *cp++ = user.u_mid_init[0];
+    /* build suggested username */
+    cp = user.u_login;
+    if (isalpha(user.u_first[0]))
+      *cp++ = user.u_first[0];
+    if (isalpha(user.u_mid_init[0]))
+      *cp++ = user.u_mid_init[0];
+    for (i = 0; user.u_last[i] && cp - user.u_login < 8; i++)
+      if (isalpha(user.u_last[i]))
+       *cp++ = user.u_last[i];
+    for (i=0; user.u_login[i]; i++)
+      if (isupper(user.u_login[i]))
+       user.u_login[i]=tolower(user.u_login[i]);
+    strcpy(old_login, user.u_login);
        
-       for (i = 0; user.u_last[i] && cp - user.u_login < 8; i++) {
-               if (isalpha(user.u_last[i])) *cp++ = user.u_last[i];
+    /* print message */
+    display_text(USERNAME_BLURB, user.u_login);
+
+ again:
+    /* get name from user */
+    glogin();
+
+    display_text_line(0);
+    display_text_line("Testing that username...");
+    error = "";
+    if (strlen(user.u_login) < 3)
+      error = "Your username must be at least 3 characters long.";
+    else if (strlen(user.u_login) > 8)
+      error = "Your username cannot be longer than 8 characters.";
+    else if (!isalpha(user.u_login[0]) || !islower(user.u_login[0]))
+      error = "Your username must start with a lowercase letter.";
+    else for (i = 1; i < strlen(user.u_login); i++)
+      if (!islower(user.u_login[i]) &&
+         !isdigit(user.u_login[i]) &&
+         user.u_login[i] != '_')
+       error = "Your username must contain only lower case letters, numbers, and underscore";
+    timer_off();
+    result = krb_get_pw_in_tkt(user.u_login, "", realm, 
+                              "krbtgt", realm, 1, "");
+    timer_on();
+    if (*error == 0 && result != KDC_PR_UNKNOWN)
+      error = "That username is already taken.";
+
+    /* if it's bad, get another name from user */
+    if (*error) {
+       strcpy(user.u_login, old_login);
+       redisp();
+       display_text_line(error);
+       display_text_line("Please choose another username.");
+       goto again;
+    }
+
+    /* name is OK, make sure */
+    display_text(USERNAME_BLURB2, user.u_login);
+    if (!askyn("Do you want to register this username? (Yes or No) "))
+      goto again;
+
+    display_text_line(0);
+    display_text_line("Trying to assign that username...  This may take a few minutes.");
+
+    /* Do It! */
+    timer_off();
+    if (!enrollment)
+      result = grab_login(user.u_first, user.u_last,
+                         typed_mit_id, user.u_mit_id,
+                         user.u_login);
+    else
+      result = enroll_login(user.u_first, user.u_last,
+                           typed_mit_id, user.u_mit_id,
+                           user.u_login);
+    wfeep();
+    timer_on();
+    if (result != 0) {
+       char buf[BUFSIZ];
+
+       if (result == UREG_LOGIN_USED) {
+           /* name was in moira but not kerberos */
+           error = "Sorry, that username really was in use after all.";
+           strcpy(user.u_login, old_login);
+           redisp();
+           display_text_line(error);
+           display_text_line("Please choose another username.");
+           goto again;
        }
 
-       for (i=0; user.u_login[i]; i++)
-               if (isupper(user.u_login[i]))
-                       user.u_login[i]=tolower(user.u_login[i]);
-       
-       strcpy(old_login, user.u_login);
-       sprintf(line, "We suggest the username '%s'.", user.u_login);
-       display_text_line(line);
-       display_text_line(
-                         "If you are sure you would prefer another username,  feel free to enter");
-       display_text_line(
-                         "a different one,  but  remember  that it will remain with you for all the ");
-       display_text_line("time you are at MIT.");
-
-       while (1) {
-               glogin();
-
-               display_text_line(0);
-               display_text_line("Looking up that username in the database...  This may take a few minutes.");
-               timer_off();
-               /*
-                * Rather than bother SMS with a bunch of different
-                * usernames, all in use, we first try and see if this
-                * guy is known to Kerberos.
-                */
-               if ((result = get_krbrlm(realm, 1)) != KSUCCESS) {
-                   display_text_line("Can't get kerberos realm, giving up");
-                   continue;
-               }
-               result = get_in_tkt(user.u_login, "", realm, "krbtgt", realm, "");
-               timer_on();
-               if (result != KDC_PR_UNKNOWN) {
-               in_use:
-                       strcpy(user.u_login, old_login);
-                       redisp();
-                       display_text_line("I'm sorry, but that username is already taken.  Please try again with a different username");
-                       continue;
-               }
+       display_text(NETWORK_DOWN, "");
+       display_text_line(" ");
+       sprintf(buf, "The specific error was: %s", error_message(result));
+       display_text_line(buf);
+       wait_for_user();
+       return (qexit());
+    }
+
+    /* at this point we have successfully negotiated a username */
+    sprintf(line, "O.K. your username will be \"%s\".", user.u_login);
+    display_text_line(0);
+    display_text_line(line);
+    redisp();
+    sleep(3);
+    return 0;
+}
 
-               /*
-                * If he isn't, let's try through SMS.
-                */
-               timer_off();
-               result = grab_login(user.u_first, user.u_last,
-                                   typed_mit_id, user.u_mit_id,
-                                   user.u_login);
-               timer_on();
-               if (result != 0) {
-                       if (result == UREG_LOGIN_USED) goto in_use;
-                       display_text(NETWORK_DOWN);
-                       return (qexit());
-               } else break;
-       }
-       /* at this point we have successfully negotiated a username */
 
-       sprintf(line, "O.K. your username will be \"%s\".", user.u_login);
-       display_text_line(0);
-       display_text_line(line);
-       redisp();
-       sleep(3);
-       return 0;
-}
 negotiate_passwd()
 {
-       display_text_line(0);
-       display_text(PASSWORD_BLURB);
+    char *passwd, *error;
+    char old_passwd[256], fullname[256], tktstring[256], inst[INST_SZ];
+    char login[ANAME_SZ], lpassword[PASSWORD_SIZE];
+    int result;
+    des_cblock key;
+    FILE *in;
+
+ again:
+    display_text(PASSWORD_BLURB, "");
+    gpass();
+
+    /* validate password */
+    error = NULL;
+    passwd = user.u_password;
+    sprintf(fullname, "%s%s", user.u_first, user.u_last);
+    if (strlen(passwd) < 6)
+      error = "Please choose a longer password.";
+    if (!strpasscmp(passwd, user.u_first) ||
+       !strpasscmp(passwd, user.u_last) ||
+       !strpasscmp(passwd, user.u_login) ||
+       !strpasscmp(passwd, fullname) ||
+       !strpasscmp(passwd, typed_mit_id))
+      error = "Please do not use your name or ID number for your password.";
+    if (!error) {
+       in = fopen(LOGIN_INFO, "r");
+       if (in != NULL) {
+           fgets(login, sizeof(login), in);
+           /* trim trailing newline */
+           if (strlen(login))
+             login[strlen(login) - 1] = 0;
+           fgets(lpassword, sizeof(lpassword), in);
+           /* trim trailing newline */
+           if (strlen(lpassword))
+             lpassword[strlen(lpassword) - 1] = 0;
+           fclose(in);
+       } else {
+           strcpy(login, "moira");
+           strcpy(lpassword, "moira");
+       }
 
-       gpass();
-       display_text_line("Storing password in the database...  This may take a few minutes.");
-       if (do_replace()) {
-               return (-1);
+       sprintf(tktstring, "/tmp/tkt_cpw_%d", getpid());
+       krb_set_tkt_string(tktstring);  
+       des_string_to_key(passwd, key);
+       inst[0] = 0;
+
+       result = krb_get_pw_in_tkt(login, inst, realm, PWSERV_NAME,
+                                  KADM_SINST, 1, lpassword);
+       if (result == KSUCCESS)
+         result = kadm_init_link(PWSERV_NAME, KRB_MASTER, realm);
+       if (result == KSUCCESS)
+         result = kadm_check_pw(key, passwd, &error);
+       dest_tkt();
+       if (result == KADM_INSECURE_PW) {
+           error = "You have chosen a passsword that is in the dictionary of commonly\nselected user passwords.  You will have to choose a better password.";
+       } else if (result != KSUCCESS) {
+           display_text(NETWORK_DOWN);
+           display_text_line(" ");
+           sprintf(fullname, "%s while verifying password",
+                   error_message(result));
+           display_text_line(fullname);
+           wait_for_user();
+           return(-1);
        }
-       display_text_line("done.");
+    }
 
+    if (error) {
+       display_text_line(0);
+       display_text_line(error);
+       wait_for_user();
+       goto again;
+    }
+
+    display_text(PASSWORD_BLURB2, "");
+    strcpy(old_passwd, user.u_password);
+    gpass();
+    if (strcmp(old_passwd, user.u_password)) {
+       display_text_line(0);
+       display_text_line("What you just typed did not match the password you gave the first time.");
+       sleep(8);
+       goto again;
+    }
+
+    display_text_line("Storing password in the database...  This may take a few minutes.");
+    if (do_replace()) {
+       return (-1);
+    }
+    display_text_line("done.");
+    return(0);
 }
 
 gfirst()
 {
        /* input the first name */
-       char            buf[100];
-
-       signal(SIGALRM, restart);
-       input("Enter first Name:", buf, 100, FIRSTNAME_TIMEOUT);
+       char            buf[FIRST_NAME_SIZE+2];
+#ifdef POSIX
+       struct sigaction act;
+
+       sigemptyset(&act.sa_mask);
+       act.sa_flags = 0;
+       act.sa_handler= (void (*)()) fix_display;
+       sigaction(SIGALRM, &act, NULL);
+#else
+       signal(SIGALRM, fix_display);
+#endif
+       input("Enter first Name:", buf, FIRST_NAME_SIZE+1,
+             FIRSTNAME_TIMEOUT, TRUE);
        strncpy(user.u_first, buf, FIRST_NAME_SIZE);
        user.u_first[FIRST_NAME_SIZE - 1] = '\0';
        canon_name(user.u_first);
@@ -370,10 +587,19 @@ gfirst()
 glast()
 {
        /* input the last name */
-       char            buf[100];
-
+       char            buf[LAST_NAME_SIZE+2];
+#ifdef POSIX
+       struct sigaction act;
+
+       sigemptyset(&act.sa_mask);
+       act.sa_flags = 0;
+       act.sa_handler= (void (*)()) fix_display;
+       sigaction(SIGALRM, &act, NULL);
+#else
        signal(SIGALRM, restart);
-       input("Enter family Name:", buf, 100, LASTNAME_TIMEOUT);
+#endif
+       input("Enter family Name:", buf, LAST_NAME_SIZE+1,
+             LASTNAME_TIMEOUT, FALSE);
        strncpy(user.u_last, buf, LAST_NAME_SIZE);
        user.u_last[LAST_NAME_SIZE - 1] = '\0';
        canon_name(user.u_last);
@@ -383,64 +609,42 @@ glast()
 gpass()
 {
        /* input password */
-       char            old_password[PASSWORD_SIZE];
-       char            new_password[PASSWORD_SIZE];
-       char            new_password_again[PASSWORD_SIZE];
-
-do_input:
+       char            new_password[PASSWORD_SIZE + 1];
+#ifdef POSIX
+       struct sigaction act;
+
+       sigemptyset(&act.sa_mask);
+       act.sa_flags = 0;
+       act.sa_handler= (void (*)()) fix_display;
+       sigaction(SIGALRM, &act, NULL);
+#else
        signal(SIGALRM, restart);
+#endif
        input_no_echo("Enter password:", new_password,
                      PASSWORD_SIZE, NEW_PASSWORD_TIMEOUT);
-       if (strlen(new_password) < 4) {
-               display_text_line("Please use a password of at least 4 characters.");
-               goto do_input;
-       }
-       signal(SIGALRM, restart);
-       input_no_echo("Enter password again:", new_password_again,
-                     PASSWORD_SIZE, REENTER_PASSWORD_TIMEOUT);
-       if (strcmp(new_password, new_password_again)) {
-               display_text_line("Sorry, the two passwords you just typed in don't match.");
-               display_text_line("Please try again.");
-               goto do_input;
-       }
-
        strcpy(user.u_password, new_password);
        redisp();
 }
 
+
+/* get login name */
+
 glogin()
 {
-       /* get login name */
-       register int    i;
-       char            buf[100];
-       register char  *nbuf = buf;
-
-input_login:
-       i = 0;
-       user.u_login[0] = '\0';
-       nbuf = &buf[0];
+       char buf[LOGIN_SIZE+2];
+#ifdef POSIX
+       struct sigaction act;
+
+       sigemptyset(&act.sa_mask);
+       act.sa_flags = 0;
+       act.sa_handler= (void (*)()) fix_display;
+       sigaction(SIGALRM, &act, NULL);
+#else
        signal(SIGALRM, restart);
-       input("Enter username:", buf, 100, USERNAME_TIMEOUT);
-       while (*nbuf != '\0') {
-               if (!islower(*nbuf) && !isdigit(*nbuf)
-                   && (*nbuf != '_') && (*nbuf != '.')) {
-                       display_text_line("Your username must be all lowercase alphabetic characters.");
-                       goto input_login;
-               }
-               user.u_login[i] = *nbuf++;
-               i++;
-               if (i > LOGIN_SIZE - 1) {
-                       display_text_line("Your username must be no more than 8 characters long.");
-                       goto input_login;
-               }
-       }
-       if (i != 0) {
-               user.u_login[i] = '\0';
-       }
-       if (strlen(user.u_login) < 3) {
-               display_text_line("Your username must be 3 or more characters long.\n");
-               goto input_login;
-       }
+#endif
+       user.u_login[0] = '\0';
+       input("Enter username:", buf, LOGIN_SIZE, USERNAME_TIMEOUT, FALSE);
+       strcpy(user.u_login, buf);
        redisp();
 }
 
@@ -448,12 +652,23 @@ gmitid()
 {
        /* get mid id */
        register int    i;
-       char            buf[100];
+       char            buf[15];
        register char  *nbuf = buf;
+#ifdef POSIX
+       struct sigaction act;
+#endif
+
 
 input_mit_id:
+#ifdef POSIX
+       sigemptyset(&act.sa_mask);
+       act.sa_flags = 0;
+       act.sa_handler= (void (*)()) fix_display;
+       sigaction(SIGALRM, &act, NULL);
+#else
        signal(SIGALRM, restart);
-       input("Enter MIT Id:", buf, 100, MITID_TIMEOUT);
+#endif
+       input("Enter MIT Id:", buf, 14, MITID_TIMEOUT, FALSE);
        i = 0;
        nbuf = &buf[0];
        while (*nbuf != '\0') {
@@ -476,35 +691,24 @@ input_mit_id:
        }
        typed_mit_id[9] = '\0';
        redisp();
-       encrypt_mitid();
-}
-
-encrypt_mitid()
-{
-       char            salt[3];
-
-       make_salt(salt, user.u_first, user.u_last);
-       strcpy(user.u_mit_id, crypt(&typed_mit_id[2], salt));
-}
-
-
-#define _tolower(c) ((c)|0x60)
-
-make_salt(salt, first, last)
-       char           *salt, *first, *last;
-{
-       salt[0] = _tolower(last[0]);
-       salt[1] = _tolower(first[0]);
+       EncryptID(user.u_mit_id, typed_mit_id, user.u_first, user.u_last);
 }
 
-
 gmi()
 {
        /* get middle initial */
-       char            buf[100];
-
+       char            buf[MID_INIT_SIZE+2];
+#ifdef POSIX
+       struct sigaction act;
+
+       sigemptyset(&act.sa_mask);
+       act.sa_flags = 0;
+       act.sa_handler= (void (*)()) fix_display;
+       sigaction(SIGALRM, &act, NULL);
+#else
        signal(SIGALRM, restart);
-       input("Enter Middle Initial:", buf, 100, MI_TIMEOUT);
+#endif
+       input("Enter Middle Initial:", buf, MID_INIT_SIZE+1, MI_TIMEOUT, TRUE);
        strncpy(user.u_mid_init, buf, MID_INIT_SIZE);
        user.u_mid_init[MID_INIT_SIZE - 1] = '\0';
        canon_name(user.u_mid_init);
@@ -514,11 +718,12 @@ gmi()
 qexit()
 {
        /* exit quickly, not saving anything in the database */
-       bzero(&user, sizeof(user));
+       memset(&user, 0, sizeof(user));
        typed_mit_id[0] = '\0';
        user_is_valid = 0;
        already_registered = 0;
-       sleep(6);               /* give the user a chance to see the screen */
+       enrollment = 0;
+       sleep(2);               /* give the user a chance to see the screen */
        display_text_line(0);
        return (EXIT);
 }
@@ -527,22 +732,49 @@ qexit()
 do_replace()
 {
        int status;
+       char buf[100];
        
        /*
         * replaces a user in the database. If there is an error, it informs
         * the user and calls qexit(); It returns only if is is successful 
         */
        timer_off();
-       status = set_password(user.u_first, user.u_last, typed_mit_id,
-                             user.u_mit_id, user.u_password);
+       if (!enrollment)
+         status = set_password(user.u_first, user.u_last, typed_mit_id,
+                               user.u_mit_id, user.u_password);
+       else
+         status = get_krb(user.u_first, user.u_last, typed_mit_id,
+                               user.u_mit_id, user.u_password);
+       wfeep();
        timer_on();
        if (status) {
                display_text (NETWORK_DOWN);
+               display_text_line(" ");
+               sprintf(buf, "The specific error was: %s",
+                       error_message(status));
+               display_text_line(buf);
+               wait_for_user();
                return (-1);
        } else return 0;
 }
 
+
+kinit(user, passwd)
+char *user, *passwd;
+{
+    int status;
+    char inst[INST_SZ];
+
+    inst[0] = 0;
+    status = krb_get_pw_in_tkt(user, inst, realm, "krbtgt",
+                              realm, DEFAULT_TKT_LIFE, 0);
+    return(status);
+}
+
+
+#ifndef _toupper
 #define _toupper(c) ((c) & ~0x20)
+#endif
 
 lenient_strcmp(string1, string2)
        register char  *string1, *string2;
@@ -557,11 +789,13 @@ lenient_strcmp(string1, string2)
                if (*string1 == '\0' && *string2 == '\0') {
                        return (0);
                }
-               if (*string1 == ' ' || *string1 == '.' || *string1 == '-' || *string1 == '\'') {
+               if (*string1 == ' ' || *string1 == '.' || *string1 == '-' ||
+                   *string1 == '\'' || *string1 == '_') {
                        string1++;
                        continue;
                }
-               if (*string2 == ' ' || *string2 == '.' || *string2 == '-' || *string2 == '\'') {
+               if (*string2 == ' ' || *string2 == '.' || *string2 == '-' ||
+                   *string2 == '\'' || *string2 == '_') {
                        string2++;
                        continue;
                }
@@ -573,6 +807,31 @@ lenient_strcmp(string1, string2)
        }
 }
 
+
+/* See if the strings match in forward & reverse direction, ignoring
+ * case and spaces/punctuation.
+ */
+
+strpasscmp(s1, s2)
+char *s1, *s2;
+{
+    char buf[256], *from, *to;
+
+    if (!lenient_strcmp(s1, s2))
+      return(0);
+    /* if s2 is empty, say OK */
+    if (!*s2)
+      return(1);
+
+    from = &s2[strlen(s2)];
+    from--;
+    for (to = &buf[0]; from >= s2; from--)
+      *to++ = *from;
+
+    return(lenient_strcmp(s1, buf));
+}
+
+
 /*
  * Input timeout handler.  Loop back to asking for the first name. 
  */
@@ -581,7 +840,7 @@ restart()
 /* Go to asking for first name. */
 {
        qexit();
-       longjmp(redo);
+       longjmp(redo, 1);
 }
 
 canon_name(cp)
@@ -598,8 +857,5 @@ canon_name(cp)
                while (p2 >= cp && isspace(*p2)) *(--p2) = '\0';
        }
        /* Make it capitalized */
-       for (p2=cp; *p2; p2++) {
-               if (isupper(*p2)) *p2 = tolower(*p2);
-       }
-       if (islower(*cp)) *cp=toupper(*cp);
+       FixCase(cp);
 }
This page took 0.103205 seconds and 4 git commands to generate.