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;
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)) {
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);
}
}
} 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;
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;
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,
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");
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;
}
}
- if (ucfg)
- ast_config_destroy(ucfg);
ast_config_destroy(cfg);
if (ast_check_hangup(chan)) {
enum vm_passwordlocation {
OPT_PWLOC_VOICEMAILCONF = 0,
OPT_PWLOC_SPOOLDIR = 1,
- OPT_PWLOC_USERSCONF = 2,
};
AST_APP_OPTIONS(vm_app_options, {
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
# endif
#endif
-static char userscontext[AST_MAX_EXTENSION] = "default";
-
static char *addesc = "Comedian Mail";
/* Leave a message */
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;
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;
}
}
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;
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;
}
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;
}
}
#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
}
}
-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;
#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);
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));
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 */
/*
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)) { \
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")) {
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;
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;
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) {
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;
v, reload, 0))) {
ast_mutex_unlock(&iflock);
ast_config_destroy(cfg);
- if (ucfg) {
- ast_config_destroy(ucfg);
- }
return res;
}
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
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")) {
/*! \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;
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) {
} 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) {
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")) {
; ~~~~~~~~~~~~~~~~~~~~~~
; 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:
;
;
; 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
[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
; 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
; 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)
--- /dev/null
+;
+; 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
+++ /dev/null
-;
-; 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
; 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
; 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.
; 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.
}
}
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 ("", "");
}
* \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
*/
* \verbinclude manager.conf.sample
*/
-/*! \page users.conf users.conf
- * \verbinclude users.conf.sample
- */
-
/*** MODULEINFO
<support_level>core</support_level>
***/
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;
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;
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);
ast_manager_unregister(AMI_EXTENSION_REMOVE);
ast_context_destroy(NULL, registrar);
- stasis_unsubscribe_and_join(fully_booted_subscription);
-
return 0;
}
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;
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;
* \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
*/
[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",
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 */
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);
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;
}
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. */
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");
}