users.conf: Remove deprecated users.conf integration.

users.conf was deprecated in Asterisk 21 and is now being removed
for Asterisk 23, in accordance with the Asterisk deprecation policy.

This consists of:
* Removing integration with app_directory, app_voicemail, chan_dahdi,
  chan_iax2, and AMI.
* users.conf was also partially used for res_phoneprov, and this remaining
  functionality is consolidated to a separate phoneprov_users.conf,
  used only by res_phoneprov.

Resolves: #1292

UpgradeNote: users.conf has been removed and all channel drivers must
be configured using their specific configuration files. The functionality
previously in users.conf for res_phoneprov is now in phoneprov_users.conf.
pull/1303/head
Naveen Albert 3 months ago committed by github-actions[bot]
parent 5963e624e2
commit 415daae95f

@ -699,14 +699,13 @@ static int check_match(struct directory_item **result, const char *item_context,
typedef AST_LIST_HEAD_NOLOCK(, directory_item) itemlist;
static int search_directory_sub(const char *context, struct ast_config *vmcfg, struct ast_config *ucfg, const char *ext, struct ast_flags flags, itemlist *alist)
static int search_directory_sub(const char *context, struct ast_config *vmcfg, const char *ext, struct ast_flags flags, itemlist *alist)
{
struct ast_variable *v;
struct ast_str *buf = ast_str_thread_get(&commonbuf, 100);
char *name;
char *options;
char *alias;
char *cat;
struct directory_item *item;
int res;
@ -765,52 +764,10 @@ static int search_directory_sub(const char *context, struct ast_config *vmcfg, s
AST_LIST_INSERT_TAIL(alist, item, entry);
}
if (ucfg) {
for (cat = ast_category_browse(ucfg, NULL); cat ; cat = ast_category_browse(ucfg, cat)) {
const char *position;
if (!strcasecmp(cat, "general")) {
continue;
}
if (!ast_true(ast_config_option(ucfg, cat, "hasdirectory"))) {
continue;
}
/* Find all candidate extensions */
if (!(position = ast_variable_retrieve(ucfg, cat, "fullname"))) {
continue;
}
res = 0;
if (ast_test_flag(&flags, OPT_LISTBYLASTNAME)) {
res = check_match(&item, context, position, cat, ext, 0 /* use_first_name */);
}
if (!res && ast_test_flag(&flags, OPT_LISTBYFIRSTNAME)) {
res = check_match(&item, context, position, cat, ext, 1 /* use_first_name */);
}
if (!res && ast_test_flag(&flags, OPT_ALIAS)) {
for (v = ast_variable_browse(ucfg, cat); v; v = v->next) {
if (!strcasecmp(v->name, "alias")
&& (res = check_match(&item, context, v->value, cat, ext, 1))) {
break;
}
}
}
if (!res) {
continue;
} else if (res < 0) {
return -1;
}
AST_LIST_INSERT_TAIL(alist, item, entry);
}
}
return 0;
}
static int search_directory(const char *context, struct ast_config *vmcfg, struct ast_config *ucfg, const char *ext, struct ast_flags flags, itemlist *alist)
static int search_directory(const char *context, struct ast_config *vmcfg, const char *ext, struct ast_flags flags, itemlist *alist)
{
const char *searchcontexts = ast_variable_retrieve(vmcfg, "general", "searchcontexts");
if (ast_strlen_zero(context)) {
@ -823,19 +780,19 @@ static int search_directory(const char *context, struct ast_config *vmcfg, struc
continue;
}
if ((res = search_directory_sub(catg, vmcfg, ucfg, ext, flags, alist))) {
if ((res = search_directory_sub(catg, vmcfg, ext, flags, alist))) {
return res;
}
}
return 0;
} else {
ast_debug(1, "Searching by category default\n");
return search_directory_sub("default", vmcfg, ucfg, ext, flags, alist);
return search_directory_sub("default", vmcfg, ext, flags, alist);
}
} else {
/* Browse only the listed context for a match */
ast_debug(1, "Searching by category %s\n", context);
return search_directory_sub(context, vmcfg, ucfg, ext, flags, alist);
return search_directory_sub(context, vmcfg, ext, flags, alist);
}
}
@ -861,7 +818,7 @@ static void sort_items(struct directory_item **sorted, int count)
} while (reordered);
}
static int do_directory(struct ast_channel *chan, struct ast_config *vmcfg, struct ast_config *ucfg, char *context, char *dialcontext, char digit, int digits, struct ast_flags *flags, char *opts[])
static int do_directory(struct ast_channel *chan, struct ast_config *vmcfg, char *context, char *dialcontext, char digit, int digits, struct ast_flags *flags, char *opts[])
{
/* Read in the first three digits.. "digit" is the first digit, already read */
int res = 0;
@ -884,7 +841,7 @@ static int do_directory(struct ast_channel *chan, struct ast_config *vmcfg, stru
if (ast_readstring(chan, ext + 1, digits - 1, 3000, 3000, "#") < 0)
return -1;
res = search_directory(context, vmcfg, ucfg, ext, *flags, &alist);
res = search_directory(context, vmcfg, ext, *flags, &alist);
if (res)
goto exit;
@ -943,11 +900,10 @@ exit:
static int directory_exec(struct ast_channel *chan, const char *data)
{
int res = 0, digit = 3;
struct ast_config *cfg, *ucfg;
struct ast_config *cfg;
const char *dirintro;
char *parse, *opts[OPT_ARG_ARRAY_SIZE] = { 0, };
struct ast_flags flags = { 0 };
struct ast_flags config_flags = { 0 };
enum { FIRST, LAST, BOTH } which = LAST;
char digits[9] = "digits/3";
AST_DECLARE_APP_ARGS(args,
@ -970,11 +926,6 @@ static int directory_exec(struct ast_channel *chan, const char *data)
return -1;
}
if ((ucfg = ast_config_load("users.conf", config_flags)) == CONFIG_STATUS_FILEINVALID) {
ast_log(LOG_ERROR, "Config file users.conf is in an invalid format. Aborting.\n");
ucfg = NULL;
}
dirintro = ast_variable_retrieve(cfg, args.vmcontext, "directoryintro");
if (ast_strlen_zero(dirintro))
dirintro = ast_variable_retrieve(cfg, "general", "directoryintro");
@ -1065,7 +1016,7 @@ static int directory_exec(struct ast_channel *chan, const char *data)
break;
}
res = do_directory(chan, cfg, ucfg, args.vmcontext, args.dialcontext, res, digit, &flags, opts);
res = do_directory(chan, cfg, args.vmcontext, args.dialcontext, res, digit, &flags, opts);
if (res)
break;
@ -1076,8 +1027,6 @@ static int directory_exec(struct ast_channel *chan, const char *data)
}
}
if (ucfg)
ast_config_destroy(ucfg);
ast_config_destroy(cfg);
if (ast_check_hangup(chan)) {

@ -782,7 +782,6 @@ enum vm_option_args {
enum vm_passwordlocation {
OPT_PWLOC_VOICEMAILCONF = 0,
OPT_PWLOC_SPOOLDIR = 1,
OPT_PWLOC_USERSCONF = 2,
};
AST_APP_OPTIONS(vm_app_options, {
@ -834,9 +833,9 @@ static int load_config_force(int reload, int force);
static int load_config(int reload);
#ifdef TEST_FRAMEWORK
static int load_config_from_memory(int reload, struct ast_config *cfg, struct ast_config *ucfg);
static int load_config_from_memory(int reload, struct ast_config *cfg);
#endif
static int actual_load_config(int reload, struct ast_config *cfg, struct ast_config *ucfg);
static int actual_load_config(int reload, struct ast_config *cfg);
/*! \page vmlang Voicemail Language Syntaxes Supported
@ -1086,8 +1085,6 @@ static int pwdchange = PWDCHANGE_INTERNAL;
# endif
#endif
static char userscontext[AST_MAX_EXTENSION] = "default";
static char *addesc = "Comedian Mail";
/* Leave a message */
@ -2098,7 +2095,6 @@ static inline int valid_config(const struct ast_config *cfg)
static void vm_change_password(struct ast_vm_user *vmu, const char *newpassword)
{
struct ast_config *cfg = NULL;
struct ast_variable *var = NULL;
struct ast_category *cat = NULL;
char *category = NULL;
const char *tmp = NULL;
@ -2163,48 +2159,7 @@ static void vm_change_password(struct ast_vm_user *vmu, const char *newpassword)
ast_config_destroy(cfg);
}
/* Fall-through */
case OPT_PWLOC_USERSCONF:
/* check users.conf and update the password stored for the mailbox */
/* if no vmsecret entry exists create one. */
if ((cfg = ast_config_load("users.conf", config_flags)) && valid_config(cfg)) {
ast_debug(4, "we are looking for %s\n", vmu->mailbox);
for (category = ast_category_browse(cfg, NULL); category; category = ast_category_browse(cfg, category)) {
ast_debug(4, "users.conf: %s\n", category);
if (!strcasecmp(category, vmu->mailbox)) {
char new[strlen(newpassword) + 1];
if (!ast_variable_retrieve(cfg, category, "vmsecret")) {
ast_debug(3, "looks like we need to make vmsecret!\n");
var = ast_variable_new("vmsecret", newpassword, "");
} else {
var = NULL;
}
sprintf(new, "%s", newpassword);
if (!(cat = ast_category_get(cfg, category, NULL))) {
ast_debug(4, "failed to get category!\n");
ast_free(var);
break;
}
if (!var) {
ast_variable_update(cat, "vmsecret", new, NULL, 0);
} else {
ast_variable_append(cat, var);
}
found = 1;
break;
}
}
/* save the results and clean things up */
if (found) {
ast_test_suite_event_notify("PASSWORDCHANGED", "Message: users.conf updated with new password\r\nPasswordSource: users.conf");
reset_user_pw(vmu->context, vmu->mailbox, newpassword);
ast_copy_string(vmu->password, newpassword, sizeof(vmu->password));
ast_config_text_file_save("users.conf", cfg, "app_voicemail");
}
ast_config_destroy(cfg);
}
break;
}
}
@ -14736,7 +14691,7 @@ static const char *substitute_escapes(const char *value)
static int load_config_force(int reload, int force)
{
struct ast_config *cfg, *ucfg;
struct ast_config *cfg;
struct ast_flags config_flags = { reload && !force ? CONFIG_FLAG_FILEUNCHANGED : 0 };
int res;
@ -14744,15 +14699,8 @@ static int load_config_force(int reload, int force)
ast_unload_realtime("voicemail_data");
if ((cfg = ast_config_load(VOICEMAIL_CONFIG, config_flags)) == CONFIG_STATUS_FILEUNCHANGED) {
if ((ucfg = ast_config_load("users.conf", config_flags)) == CONFIG_STATUS_FILEUNCHANGED) {
return 0;
} else if (ucfg == CONFIG_STATUS_FILEINVALID) {
ast_log(LOG_ERROR, "Config file users.conf is in an invalid format. Avoiding.\n");
ucfg = NULL;
}
ast_clear_flag(&config_flags, CONFIG_FLAG_FILEUNCHANGED);
if ((cfg = ast_config_load(VOICEMAIL_CONFIG, config_flags)) == CONFIG_STATUS_FILEINVALID) {
ast_config_destroy(ucfg);
ast_log(LOG_ERROR, "Config file " VOICEMAIL_CONFIG " is in an invalid format. Aborting.\n");
return 0;
}
@ -14761,16 +14709,11 @@ static int load_config_force(int reload, int force)
return 0;
} else {
ast_clear_flag(&config_flags, CONFIG_FLAG_FILEUNCHANGED);
if ((ucfg = ast_config_load("users.conf", config_flags)) == CONFIG_STATUS_FILEINVALID) {
ast_log(LOG_ERROR, "Config file users.conf is in an invalid format. Avoiding.\n");
ucfg = NULL;
}
}
res = actual_load_config(reload, cfg, ucfg);
res = actual_load_config(reload, cfg);
ast_config_destroy(cfg);
ast_config_destroy(ucfg);
return res;
}
@ -14781,11 +14724,11 @@ static int load_config(int reload)
}
#ifdef TEST_FRAMEWORK
static int load_config_from_memory(int reload, struct ast_config *cfg, struct ast_config *ucfg)
static int load_config_from_memory(int reload, struct ast_config *cfg)
{
ast_unload_realtime("voicemail");
ast_unload_realtime("voicemail_data");
return actual_load_config(reload, cfg, ucfg);
return actual_load_config(reload, cfg);
}
#endif
@ -14881,15 +14824,12 @@ static void load_users(struct ast_config *cfg)
}
}
static int actual_load_config(int reload, struct ast_config *cfg, struct ast_config *ucfg)
static int actual_load_config(int reload, struct ast_config *cfg)
{
struct ast_vm_user *current;
char *cat;
const char *val;
char *q, *stringp, *tmp;
int x;
unsigned int tmpadsi[4];
char secretfn[PATH_MAX] = "";
long tps_queue_low;
long tps_queue_high;
@ -14898,6 +14838,7 @@ static int actual_load_config(int reload, struct ast_config *cfg, struct ast_con
#endif
/* set audio control prompts */
strcpy(listen_control_forward_key, DEFAULT_LISTEN_CONTROL_FORWARD_KEY);
strcpy(listen_control_forward_key, DEFAULT_LISTEN_CONTROL_FORWARD_KEY);
strcpy(listen_control_reverse_key, DEFAULT_LISTEN_CONTROL_REVERSE_KEY);
strcpy(listen_control_pause_key, DEFAULT_LISTEN_CONTROL_PAUSE_KEY);
strcpy(listen_control_restart_key, DEFAULT_LISTEN_CONTROL_RESTART_KEY);
@ -14924,11 +14865,6 @@ static int actual_load_config(int reload, struct ast_config *cfg, struct ast_con
if (cfg) {
/* General settings */
if (!(val = ast_variable_retrieve(cfg, "general", "userscontext")))
val = "default";
ast_copy_string(userscontext, val, sizeof(userscontext));
aliasescontext[0] = '\0';
val = ast_variable_retrieve(cfg, "general", "aliasescontext");
ast_copy_string(aliasescontext, S_OR(val, ""), sizeof(aliasescontext));
@ -15524,31 +15460,6 @@ static int actual_load_config(int reload, struct ast_config *cfg, struct ast_con
ast_log(AST_LOG_WARNING, "Failed to set alert levels for voicemail taskprocessor.\n");
}
/* load mailboxes from users.conf */
if (ucfg) {
for (cat = ast_category_browse(ucfg, NULL); cat ; cat = ast_category_browse(ucfg, cat)) {
if (!strcasecmp(cat, "general")) {
continue;
}
if (!ast_true(ast_config_option(ucfg, cat, "hasvoicemail")))
continue;
if ((current = find_or_create(userscontext, cat))) {
populate_defaults(current);
apply_options_full(current, ast_variable_browse(ucfg, cat));
ast_copy_string(current->context, userscontext, sizeof(current->context));
if (!ast_strlen_zero(current->password) && current->passwordlocation == OPT_PWLOC_VOICEMAILCONF) {
current->passwordlocation = OPT_PWLOC_USERSCONF;
}
switch (current->passwordlocation) {
case OPT_PWLOC_SPOOLDIR:
snprintf(secretfn, sizeof(secretfn), "%s%s/%s/secret.conf", VM_SPOOL_DIR, current->context, current->mailbox);
read_password_from_file(secretfn, current->password, sizeof(current->password));
}
}
}
}
/* load mailboxes from voicemail.conf */
/*
@ -16119,7 +16030,7 @@ AST_TEST_DEFINE(test_voicemail_load_config)
goto cleanup;
}
load_config_from_memory(1, cfg, NULL);
load_config_from_memory(1, cfg);
ast_config_destroy(cfg);
#define CHECK(u, attr, value) else if (strcmp(u->attr, value)) { \

@ -18676,19 +18676,6 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct
ast_copy_string(confp->chan.mailbox, v->value, sizeof(confp->chan.mailbox));
} else if (!strcasecmp(v->name, "description")) {
ast_copy_string(confp->chan.description, v->value, sizeof(confp->chan.description));
} else if (!strcasecmp(v->name, "hasvoicemail")) {
if (ast_true(v->value) && ast_strlen_zero(confp->chan.mailbox)) {
/*
* hasvoicemail is a users.conf legacy voicemail enable method.
* hasvoicemail is only going to work for app_voicemail mailboxes.
*/
if (strchr(cat, '@')) {
ast_copy_string(confp->chan.mailbox, cat, sizeof(confp->chan.mailbox));
} else {
snprintf(confp->chan.mailbox, sizeof(confp->chan.mailbox),
"%s@default", cat);
}
}
} else if (!strcasecmp(v->name, "adsi")) {
confp->chan.adsi = ast_true(v->value);
} else if (!strcasecmp(v->name, "usesmdi")) {
@ -20062,7 +20049,7 @@ static void deep_copy_dahdi_chan_conf(struct dahdi_chan_conf *dest, const struct
static int setup_dahdi_int(int reload, struct dahdi_chan_conf *default_conf, struct dahdi_chan_conf *base_conf, struct dahdi_chan_conf *conf)
{
struct ast_config *cfg;
struct ast_config *ucfg;
struct ast_config;
struct ast_variable *v;
struct ast_flags config_flags = { reload == 1 ? CONFIG_FLAG_FILEUNCHANGED : 0 };
const char *chans;
@ -20092,25 +20079,7 @@ static int setup_dahdi_int(int reload, struct dahdi_chan_conf *default_conf, str
if (!cfg) {
return 0;
}
ucfg = ast_config_load("users.conf", config_flags);
if (ucfg == CONFIG_STATUS_FILEUNCHANGED) {
ast_config_destroy(cfg);
return 0;
}
if (ucfg == CONFIG_STATUS_FILEINVALID) {
ast_log(LOG_ERROR, "File users.conf cannot be parsed. Aborting.\n");
ast_config_destroy(cfg);
return 0;
}
} else if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
ucfg = ast_config_load("users.conf", config_flags);
if (ucfg == CONFIG_STATUS_FILEUNCHANGED) {
return 0;
}
if (ucfg == CONFIG_STATUS_FILEINVALID) {
ast_log(LOG_ERROR, "File users.conf cannot be parsed. Aborting.\n");
return 0;
}
ast_clear_flag(&config_flags, CONFIG_FLAG_FILEUNCHANGED);
cfg = ast_config_load(config, config_flags);
have_cfg_now = !!cfg;
@ -20118,17 +20087,14 @@ static int setup_dahdi_int(int reload, struct dahdi_chan_conf *default_conf, str
if (had_cfg_before) {
/* We should have been able to load the config. */
ast_log(LOG_ERROR, "Bad. Unable to load config %s\n", config);
ast_config_destroy(ucfg);
return 0;
}
cfg = ast_config_new();/* Dummy config */
if (!cfg) {
ast_config_destroy(ucfg);
return 0;
}
} else if (cfg == CONFIG_STATUS_FILEINVALID) {
ast_log(LOG_ERROR, "File %s cannot be parsed. Aborting.\n", config);
ast_config_destroy(ucfg);
return 0;
}
} else if (cfg == CONFIG_STATUS_FILEINVALID) {
@ -20136,12 +20102,6 @@ static int setup_dahdi_int(int reload, struct dahdi_chan_conf *default_conf, str
return 0;
} else {
ast_clear_flag(&config_flags, CONFIG_FLAG_FILEUNCHANGED);
ucfg = ast_config_load("users.conf", config_flags);
if (ucfg == CONFIG_STATUS_FILEINVALID) {
ast_log(LOG_ERROR, "File users.conf cannot be parsed. Aborting.\n");
ast_config_destroy(cfg);
return 0;
}
}
had_cfg_before = have_cfg_now;
@ -20219,9 +20179,6 @@ static int setup_dahdi_int(int reload, struct dahdi_chan_conf *default_conf, str
v, reload, 0))) {
ast_mutex_unlock(&iflock);
ast_config_destroy(cfg);
if (ucfg) {
ast_config_destroy(ucfg);
}
return res;
}
@ -20249,44 +20206,11 @@ static int setup_dahdi_int(int reload, struct dahdi_chan_conf *default_conf, str
if ((res = process_dahdi(conf, cat, ast_variable_browse(cfg, cat), reload, PROC_DAHDI_OPT_NOCHAN))) {
ast_mutex_unlock(&iflock);
ast_config_destroy(cfg);
if (ucfg) {
ast_config_destroy(ucfg);
}
return res;
}
}
ast_config_destroy(cfg);
if (ucfg) {
/* Reset base_conf, so things don't leak from chan_dahdi.conf */
deep_copy_dahdi_chan_conf(base_conf, default_conf);
process_dahdi(base_conf,
"" /* Must be empty for the general category. Silly voicemail mailbox. */,
ast_variable_browse(ucfg, "general"), 1, 0);
for (cat = ast_category_browse(ucfg, NULL); cat ; cat = ast_category_browse(ucfg, cat)) {
if (!strcasecmp(cat, "general")) {
continue;
}
chans = ast_variable_retrieve(ucfg, cat, "dahdichan");
if (ast_strlen_zero(chans)) {
/* Section is useless without a dahdichan value present. */
continue;
}
/* Copy base_conf to conf. */
deep_copy_dahdi_chan_conf(conf, base_conf);
if ((res = process_dahdi(conf, cat, ast_variable_browse(ucfg, cat), reload, PROC_DAHDI_OPT_NOCHAN | PROC_DAHDI_OPT_NOWARN))) {
ast_config_destroy(ucfg);
ast_mutex_unlock(&iflock);
return res;
}
}
ast_config_destroy(ucfg);
}
ast_mutex_unlock(&iflock);
#ifdef HAVE_PRI

@ -13083,18 +13083,6 @@ static struct iax2_peer *build_peer(const char *name, struct ast_variable *v, st
ast_string_field_set(peer, secret, v->value);
} else if (!strcasecmp(v->name, "mailbox")) {
ast_string_field_set(peer, mailbox, v->value);
} else if (!strcasecmp(v->name, "hasvoicemail")) {
if (ast_true(v->value) && ast_strlen_zero(peer->mailbox)) {
/*
* hasvoicemail is a users.conf legacy voicemail enable method.
* hasvoicemail is only going to work for app_voicemail mailboxes.
*/
if (strchr(name, '@')) {
ast_string_field_set(peer, mailbox, name);
} else {
ast_string_field_build(peer, mailbox, "%s@default", name);
}
}
} else if (!strcasecmp(v->name, "mohinterpret")) {
ast_string_field_set(peer, mohinterpret, v->value);
} else if (!strcasecmp(v->name, "mohsuggest")) {
@ -13695,7 +13683,7 @@ static void set_config_destroy(void)
/*! \brief Load configuration */
static int set_config(const char *config_file, int reload, int forced)
{
struct ast_config *cfg, *ucfg;
struct ast_config *cfg;
iax2_format capability;
struct ast_variable *v;
char *cat;
@ -13719,14 +13707,9 @@ static int set_config(const char *config_file, int reload, int forced)
ast_log(LOG_ERROR, "Unable to load config %s\n", config_file);
return -1;
} else if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
ucfg = ast_config_load("users.conf", config_flags);
if (ucfg == CONFIG_STATUS_FILEUNCHANGED)
return 0;
/* Otherwise we need to reread both files */
ast_clear_flag(&config_flags, CONFIG_FLAG_FILEUNCHANGED);
if ((cfg = ast_config_load(config_file, config_flags)) == CONFIG_STATUS_FILEINVALID) {
ast_log(LOG_ERROR, "Config file %s is in an invalid format. Aborting.\n", config_file);
ast_config_destroy(ucfg);
return 0;
}
if (!cfg) {
@ -13737,13 +13720,8 @@ static int set_config(const char *config_file, int reload, int forced)
} else if (cfg == CONFIG_STATUS_FILEINVALID) {
ast_log(LOG_ERROR, "Config file %s is in an invalid format. Aborting.\n", config_file);
return 0;
} else { /* iax.conf changed, gotta reread users.conf, too */
} else { /* iax.conf changed */
ast_clear_flag(&config_flags, CONFIG_FLAG_FILEUNCHANGED);
if ((ucfg = ast_config_load("users.conf", config_flags)) == CONFIG_STATUS_FILEINVALID) {
ast_log(LOG_ERROR, "Config file users.conf is in an invalid format. Aborting.\n");
ast_config_destroy(cfg);
return 0;
}
}
if (reload) {
@ -14126,61 +14104,6 @@ static int set_config(const char *config_file, int reload, int forced)
prefs_global = prefs_new;
iax2_capability = capability;
if (ucfg) {
struct ast_variable *gen;
int genhasiax;
int genregisteriax;
const char *hasiax, *registeriax;
genhasiax = ast_true(ast_variable_retrieve(ucfg, "general", "hasiax"));
genregisteriax = ast_true(ast_variable_retrieve(ucfg, "general", "registeriax"));
gen = ast_variable_browse(ucfg, "general");
cat = ast_category_browse(ucfg, NULL);
while (cat) {
if (strcasecmp(cat, "general")) {
hasiax = ast_variable_retrieve(ucfg, cat, "hasiax");
registeriax = ast_variable_retrieve(ucfg, cat, "registeriax");
if (ast_true(hasiax) || (!hasiax && genhasiax)) {
/* Start with general parameters, then specific parameters, user and peer */
user = build_user(cat, gen, ast_variable_browse(ucfg, cat), 0);
if (user) {
ao2_link(users, user);
user = user_unref(user);
}
peer = build_peer(cat, gen, ast_variable_browse(ucfg, cat), 0);
if (peer) {
if (ast_test_flag64(peer, IAX_DYNAMIC)) {
reg_source_db(peer);
}
ao2_link(peers, peer);
peer = peer_unref(peer);
}
}
if (ast_true(registeriax) || (!registeriax && genregisteriax)) {
char tmp[256];
const char *host = ast_variable_retrieve(ucfg, cat, "host");
const char *username = ast_variable_retrieve(ucfg, cat, "username");
const char *secret = ast_variable_retrieve(ucfg, cat, "secret");
if (!host)
host = ast_variable_retrieve(ucfg, "general", "host");
if (!username)
username = ast_variable_retrieve(ucfg, "general", "username");
if (!secret)
secret = ast_variable_retrieve(ucfg, "general", "secret");
if (!ast_strlen_zero(username) && !ast_strlen_zero(host)) {
if (!ast_strlen_zero(secret))
snprintf(tmp, sizeof(tmp), "%s:%s@%s", username, secret, host);
else
snprintf(tmp, sizeof(tmp), "%s@%s", username, host);
iax2_register(tmp, 0);
}
}
}
cat = ast_category_browse(ucfg, cat);
}
ast_config_destroy(ucfg);
}
cat = ast_category_browse(cfg, NULL);
while(cat) {
if (strcasecmp(cat, "general")) {

@ -1777,7 +1777,7 @@ pickupgroup=1
; ~~~~~~~~~~~~~~~~~~~~~~
; You can also configure channels in a separate chan_dahdi.conf section. In
; this case the keyword 'channel' is not used. Instead the keyword
; 'dahdichan' is used (as in users.conf) - configuration is only processed
; 'dahdichan' is used - configuration is only processed
; in a section where the keyword dahdichan is used. It will only be
; processed in the end of the section. Thus the following section:
;
@ -1795,8 +1795,7 @@ pickupgroup=1
;
; When starting a new section almost all of the configuration values are
; copied from their values at the end of the section [channels] in
; chan_dahdi.conf and [general] in users.conf - one section's configuration
; does not affect another one's.
; chan_dahdi.conf - one section's configuration does not affect another one's.
;
; Instead of letting common configuration values "slide through" you can
; use configuration templates to easily keep the common part in one

@ -1,5 +1,5 @@
[general]
; This section applies only to the default users.conf config provider
; This section applies only to the default phoneprov_users.conf config provider
; embedded in res_phoneprov. Other providers may provide their own default settings.
; The default behavior of res_phoneprov will be to set the SERVER template variable to
@ -11,7 +11,7 @@
; Useful for when the interface uses DHCP and the asterisk http
; server listens on a different IP than sip.
;serverport=5060 ; Override port to send to the phone to use as server port.
default_profile=polycom ; The default profile to use if none specified in users.conf
default_profile=polycom ; The default profile to use if none specified in phoneprov_users.conf
; You can define profiles for different phones specifying what files to register
; with the provisioning server. You can define either static files, or dynamically
@ -29,10 +29,10 @@ default_profile=polycom ; The default profile to use if none specified in users.
; Dynamically generated files have a filename registered with variable substitution
; with variables obtained from various config providers. The default provider
; embedded in res_phoneprov reads users.conf. Other providers will have their own
; embedded in res_phoneprov reads phoneprov_users.conf. Other providers will have their own
; sources for the variables and may provide additional variables not listed here.
; Built in variables and the options in users.conf that they come from
; Built in variables and the options in phoneprov_users.conf that they come from
; MAC (macaddress)
; USERNAME (username)
; DISPLAY_NAME (fullname)

@ -0,0 +1,40 @@
;
; Device provisioning configuration
;
; This file is used by res_phoneprov to define provisioning entries.
;
[general]
;
; Full name of a user
;
fullname = New User
;
; MAC Address for res_phoneprov
;
;macaddress = 112233445566
;
; Auto provision the phone with res_phoneprov
;
;autoprov = yes
;
; Line Keys for hardphone
;
;LINEKEYS = 1
;
; Line number for hardphone
;
;linenumber = 1
;
; Local Caller ID number used with res_phoneprov and Asterisk GUI
;
;cid_number = 6000
;[6000]
;fullname = Joe User
;secret = 1234
;macaddress = 112233445566
;autoprov = yes
;LINEKEYS = 1
;linenumber = 1
;cid_number = 6000

@ -1,113 +0,0 @@
;
; User configuration
;
; WARNING: This configuration file is deprecated and will be removed in
; a future version of Asterisk. It is recommended that you make configurations
; in the appropriate module-specific configuration file for more flexibility.
; Many Asterisk modules already no longer support users.conf.
;
; Creating entries in users.conf is a "shorthand" for creating individual
; entries in each configuration file. Using users.conf is not intended to
; provide you with as much flexibility as using the separate configuration
; files (e.g. iax.conf, etc) but is intended to accelerate the
; simple task of adding users. Note that creating individual items (e.g.
; IAX friends, etc.) will allow you to override specific parameters within
; this file. Parameter names here are the same as they appear in the
; other configuration files. There is no way to change the value of a
; parameter here for just one subsystem.
;
[general]
;
; Full name of a user
;
fullname = New User
;
; Starting point of allocation of extensions
;
userbase = 6000
;
; Create voicemail mailbox
;
hasvoicemail = yes
;
; Set voicemail mailbox 6000 password to 1234
;
vmsecret = 1234
;
; Create IAX friend
;
hasiax = yes
;
; Create H.323 friend
;
;hash323 = yes
;
; Create manager entry
;
hasmanager = no
;
; Set permissions for manager entry (see manager.conf.sample for documentation)
; (defaults to *all* permissions)
;managerread = system,call,log,verbose,command,agent,user,config
;managerwrite = system,call,log,verbose,command,agent,user,config
;
;
; MAC Address for res_phoneprov
;
;macaddress = 112233445566
;
; Auto provision the phone with res_phoneprov
;
;autoprov = yes
;
; Line Keys for hardphone
;
;LINEKEYS = 1
;
; Line number for hardphone
;
;linenumber = 1
;
; Local Caller ID number used with res_phoneprov and Asterisk GUI
;
;cid_number = 6000
;
; Remaining options are not specific to users.conf entries but are general.
;
callwaiting = yes
threewaycalling = yes
callwaitingcallerid = yes
transfer = yes
canpark = yes
cancallforward = yes
callreturn = yes
callgroup = 1
pickupgroup = 1
;nat = no
;[6000]
;fullname = Joe User
;description = Courtesy Phone In Lobby ; Used to provide a description of the
; peer in console output
;email = joe@foo.bar
;secret = 1234
;dahdichan = 1
;hasvoicemail = yes
;vmsecret = 1234
;hasiax = no
;hash323 = no
;hasmanager = no
;callwaiting = no
;context = international
;
; Some administrators choose alphanumeric extensions, but still want their
; users to be reachable by traditional numeric extensions, specified by the
; alternateexts entry.
;
;alternateexts = 7057,3249
;macaddress = 112233445566
;autoprov = yes
;LINEKEYS = 1
;linenumber = 1
;cid_number = 6000

@ -72,11 +72,6 @@ maxlogins=3
; sender can set the urgency on the envelope of the forwarded message.
;forward_urgent_auto=no
;
; User context is where entries from users.conf are registered. The
; default value is 'default'
;
;userscontext=default
;
; Aliases allow a mailbox to be referenced by an alias. The aliases are
; specified in the special context named here. There is no default.
;aliasescontext=myaliases
@ -411,7 +406,7 @@ sendvoicemail=yes ; Allow the user to compose and send a voicemail while inside
; Supported options:
; voicemail.conf:
; This is the default option. The secret is read from
; and written to voicemail.conf (or users.conf).
; and written to voicemail.conf.
; spooldir:
; The secret is stored in a separate file in the user's
; voicemail spool directory in a file named secret.conf.
@ -419,7 +414,7 @@ sendvoicemail=yes ; Allow the user to compose and send a voicemail while inside
; permitted to access Asterisk's spool directory as the
; secret is stored in plain text. If a secret is not
; found in this directory, the password in
; voicemail.conf (or users.conf) will be used.
; voicemail.conf will be used.
; Note that this option does not affect password storage for
; realtime users, which are still stored in the realtime
; backend.

@ -193,39 +193,6 @@ sub check_login($$)
}
}
close(VMAIL);
return check_login_users();
}
sub check_login_users {
my ($mbox, $context) = split(/\@/, param('mailbox'));
my $pass = param('password');
my ($found, $fullname) = (0, "");
open VMAIL, "</etc/asterisk/users.conf";
while (<VMAIL>) {
chomp;
if (m/\[(.*)\]/) {
if ($1 eq $mbox) {
$found = 1;
} elsif ($found == 2) {
close VMAIL;
return (($fullname ? $fullname : "Extension $mbox in $context"), $context);
} else {
$found = 0;
}
} elsif ($found) {
my ($var, $value) = split /\s*=\s*/, $_, 2;
if ($var eq 'vmsecret' and $value eq $pass) {
$found = 2;
} elsif ($var eq 'fullname') {
$fullname = $value;
if ($found == 2) {
close VMAIL;
return ($fullname, $context);
}
}
}
}
close VMAIL;
return ("", "");
}

@ -36,7 +36,7 @@
* \ref amiconf
*/
/*! \li \ref manager.c uses the configuration file \ref manager.conf and \ref users.conf
/*! \li \ref manager.c uses the configuration file \ref manager.conf
* \addtogroup configuration_file
*/
@ -44,10 +44,6 @@
* \verbinclude manager.conf.sample
*/
/*! \page users.conf users.conf
* \verbinclude users.conf.sample
*/
/*** MODULEINFO
<support_level>core</support_level>
***/
@ -9645,7 +9641,7 @@ static void manager_set_defaults(void)
static int __init_manager(int reload, int by_external_config)
{
struct ast_config *ucfg = NULL, *cfg = NULL;
struct ast_config *cfg = NULL;
const char *val;
char *cat = NULL;
int newhttptimeout = 60;
@ -9880,100 +9876,6 @@ static int __init_manager(int reload, int by_external_config)
AST_RWLIST_WRLOCK(&users);
/* First, get users from users.conf */
ucfg = ast_config_load2("users.conf", "manager", config_flags);
if (ucfg && (ucfg != CONFIG_STATUS_FILEUNCHANGED) && ucfg != CONFIG_STATUS_FILEINVALID) {
const char *hasmanager;
int genhasmanager = ast_true(ast_variable_retrieve(ucfg, "general", "hasmanager"));
while ((cat = ast_category_browse(ucfg, cat))) {
if (!strcasecmp(cat, "general")) {
continue;
}
hasmanager = ast_variable_retrieve(ucfg, cat, "hasmanager");
if ((!hasmanager && genhasmanager) || ast_true(hasmanager)) {
const char *user_secret = ast_variable_retrieve(ucfg, cat, "secret");
const char *user_read = ast_variable_retrieve(ucfg, cat, "read");
const char *user_write = ast_variable_retrieve(ucfg, cat, "write");
const char *user_displayconnects = ast_variable_retrieve(ucfg, cat, "displayconnects");
const char *user_allowmultiplelogin = ast_variable_retrieve(ucfg, cat, "allowmultiplelogin");
const char *user_writetimeout = ast_variable_retrieve(ucfg, cat, "writetimeout");
/* Look for an existing entry,
* if none found - create one and add it to the list
*/
if (!(user = get_manager_by_name_locked(cat))) {
if (!(user = ast_calloc(1, sizeof(*user)))) {
break;
}
/* Copy name over */
ast_copy_string(user->username, cat, sizeof(user->username));
/* Insert into list */
AST_LIST_INSERT_TAIL(&users, user, list);
user->acl = NULL;
user->keep = 1;
user->readperm = -1;
user->writeperm = -1;
/* Default displayconnect from [general] */
user->displayconnects = displayconnects;
/* Default allowmultiplelogin from [general] */
user->allowmultiplelogin = allowmultiplelogin;
user->writetimeout = 100;
}
if (!user_secret) {
user_secret = ast_variable_retrieve(ucfg, "general", "secret");
}
if (!user_read) {
user_read = ast_variable_retrieve(ucfg, "general", "read");
}
if (!user_write) {
user_write = ast_variable_retrieve(ucfg, "general", "write");
}
if (!user_displayconnects) {
user_displayconnects = ast_variable_retrieve(ucfg, "general", "displayconnects");
}
if (!user_allowmultiplelogin) {
user_allowmultiplelogin = ast_variable_retrieve(ucfg, "general", "allowmultiplelogin");
}
if (!user_writetimeout) {
user_writetimeout = ast_variable_retrieve(ucfg, "general", "writetimeout");
}
if (!ast_strlen_zero(user_secret)) {
ast_free(user->secret);
user->secret = ast_strdup(user_secret);
}
if (user_read) {
user->readperm = get_perm(user_read);
}
if (user_write) {
user->writeperm = get_perm(user_write);
}
if (user_displayconnects) {
user->displayconnects = ast_true(user_displayconnects);
}
if (user_allowmultiplelogin) {
user->allowmultiplelogin = ast_true(user_allowmultiplelogin);
}
if (user_writetimeout) {
int value = atoi(user_writetimeout);
if (value < 100) {
ast_log(LOG_WARNING, "Invalid writetimeout value '%d' in users.conf\n", value);
} else {
user->writetimeout = value;
}
}
}
}
ast_config_destroy(ucfg);
}
/* cat is NULL here in any case */
while ((cat = ast_category_browse(cfg, cat))) {
struct ast_acl_list *oldacl;

@ -110,8 +110,6 @@ static int clearglobalvars_config = 0;
static int extenpatternmatchnew_config = 0;
static char *overrideswitch_config = NULL;
static struct stasis_subscription *fully_booted_subscription;
AST_MUTEX_DEFINE_STATIC(save_dialplan_lock);
AST_MUTEX_DEFINE_STATIC(reload_lock);
@ -1641,8 +1639,6 @@ static int unload_module(void)
ast_manager_unregister(AMI_EXTENSION_REMOVE);
ast_context_destroy(NULL, registrar);
stasis_unsubscribe_and_join(fully_booted_subscription);
return 0;
}
@ -1972,143 +1968,6 @@ process_extension:
return 1;
}
static void append_interface(char *iface, int maxlen, char *add)
{
int len = strlen(iface);
if (strlen(add) + len < maxlen - 2) {
if (strlen(iface)) {
iface[len] = '&';
strcpy(iface + len + 1, add);
} else
strcpy(iface, add);
}
}
static void startup_event_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message)
{
struct ast_json_payload *payload;
const char *type;
if (stasis_message_type(message) != ast_manager_get_generic_type()) {
return;
}
payload = stasis_message_data(message);
type = ast_json_string_get(ast_json_object_get(payload->json, "type"));
if (strcmp(type, "FullyBooted")) {
return;
}
ast_log(LOG_WARNING, "users.conf is deprecated and will be removed in a future version of Asterisk\n");
fully_booted_subscription = stasis_unsubscribe(fully_booted_subscription);
}
static void pbx_load_users(void)
{
struct ast_config *cfg;
char *cat, *chan;
const char *dahdichan;
const char *hasexten, *altexts;
char tmp[256];
char iface[256];
char dahdicopy[256];
char *ext, altcopy[256];
char *c;
int hasvoicemail;
int start, finish, x;
struct ast_context *con = NULL;
struct ast_flags config_flags = { 0 };
cfg = ast_config_load("users.conf", config_flags);
if (!cfg)
return;
/*! \todo Remove users.conf support in Asterisk 23 */
fully_booted_subscription =
stasis_subscribe_pool(ast_manager_get_topic(), startup_event_cb, NULL);
for (cat = ast_category_browse(cfg, NULL); cat ; cat = ast_category_browse(cfg, cat)) {
if (!strcasecmp(cat, "general"))
continue;
iface[0] = '\0';
if (ast_true(ast_config_option(cfg, cat, "hasiax"))) {
snprintf(tmp, sizeof(tmp), "IAX2/%s", cat);
append_interface(iface, sizeof(iface), tmp);
}
if (ast_true(ast_config_option(cfg, cat, "hash323"))) {
snprintf(tmp, sizeof(tmp), "H323/%s", cat);
append_interface(iface, sizeof(iface), tmp);
}
hasexten = ast_config_option(cfg, cat, "hasexten");
if (hasexten && !ast_true(hasexten))
continue;
hasvoicemail = ast_true(ast_config_option(cfg, cat, "hasvoicemail"));
dahdichan = ast_variable_retrieve(cfg, cat, "dahdichan");
if (!dahdichan)
dahdichan = ast_variable_retrieve(cfg, "general", "dahdichan");
if (!ast_strlen_zero(dahdichan)) {
ast_copy_string(dahdicopy, dahdichan, sizeof(dahdicopy));
c = dahdicopy;
chan = strsep(&c, ",");
while (chan) {
if (sscanf(chan, "%30d-%30d", &start, &finish) == 2) {
/* Range */
} else if (sscanf(chan, "%30d", &start)) {
/* Just one */
finish = start;
} else {
start = 0; finish = 0;
}
if (finish < start) {
x = finish;
finish = start;
start = x;
}
for (x = start; x <= finish; x++) {
snprintf(tmp, sizeof(tmp), "DAHDI/%d", x);
append_interface(iface, sizeof(iface), tmp);
}
chan = strsep(&c, ",");
}
}
if (!ast_strlen_zero(iface)) {
/* Only create a context here when it is really needed. Otherwise default empty context
created by pbx_config may conflict with the one explicitly created by pbx_ael */
if (!con)
con = ast_context_find_or_create(&local_contexts, local_table, userscontext, registrar);
if (!con) {
ast_log(LOG_ERROR, "Can't find/create user context '%s'\n", userscontext);
return;
}
/* Add hint */
ast_add_extension2(con, 0, cat, -1, NULL, NULL, iface, NULL, NULL, registrar, NULL, 0);
/* If voicemail, use "stdexten" else use plain old dial */
if (hasvoicemail) {
snprintf(tmp, sizeof(tmp), "%s,stdexten(${HINT})", cat);
ast_add_extension2(con, 0, cat, 1, NULL, NULL, "Gosub", ast_strdup(tmp), ast_free_ptr, registrar, NULL, 0);
} else {
ast_add_extension2(con, 0, cat, 1, NULL, NULL, "Dial", ast_strdup("${HINT}"), ast_free_ptr, registrar, NULL, 0);
}
altexts = ast_variable_retrieve(cfg, cat, "alternateexts");
if (!ast_strlen_zero(altexts)) {
snprintf(tmp, sizeof(tmp), "%s,1", cat);
ast_copy_string(altcopy, altexts, sizeof(altcopy));
c = altcopy;
ext = strsep(&c, ",");
while (ext) {
ast_add_extension2(con, 0, ext, 1, NULL, NULL, "Goto", ast_strdup(tmp), ast_free_ptr, registrar, NULL, 0);
ext = strsep(&c, ",");
}
}
}
}
ast_config_destroy(cfg);
}
static int pbx_load_module(void)
{
struct ast_context *con;
@ -2130,8 +1989,6 @@ static int pbx_load_module(void)
return AST_MODULE_LOAD_DECLINE;
}
pbx_load_users();
ast_merge_contexts_and_delete(&local_contexts, local_table, registrar);
local_table = NULL; /* the local table has been moved into the global one. */
local_contexts = NULL;

@ -29,7 +29,7 @@
* \author George Joseph <george.joseph@fairview5.com>
*/
/*! \li \ref res_phoneprov.c uses the configuration file \ref phoneprov.conf and \ref users.conf
/*! \li \ref res_phoneprov.c uses the configuration file \ref phoneprov.conf and \ref phoneprov_users.conf
* \addtogroup configuration_file Configuration Files
*/
@ -211,7 +211,7 @@ static const char *variable_lookup[] = {
[AST_PHONEPROV_STD_DST_END_HOUR] = "DST_END_HOUR",
};
/* Translate the standard variables to their users.conf equivalents. */
/* Translate the standard variables to their phoneprov_users.conf equivalents. */
static const char *pp_user_lookup[] = {
[AST_PHONEPROV_STD_MAC] = "macaddress",
[AST_PHONEPROV_STD_PROFILE] = "profile",
@ -314,7 +314,7 @@ struct ao2_container *profiles;
SIMPLE_HASH_FN(phone_profile_hash_fn, phone_profile, name)
SIMPLE_CMP_FN(phone_profile_cmp_fn, phone_profile, name)
/*! \brief structure to hold users read from users.conf */
/*! \brief structure to hold users read from phoneprov_users.conf */
struct user {
AST_DECLARE_STRING_FIELDS(
AST_STRING_FIELD(macaddress); /*!< Mac address of user's phone */
@ -1273,13 +1273,13 @@ static struct varshead *get_defaults(void)
AST_VAR_LIST_INSERT_TAIL(defaults, var);
ast_config_destroy(phoneprov_cfg);
if (!(cfg = ast_config_load("users.conf", config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) {
ast_log(LOG_ERROR, "Unable to load users.conf\n");
if (!(cfg = ast_config_load("phoneprov_users.conf", config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) {
ast_log(LOG_ERROR, "Unable to load phoneprov_users.conf\n");
ast_var_list_destroy(defaults);
return NULL;
}
/* Go ahead and load global variables from users.conf so we can append to profiles */
/* Go ahead and load global variables from phoneprov_users.conf so we can append to profiles */
for (v = ast_variable_browse(cfg, "general"); v; v = v->next) {
if (!strcasecmp(v->name, pp_user_lookup[AST_PHONEPROV_STD_VOICEMAIL_EXTEN])) {
var = ast_var_assign(variable_lookup[AST_PHONEPROV_STD_VOICEMAIL_EXTEN], v->value);
@ -1308,9 +1308,9 @@ static int load_users(void)
return -1;
}
if (!(cfg = ast_config_load("users.conf", config_flags))
if (!(cfg = ast_config_load("phoneprov_users.conf", config_flags))
|| cfg == CONFIG_STATUS_FILEINVALID) {
ast_log(LOG_WARNING, "Unable to load users.conf\n");
ast_log(LOG_WARNING, "Unable to load phoneprov_users.conf\n");
ast_var_list_destroy(defaults);
return -1;
}
@ -1401,7 +1401,7 @@ static int unload_module(void)
ast_custom_function_unregister(&pp_each_extension_function);
ast_cli_unregister_multiple(pp_cli, ARRAY_LEN(pp_cli));
/* This cleans up the users.conf provider (called specifically for clarity) */
/* This cleans up the phoneprov_users.conf provider (called specifically for clarity) */
ast_phoneprov_provider_unregister(SIPUSERS_PROVIDER_NAME);
/* This cleans up the framework which also cleans up the providers. */
@ -1466,7 +1466,7 @@ static int load_module(void)
goto error;
}
/* Register ourselves as the provider for users.conf */
/* Register ourselves as the provider for phoneprov_users.conf */
if (ast_phoneprov_provider_register(SIPUSERS_PROVIDER_NAME, load_users)) {
ast_log(LOG_WARNING, "Unable register users config provider. Others may succeed.\n");
}

Loading…
Cancel
Save