]> andersk Git - moira.git/blobdiff - clients/moira/lists.c
If creating a list which has the same name as a username, prompt and ask
[moira.git] / clients / moira / lists.c
index 310dfcbb0060fc6da53b987969dbfef0543465d9..7bcc4f54664b0ea6eec8ebebb2a802caa5b6ac81 100644 (file)
@@ -2,8 +2,8 @@
   static char rcsid_module_c[] = "$Header$";
 #endif lint
 
-/*     This is the file lists.c for the SMS Client, which allows a nieve
- *      user to quickly and easily maintain most parts of the SMS database.
+/*     This is the file lists.c for the MOIRA Client, which allows a nieve
+ *      user to quickly and easily maintain most parts of the MOIRA database.
  *     It Contains: All list manipulation functions, except delete.
  *     
  *     Created:        4/12/88
@@ -20,9 +20,9 @@
  */
 
 #include <stdio.h>
-#include <strings.h>
-#include <sms.h>
-#include <sms_app.h>
+#include <string.h>
+#include <moira.h>
+#include <moira_site.h>
 #include <menu.h>
 
 #include "mit-copyright.h"
@@ -132,7 +132,7 @@ char * name1, *name2;
     switch(type) {
     case LIST:
        args[0] = name1;
-       if ( (status = do_sms_query("get_list_info", 1, args,
+       if ( (status = do_mr_query("get_list_info", 1, args,
                               StoreInfo, (char *) &elem)) != 0) {
            com_err(program_name, status, " in get_list_info");
            return (NULL);
@@ -140,7 +140,7 @@ char * name1, *name2;
        break;
     case MEMBERS:
        args[0] = name1;
-       if ( (status = do_sms_query("get_members_of_list", 1, args,
+       if ( (status = do_mr_query("get_members_of_list", 1, args,
                               StoreInfo, (char *) &elem)) != 0) {
            com_err(program_name, status, " in get_members_of_list");
            return (NULL);
@@ -149,7 +149,7 @@ char * name1, *name2;
     case GLOM:
        args[0] = name1;        
        args[1] = name2;        
-       if ( (status =  do_sms_query("get_lists_of_member", 2, args,
+       if ( (status =  do_mr_query("get_lists_of_member", 2, args,
                               StoreInfo, (char *) &elem)) != 0) {
            com_err(program_name, status, " in get_list_of_members");
            return (NULL);
@@ -158,7 +158,7 @@ char * name1, *name2;
     case ACE_USE:
        args[0] = name1;        
        args[1] = name2;        
-       if ( (status =  do_sms_query("get_ace_use", 2, args,
+       if ( (status =  do_mr_query("get_ace_use", 2, args,
                               StoreInfo, (char *) &elem)) != 0) {
            com_err(program_name, status, " in get_ace_use");
            return (NULL);
@@ -190,27 +190,46 @@ Bool name;
     Put_message(" ");
 
     if (name) {
-       newname = Strsave(info[L_NAME]);
-       GetValueFromUser("The new name for this list", &newname);
+       while (1) {
+           newname = Strsave(info[L_NAME]);
+           if (GetValueFromUser("The new name for this list", &newname) ==
+               SUB_ERROR)
+             return(NULL);
+           if (ValidName(newname))
+             break;
+       }
     }
-    GetYesNoValueFromUser("Is this an active list", &info[L_ACTIVE]);
-    GetYesNoValueFromUser("Is this a public list", &info[L_PUBLIC]);
-    GetYesNoValueFromUser("Is this a hidden list", &info[L_HIDDEN]);
-    GetYesNoValueFromUser("Is this a maillist", &info[L_MAILLIST]);
-    GetYesNoValueFromUser("Is this a group", &info[L_GROUP]);
+    if (GetYesNoValueFromUser("Is this an active list", &info[L_ACTIVE]) ==
+       SUB_ERROR)
+      return(NULL);
+    if (GetYesNoValueFromUser("Is this a public list", &info[L_PUBLIC]) ==
+       SUB_ERROR)
+      return(NULL);
+    if (GetYesNoValueFromUser("Is this a hidden list", &info[L_HIDDEN]) ==
+       SUB_ERROR)
+      return(NULL);
+    if (GetYesNoValueFromUser("Is this a maillist", &info[L_MAILLIST]) ==
+       SUB_ERROR)
+      return(NULL);
+    if (GetYesNoValueFromUser("Is this a group", &info[L_GROUP]) == SUB_ERROR)
+      return(NULL);
     if (atoi(info[L_GROUP]))
-       GetValueFromUser("What is the GID for this group.", &info[L_GID]);
-
-    GetTypeFromUser("What Type of Administrator", "ace_type",&info[L_ACE_TYPE]);
-    if ( (strcmp(info[L_ACE_TYPE], "USER") == 0) || 
-       (strcmp(info[L_ACE_TYPE], "user") == 0) )
-       GetValueFromUser("Who will be the administrator of this list: ",
-                        &info[L_ACE_NAME]);
-    if ( (strcmp(info[L_ACE_TYPE], "LIST") == 0) ||
-       (strcmp(info[L_ACE_TYPE], "list") == 0) )
-       GetValueFromUser("Which group will be the administrator of this list: ",
-                        &info[L_ACE_NAME]);
-    GetValueFromUser("Description: ", &info[L_DESC]);
+      if (GetValueFromUser("What is the GID for this group.", &info[L_GID]) ==
+         SUB_ERROR)
+       return(NULL);
+
+    if (GetTypeFromUser("What Type of Administrator", "ace_type",
+                       &info[L_ACE_TYPE]) == SUB_ERROR)
+      return(NULL);
+    if ((strcasecmp(info[L_ACE_TYPE], "NONE") != 0) &&
+       (strcasecmp(info[L_ACE_TYPE], "none") != 0)) {
+       sprintf(temp_buf, "Which %s will be the administrator of this list: ",
+               info[L_ACE_TYPE]);
+       if (GetValueFromUser(temp_buf, &info[L_ACE_NAME]) == SUB_ERROR)
+         return(NULL);
+    }
+    if (GetValueFromUser("Description: ", &info[L_DESC]) == SUB_ERROR)
+      return(NULL);
 
     FreeAndClear(&info[L_MODTIME], TRUE);
     FreeAndClear(&info[L_MODBY], TRUE);
@@ -267,9 +286,12 @@ Bool junk;
     register int stat;
     char ** args;
     
-    args = AskListInfo(info, TRUE);
-    if ( (stat = do_sms_query("update_list", CountArgs(args), args, 
-                          Scream, (char *) NULL)) != SMS_SUCCESS) {
+    if ((args = AskListInfo(info, TRUE)) == NULL) {
+       Put_message("Aborted.");
+       return;
+    }
+    if ( (stat = do_mr_query("update_list", CountArgs(args), args, 
+                          Scream, (char *) NULL)) != MR_SUCCESS) {
        com_err(program_name, stat, " in UpdateList."); 
        Put_message("List ** NOT ** Updated.");
     }
@@ -338,21 +360,37 @@ char **argv;
 {
     static char *info[MAX_ARGS_SIZE], **add_args;
     int status, ret_code = SUB_NORMAL;
+    struct qelem *elem = NULL;
 
-    status = do_sms_query("get_list_info", 1, argv + 1, NullFunc, 
+    if (!ValidName(argv[1]))
+      return(DM_NORMAL);
+    status = do_mr_query("get_list_info", 1, argv + 1, NullFunc, 
                       (char *) NULL);
-    if (status != SMS_NO_MATCH) {
-       if (status == SMS_SUCCESS)
+    if (status != MR_NO_MATCH) {
+       if (status == MR_SUCCESS)
            Put_message("This list already exists.");
        else
            com_err(program_name, status, " in AddList.");      
        return(SUB_ERROR);
     }
 
-    add_args = AskListInfo(SetDefaults(info,argv[1]), FALSE);
+    if (do_mr_query("get_user_account_by_login", 1, argv + 1,
+                   StoreInfo, (char *) &elem) == 0) {
+           Put_message("A user by that name already exists in the database.");
+           Loop(QueueTop(elem), FreeInfo);
+           FreeQueue(elem);
+           if (YesNoQuestion("Crate a list with the same name",
+                             FALSE) != TRUE)
+                   return(SUB_ERROR);
+    }
+    
+    if ((add_args = AskListInfo(SetDefaults(info,argv[1]), FALSE)) == NULL) {
+       Put_message("Aborted.");
+       return(SUB_ERROR);
+    }
 
-    if ( (status = do_sms_query("add_list", CountArgs(add_args), add_args,
-                            Scream, (char *) NULL)) != SMS_SUCCESS) {
+    if ( (status = do_mr_query("add_list", CountArgs(add_args), add_args,
+                            Scream, (char *) NULL)) != MR_SUCCESS) {
        com_err(program_name, status, " in AddList.");  
        Put_message("List Not Created.");
        ret_code = SUB_ERROR;
@@ -422,14 +460,14 @@ char **argv;
     }
     else 
        /* All we want to know is if it exists. */
-       switch( (stat = do_sms_query("count_members_of_list", 1, argv + 1,
+       switch( (stat = do_mr_query("count_members_of_list", 1, argv + 1,
                                   NullFunc, (char *) NULL))) {
-       case SMS_SUCCESS:
+       case MR_SUCCESS:
            break;
-       case SMS_LIST:
+       case MR_LIST:
            Put_message("This list does not exist.");
            return(DM_QUIT);
-       case SMS_PERM:
+       case MR_PERM:
            Put_message("You are not allowed to view this list.");
            break;
        default:
@@ -479,7 +517,7 @@ char * type;
     args[1] = NULL;
 
     found_some = FALSE;
-    if ( (status = do_sms_query("get_members_of_list", CountArgs(args), args, 
+    if ( (status = do_mr_query("get_members_of_list", CountArgs(args), args, 
                             PrintByType, type)) != 0) {
        com_err(program_name, status, " in ListMembersByType");
        return(DM_NORMAL);
@@ -557,16 +595,19 @@ int
 GetMemberInfo(action, ret_argv)
 char *action, **ret_argv;
 {
-    char temp_buf[BUFSIZ], ret_buf[BUFSIZ];
+    char temp_buf[BUFSIZ];
 
     ret_argv[LM_LIST] = Strsave(current_list);
 
     ret_argv[LM_TYPE] = Strsave("user");
-    GetTypeFromUser("Type of member", "member", &ret_argv[LM_TYPE]);
+    if (GetTypeFromUser("Type of member", "member", &ret_argv[LM_TYPE]) ==
+       SUB_ERROR)
+      return(SUB_ERROR);
 
     sprintf(temp_buf,"Name of %s to %s", ret_argv[LM_TYPE], action);
     ret_argv[LM_MEMBER] = Strsave(user);
-    GetValueFromUser(temp_buf, &ret_argv[LM_MEMBER]);
+    if (GetValueFromUser(temp_buf, &ret_argv[LM_MEMBER]) == SUB_ERROR)
+      return(SUB_ERROR);
     ret_argv[LM_END] = NULL;           /* NULL terminate this list. */
 
     if (strcasecmp(ret_argv[LM_TYPE], "string") &&
@@ -586,15 +627,40 @@ char *action, **ret_argv;
 int
 AddMember()
 {
-    char *args[10], temp_buf[BUFSIZ];
+    char *args[10], temp_buf[BUFSIZ], *p;
     register int status;
+    struct qelem *mailhubs, *elem, *GetTypeValues();
 
     if ( GetMemberInfo("add", args) == SUB_ERROR )
        return(DM_NORMAL);
 
-    if ( (status = do_sms_query("add_member_to_list", CountArgs(args), args,
-                          Scream, NULL)) != SMS_SUCCESS) {
-       if (status == SMS_EXISTS) {
+    if (!strcmp(args[LM_TYPE], "STRING")) {
+       if (p = strchr(args[LM_MEMBER], '@')) {
+           char *host = canonicalize_hostname(strsave(++p));
+           mailhubs = GetTypeValues("mailhub");
+           for (elem = mailhubs; elem; elem = elem->q_forw) {
+               if (!strcasecmp(host, elem->q_data)) {
+                   free(host);
+                   host = strsave(args[LM_MEMBER]);
+                   *(--p) = 0;
+                   sprintf(temp_buf, "String \"%s\" should be USER or LIST \"%s\" because it is a local name.",
+                           host, args[LM_MEMBER]);
+                   Put_message(temp_buf);
+                   free(args[LM_TYPE]);
+                   free(host);
+                   return(DM_NORMAL);
+               }
+           }
+           free(host);
+       } else if (!strchr(args[LM_MEMBER], '!')) {
+           Put_message("Member which is not a foreign mail address should not be type STRING.");
+           return(DM_NORMAL);
+       }
+    }
+
+    if ( (status = do_mr_query("add_member_to_list", CountArgs(args), args,
+                          Scream, NULL)) != MR_SUCCESS) {
+       if (status == MR_EXISTS) {
            sprintf(temp_buf, "The %s %s is already a member of LIST %s.",
                    args[LM_TYPE], args[LM_MEMBER], args[LM_LIST]);
            Put_message(temp_buf);
@@ -623,7 +689,7 @@ DeleteMember()
        return(DM_NORMAL);
 
     if (Confirm("Are you sure you want to delete this member?") ) {
-       if (status = do_sms_query("delete_member_from_list", CountArgs(args),
+       if (status = do_mr_query("delete_member_from_list", CountArgs(args),
                               args, Scream, NULL))
            com_err(program_name, status, " in DeleteMember");
        else
@@ -649,17 +715,17 @@ int
 InterRemoveItemFromLists()
 {
     register int status;
-    char type[BUFSIZ], name[BUFSIZ], *args[10], buf[BUFSIZ];
+    char *type, *name, *args[10], buf[BUFSIZ];
     struct qelem *top, *elem;
 
-    if ( !(PromptWithDefault("Type of member (user, list, string)", type, 
-                           BUFSIZ, "user")) )
+    type = strsave("USER");
+    if (GetTypeFromUser("Type of member", "member", &type) == SUB_ERROR)
        return(DM_NORMAL);
     
     sprintf(buf, "Name of %s", type);
-    if ( !(PromptWithDefault(buf, name, BUFSIZ, user)) ) {
-       return(DM_NORMAL);
-    }
+    name = strsave(user);
+    if (GetValueFromUser(buf, &name) == SUB_ERROR)
+      return(DM_NORMAL);
 
     if (!ValidName(name))
        return(DM_NORMAL);
@@ -677,7 +743,7 @@ InterRemoveItemFromLists()
            args[DM_LIST] = info[GLOM_NAME];
            args[DM_TYPE] = type;
            args[DM_MEMBER] = name;
-           if ( (status = do_sms_query("delete_member_from_list", 3, args,
+           if ( (status = do_mr_query("delete_member_from_list", 3, args,
                               Scream, (char *) NULL)) != 0)
                /* should probabally check to delete list. */
                com_err(program_name, status, " in delete_member");
@@ -710,24 +776,25 @@ ListByMember()
     Bool maillist, group;
     struct qelem *top, *elem;
 
-    if ( !(PromptWithDefault("Type of member (user, list, string)", buf, 
-                           BUFSIZ, "user")) )
+    type = strsave("USER");
+    if (GetTypeFromUser("Type of member", "member", &type) == SUB_ERROR)
        return(DM_NORMAL);
+    
+    sprintf(buf, "Name of %s", type);
+    name = strsave(user);
+    if (GetValueFromUser(buf, &name) == SUB_ERROR)
+      return(DM_NORMAL);
 
     /* What we really want is a recursive search */
-    sprintf(temp_buf, "R%s", buf); 
-    type = Strsave(temp_buf);
+    sprintf(temp_buf, "R%s", type);
+    free(type); type = Strsave(temp_buf);
 
-    sprintf(temp_buf, "Name of %s", buf);
-    if ( !(PromptWithDefault(temp_buf, buf, BUFSIZ, user)) ) {
-       free(type);
-       return(DM_NORMAL);
-    }
-    name = Strsave(buf);
-
-    maillist = YesNoQuestion("Show Lists that are Maillists (y/n) ?",
-                            TRUE);
-    group = YesNoQuestion("Show Lists that are Groups (y/n) ?", TRUE);
+    if ((maillist = YesNoQuestion("Show Lists that are Maillists (y/n) ?",
+                                 TRUE)) == -1)
+      return(DM_NORMAL);
+    if ((group = YesNoQuestion("Show Lists that are Groups (y/n) ?",
+                              TRUE)) == -1)
+      return(DM_NORMAL);
 
     elem = top = GetListInfo(GLOM, type, name);
 
@@ -755,24 +822,27 @@ ListByAdministrator()
     char buf[BUFSIZ], temp_buf[BUFSIZ], *type, *name;
     struct qelem *top;
 
-    if ( !(PromptWithDefault("Type of member (user, list, string)", buf, 
-                           BUFSIZ, "user")) )
+    type = strsave("USER");
+    if (GetTypeFromUser("Type of member", "member", &type) == SUB_ERROR)
        return(DM_NORMAL);
-
-    if ( YesNoQuestion("Do you want a recursive search (y/n)", FALSE) == 1 ) {
-       sprintf(temp_buf, "R%s", buf);  /* "USER" to "RUSER" etc. */
-       type = Strsave(temp_buf);
-    }
-    else 
-       type = Strsave(buf);
     
-    sprintf(temp_buf, "Name of %s", buf);
-    if ( !(PromptWithDefault(temp_buf, buf, BUFSIZ, user)) ) {
+    sprintf(buf, "Name of %s", type);
+    name = strsave(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 = Strsave(temp_buf);
+       break;
+    case FALSE:
+       break;
+    default:
        return(DM_NORMAL);
     }
-    name = Strsave(buf);
-
+    
     top = GetListInfo(ACE_USE, type, name);
     Loop(top, PrintListAce);
 
@@ -780,57 +850,6 @@ ListByAdministrator()
     return (DM_NORMAL);
 }
 
-/*     Function Name: ListAllGroups
- *     Description: This function lists all visable groups.
- *     Arguments: none.
- *     Returns: DM_NORMAL.
- */
-
-ListAllGroups()
-{
-    register int status;
-    static char * args[] = {
-       "TRUE",                 /* active */
-       "DONTCARE",             /* public */
-       "FALSE",                /* hidden */
-       "DONTCARE",             /* maillist */
-       "TRUE",                 /* group. */
-    };
-
-    if (YesNoQuestion("This query will take a while, Do you wish to continue?",
-                      TRUE) == TRUE )
-       if (status = do_sms_query("qualified_get_lists", 5, args,
-                              Print, (char *) NULL) != 0)
-           com_err(program_name, status, " in ListAllGroups");
-    return (DM_NORMAL);
-}
-
-/*     Function Name: ListAllMailLists
- *     Description: This function lists all visable maillists.
- *     Arguments: none
- *     Returns: DM_NORMAL.
- */
-
-ListAllMailLists()
-{
-    register int status;
-    static char * args[] = {
-       "TRUE",                 /* active */
-       "DONTCARE",             /* public */
-       "FALSE",                /* hidden */
-       "TRUE",                 /* maillist */
-       "DONTCARE",             /* group. */
-    };
-
-    if (YesNoQuestion("This query will take a while. Do you wish to continue?",
-                      TRUE) == TRUE )
-       if (status = do_sms_query("qualified_get_lists", 5, args,
-                              Print, (char *) NULL) != 0)
-           com_err(program_name, status, " in ListAllGroups");
-
-    return (DM_NORMAL);        
-}
-
 /*     Function Name: ListAllPublicMailLists
  *     Description: This function lists all public mailing lists.
  *     Arguments: none
@@ -850,7 +869,7 @@ ListAllPublicMailLists()
 
     if (YesNoQuestion("This query will take a while. Do you wish to continue?",
                       TRUE) == TRUE )
-       if (status = do_sms_query("qualified_get_lists", 5, args,
+       if (status = do_mr_query("qualified_get_lists", 5, args,
                               Print, (char *) NULL) != 0)
            com_err(program_name, status, " in ListAllGroups");
 
This page took 0.052676 seconds and 4 git commands to generate.