X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/6ec067c71def94f93fca957f583881c6bf4d17d7..44d12d589b43a1d65d8af81559b3f1588d88acff:/clients/moira/user.c diff --git a/clients/moira/user.c b/clients/moira/user.c index 76001be0..e084f0ad 100644 --- a/clients/moira/user.c +++ b/clients/moira/user.c @@ -1,31 +1,37 @@ #if (!defined(lint) && !defined(SABER)) static char rcsid_module_c[] = "$Header$"; -#endif lint +#endif /* This is the file user.c for the MOIRA Client, which allows a nieve * user to quickly and easily maintain most parts of the MOIRA database. * It Contains: Functions for manipulating user information. - * + * * Created: 5/9/88 * By: Chris D. Peterson * * $Source$ * $Author$ * $Header$ - * + * * Copyright 1988 by the Massachusetts Institute of Technology. * - * For further information on copyright and distribution + * For further information on copyright and distribution * see the file mit-copyright.h */ #include -#include +#include +#include #include #include #include #include - +#include +#ifdef GDSS +#include +#include +#include +#endif #include "mit-copyright.h" #include "defs.h" #include "f_defs.h" @@ -35,8 +41,13 @@ #define UID 1 #define BY_NAME 2 #define CLASS 3 +#define ID 4 +#ifdef ATHENA +#define DEFAULT_SHELL "/bin/athena/tcsh" +#else #define DEFAULT_SHELL "/bin/csh" +#endif #define DEFAULT_CLASS "?" @@ -46,25 +57,27 @@ * Returns: pointer to statically allocated string. */ -static char *states[] = { "Registerable (0)", - "Active (1)", - "Half Registered (2)", - "Deleted (3)", - "Not registerable (4)", - "Enrolled/Registerable (5)", - "Enrolled/Not Registerable (6)", - "Half Enrolled (7)" }; - -static char *UserState(state) -int state; +static char *states[] = { + "Registerable (0)", + "Active (1)", + "Half Registered (2)", + "Deleted (3)", + "Not registerable (4)", + "Enrolled/Registerable (5)", + "Enrolled/Not Registerable (6)", + "Half Enrolled (7)" +}; + +static char *UserState(int state) { - char buf[BUFSIZ]; + static char buf[BUFSIZ]; - if (state < 0 || state >= US_END) { - sprintf(buf, "Unknown (%d)", state); - return(buf); + if (state < 0 || state >= US_END) + { + sprintf(buf, "Unknown (%d)", state); + return buf; } - return(states[state]); + return states[state]; } @@ -74,14 +87,12 @@ int state; * Returns: none. */ -static void -PrintUserName(info) -char ** info; +static void PrintUserName(char **info) { - char buf[BUFSIZ], print_buf[BUFSIZ]; - sprintf(buf, "%s, %s %s", info[U_LAST], info[U_FIRST], info[U_MIDDLE]); - sprintf(print_buf, "%-40s User Name: %s", buf, info[U_NAME]); - Put_message(print_buf); + char buf[BUFSIZ], print_buf[BUFSIZ]; + sprintf(buf, "%s, %s %s", info[U_LAST], info[U_FIRST], info[U_MIDDLE]); + sprintf(print_buf, "%-40s User Name: %s", buf, info[U_NAME]); + Put_message(print_buf); } /* Function Name: PrintUserInfo @@ -91,23 +102,42 @@ char ** info; * Returns: none */ -static void -PrintUserInfo(info) -char ** info; +static void PrintUserInfo(char **info) { - char name[BUFSIZ], buf[BUFSIZ]; - - sprintf(name, "%s, %s %s", info[U_LAST], info[U_FIRST], info[U_MIDDLE]); - sprintf(buf, "Login name: %-20s Full name: %s", info[U_NAME], name); - Put_message(buf); - sprintf(buf, "User id: %-23s Login shell %-10s Class: %s", - info[U_UID], info[U_SHELL], info[U_CLASS]); - Put_message(buf); - sprintf(buf, "Account is: %-20s MIT ID number: %s", - UserState(atoi(info[U_STATE])), info[U_MITID]); - Put_message(buf); - sprintf(buf, MOD_FORMAT, info[U_MODBY], info[U_MODTIME],info[U_MODWITH]); - Put_message(buf); + char name[BUFSIZ], buf[BUFSIZ]; + int status; +#ifdef GDSS + SigInfo si; +#endif + + sprintf(name, "%s, %s %s", info[U_LAST], info[U_FIRST], info[U_MIDDLE]); + sprintf(buf, "Login name: %-20s Full name: %s", info[U_NAME], name); + Put_message(buf); + sprintf(buf, "User id: %-23s Login shell %-10s Class: %s", + info[U_UID], info[U_SHELL], info[U_CLASS]); + Put_message(buf); + +#ifdef GDSS + sprintf(buf, "%s:%s", info[U_NAME], info[U_MITID]); + si.rawsig = NULL; + status = GDSS_Verify(buf, strlen(buf), info[U_SIGNATURE], &si); +#else /* GDSS */ + status = 0; +#endif /* GDSS */ + + sprintf(buf, "Account is: %-20s MIT ID number: %s Signed: %s", + UserState(atoi(info[U_STATE])), info[U_MITID], + *info[U_SIGNATURE] ? (status ? "Bad" : "Yes") : "No"); + Put_message(buf); + if (atoi(info[U_SECURE])) + sprintf(buf, "Secure password set on %s.", atot(info[U_SECURE])); + else + sprintf(buf, "No secure password set."); + Put_message(buf); + sprintf(buf, "Comments: %s", info[U_COMMENT]); + Put_message(buf); + sprintf(buf, MOD_FORMAT, info[U_MODBY], info[U_MODTIME], info[U_MODWITH]); + Put_message(buf); } /* Function Name: SetUserDefaults @@ -116,48 +146,50 @@ char ** info; * Returns: args - the filled info structure. */ -static char ** -SetUserDefaults(info) -char ** info; +static char **SetUserDefaults(char **info) { - info[U_NAME] = Strsave(UNIQUE_LOGIN); - info[U_UID] = Strsave(UNIQUE_UID); - info[U_SHELL] = Strsave(DEFAULT_SHELL); - info[U_LAST] = Strsave(DEFAULT_NONE); - info[U_FIRST] = Strsave(DEFAULT_NONE); - info[U_MIDDLE] = Strsave(DEFAULT_NONE); - info[U_STATE] = Strsave(DEFAULT_NO); - info[U_MITID] = Strsave(DEFAULT_NONE); - info[U_CLASS] = Strsave(DEFAULT_CLASS); - info[U_MODTIME] = info[U_MODBY] = info[U_MODWITH] = info[U_END] = NULL; - return(info); + info[U_NAME] = Strsave(UNIQUE_LOGIN); + info[U_UID] = Strsave(UNIQUE_UID); + info[U_SHELL] = Strsave(DEFAULT_SHELL); + info[U_LAST] = Strsave(DEFAULT_NONE); + info[U_FIRST] = Strsave(DEFAULT_NONE); + info[U_MIDDLE] = Strsave(DEFAULT_NONE); + info[U_STATE] = Strsave(DEFAULT_NO); + info[U_MITID] = Strsave(DEFAULT_NONE); + info[U_CLASS] = Strsave(DEFAULT_CLASS); + info[U_COMMENT] = Strsave(""); + info[U_SIGNATURE] = Strsave(""); + info[U_SECURE] = Strsave("0"); + info[U_MODTIME] = info[U_MODBY] = info[U_MODWITH] = info[U_END] = NULL; + return info; } -/* Check that the supplied name follows the capitalization rules, and +/* Check that the supplied name follows the capitalization rules, and * offer to correct it if not. */ -CorrectCapitalization(name) -char **name; +int CorrectCapitalization(char **name) { - char temp_buf[BUFSIZ], fixname[BUFSIZ]; - - strcpy(fixname, *name); - FixCase(fixname); - if (strcmp(fixname, *name)) { - Put_message("You entered a name which does not follow the capitalization conventions."); - sprintf(temp_buf, "Correct it to \"%s\"", fixname); - if (YesNoQuestion(temp_buf, 1) == TRUE) { - free(*name); - *name = strsave(fixname); + char temp_buf[BUFSIZ], fixname[BUFSIZ]; + + strcpy(fixname, *name); + FixCase(fixname); + if (strcmp(fixname, *name)) + { + Put_message("You entered a name which does not follow the capitalization conventions."); + sprintf(temp_buf, "Correct it to \"%s\"", fixname); + if (YesNoQuestion(temp_buf, 1) == TRUE) + { + free(*name); + *name = strsave(fixname); } } } /* Function Name: AskUserInfo. - * Description: This function askes the user for information about a + * Description: This function askes the user for information about a * machine and saves it into a structure. * Arguments: info - a pointer the the structure to put the info into. * flags - Flags asking us which info we want. @@ -166,100 +198,161 @@ char **name; * use the #defined names (e.g args[UID] is not the uid anymore). */ -char ** -AskUserInfo(info, name) -char ** info; -Bool name; +char **AskUserInfo(char **info, Bool name) { - char temp_buf[BUFSIZ], *newname, *temp_ptr; - - if (name) { - sprintf(temp_buf,"\nChanging Attributes of user %s.\n",info[U_NAME]); - Put_message(temp_buf); - } else { - struct qelem *elem = NULL; - char *argv[3]; - - if (GetValueFromUser("User's last name", &info[U_LAST]) == SUB_ERROR) - return(NULL); - CorrectCapitalization(&info[U_LAST]); - if (GetValueFromUser("User's first name", &info[U_FIRST]) == SUB_ERROR) - return(NULL); - CorrectCapitalization(&info[U_FIRST]); - if (GetValueFromUser("User's middle name", &info[U_MIDDLE]) == - SUB_ERROR) - return(NULL); - CorrectCapitalization(&info[U_MIDDLE]); - argv[0] = info[U_FIRST]; - argv[1] = info[U_LAST]; - if (do_mr_query("get_user_by_name", 2, argv, - StoreInfo, (char *) &elem) == 0) { - Put_message("A user by that name already exists in the database."); - Loop(QueueTop(elem), PrintUserInfo); - Loop(QueueTop(elem), FreeInfo); - FreeQueue(elem); - if (YesNoQuestion("Add new user anyway", TRUE) != TRUE) - return(NULL); + int i; +#ifdef GDSS + SigInfo si; +#endif + char temp_buf[BUFSIZ], *newname; + + if (name) + { + sprintf(temp_buf, "\nChanging Attributes of user %s.\n", info[U_NAME]); + Put_message(temp_buf); + } + else + { + struct qelem *elem = NULL; + char *argv[3]; + + if (GetValueFromUser("User's last name", &info[U_LAST]) == SUB_ERROR) + return NULL; + CorrectCapitalization(&info[U_LAST]); + if (GetValueFromUser("User's first name", &info[U_FIRST]) == SUB_ERROR) + return NULL; + CorrectCapitalization(&info[U_FIRST]); + if (GetValueFromUser("User's middle name", &info[U_MIDDLE]) == SUB_ERROR) + return NULL; + CorrectCapitalization(&info[U_MIDDLE]); + argv[0] = info[U_FIRST]; + argv[1] = info[U_LAST]; + if (do_mr_query("get_user_account_by_name", 2, argv, + StoreInfo, (char *) &elem) == MR_SUCCESS) + { + Put_message("A user by that name already exists in the database."); + Loop(QueueTop(elem), PrintUserInfo); + Loop(QueueTop(elem), FreeInfo); + FreeQueue(elem); + if (YesNoQuestion("Add new user anyway", TRUE) != TRUE) + return NULL; } } - if (name) { - newname = Strsave(info[U_NAME]); - if (GetValueFromUser("The new login name for this user", &newname) == - SUB_ERROR) - return(NULL); - } else if (GetValueFromUser("Login name for this user", &info[U_NAME]) == - SUB_ERROR) - return(NULL); - - if (GetValueFromUser("User's UID", &info[U_UID]) == SUB_ERROR) - return(NULL); - if (GetValueFromUser("User's shell", &info[U_SHELL]) == SUB_ERROR) - return(NULL); - if (name) { - if (GetValueFromUser("User's last name", &info[U_LAST]) == SUB_ERROR) - return(NULL); - CorrectCapitalization(&info[U_LAST]); - if (GetValueFromUser("User's first name", &info[U_FIRST]) == SUB_ERROR) - return(NULL); - CorrectCapitalization(&info[U_FIRST]); - if (GetValueFromUser("User's middle name", &info[U_MIDDLE]) == - SUB_ERROR) - return(NULL); - CorrectCapitalization(&info[U_MIDDLE]); + if (name) + { + newname = Strsave(info[U_NAME]); + if (GetValueFromUser("The new login name for this user", &newname) == + SUB_ERROR) + return NULL; } - while (1) { - int i; - if (GetValueFromUser("User's status (? for help)", &info[U_STATE]) == - SUB_ERROR) - return(NULL); - if (isdigit(info[U_STATE][0])) - break; - Put_message("Valid status numbers:"); - for (i = 0; i < US_END; i++) { - sprintf(temp_buf, " %d: %s", i, states[i]); - Put_message(temp_buf); + else if (GetValueFromUser("Login name for this user", &info[U_NAME]) == + SUB_ERROR) + return NULL; + + if (GetValueFromUser("User's UID", &info[U_UID]) == SUB_ERROR) + return NULL; + if (GetValueFromUser("User's shell", &info[U_SHELL]) == SUB_ERROR) + return NULL; + if (name) + { + if (GetValueFromUser("User's last name", &info[U_LAST]) == SUB_ERROR) + return NULL; + CorrectCapitalization(&info[U_LAST]); + if (GetValueFromUser("User's first name", &info[U_FIRST]) == SUB_ERROR) + return NULL; + CorrectCapitalization(&info[U_FIRST]); + if (GetValueFromUser("User's middle name", &info[U_MIDDLE]) == SUB_ERROR) + return NULL; + CorrectCapitalization(&info[U_MIDDLE]); + } + while (1) + { + int i; + if (GetValueFromUser("User's status (? for help)", &info[U_STATE]) == + SUB_ERROR) + return NULL; + if (isdigit(info[U_STATE][0])) + break; + Put_message("Valid status numbers:"); + for (i = 0; i < US_END; i++) + { + sprintf(temp_buf, " %d: %s", i, states[i]); + Put_message(temp_buf); } } - if (GetValueFromUser("User's MIT ID number", &info[U_MITID]) == SUB_ERROR) - return(NULL); - RemoveHyphens(info[U_MITID]); - if (GetTypeFromUser("User's MIT Year (class)", "class", &info[U_CLASS]) == - SUB_ERROR) - return(NULL); - - FreeAndClear(&info[U_MODTIME], TRUE); - FreeAndClear(&info[U_MODBY], TRUE); - FreeAndClear(&info[U_MODWITH], TRUE); - -/* - * Slide the newname into the #2 slot, this screws up all future references - * to this list, since we slip the pointer into a info list it gets freed - * when the rest of the list gets freed. - */ - if (name) - SlipInNewName(info, newname); + if (GetValueFromUser("User's MIT ID number", &info[U_MITID]) == SUB_ERROR) + return NULL; + RemoveHyphens(info[U_MITID]); + if (GetTypeFromUser("User's MIT Year (class)", "class", &info[U_CLASS]) == + SUB_ERROR) + return NULL; + if (GetValueFromUser("Comments", &info[U_COMMENT]) == SUB_ERROR) + return NULL; + + if (YesNoQuestion("Secure password set", + atoi(info[U_SECURE]) ? TRUE : FALSE) == FALSE) + { + free(info[U_SECURE]); + info[U_SECURE] = strsave("0"); + } + else if (!strcmp(info[U_SECURE], "0")) + { + char buf[16]; + struct timeval tv; + + gettimeofday(&tv, NULL); + sprintf(buf, "%ld", (long) tv.tv_sec); + free(info[U_SECURE]); + info[U_SECURE] = strsave(buf); + } - return(info); + /* Sign record */ +#ifdef GDSS + if (strcmp(info[U_NAME], UNIQUE_LOGIN)) + { + if (name) + sprintf(temp_buf, "%s:%s", newname, info[U_MITID]); + else + sprintf(temp_buf, "%s:%s", info[U_NAME], info[U_MITID]); + si.rawsig = NULL; + i = GDSS_Verify(temp_buf, strlen(temp_buf), info[U_SIGNATURE], &si); + /* If it's already signed OK, don't resign it. */ + if (i != GDSS_SUCCESS) + { + free(info[U_SIGNATURE]); + info[U_SIGNATURE] = malloc(GDSS_Sig_Size() * 2); + sign_again: + i = GDSS_Sign(temp_buf, strlen(temp_buf), info[U_SIGNATURE]); + if (i != GDSS_SUCCESS) + com_err(program_name, gdss2et(i), "Failed to create signature"); + else + { + unsigned char buf[256]; + si.rawsig = buf; + i = GDSS_Verify(temp_buf, strlen(temp_buf), + info[U_SIGNATURE], &si); + if (strlen(buf) > 68) + goto sign_again; + } + } + } +#else /* GDSS */ + info[U_SIGNATURE] = strsave(""); +#endif /* GDSS */ + + FreeAndClear(&info[U_MODTIME], TRUE); + FreeAndClear(&info[U_MODBY], TRUE); + FreeAndClear(&info[U_MODWITH], TRUE); + + /* + * Slide the newname into the #2 slot, this screws up all future references + * to this list, since we slip the pointer into a info list it gets freed + * when the rest of the list gets freed. + */ + if (name) + SlipInNewName(info, newname); + + return info; } /* Function Name: GetUserInfo @@ -270,57 +363,70 @@ Bool name; * name2 - other name, only used in get user by first and last. * (wildcards okay). * Returns: the first element of the queue containing the user info. + * */ -struct qelem * -GetUserInfo(type, name1, name2) -int type; -char *name1, *name2; +struct qelem *GetUserInfo(int type, char *name1, char *name2) { - char * args[2]; - register int status; - struct qelem * elem = NULL; + char *args[2]; + int status; + struct qelem *elem = NULL; - switch(type) { + switch (type) + { case LOGIN: - args[0] = name1; - if ( (status = do_mr_query("get_user_by_login", 1, args, - StoreInfo, (char *) &elem)) != 0) { - com_err(program_name, status, - " when attempting to get_user_by_login."); - return (NULL); + args[0] = name1; + if ((status = do_mr_query("get_user_account_by_login", 1, args, + StoreInfo, (char *) &elem))) + { + com_err(program_name, status, + " when attempting to get_user_account_by_login."); + return NULL; } - break; + break; case UID: - args[0] = name1; - if ( (status = do_mr_query("get_user_by_uid", 1, args, - StoreInfo, (char *) &elem)) != 0) { - com_err(program_name, status, - " when attempting to get_user_by_uid."); - return (NULL); + args[0] = name1; + if ((status = do_mr_query("get_user_account_by_uid", 1, args, + StoreInfo, (char *) &elem))) + { + com_err(program_name, status, + " when attempting to get_user_account_by_uid."); + return NULL; } - break; + break; case BY_NAME: - args[0] = name1; - args[1] = name2; - if ( (status = do_mr_query("get_user_by_name", 2, args, - StoreInfo, (char *) &elem)) != 0) { - com_err(program_name, status, - " when attempting to get_user_by_name."); - return (NULL); + args[0] = name1; + args[1] = name2; + if ((status = do_mr_query("get_user_account_by_name", 2, args, + StoreInfo, (char *) &elem))) + { + com_err(program_name, status, + " when attempting to get_user_account_by_name."); + return NULL; } - break; + break; case CLASS: - args[0] = name1; - if ( (status = do_mr_query("get_user_by_class", 1, args, - StoreInfo, (char *) &elem)) != 0) { - com_err(program_name, status, - " when attempting to get_user_by_class."); - return (NULL); + args[0] = name1; + if ((status = do_mr_query("get_user_account_by_class", 1, args, + StoreInfo, (char *) &elem))) + { + com_err(program_name, status, + " when attempting to get_user_account_by_class."); + return NULL; } - break; + break; + case ID: + args[0] = name1; + if ((status = do_mr_query("get_user_account_by_id", 1, args, + StoreInfo, (char *) &elem))) + { + com_err(program_name, status, + " when attempting to get_user_account_by_id."); + return NULL; + } + break; } - return( QueueTop(elem) ); + return QueueTop(elem) ; } /* Function Name: AddNewUser @@ -329,26 +435,23 @@ char *name1, *name2; * Returns: DM_NORMAL. */ -/* ARGSUSED */ -int -AddNewUser() +int AddNewUser(void) { - register int status; - char ** args, *info[MAX_ARGS_SIZE]; + int status; + char **args, *info[MAX_ARGS_SIZE]; - if ((args = AskUserInfo(SetUserDefaults(info), FALSE)) == NULL) { - Put_message("Aborted."); - return(DM_NORMAL); + if (!(args = AskUserInfo(SetUserDefaults(info), FALSE))) + { + Put_message("Aborted."); + return DM_NORMAL; } - if (args == NULL) - return(DM_NORMAL); - if ( (status = do_mr_query("add_user", CountArgs(args), - args, Scream, (char *) NULL)) != MR_SUCCESS) - com_err(program_name, status, " in add_user"); - else - Put_message("New user added to database."); - FreeInfo(args); - return(DM_NORMAL); + if ((status = do_mr_query("add_user_account", CountArgs(args), + args, Scream, NULL))) + com_err(program_name, status, " in add_user_account"); + else + Put_message("New user added to database."); + FreeInfo(args); + return DM_NORMAL; } @@ -359,16 +462,15 @@ AddNewUser() * Returns: a malloced login name for the user. */ -static char * -GetLoginName() +static char *GetLoginName(void) { - char *name; + char *name; - name = strsave(""); - if (GetValueFromUser("Login name for this user? ", &name) == SUB_ERROR) - return(NULL); - Put_message("KERBEROS code not added, did not reserve name with kerberos."); - return(name); + name = strsave(""); + if (GetValueFromUser("Login name for this user? ", &name) == SUB_ERROR) + return NULL; + Put_message("KERBEROS code not added, did not reserve name with kerberos."); + return name; } @@ -378,24 +480,24 @@ GetLoginName() * Returns: uid - the malloced uid of the user that was chosen. */ -static char * -ChooseUser(elem) -struct qelem * elem; +static char *ChooseUser(struct qelem *elem) { - while (elem != NULL) { - char ** info = (char **) elem->q_data; - PrintUserInfo(info); - switch(YesNoQuitQuestion("Is this the user you want (y/n/q)", FALSE)) { + while (elem) + { + char **info = (char **) elem->q_data; + PrintUserInfo(info); + switch (YesNoQuitQuestion("Is this the user you want (y/n/q)", FALSE)) + { case TRUE: - return(Strsave(info[U_UID])); + return Strsave(info[U_UID]); case FALSE: - break; + break; default: /* quit or ^C. */ - return(NULL); + return NULL; } - elem = elem->q_forw; + elem = elem->q_forw; } - return(NULL); + return NULL; } /* Function Name: GetUidNumberFromName @@ -404,50 +506,51 @@ struct qelem * elem; * Returns: uid - a malloced string containing the uid. */ -static char * -GetUidNumberFromName() +static char *GetUidNumberFromName(void) { - char *args[5], *uid, first[BUFSIZ], last[BUFSIZ]; - register int status; - struct qelem * top = NULL; - - if (!Prompt_input("First Name: ", first, BUFSIZ)) - return(NULL); - if (!Prompt_input("Last Name: ", last, BUFSIZ)) - return(NULL); - FixCase(first); - FixCase(last); - - args[0] = first; - args[1] = last; - - switch (status = do_mr_query("get_user_by_name", 2, args, - StoreInfo, (char *) &top)) { + char *args[5], *uid, first[BUFSIZ], last[BUFSIZ]; + int status; + struct qelem *top = NULL; + + if (!Prompt_input("First Name: ", first, BUFSIZ)) + return NULL; + if (!Prompt_input("Last Name: ", last, BUFSIZ)) + return NULL; + FixCase(first); + FixCase(last); + + args[0] = first; + args[1] = last; + + switch ((status = do_mr_query("get_user_account_by_name", 2, args, + StoreInfo, (char *) &top))) + { case MR_SUCCESS: - break; + break; case MR_NO_MATCH: - Put_message("There is no user in the database with that name."); - return(NULL); + Put_message("There is no user in the database with that name."); + return NULL; default: - com_err(program_name, status, " in get_user_by_name."); - return(NULL); + com_err(program_name, status, " in get_account_user_by_name."); + return NULL; } - - top = QueueTop(top); - if (QueueCount(top) == 1) /* This is a unique name. */ { - char ** info = (char **) top->q_data; - Put_message("User ID Number retrieved for the user: "); - Put_message(""); - PrintUserName(info); - uid = Strsave(info[U_UID]); - FreeQueue(top); - return(Strsave(uid)); + + top = QueueTop(top); + if (QueueCount(top) == 1) /* This is a unique name. */ + { + char **info = (char **) top->q_data; + Put_message("User ID Number retrieved for the user: "); + Put_message(""); + PrintUserName(info); + uid = Strsave(info[U_UID]); + FreeQueue(top); + return Strsave(uid); } - Put_message("That name is not unique, choose the user that you want."); - uid = ChooseUser(top); - FreeQueue(top); - return(uid); + Put_message("That name is not unique, choose the user that you want."); + uid = ChooseUser(top); + FreeQueue(top); + return uid; } /* Function Name: SetUserPassword @@ -456,13 +559,11 @@ GetUidNumberFromName() * Returns: none. */ -static void -SetUserPassword(name) -char * name; +static void SetUserPassword(char *name) { - name = name; /* make saber happy. */ - Put_message("Kerberos password not changed, code non-existant."); - /* clever message to call account_admin, if this fails. */ + name = name; /* make saber happy. */ + Put_message("Kerberos password not changed, code non-existant."); + /* clever message to call account_admin, if this fails. */ } /* Function Name: GiveBackLogin @@ -471,13 +572,11 @@ char * name; * Returns: void. */ -static void -GiveBackLogin(name) -char * name; +static void GiveBackLogin(char *name) { - name = name; /* make saber happy. */ - Put_message("kerberos code not implimented, name not given back."); - /* send mail to db maintainer if this fails. */ + name = name; /* make saber happy. */ + Put_message("kerberos code not implimented, name not given back."); + /* send mail to db maintainer if this fails. */ } /* Function Name: RegisterUser @@ -486,56 +585,63 @@ char * name; * Returns: DM_NORMAL. */ -int -RegisterUser() +int RegisterUser(void) { - char * args[MAX_ARGS_SIZE]; - char *login, *fstype = NULL; - char temp_buf[BUFSIZ]; - register int status; - - Put_message("This function has NO kerberos support, so strange things"); - Put_message("may happen if you use it to register a user."); - - switch (YesNoQuestion("Do you know the users UID Number (y/n)", FALSE)) { + char *args[MAX_ARGS_SIZE]; + char *login, *fstype = NULL; + char temp_buf[BUFSIZ]; + int status; + + Put_message("This function has NO kerberos support, so strange things"); + Put_message("may happen if you use it to register a user."); + + switch (YesNoQuestion("Do you know the users UID Number (y/n)", FALSE)) + { case TRUE: - Prompt_input("What is the UID number of the user? ", temp_buf, BUFSIZ); - args[0] = Strsave(temp_buf); - break; + Prompt_input("What is the UID number of the user? ", temp_buf, BUFSIZ); + args[0] = Strsave(temp_buf); + break; case FALSE: - if ( (args[0] = GetUidNumberFromName()) == NULL) - return(DM_NORMAL); - break; + if (!(args[0] = GetUidNumberFromName())) + return DM_NORMAL; + break; default: - return(DM_NORMAL); + return DM_NORMAL; } - if ( ((login = args[1] = GetLoginName()) == NULL) || - ( GetFSTypes(&fstype, FALSE) == SUB_ERROR ) ) { - FreeInfo(args); /* This work because the NULL temination is ok. */ - return(DM_NORMAL); + sprintf(temp_buf, "u%s", args[0]); + login = strsave(temp_buf); + if ((GetValueFromUser("Login name for this user? ", &login) == SUB_ERROR) || + (GetFSTypes(&fstype, FALSE) == SUB_ERROR)) + { + args[1] = login; + FreeInfo(args); /* This work because the NULL temination is ok. */ + return DM_NORMAL; } - args[2] = fstype; - args[3] = NULL; - - switch (status = do_mr_query("register_user", CountArgs(args), - args, Scream, (char *) NULL)) { + Put_message("KERBEROS code not added, did not reserve name with kerberos."); + args[1] = login; + args[2] = fstype; + args[3] = NULL; + + switch ((status = do_mr_query("register_user", CountArgs(args), + args, Scream, NULL))) + { case MR_SUCCESS: - sprintf(temp_buf, "User %s successfully registered.", login); - Put_message(temp_buf); - SetUserPassword(login); - break; + sprintf(temp_buf, "User %s successfully registered.", login); + Put_message(temp_buf); + SetUserPassword(login); + break; case MR_IN_USE: - GiveBackLogin(login); - sprintf(temp_buf, "The username %s is already in use.", login); - Put_message(temp_buf); - break; + GiveBackLogin(login); + sprintf(temp_buf, "The username %s is already in use.", login); + Put_message(temp_buf); + break; default: - com_err(program_name, status, " in register_user"); - break; + com_err(program_name, status, " in register_user"); + break; } - FreeInfo(args); - return(DM_NORMAL); + FreeInfo(args); + return DM_NORMAL; } /* Function Name: RealUpdateUser @@ -545,25 +651,23 @@ RegisterUser() * Returns: none. */ -/* ARGSUSED */ -static void -RealUpdateUser(info, junk) -char ** info; -Bool junk; +static void RealUpdateUser(char **info, Bool junk) { - register int status; - char error_buf[BUFSIZ]; - char ** args = AskUserInfo(info, TRUE); - - if (args == NULL) { - Put_message("Aborted."); - return; + int status; + char error_buf[BUFSIZ]; + char **args = AskUserInfo(info, TRUE); + + if (!args) + { + Put_message("Aborted."); + return; } - if ( (status = do_mr_query("update_user", CountArgs(args), - args, Scream, (char *) NULL)) != MR_SUCCESS) { - com_err(program_name, status, " in ModifyFields"); - sprintf(error_buf, "User %s not updated due to errors.", info[NAME]); - Put_message(error_buf); + if ((status = do_mr_query("update_user_account", CountArgs(args), + args, Scream, NULL))) + { + com_err(program_name, status, " in ModifyFields"); + sprintf(error_buf, "User %s not updated due to errors.", info[NAME]); + Put_message(error_buf); } } @@ -573,19 +677,15 @@ Bool junk; * Returns: DM_NORMAL. */ -/* ARGSUSED */ -int -UpdateUser(argc, argv) -int argc; -char **argv; +int UpdateUser(int argc, char **argv) { - struct qelem * elem; + struct qelem *elem; + + elem = GetUserInfo(LOGIN, argv[1], NULL); + QueryLoop(elem, NullPrint, RealUpdateUser, "Update the user"); - elem = GetUserInfo(LOGIN, argv[1], (char *) NULL); - QueryLoop(elem, NullPrint, RealUpdateUser, "Update the user"); - - FreeQueue(elem); - return(DM_NORMAL); + FreeQueue(elem); + return DM_NORMAL; } /* Function Name: RealDeactivateUser @@ -595,28 +695,91 @@ char **argv; * Returns: none. */ -static void -RealDeactivateUser(info, one_item) -char ** info; -Bool one_item; +static void RealDeactivateUser(char **info, Bool one_item) { - register int status; - char txt_buf[BUFSIZ]; - char * qargs[2]; - - if (one_item) { - sprintf(txt_buf, "Deactivate user %s (y/n)", info[NAME]); - if (YesNoQuestion(txt_buf, FALSE) != TRUE) - return; + int status; + char txt_buf[BUFSIZ]; + char *qargs[2], **args; + struct qelem *elem = NULL; + + if (one_item) + { + sprintf(txt_buf, "Deactivate user %s (y/n)", info[NAME]); + if (YesNoQuestion(txt_buf, FALSE) != TRUE) + return; } - qargs[0] = info[NAME]; - qargs[1] = "3"; - if ((status = do_mr_query("update_user_status", 2, qargs, Scream, - (char *) NULL)) != MR_SUCCESS) { - com_err(program_name, status, " in update_user_status"); - sprintf(txt_buf, "User %s not deactivated due to errors.", info[NAME]); - Put_message(txt_buf); + qargs[0] = info[NAME]; + qargs[1] = "3"; + if ((status = do_mr_query("update_user_status", 2, qargs, Scream, NULL))) + { + com_err(program_name, status, " in update_user_status"); + sprintf(txt_buf, "User %s not deactivated due to errors.", info[NAME]); + Put_message(txt_buf); + } + else if (YesNoQuestion("Also deactivate matching list and filesystem (y/n)", + FALSE) == TRUE) + { + status = do_mr_query("get_list_info", 1, &(info[NAME]), StoreInfo, + (char *) &elem); + if (status == MR_SUCCESS) + { + args = (char **) (QueueTop(elem)->q_data); + free(args[L_ACTIVE]); + args[L_ACTIVE] = strsave("0"); + FreeAndClear(&args[L_MODTIME], TRUE); + FreeAndClear(&args[L_MODBY], TRUE); + FreeAndClear(&args[L_MODWITH], TRUE); + SlipInNewName(args, args[L_NAME]); + if ((status = do_mr_query("update_list", CountArgs(args), args, + Scream, NULL))) + { + com_err(program_name, status, " updating list, " + "not deactivating list or filesystem"); + FreeInfo(args); + FreeQueue(elem); + return; + } + FreeInfo(args); + FreeQueue(elem); + elem = NULL; + } + else if (status != MR_NO_MATCH) + { + com_err(program_name, status, " getting list info, " + "not deactivating list or filesystem"); + return; + } + + if ((status = do_mr_query("get_filesys_by_label", 1, &(info[NAME]), + StoreInfo, (char *) &elem))) + { + com_err(program_name, status, " getting filsys info, " + "not deactivating filesystem"); + FreeInfo(args); + FreeQueue(elem); + return; + } + args = (char **) (QueueTop(elem)->q_data); + free(args[FS_TYPE]); + args[FS_TYPE] = strsave("ERR"); + free(args[FS_COMMENTS]); + args[FS_COMMENTS] = strsave("Locker disabled; call 3-1325 for help"); + FreeAndClear(&args[FS_MODTIME], TRUE); + FreeAndClear(&args[FS_MODBY], TRUE); + FreeAndClear(&args[FS_MODWITH], TRUE); + SlipInNewName(args, args[FS_NAME]); + if ((status = do_mr_query("update_filesys", CountArgs(args), args, + Scream, NULL))) + { + com_err(program_name, status, " updating filesystem, " + "not deactivating filesystem"); + FreeInfo(args); + FreeQueue(elem); + return; + } + FreeInfo(args); + FreeQueue(elem); } } @@ -627,19 +790,15 @@ Bool one_item; * Returns: DM_NORMAL. */ -/* ARGSUSED */ -int -DeactivateUser(argc, argv) -int argc; -char **argv; +int DeactivateUser(int argc, char **argv) { - struct qelem * elem; + struct qelem *elem; + + elem = GetUserInfo(LOGIN, argv[1], NULL); + QueryLoop(elem, NullPrint, RealDeactivateUser, "Deactivate user"); - elem = GetUserInfo(LOGIN, argv[1], (char *) NULL); - QueryLoop(elem, NullPrint, RealDeactivateUser, "Deactivate user"); - - FreeQueue(elem); - return(DM_NORMAL); + FreeQueue(elem); + return DM_NORMAL; } @@ -651,32 +810,29 @@ char **argv; * Description: Deletes the user given a uid number. * Arguments: argc, argv - uid if user in argv[1]. * Returns: DM_NORMAL. - * NOTES: This just gets the username from the mr server + * NOTES: This just gets the username from the mr server * and performs a DeleteUser(). */ -int -DeleteUserByUid(argc, argv) -int argc; -char **argv; +int DeleteUserByUid(int argc, char **argv) { - int status; - struct qelem *elem = NULL; - char ** info; - - if(!ValidName(argv[1])) - return(DM_NORMAL); - - if ( (status = do_mr_query("get_user_by_uid", 1, argv+1, StoreInfo, - (char * ) &elem)) != MR_SUCCESS) - com_err(program_name, status, " in get_user_by_uid"); - - info = (char **) elem->q_data; - argv[1] = info[U_NAME]; - - (void) DeleteUser(argc, argv); - return(DM_NORMAL); -} + int status; + struct qelem *elem = NULL; + char **info; + + if (!ValidName(argv[1])) + return DM_NORMAL; + + if ((status = do_mr_query("get_user_account_by_uid", 1, argv + 1, StoreInfo, + (char *) &elem))) + com_err(program_name, status, " in get_user_account_by_uid"); + + info = (char **) elem->q_data; + argv[1] = info[U_NAME]; + + DeleteUser(argc, argv); + return DM_NORMAL; +} /* ------------------------- Show User Information ------------------------- */ @@ -686,19 +842,15 @@ char **argv; * Returns: DM_NORMAL */ -/* ARGSUSED */ -int -ShowUserByLogin(argc, argv) -int argc; -char *argv[]; +int ShowUserByLogin(int argc, char *argv[]) { - struct qelem *top, *elem; + struct qelem *top, *elem; - elem = top = GetUserInfo(LOGIN, argv[1], (char *) NULL); - Loop(elem, PrintUserInfo); + elem = top = GetUserInfo(LOGIN, argv[1], NULL); + Loop(elem, PrintUserInfo); - FreeQueue(top); - return (DM_NORMAL); + FreeQueue(top); + return DM_NORMAL; } /* Function Name: RetrieveUserByName @@ -708,37 +860,34 @@ char *argv[]; * Returns: DM_NORMAL. */ -/* ARGSUSED */ -int -ShowUserByName(argc, argv) -int argc; -char *argv[]; +int ShowUserByName(int argc, char *argv[]) { - struct qelem *top; - char buf[BUFSIZ]; + struct qelem *top; + char buf[BUFSIZ]; - top = GetUserInfo(BY_NAME, argv[1], argv[2]); + top = GetUserInfo(BY_NAME, argv[1], argv[2]); - if (top == NULL) /* if there was an error then return. */ - return(DM_NORMAL); + if (!top) /* if there was an error then return. */ + return DM_NORMAL; - if (!PromptWithDefault("Print full information, or just the names (f/n)?", - buf, 2, "f")) - return(DM_NORMAL); + if (!PromptWithDefault("Print full information, or just the names (f/n)?", + buf, 2, "f")) + return DM_NORMAL; - switch(buf[0]) { + switch (buf[0]) + { case 'F': case 'f': - Loop(top, PrintUserInfo); - break; + Loop(top, PrintUserInfo); + break; case 'N': case 'n': - Loop(top, PrintUserName); - break; + Loop(top, PrintUserName); + break; } - - FreeQueue(top); - return (DM_NORMAL); + + FreeQueue(top); + return DM_NORMAL; } /* Function Name: ShowUserByClass @@ -747,19 +896,35 @@ char *argv[]; * Returns: none. */ -/* ARGSUSED */ -int -ShowUserByClass(argc, argv) -int argc; -char **argv; +int ShowUserByClass(int argc, char **argv) +{ + struct qelem *top; + + if (YesNoQuestion("This will take a long time. Are you sure", 0) == FALSE) + return DM_NORMAL; + top = GetUserInfo(CLASS, argv[1], NULL); + Loop(top, PrintUserName); + + FreeQueue(top); + return DM_NORMAL; +} + + +/* Function Name: ShowUserById + * Description: Shows user information given an ID number. + * Arguments: argc, argv - ID number in argv[1]. + * Returns: DM_NORMAL + */ + +int ShowUserById(int argc, char *argv[]) { - struct qelem *top; + struct qelem *top, *elem; - top = GetUserInfo(CLASS, argv[1], (char *) NULL); - Loop(top, PrintUserName); + elem = top = GetUserInfo(ID, argv[1], NULL); + Loop(elem, PrintUserInfo); - FreeQueue(top); - return (DM_NORMAL); + FreeQueue(top); + return DM_NORMAL; } @@ -770,34 +935,32 @@ char **argv; * Returns: none. */ -/* ARGSUSED */ -int -GetKrbmap(argc, argv) -int argc; -char **argv; +int GetKrbmap(int argc, char **argv) { - int stat; - struct qelem *elem = NULL, *top; - char buf[BUFSIZ]; - - if ((stat = do_mr_query("get_kerberos_user_map", 2, &argv[1], - StoreInfo, (char *)&elem)) != 0) { - com_err(program_name, stat, " in GetKrbMap."); - return(DM_NORMAL); + int stat; + struct qelem *elem = NULL, *top; + char buf[BUFSIZ]; + + if ((stat = do_mr_query("get_kerberos_user_map", 2, &argv[1], + StoreInfo, (char *)&elem))) + { + com_err(program_name, stat, " in GetKrbMap."); + return DM_NORMAL; } - top = elem = QueueTop(elem); - Put_message(""); - while (elem != NULL) { - char **info = (char **) elem->q_data; - sprintf(buf, "User: %-9s Principal: %s", - info[KMAP_USER], info[KMAP_PRINCIPAL]); - Put_message(buf); - elem = elem->q_forw; + top = elem = QueueTop(elem); + Put_message(""); + while (elem) + { + char **info = (char **) elem->q_data; + sprintf(buf, "User: %-9s Principal: %s", + info[KMAP_USER], info[KMAP_PRINCIPAL]); + Put_message(buf); + elem = elem->q_forw; } - FreeQueue(QueueTop(top)); - return(DM_NORMAL); + FreeQueue(QueueTop(top)); + return DM_NORMAL; } @@ -808,25 +971,23 @@ char **argv; * Returns: none. */ -/* ARGSUSED */ -int -AddKrbmap(argc, argv) -int argc; -char **argv; +int AddKrbmap(int argc, char **argv) { - int stat; + int stat; - if (!index(argv[KMAP_PRINCIPAL + 1], '@')) { - Put_message("Please specify a realm for the kerberos principal."); - return(DM_NORMAL); + if (!strchr(argv[KMAP_PRINCIPAL + 1], '@')) + { + Put_message("Please specify a realm for the kerberos principal."); + return DM_NORMAL; } - if ((stat = do_mr_query("add_kerberos_user_map", 2, &argv[1], - Scream, NULL)) != 0) { - com_err(program_name, stat, " in AddKrbMap."); - if (stat == MR_EXISTS) - Put_message("No user or principal may have more than one mapping."); + if ((stat = do_mr_query("add_kerberos_user_map", 2, &argv[1], + Scream, NULL))) + { + com_err(program_name, stat, " in AddKrbMap."); + if (stat == MR_EXISTS) + Put_message("No user or principal may have more than one mapping."); } - return(DM_NORMAL); + return DM_NORMAL; } @@ -837,17 +998,107 @@ char **argv; * Returns: none. */ -/* ARGSUSED */ -int -DeleteKrbmap(argc, argv) -int argc; -char **argv; +int DeleteKrbmap(int argc, char **argv) +{ + int stat; + + if ((stat = do_mr_query("delete_kerberos_user_map", 2, &argv[1], + Scream, NULL))) + com_err(program_name, stat, " in DeleteKrbMap."); + return DM_NORMAL; +} + + +/* Function Name: GetDirFlags + * Description: Shows MITdir listing preferences + * Arguments: argc, argv - argv[1] contains the user login name + * Returns: none. + */ + +int GetDirFlags(int argc, char **argv) { - int stat; + int stat, flags; + struct qelem *elem = NULL; + char buf[BUFSIZ], **info; + + if (!ValidName(argv[1])) + return DM_NORMAL; + + if ((stat = do_mr_query("get_user_directory_flags", 1, &argv[1], + StoreInfo, (char *)&elem))) + { + com_err(program_name, stat, " in GetDirFlags."); + return DM_NORMAL; + } + + info = (char **) QueueTop(elem)->q_data; + flags = atoi(info[0]); + FreeQueue(QueueTop(elem)); + + Put_message(""); + sprintf(buf, "User: %s", argv[1]); + Put_message(buf); + if (flags & DIRFLAGS_SUPPRESS) + Put_message("Does NOT appear in the on-line directory."); + else + { + Put_message("Does appear in the on-line directory."); + if (flags & DIRFLAGS_NONLOCAL) + Put_message("Is listed with non-MIT.EDU email address (if known)"); + else + Put_message("Is listed with MIT.EDU email address."); + } + + return DM_NORMAL; +} - if ((stat = do_mr_query("delete_kerberos_user_map", 2, &argv[1], - Scream, NULL)) != 0) { - com_err(program_name, stat, " in DeleteKrbMap."); +/* Function Name: SetDirFlags + * Description: Update online directory preferences + * Arguments: argc, argv - the login name of the user in argv[1]. + * Returns: DM_NORMAL. + */ + +int SetDirFlags(int argc, char **argv) +{ + int stat, flags; + char **info, buf[BUFSIZ], *args[2]; + struct qelem *elem = NULL; + + if (!ValidName(argv[1])) + return DM_NORMAL; + + /* Fetch current prefs */ + if ((stat = do_mr_query("get_user_directory_flags", 1, &argv[1], + StoreInfo, (char *) &elem))) + { + com_err(program_name, stat, " in GetDirFlags."); + return DM_NORMAL; } - return(DM_NORMAL); + info = (char **) QueueTop(elem)->q_data; + flags = atoi(info[0]); + FreeQueue(QueueTop(elem)); + + sprintf(buf, "List %s in the on-line directory (y/n)", argv[1]); + if (YesNoQuestion(buf, !(flags & DIRFLAGS_SUPPRESS))) + flags &= ~DIRFLAGS_SUPPRESS; + else + flags |= DIRFLAGS_SUPPRESS; + + sprintf(buf, "List MIT.EDU email address even when mail is " + "forwarded elsewhere? (y/n)"); + if (YesNoQuestion(buf, !(flags & DIRFLAGS_NONLOCAL))) + flags &= ~DIRFLAGS_NONLOCAL; + else + flags |= DIRFLAGS_NONLOCAL; + + args[0] = argv[1]; + sprintf(buf, "%d", flags); + args[1] = buf; + if ((stat = do_mr_query("update_user_directory_flags", 2, + args, Scream, NULL))) + com_err(program_name, stat, " in SetDirFlags"); + else + Put_message("Directory preferences set."); + + return DM_NORMAL; }