diff --git a/configs/ari.conf.sample b/configs/ari.conf.sample index 11e2b065e7..414f89d8f2 100644 --- a/configs/ari.conf.sample +++ b/configs/ari.conf.sample @@ -8,7 +8,8 @@ enabled = yes ; When set to no, stasis-http support is disabled. ;auth_realm = ; Realm to use for authentication. Defaults to Asterisk ; ; REST Interface. -;[user-username] +;[username] +;type = user ; Specifies user configuration ;read_only = no ; When set to yes, user is only authorized for ; ; read-only requests. ; diff --git a/res/res_stasis_http.c b/res/res_stasis_http.c index f76752d3da..7cd92f48f1 100644 --- a/res/res_stasis_http.c +++ b/res/res_stasis_http.c @@ -95,6 +95,14 @@ Per-user configuration settings + + Define this configuration section as a user. + + + Configure this section as a user + + + When set to yes, user is only authorized for read-only requests diff --git a/res/stasis_http/config.c b/res/stasis_http/config.c index 09db01e847..2181907d57 100644 --- a/res/stasis_http/config.c +++ b/res/stasis_http/config.c @@ -89,19 +89,11 @@ static void user_dtor(void *obj) static void *user_alloc(const char *cat) { RAII_VAR(struct ari_conf_user *, user, NULL, ao2_cleanup); - const char *username; if (!cat) { return NULL; } - username = strchr(cat, '-') + 1; - - if (!username) { - ast_log(LOG_ERROR, "Invalid user category '%s'\n", cat); - return NULL; - } - ast_debug(3, "Allocating user %s\n", cat); user = ao2_alloc_options(sizeof(*user), user_dtor, @@ -110,7 +102,7 @@ static void *user_alloc(const char *cat) return NULL; } - user->username = ast_strdup(username); + user->username = ast_strdup(cat); if (!user->username) { return NULL; } @@ -141,21 +133,20 @@ static int user_sort_cmp(const void *obj_left, const void *obj_right, int flags) /*! \brief \ref aco_type item_find function */ static void *user_find(struct ao2_container *tmp_container, const char *cat) { - const char *username; - if (!cat) { return NULL; } - username = strchr(cat, '-') + 1; - return ao2_find(tmp_container, username, OBJ_KEY); + return ao2_find(tmp_container, cat, OBJ_KEY); } static struct aco_type user_option = { .type = ACO_ITEM, .name = "user", - .category_match = ACO_WHITELIST, - .category = "^user-.+$", + .category_match = ACO_BLACKLIST, + .category = "^general$", + .matchfield = "type", + .matchvalue = "user", .item_alloc = user_alloc, .item_find = user_find, .item_offset = offsetof(struct ari_conf, users), @@ -318,6 +309,8 @@ int ari_config_init(void) FLDSET(struct ari_conf_general, auth_realm), ARI_AUTH_REALM_LEN); + aco_option_register(&cfg_info, "type", ACO_EXACT, user, NULL, + OPT_NOOP_T, 0, 0); aco_option_register(&cfg_info, "read_only", ACO_EXACT, user, "no", OPT_BOOL_T, 1, FLDSET(struct ari_conf_user, read_only));