]> andersk Git - moira.git/blobdiff - clients/moira/user.c
added kerberos mapping routines; improved user status handling
[moira.git] / clients / moira / user.c
index 6f04d590abef476cff4a8998e5f470a748541918..9dcba4d4af1f059496a657e7efc8ea329bb821ed 100644 (file)
 #include <stdio.h>
 #include <strings.h>
 #include <sms.h>
+#include <sms_app.h>
 #include <menu.h>
+#include <ctype.h>
 
 #include "mit-copyright.h"
 #include "defs.h"
 #include "f_defs.h"
 #include "globals.h"
-#include "infodefs.h"
 
 #define LOGIN 0
 #define UID   1
  *     Returns: pointer to statically allocated string.
  */
 
-static char *states[] = { "Not registered",
+static char *states[] = { "Registerable",
                          "Active",
-                         "Half registered",
-                         "Marked for deletion",
-                         "Not registerable" };
+                         "Half Registered",
+                         "Deleted",
+                         "Not registerable",
+                         "Enrolled/Registerable",
+                         "Enrolled/Not Registerable" };
 
 static char *UserState(state)
 int state;
 {
-    if (state < 0 || state > 4)
+    if (state < 0 || state >= US_END)
        return("Unknown");
     return(states[state]);
 }
@@ -90,12 +93,12 @@ 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: %-10s Full name: %s", info[U_NAME], name);
+    sprintf(buf, "Login name: %-20s Full name: %s", info[U_NAME], name);
     Put_message(buf);
-    sprintf(buf, "User id: %-13s Login shell %-15s Class: %s", 
+    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: %-10s Encrypted MIT ID number: %s",
+    sprintf(buf, "Account is: %-20s Encrypted 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]);
@@ -145,6 +148,24 @@ Bool name;
     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];
+
+       GetValueFromUser("User's last name", &info[U_LAST]);
+       GetValueFromUser("User's first name", &info[U_FIRST]);
+       GetValueFromUser("User's middle name", &info[U_MIDDLE]);
+       argv[0] = info[U_FIRST];
+       argv[1] = info[U_LAST];
+       if (do_sms_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) == FALSE)
+             return(NULL);
+       }
     }
     if (name) {
        newname = Strsave(info[U_NAME]);
@@ -155,10 +176,22 @@ Bool name;
 
     GetValueFromUser("User's UID", &info[U_UID]);
     GetValueFromUser("User's shell", &info[U_SHELL]);
-    GetValueFromUser("User's last name", &info[U_LAST]);
-    GetValueFromUser("User's first name", &info[U_FIRST]);
-    GetValueFromUser("User's middle name", &info[U_MIDDLE]);
-    GetValueFromUser("User's status", &info[U_STATE]);
+    if (name) {
+       GetValueFromUser("User's last name", &info[U_LAST]);
+       GetValueFromUser("User's first name", &info[U_FIRST]);
+       GetValueFromUser("User's middle name", &info[U_MIDDLE]);
+    }
+    while (1) {
+       int i;
+       GetValueFromUser("User's status (? for help)", &info[U_STATE]);
+       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);
+       }
+    }
     temp_ptr = Strsave(info[U_MITID]);
     Put_message("User's MIT ID number (type a new unencrypted number, or keep same encryption)");
     GetValueFromUser("", &temp_ptr);
@@ -207,8 +240,8 @@ char *name1, *name2;
     switch(type) {
     case LOGIN:
        args[0] = name1;
-       if ( (status = sms_query("get_user_by_login", 1, args,
-                              StoreInfo, (char *) &elem)) != 0) {
+       if ( (status = do_sms_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);               
@@ -216,8 +249,8 @@ char *name1, *name2;
        break;
     case UID:
        args[0] = name1;
-       if ( (status = sms_query("get_user_by_uid", 1, args,
-                              StoreInfo, (char *) &elem)) != 0) {
+       if ( (status = do_sms_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);      
@@ -226,8 +259,8 @@ char *name1, *name2;
     case BY_NAME:
        args[0] = name1;
        args[1] = name2;    
-       if ( (status = sms_query("get_user_by_name", 2, args,
-                              StoreInfo, (char *) &elem)) != 0) {
+       if ( (status = do_sms_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);      
@@ -235,8 +268,8 @@ char *name1, *name2;
        break;
     case CLASS:
        args[0] = name1;
-       if ( (status = sms_query("get_user_by_class", 1, args,
-                              StoreInfo, (char *) &elem)) != 0) {
+       if ( (status = do_sms_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);      
@@ -260,8 +293,10 @@ AddNewUser()
     char ** args, *info[MAX_ARGS_SIZE];
 
     args = AskUserInfo(SetUserDefaults(info), FALSE);
-    if ( (status = sms_query("add_user", CountArgs(args), 
-                            args, Scream, (char *) NULL)) != SMS_SUCCESS)
+    if (args == NULL)
+      return(DM_NORMAL);
+    if ( (status = do_sms_query("add_user", CountArgs(args), 
+                               args, Scream, (char *) NULL)) != SMS_SUCCESS)
        com_err(program_name, status, " in add_user");
     else
        Put_message("New user added to database.");
@@ -336,8 +371,8 @@ GetUidNumberFromName()
     args[0] = first;
     args[1] = last;
     
-    switch (status = sms_query("get_user_by_name", 2, args,
-                              StoreInfo, (char *) &top)) {
+    switch (status = do_sms_query("get_user_by_name", 2, args,
+                                 StoreInfo, (char *) &top)) {
     case SMS_SUCCESS:
        break;
     case SMS_NO_MATCH:
@@ -433,8 +468,8 @@ RegisterUser()
     args[2] = fstype;
     args[3] = NULL;
     
-    switch (status = sms_query("register_user", CountArgs(args),
-                              args, Scream, (char *) NULL)) {
+    switch (status = do_sms_query("register_user", CountArgs(args),
+                                 args, Scream, (char *) NULL)) {
     case SMS_SUCCESS:
        sprintf(temp_buf, "User %s successfully registered.", login);
        Put_message(temp_buf);
@@ -470,8 +505,8 @@ Bool junk;
     char error_buf[BUFSIZ];
     char ** args = AskUserInfo(info, TRUE);
     
-    if ( (status = sms_query("update_user", CountArgs(args), 
-                            args, Scream, (char *) NULL)) != SMS_SUCCESS) {
+    if ( (status = do_sms_query("update_user", CountArgs(args), 
+                               args, Scream, (char *) NULL)) != SMS_SUCCESS) {
        com_err(program_name, status, " in ModifyFields");
        sprintf(error_buf, "User %s not updated due to errors.", info[NAME]);
        Put_message(error_buf);
@@ -523,8 +558,8 @@ Bool one_item;
 
     qargs[0] = info[NAME];
     qargs[1] = "3";
-    if ((status = sms_query("update_user_status", 2, qargs, Scream,
-                           (char *) NULL)) != SMS_SUCCESS) {
+    if ((status = do_sms_query("update_user_status", 2, qargs, Scream,
+                              (char *) NULL)) != SMS_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);
@@ -578,8 +613,8 @@ char **argv;
     if(!ValidName(argv[1]))
        return(DM_NORMAL);
     
-    if ( (status = sms_query("get_user_by_uid", 1, argv+1, StoreInfo,
-                            (char * ) &elem)) != SMS_SUCCESS)
+    if ( (status = do_sms_query("get_user_by_uid", 1, argv+1, StoreInfo,
+                               (char * ) &elem)) != SMS_SUCCESS)
        com_err(program_name, status, " in get_user_by_uid");
     
     info = (char **) elem->q_data;
@@ -673,13 +708,92 @@ char **argv;
     return (DM_NORMAL);
 }
 
-/*
- * Local Variables:
- * mode: c
- * c-indent-level: 4
- * c-continued-statement-offset: 4
- * c-brace-offset: -4
- * c-argdecl-indent: 4
- * c-label-offset: -4
- * End:
+
+/*     Function Name: GetKrbmap
+ *     Description: Shows user <-> Kerberos mappings
+ *     Arguments: argc, argv - argv[1] contains the user login name,
+ *             argv[2] contains the principal
+ *     Returns: none.
  */
+
+/* ARGSUSED */
+int
+GetKrbmap(argc, argv)
+int argc;
+char **argv;
+{
+    int stat;
+    struct qelem *elem = NULL;
+    char buf[BUFSIZ];
+
+    if ((stat = do_sms_query("get_kerberos_user_map", 2, &argv[1],
+                            StoreInfo, (char *)&elem)) != 0) {
+       com_err(program_name, stat, " in GetKrbMap.");
+       return(DM_NORMAL);
+    }
+
+    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;
+    }
+
+    FreeQueue(QueueTop(elem));
+    return(DM_NORMAL);
+}
+
+
+/*     Function Name: AddKrbmap
+ *     Description: Add a new user <-> Kerberos mapping
+ *     Arguments: argc, argv - argv[1] contains the user login name,
+ *             argv[2] contains the principal
+ *     Returns: none.
+ */
+
+/* ARGSUSED */
+int
+AddKrbmap(argc, argv)
+int argc;
+char **argv;
+{
+    int stat;
+
+    if (!index(argv[KMAP_PRINCIPAL + 1], '@')) {
+       Put_message("Please specify a realm for the kerberos principal.");
+       return(DM_NORMAL);
+    }
+    if ((stat = do_sms_query("add_kerberos_user_map", 2, &argv[1],
+                            Scream, NULL)) != 0) {
+       com_err(program_name, stat, " in AddKrbMap.");
+       if (stat == SMS_EXISTS)
+         Put_message("No user or principal may have more than one mapping.");
+    }
+    return(DM_NORMAL);
+}
+
+
+/*     Function Name: DeleteKrbmap
+ *     Description: Remove a user <-> Kerberos mapping
+ *     Arguments: argc, argv - argv[1] contains the user login name,
+ *             argv[2] contains the principal
+ *     Returns: none.
+ */
+
+/* ARGSUSED */
+int
+DeleteKrbmap(argc, argv)
+int argc;
+char **argv;
+{
+    int stat;
+
+    if ((stat = do_sms_query("delete_kerberos_user_map", 2, &argv[1],
+                            Scream, NULL)) != 0) {
+       com_err(program_name, stat, " in DeleteKrbMap.");
+    }
+    return(DM_NORMAL);
+}
This page took 0.056401 seconds and 4 git commands to generate.