]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Patch by Ryan Brindley -- Make sure that manager refuses any duplicate 'new category...
authorPari Nannapaneni <paripurnachand@digium.com>
Tue, 11 Nov 2008 23:02:43 +0000 (23:02 +0000)
committerPari Nannapaneni <paripurnachand@digium.com>
Tue, 11 Nov 2008 23:02:43 +0000 (23:02 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@156017 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/manager.c

index 9292c739e47fa7e6191cfa8480c8474bf314a95e..d86130f2988b68092552efffc381fd8ea6038a71 100644 (file)
@@ -81,6 +81,7 @@ enum error_type {
        UNSPECIFIED_CATEGORY,
        UNSPECIFIED_ARGUMENT,
        FAILURE_ALLOCATION,
+       FAILURE_NEWCAT,
        FAILURE_DELCAT,
        FAILURE_EMPTYCAT,
        FAILURE_UPDATE,
@@ -1286,17 +1287,24 @@ static enum error_type handle_updates(struct mansession *s, const struct message
        struct ast_str *str1 = ast_str_create(16), *str2 = ast_str_create(16);
        enum error_type result = 0;
 
-       for (x = 0; x < 100000; x++) {
+       for (x = 0; x < 100000; x++) {  //100000 = the max number of allowed updates + 1
                unsigned int object = 0;
 
                snprintf(hdr, sizeof(hdr), "Action-%06d", x);
                action = astman_get_header(m, hdr);
-               if (ast_strlen_zero(action))
-                       break;
+               if (ast_strlen_zero(action))            // breaks the for loop if no action header
+                       break;                          // this could cause problems if actions come in misnumbered
+
                snprintf(hdr, sizeof(hdr), "Cat-%06d", x);
                cat = astman_get_header(m, hdr);
+               if (ast_strlen_zero(cat)) {             //every action needs a category
+                       result =  UNSPECIFIED_CATEGORY;
+                       break;
+               }
+
                snprintf(hdr, sizeof(hdr), "Var-%06d", x);
                var = astman_get_header(m, hdr);
+
                snprintf(hdr, sizeof(hdr), "Value-%06d", x);
                value = astman_get_header(m, hdr);
 
@@ -1304,13 +1312,16 @@ static enum error_type handle_updates(struct mansession *s, const struct message
                        object = 1;
                        value++;
                }
+       
                snprintf(hdr, sizeof(hdr), "Match-%06d", x);
                match = astman_get_header(m, hdr);
+
                snprintf(hdr, sizeof(hdr), "Line-%06d", x);
                line = astman_get_header(m, hdr);
+
                if (!strcasecmp(action, "newcat")) {
-                       if (ast_strlen_zero(cat)) {
-                               result = UNSPECIFIED_CATEGORY;
+                       if (ast_category_get(cfg,cat)) {        //check to make sure the cat doesn't
+                               result = FAILURE_NEWCAT;        //already exist
                                break;
                        }
                        if (!(category = ast_category_new(cat, dfn, -1))) {
@@ -1322,7 +1333,7 @@ static enum error_type handle_updates(struct mansession *s, const struct message
                        } else
                                ast_category_insert(cfg, category, match);
                } else if (!strcasecmp(action, "renamecat")) {
-                       if (ast_strlen_zero(cat) || ast_strlen_zero(value)) {
+                       if (ast_strlen_zero(value)) {
                                result = UNSPECIFIED_ARGUMENT;
                                break;
                        }
@@ -1332,25 +1343,17 @@ static enum error_type handle_updates(struct mansession *s, const struct message
                        }
                        ast_category_rename(category, value);
                } else if (!strcasecmp(action, "delcat")) {
-                       if (ast_strlen_zero(cat)) {
-                               result = UNSPECIFIED_CATEGORY;
-                               break;
-                       }
                        if (ast_category_delete(cfg, cat)) {
                                result = FAILURE_DELCAT;
                                break;
                        }
                } else if (!strcasecmp(action, "emptycat")) {
-                       if (ast_strlen_zero(cat)) {
-                               result = UNSPECIFIED_CATEGORY;
-                               break;
-                       }
                        if (ast_category_empty(cfg, cat)) {
                                result = FAILURE_EMPTYCAT;
                                break;
                        }
                } else if (!strcasecmp(action, "update")) {
-                       if (ast_strlen_zero(cat) || ast_strlen_zero(var)) {
+                       if (ast_strlen_zero(var)) {
                                result = UNSPECIFIED_ARGUMENT;
                                break;
                        }
@@ -1363,7 +1366,7 @@ static enum error_type handle_updates(struct mansession *s, const struct message
                                break;
                        }
                } else if (!strcasecmp(action, "delete")) {
-                       if (ast_strlen_zero(cat) || (ast_strlen_zero(var) && ast_strlen_zero(line))) {
+                       if ((ast_strlen_zero(var) && ast_strlen_zero(line))) {
                                result = UNSPECIFIED_ARGUMENT;
                                break;
                        }
@@ -1376,7 +1379,7 @@ static enum error_type handle_updates(struct mansession *s, const struct message
                                break;
                        }
                } else if (!strcasecmp(action, "append")) {
-                       if (ast_strlen_zero(cat) || ast_strlen_zero(var)) {
+                       if (ast_strlen_zero(var)) {
                                result = UNSPECIFIED_ARGUMENT;
                                break;
                        }
@@ -1392,7 +1395,7 @@ static enum error_type handle_updates(struct mansession *s, const struct message
                                v->object = 1;
                        ast_variable_append(category, v);
                } else if (!strcasecmp(action, "insert")) {
-                       if (ast_strlen_zero(cat) || ast_strlen_zero(var) || ast_strlen_zero(line)) {
+                       if (ast_strlen_zero(var) || ast_strlen_zero(line)) {
                                result = UNSPECIFIED_ARGUMENT;
                                break;
                        }
@@ -1482,6 +1485,9 @@ static int action_updateconfig(struct mansession *s, const struct message *m)
                case FAILURE_ALLOCATION:
                        astman_send_error(s, m, "Memory allocation failure, this should not happen");
                        break;
+               case FAILURE_NEWCAT:
+                       astman_send_error(s, m, "Create category did not complete successfully");
+                       break;
                case FAILURE_DELCAT:
                        astman_send_error(s, m, "Delete category did not complete successfully");
                        break;