]> andersk Git - moira.git/blobdiff - clients/moira/user.c
tcsh is dead. Long live bash.
[moira.git] / clients / moira / user.c
index d34a4b2942be3c45707436a2edde9ff091310ce3..0ed1762ec22f3a7ff710a5e87b3fd9fd7ed68fbe 100644 (file)
@@ -19,8 +19,6 @@
 #include "f_defs.h"
 #include "globals.h"
 
-#include <sys/time.h>
-
 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -34,6 +32,8 @@ RCSID("$Header$");
 void CorrectCapitalization(char **name);
 char **AskUserInfo(char **info, Bool name);
 struct mqelem *GetUserInfo(int type, char *name1, char *name2);
+static void PrintLogin(char **info);
+struct mqelem *GetUserBySponsor(char *type, char *name);
 
 #define LOGIN 0
 #define UID   1
@@ -42,12 +42,15 @@ struct mqelem *GetUserInfo(int type, char *name1, char *name2);
 #define ID 4
 
 #ifdef ATHENA
-#define DEFAULT_SHELL "/bin/athena/tcsh"
+#define DEFAULT_SHELL "/bin/athena/bash"
 #else
-#define DEFAULT_SHELL "/bin/csh"
+#define DEFAULT_SHELL "/bin/bash"
 #endif
 #define DEFAULT_CLASS "?"
 
+#define DEFAULT_WINCONSOLESHELL "cmd"
+#define DEFAULT_WINHOMEDIR "[DFS]"
+#define DEFAULT_WINPROFILEDIR "[DFS]"
 
 /*     Function Name: UserState
  *     Description: Convert a numeric state into a descriptive string.
@@ -63,7 +66,9 @@ static char *states[] = {
   "Not registerable (4)",
   "Enrolled/Registerable (5)",
   "Enrolled/Not Registerable (6)",
-  "Half Enrolled (7)"
+  "Half Enrolled (7)",
+  "Registerable, Kerberos only (8)",
+  "Active, Kerberos only (9)"
 };
 
 static char *UserState(int state)
@@ -102,19 +107,28 @@ static void PrintUserName(char **info)
 
 static void PrintUserInfo(char **info)
 {
-  char name[BUFSIZ], buf[BUFSIZ];
+  char name[BUFSIZ], buf[BUFSIZ], sponsor[BUFSIZ];
   int status;
 
   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]);
+  sprintf(buf, "User id: %-23s Login shell: %-10s",
+         info[U_UID], info[U_SHELL]);
+  Put_message(buf);
+  sprintf(buf, "Class: %-25s Windows Console Shell: %-10s",
+         info[U_CLASS], info[U_WINCONSOLESHELL]);
+  Put_message(buf);
+  sprintf(sponsor, "%s %s", info[U_SPONSOR_TYPE], info[U_SPONSOR_NAME]);
+  sprintf(buf, "Sponsor: %-23s Expiration date: %s", sponsor,  info[U_EXPIRATION]);
   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, "Windows Home Directory: %s", info[U_WINHOMEDIR]);
+  Put_message(buf);
+  sprintf(buf, "Windows Profile Directory: %s", info[U_WINPROFILEDIR]);
+  Put_message(buf);
   status = atoi(info[U_STATE]);
   if (status == 0 || status == 2)
     {
@@ -124,6 +138,8 @@ static void PrintUserInfo(char **info)
     }
   sprintf(buf, "Comments: %s", info[U_COMMENT]);
   Put_message(buf);
+  sprintf(buf, "Created  by %s on %s.", info[U_CREATOR], info[U_CREATED]);
+  Put_message(buf);
   sprintf(buf, MOD_FORMAT, info[U_MODBY], info[U_MODTIME], info[U_MODWITH]);
   Put_message(buf);
 }
@@ -139,6 +155,7 @@ static char **SetUserDefaults(char **info)
   info[U_NAME] = strdup(UNIQUE_LOGIN);
   info[U_UID] = strdup(UNIQUE_UID);
   info[U_SHELL] = strdup(DEFAULT_SHELL);
+  info[U_WINCONSOLESHELL] = strdup(DEFAULT_WINCONSOLESHELL);
   info[U_LAST] = strdup(DEFAULT_NONE);
   info[U_FIRST] = strdup(DEFAULT_NONE);
   info[U_MIDDLE] = strdup(DEFAULT_NONE);
@@ -148,7 +165,13 @@ static char **SetUserDefaults(char **info)
   info[U_COMMENT] = strdup("");
   info[U_SIGNATURE] = strdup("");
   info[U_SECURE] = strdup("0");
+  info[U_WINHOMEDIR] = strdup(DEFAULT_WINHOMEDIR);
+  info[U_WINPROFILEDIR] = strdup(DEFAULT_WINPROFILEDIR);
+  info[U_SPONSOR_TYPE] = strdup("NONE");
+  info[U_SPONSOR_NAME] = strdup("NONE");
+  info[U_EXPIRATION] = strdup("");
   info[U_MODTIME] = info[U_MODBY] = info[U_MODWITH] = info[U_END] = NULL;
+  info[U_CREATED] = info[U_CREATOR] = NULL;
   return info;
 }
 
@@ -167,7 +190,7 @@ void CorrectCapitalization(char **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)
+      if (YesNoQuestion(temp_buf, 0) == TRUE)
        {
          free(*name);
          *name = strdup(fixname);
@@ -188,7 +211,7 @@ void CorrectCapitalization(char **name)
 
 char **AskUserInfo(char **info, Bool name)
 {
-  int i, state;
+  int state;
   char temp_buf[BUFSIZ], *newname;
 
   if (name)
@@ -254,6 +277,9 @@ char **AskUserInfo(char **info, Bool name)
 
   if (GetValueFromUser("User's shell", &info[U_SHELL]) == SUB_ERROR)
     return NULL;
+  if (GetValueFromUser("Windows console shell", &info[U_WINCONSOLESHELL])
+      == SUB_ERROR)
+    return NULL;
   if (name)
     {
       if (GetValueFromUser("User's last name", &info[U_LAST]) == SUB_ERROR)
@@ -290,6 +316,24 @@ char **AskUserInfo(char **info, Bool name)
   if (GetValueFromUser("Comments", &info[U_COMMENT]) == SUB_ERROR)
     return NULL;
 
+  if (GetValueFromUser("Windows Home Directory", &info[U_WINHOMEDIR]) ==
+      SUB_ERROR)
+    return NULL;
+
+  if (GetValueFromUser("Windows Profile Directory", &info[U_WINPROFILEDIR]) ==
+      SUB_ERROR)
+    return NULL;
+
+  if (GetTypeFromUser("User's sponsor type", "ace_type", &info[U_SPONSOR_TYPE])
+      == SUB_ERROR)
+    return NULL;
+  if (strcmp(info[U_SPONSOR_TYPE], "NONE") &&
+      GetValueFromUser("Sponsor's Name", &info[U_SPONSOR_NAME]) == SUB_ERROR)
+    return NULL;
+
+  if (GetValueFromUser("Expiration date", &info[U_EXPIRATION]) == SUB_ERROR)
+    return NULL;
+
   state = atoi(info[U_STATE]);
   if (!name || state == 0 || state == 2)
     {
@@ -556,9 +600,12 @@ static void GiveBackLogin(char *name)
 int RegisterUser(int argc, char **argv)
 {
   char *args[MAX_ARGS_SIZE];
-  char *login, *fstype = NULL;
+  char *login, *potype = NULL;
   char temp_buf[BUFSIZ];
-  int status;
+  int status, i;
+
+  for (i = 0; i < MAX_ARGS_SIZE; i++)
+    args[i] = NULL;
 
   Put_message("This function has NO kerberos support, so strange things");
   Put_message("may happen if you use it to register a user.");
@@ -579,8 +626,7 @@ int RegisterUser(int argc, char **argv)
 
   sprintf(temp_buf, "u%s", args[0]);
   login = strdup(temp_buf);
-  if ((GetValueFromUser("Login name for this user? ", &login) == SUB_ERROR) ||
-      (GetFSTypes(&fstype, FALSE) == SUB_ERROR))
+  if (GetValueFromUser("Login name for this user? ", &login) == SUB_ERROR)
     {
       args[1] = login;
       FreeInfo(args);     /* This work because the NULL temination is ok. */
@@ -588,7 +634,23 @@ int RegisterUser(int argc, char **argv)
     }
   Put_message("KERBEROS code not added, did not reserve name with kerberos.");
   args[1] = login;
-  args[2] = fstype;
+  
+  sprintf(temp_buf, "IMAP");
+  potype = strdup(temp_buf);
+  if (GetValueFromUser("P.O. Box Type for this user? ", &potype) == SUB_ERROR)
+    {
+      args[2] = potype;
+      FreeInfo(args);
+      return DM_NORMAL;
+    }
+  if (strcmp(potype, "POP") && strcmp(potype, "IMAP") && strcmp(potype, "EXCHANGE"))
+    {
+      sprintf(temp_buf, "Unknown P.O. Box type.");
+      Put_message(temp_buf);
+      FreeInfo(args);
+      return DM_NORMAL;
+    }
+  args[2] = potype;
   args[3] = NULL;
 
   switch ((status = do_mr_query("register_user", CountArgs(args),
@@ -698,7 +760,7 @@ static void RealDeactivateUser(char **info, Bool one_item)
          FreeAndClear(&args[L_MODTIME], TRUE);
          FreeAndClear(&args[L_MODBY], TRUE);
          FreeAndClear(&args[L_MODWITH], TRUE);
-         SlipInNewName(args, args[L_NAME]);
+         SlipInNewName(args, strdup(args[L_NAME]));
          if ((status = do_mr_query("update_list", CountArgs(args), args,
                                    NULL, NULL)))
            {
@@ -734,7 +796,7 @@ static void RealDeactivateUser(char **info, Bool one_item)
       FreeAndClear(&args[FS_MODTIME], TRUE);
       FreeAndClear(&args[FS_MODBY], TRUE);
       FreeAndClear(&args[FS_MODWITH], TRUE);
-      SlipInNewName(args, args[FS_NAME]);
+      SlipInNewName(args, strdup(args[FS_NAME]));
       if ((status = do_mr_query("update_filesys", CountArgs(args), args,
                                NULL, NULL)))
        {
@@ -973,3 +1035,201 @@ int DeleteKrbmap(int argc, char **argv)
     com_err(program_name, stat, " in DeleteKrbMap.");
   return DM_NORMAL;
 }
+
+int GetUserReservations(int argc, char **argv)
+{
+  int stat;
+  struct mqelem *elem = NULL, *top;
+  char buf[BUFSIZ];
+
+  if ((stat = do_mr_query("get_user_reservations", 1, &argv[1],
+                         StoreInfo, &elem)))
+    {
+      com_err(program_name, stat, " in GetUserReservations.");
+      return DM_NORMAL;
+    }
+
+  top = elem = QueueTop(elem);
+  Put_message("");
+  if (!elem)
+    Put_message("No reservations for that user.");
+  while (elem)
+    {
+      char **info = elem->q_data;
+      sprintf(buf, "Reservation: %s", info[0]);
+      Put_message(buf);
+      elem = elem->q_forw;
+    }
+
+  FreeQueue(QueueTop(top));
+  return DM_NORMAL;  
+}
+
+int AddUserReservation(int argc, char **argv)
+{
+  int stat;
+  char buf[BUFSIZ];
+  
+  switch (stat = do_mr_query("add_user_reservation", 2, &argv[1],
+                            NULL, NULL))
+    {
+    case MR_SUCCESS:
+      break;
+    case MR_STRING:
+      sprintf(buf, "The reservation %s is not valid.", argv[2]);
+      Put_message(buf);
+      PrintReservationTypes();
+      break;
+    default:
+      com_err(program_name, stat, " in AddUserReservation.");
+      break;
+    }
+  
+  return DM_NORMAL;
+}
+
+int DelUserReservation(int argc, char **argv)
+{
+  int stat;
+  char buf[BUFSIZ];
+
+  switch (stat = do_mr_query("delete_user_reservation", 2, &argv[1],
+                    NULL, NULL))
+    {
+    case MR_SUCCESS:
+      break;
+    case MR_STRING:
+      sprintf(buf, "The reservation %s is not valid.", argv[2]);
+      Put_message(buf);
+      PrintReservationTypes();
+      break;
+    default:
+      com_err(program_name, stat, " in DelUserReservation.");
+      break;
+    }
+  
+  return DM_NORMAL;
+}
+
+int GetUserByReservation(int argc, char **argv)
+{
+  int stat;
+  struct mqelem *elem = NULL, *top;
+  char buf[BUFSIZ];
+
+  switch (stat = do_mr_query("get_user_by_reservation", 1, &argv[1],
+                    StoreInfo, &elem))
+    {
+    case MR_SUCCESS:
+      break;
+    case MR_STRING:
+      sprintf(buf, "The reservation %s is not valid.", argv[1]);
+      Put_message(buf);
+      PrintReservationTypes();
+      return DM_NORMAL;
+    default:
+      com_err(program_name, stat, " in GetUserByReservation.");
+      return DM_NORMAL;
+    }
+  
+  top = elem = QueueTop(elem);
+  Put_message("");
+  while (elem)
+    {
+      char **info = elem->q_data;
+      sprintf(buf, "User: %s", info[0]);
+      Put_message(buf);
+      elem = elem->q_forw;
+    }
+
+  FreeQueue(QueueTop(top));
+  return DM_NORMAL;  
+}
+
+void PrintReservationTypes(void)
+{
+  int stat;
+  struct mqelem *elem = NULL, *top;
+  char buf[BUFSIZ];
+  char *qargs[2];
+
+  Put_message("Valid types of reservations are: ");
+  Put_message("");
+  qargs[0] = "*";
+  qargs[1] = "RESERVE";
+  qargs[2] = "*";
+  if ((stat = do_mr_query("get_alias", 3, &qargs[0],
+                         StoreInfo, &elem)))
+    {
+      com_err(program_name, stat, "in PrintReservationTypes.");
+    }
+  top = elem = QueueTop(elem);
+  while (elem)
+    {
+      char **info = elem->q_data;
+      sprintf(buf, "%s", info[2]);
+      Put_message(buf);
+      elem = elem->q_forw;
+    }
+
+  FreeQueue(QueueTop(top));  
+}
+
+int UserBySponsor(int argc, char **argv)
+{
+  char buf[BUFSIZ], temp_buf[BUFSIZ], *type, *name;
+  struct mqelem *top;
+
+  type = strdup("USER");
+  if (GetTypeFromUser("Type of sponsor", "search_ace_type", &type) == SUB_ERROR)
+    return DM_NORMAL;
+
+  sprintf(buf, "Name of %s", type);
+  name = strdup(user);
+  if (GetValueFromUser(buf, &name) == SUB_ERROR)
+    return DM_NORMAL;
+
+  switch (YesNoQuestion("Do you want a recursive search (y/n)", FALSE))
+    {
+    case TRUE:
+      sprintf(temp_buf, "R%s", type);     /* "USER to "RUSER", etc. */
+      free(type);
+      type = strdup(temp_buf);
+      break;
+    case FALSE:
+      break;
+    default:
+      return DM_NORMAL;
+    }
+
+  top = GetUserBySponsor(type, name);
+  Loop(top, PrintLogin);
+
+  FreeQueue(top);
+  return DM_NORMAL;
+}
+
+static void PrintLogin(char **info)
+{
+     char buf[BUFSIZ];
+
+     sprintf(buf, "Login: %s", info[U_NAME]);
+     Put_message(buf);
+}
+
+struct mqelem *GetUserBySponsor(char *type, char *name)
+{
+  char *args[2];
+  struct mqelem *elem = NULL;
+  int status;
+
+  args[0] = type;
+  args[1] = name;
+  if ((status = do_mr_query("get_user_account_by_sponsor", 2, args, StoreInfo,
+                           &elem)))
+    {
+      com_err(program_name, status, " in get_user_account_by_sponsor");
+      return NULL;
+    }
+  return QueueTop(elem);
+}
This page took 0.055953 seconds and 4 git commands to generate.