]> andersk Git - moira.git/blobdiff - clients/addusr/addusr.c
tcsh is dead. Long live bash.
[moira.git] / clients / addusr / addusr.c
index 1fd8f702264231042dde837f6d4a67ca99eaa5a4..e31d6aa2fdd07f5d90eb67bf47eacd17d4926dd9 100644 (file)
 
 RCSID("$Header$");
 
+struct owner_type {
+  int type;
+  char *name;
+};
+
+#define M_ANY          0
+#define M_USER         1
+#define M_LIST         2
+#define M_KERBEROS     3
+#define M_NONE         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_WINCONSOLESHELL "cmd"
+#define DEFAULT_WINHOMEDIR "[DFS]"
+#define DEFAULT_WINPROFILEDIR "[DFS]"
+
 /* flags from command line */
-char *class, *comment, *status_str, *shell, *filename;
-int reg_only, reg, verbose, nodupcheck, securereg;
+char *class, *comment, *status_str, *shell, *winconsoleshell, *filename;
+char *expiration;
+int reg_only, reg, verbose, nodupcheck, securereg, nocaps;
+struct owner_type *sponsor;
 
 /* argument parsing macro */
 #define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
@@ -40,22 +57,26 @@ int duplicate, errors;
 void usage(char **argv);
 int usercheck(int argc, char **argv, void *qargv);
 int get_uid(int argc, char **argv, void *qargv);
+struct owner_type *parse_member(char *s);
 
 int main(int argc, char **argv)
 {
   int status, lineno;
   char **arg = argv, *qargv[U_END];
   char *p, *first, *middle, *last, *id, *login, *server;
-  char buf[BUFSIZ], idbuf[32];
+  char buf[BUFSIZ];
   FILE *input;
 
   /* clear all flags & lists */
-  reg_only = reg = verbose = lineno = nodupcheck = errors = securereg = 0;
+  reg_only = reg = verbose = lineno = nodupcheck = errors = securereg = nocaps = 0;
+  sponsor = NULL;
   server = NULL;
   filename = "-";
   shell = DEFAULT_SHELL;
+  winconsoleshell = DEFAULT_WINCONSOLESHELL;
   class = "TEMP";
   comment = "";
+  expiration = "";
   status_str = "0";
 
   whoami = argv[0];
@@ -105,6 +126,36 @@ int main(int argc, char **argv)
              else
                usage(argv);
            }
+         else if (argis("w", "winshell"))
+           {
+             if (arg - argv < argc - 1)
+               {
+                 ++arg;
+                 winconsoleshell = *arg;
+               }
+             else 
+               usage(argv);
+           }
+         else if (argis("sp", "sponsor"))
+           {
+             if (arg - argv < argc - 1)
+               {
+                 ++arg;
+                 sponsor = parse_member(*arg);
+               }
+             else
+               usage(argv);
+           }
+         else if (argis("e", "expiration"))
+           {
+             if (arg - argv < argc - 1)
+               {
+                 ++arg;
+                 expiration = *arg;
+               }
+             else
+               usage(argv);
+           }
          else if (argis("6", "secure"))
            securereg++;
          else if (argis("r", "reg_only"))
@@ -125,6 +176,8 @@ int main(int argc, char **argv)
            verbose++;
          else if (argis("d", "nodupcheck"))
            nodupcheck++;
+         else if (argis("n", "nocaps"))
+           nocaps++;
          else if (argis("S", "server") || argis("db", "database"))
            {
              if (arg - argv < argc - 1)
@@ -155,17 +208,22 @@ int main(int argc, char **argv)
     }
 
   /* fire up Moira */
-  if (mrcl_connect(server, "addusr", 2, 1) != MRCL_SUCCESS)
+  if (mrcl_connect(server, "addusr", 12, 1) != MRCL_SUCCESS)
     exit(2);
 
   qargv[U_NAME] = UNIQUE_LOGIN;
   qargv[U_UID] = UNIQUE_UID;
   qargv[U_SHELL] = shell;
+  qargv[U_WINCONSOLESHELL] = winconsoleshell;
+  qargv[U_WINHOMEDIR] = DEFAULT_WINHOMEDIR;
+  qargv[U_WINPROFILEDIR] = DEFAULT_WINPROFILEDIR;
+  qargv[U_EXPIRATION] = expiration;
   qargv[U_STATE] = status_str;
   qargv[U_CLASS] = class;
   qargv[U_COMMENT] = comment;
   qargv[U_SIGNATURE] = "";
   qargv[U_SECURE] = securereg ? "1" : "0";
+  
   while (fgets(buf, BUFSIZ, input))
     {
       /* throw away terminating newline */
@@ -186,7 +244,7 @@ int main(int argc, char **argv)
          continue;
        }
       *p++ = '\0';
-      first = p;
+      first = strtrim(p);
       while (*p)               /* find end-of-line */
        p++;
       if (reg_only || reg)
@@ -235,9 +293,12 @@ int main(int argc, char **argv)
       qargv[U_MIDDLE] = strtrim(middle);
       qargv[U_LAST] = strtrim(last);
       qargv[U_MITID] = strtrim(id);
-      FixCase(qargv[U_FIRST]);
-      FixCase(qargv[U_MIDDLE]);
-      FixCase(qargv[U_LAST]);
+      if (!nocaps)
+       {
+         FixCase(qargv[U_FIRST]);
+         FixCase(qargv[U_MIDDLE]);
+         FixCase(qargv[U_LAST]);
+       }
       RemoveHyphens(qargv[U_MITID]);
       if (!reg_only)
        {
@@ -254,7 +315,7 @@ int main(int argc, char **argv)
                {
                  com_err(whoami, status,
                          "checking to see if user %s %s already exists",
-                         qargv[0], qargv[1]);
+                         qargv[U_FIRST], qargv[U_LAST]);
                  com_err(whoami, 0, "NOT ADDING USER");
                  errors++;
                  continue;
@@ -262,7 +323,7 @@ int main(int argc, char **argv)
              if (duplicate > 0)
                {
                  com_err(whoami, MR_EXISTS, "user %s %s already exists",
-                         qargv[0], qargv[1]);
+                         qargv[U_FIRST], qargv[U_LAST]);
                  com_err(whoami, 0, "NOT ADDING USER");
                  errors++;
                  continue;
@@ -275,8 +336,49 @@ int main(int argc, char **argv)
                  com_err(whoami, 0, "ADDING user anyway");
                }
            }
-         status = mr_query("add_user_account", U_SECURE + 1, qargv,
-                           NULL, NULL);
+
+         if (sponsor)
+           {
+             qargv[U_SPONSOR_NAME] = sponsor->name;
+             switch (sponsor->type)
+               {
+               case M_ANY:
+               case M_USER:
+                 qargv[U_SPONSOR_TYPE] = "USER";
+                 status = mr_query("add_user_account", 18, qargv, NULL, NULL);
+                 if (sponsor->type != M_ANY || status != MR_USER)
+                   break;
+                 
+               case M_LIST:
+                 qargv[U_SPONSOR_TYPE] = "LIST";
+                 status = mr_query("add_user_account", 18, qargv, NULL, NULL);
+                 break;
+                 
+               case M_KERBEROS:
+                 qargv[U_SPONSOR_TYPE] = "KERBEROS";
+                 status = mrcl_validate_kerberos_member(qargv[U_SPONSOR_NAME],
+                                                        &qargv[U_SPONSOR_NAME]);
+                 if (mrcl_get_message())
+                   mrcl_com_err(whoami);
+                 if (status == MRCL_REJECT)
+               exit(1);
+                 status = mr_query("add_user_account", 18, qargv, NULL, NULL);
+                 break;
+                 
+               case M_NONE:
+                 qargv[U_SPONSOR_TYPE] = "NONE";
+                 status = mr_query("add_user_account", 18, qargv, NULL, NULL);
+                 break;
+               }
+           }
+         else
+           {
+             qargv[U_SPONSOR_TYPE] = "NONE";
+             qargv[U_SPONSOR_NAME] = "NONE";
+         
+             status = mr_query("add_user_account", 18, qargv, NULL, NULL);
+           }
+         
          if (status)
            {
              com_err(whoami, status, "adding user %s %s", first, last);
@@ -307,7 +409,7 @@ int main(int argc, char **argv)
 
          rargv[0] = uid;
          rargv[1] = login;
-         rargv[2] = "0";
+         rargv[2] = "IMAP";
 
          status = mr_query("register_user", 3, rargv, NULL, NULL);
          if (status)
@@ -338,10 +440,15 @@ void usage(char **argv)
   fprintf(stderr, "   -C | -comment \"comment\" (default \"\")\n");
   fprintf(stderr, "   -s | -status status (default 0)\n");
   fprintf(stderr, "   -h | -shell shell (default %s)\n", DEFAULT_SHELL);
+  fprintf(stderr, "   -w | -winshell windows console shell (default %s)\n",
+         DEFAULT_WINCONSOLESHELL);
+  fprintf(stderr, "   -sp | -sponsor sponsor (default NONE)\n");
+  fprintf(stderr, "   -e | -expiration \"expiration date\" (default \"\")\n");
   fprintf(stderr, "   -r | -reg_only\n");
   fprintf(stderr, "   -R | -register (and add to database)\n");
   fprintf(stderr, "   -v | -verbose\n");
   fprintf(stderr, "   -d | -nodupcheck (don't check for duplicates)\n");
+  fprintf(stderr, "   -n | -nocaps (don't fix capitalization of names)\n");
   fprintf(stderr, "   -db | -database host:port\n");
   exit(1);
 }
@@ -374,3 +481,57 @@ int get_uid(int argc, char **argv, void *uidv)
 
   return MR_CONT;
 }
+
+/* Parse a line of input, fetching a member.  NULL is returned if a member
+ * is not found.  ';' is a comment character.
+ */
+struct owner_type *parse_member(char *s)
+{
+  struct owner_type *m;
+  char *p, *lastchar;
+
+  while (*s && isspace(*s))
+    s++;
+  lastchar = p = s;
+  while (*p && *p != '\n' && *p != ';')
+    {
+      if (isprint(*p) && !isspace(*p))
+       lastchar = p++;
+      else
+       p++;
+    }
+  lastchar++;
+  *lastchar = '\0';
+  if (p == s || strlen(s) == 0)
+    return NULL;
+
+  if (!(m = malloc(sizeof(struct owner_type))))
+    return NULL;
+
+  if ((p = strchr(s, ':')))
+    {
+      *p = '\0';
+      m->name = ++p;
+      if (!strcasecmp("user", s))
+       m->type = M_USER;
+      else if (!strcasecmp("list", s))
+       m->type = M_LIST;
+      else if (!strcasecmp("kerberos", s))
+       m->type = M_KERBEROS;
+      else if (!strcasecmp("none", s))
+       m->type = M_NONE;
+      else
+       {
+         m->type = M_ANY;
+         *(--p) = ':';
+         m->name = s;
+       }
+      m->name = strdup(m->name);
+    }
+  else
+    {
+      m->name = strdup(s);
+      m->type = strcasecmp(s, "none") ? M_ANY : M_NONE;
+    }
+  return m;
+}
This page took 0.044823 seconds and 4 git commands to generate.