diff --git a/main/manager.c b/main/manager.c index c922973987772a519d6684198effbe4747b2d492..6af81c69629957ffd2c086bdc6efaa7766f00efc 100644 --- a/main/manager.c +++ b/main/manager.c @@ -139,9 +139,12 @@ static int manager_debug; /*!< enable some debugging code in the manager */ * HTTP sessions have managerid != 0, the value is used as a search key * to lookup sessions (using the mansession_id cookie). */ -static const char *command_blacklist[] = { - "module load", - "module unload", +#define MAX_BLACKLIST_CMD_LEN 2 +static struct { + char *words[AST_MAX_CMD_LEN]; +} command_blacklist[] = { + {{ "module", "load", NULL }}, + {{ "module", "unload", NULL }}, }; struct mansession { @@ -2083,6 +2086,41 @@ static int action_atxfer(struct mansession *s, const struct message *m) return 0; } +static int check_blacklist(const char *cmd) +{ + char *cmd_copy, *cur_cmd; + char *cmd_words[MAX_BLACKLIST_CMD_LEN] = { NULL, }; + int i; + + cmd_copy = ast_strdupa(cmd); + for (i = 0; i < MAX_BLACKLIST_CMD_LEN && (cur_cmd = strsep(&cmd_copy, " ")); i++) { + cur_cmd = ast_strip(cur_cmd); + if (ast_strlen_zero(cur_cmd)) { + i--; + continue; + } + + cmd_words[i] = cur_cmd; + } + + for (i = 0; i < ARRAY_LEN(command_blacklist); i++) { + int j, match = 1; + + for (j = 0; command_blacklist[i].words[j]; j++) { + if (ast_strlen_zero(cmd_words[j]) || strcasecmp(cmd_words[j], command_blacklist[i].words[j])) { + match = 0; + break; + } + } + + if (match) { + return 1; + } + } + + return 0; +} + static char mandescr_command[] = "Description: Run a CLI command.\n" "Variables: (Names marked with * are required)\n" @@ -2096,14 +2134,17 @@ static int action_command(struct mansession *s, const struct message *m) const char *id = astman_get_header(m, "ActionID"); char *buf, *final_buf; char template[] = "/tmp/ast-ami-XXXXXX"; /* template for temporary file */ - int fd = mkstemp(template), i = 0; + int fd = mkstemp(template); off_t l; - for (i = 0; i < sizeof(command_blacklist) / sizeof(command_blacklist[0]); i++) { - if (!strncmp(cmd, command_blacklist[i], strlen(command_blacklist[i]))) { - astman_send_error(s, m, "Command blacklisted"); - return 0; - } + if (ast_strlen_zero(cmd)) { + astman_send_error(s, m, "No command provided"); + return 0; + } + + if (check_blacklist(cmd)) { + astman_send_error(s, m, "Command blacklisted"); + return 0; } astman_append(s, "Response: Follows\r\nPrivilege: Command\r\n");