aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_voicemail.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/app_voicemail.c')
-rw-r--r--apps/app_voicemail.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 971e1879d..764a44520 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -40,6 +40,7 @@
/*** MODULEINFO
<use type="module">res_adsi</use>
<use type="module">res_smdi</use>
+ <support_level>core</support_level>
***/
/*** MAKEOPTS
@@ -1215,6 +1216,9 @@ static int check_password(struct ast_vm_user *vmu, char *password)
/* check minimum length */
if (strlen(password) < minpassword)
return 1;
+ /* check that password does not contain '*' character */
+ if (!ast_strlen_zero(password) && password[0] == '*')
+ return 1;
if (!ast_strlen_zero(ext_pass_check_cmd)) {
char cmd[255], buf[255];
@@ -1294,8 +1298,14 @@ static void apply_options_full(struct ast_vm_user *retval, struct ast_variable *
if (!strcasecmp(var->name, "vmsecret")) {
ast_copy_string(retval->password, var->value, sizeof(retval->password));
} else if (!strcasecmp(var->name, "secret") || !strcasecmp(var->name, "password")) { /* don't overwrite vmsecret if it exists */
- if (ast_strlen_zero(retval->password))
- ast_copy_string(retval->password, var->value, sizeof(retval->password));
+ if (ast_strlen_zero(retval->password)) {
+ if (!ast_strlen_zero(var->value) && var->value[0] == '*') {
+ ast_log(LOG_WARNING, "Invalid password detected for mailbox %s. The password"
+ "\n\tmust be reset in voicemail.conf.\n", retval->mailbox);
+ } else {
+ ast_copy_string(retval->password, var->value, sizeof(retval->password));
+ }
+ }
} else if (!strcasecmp(var->name, "uniqueid")) {
ast_copy_string(retval->uniqueid, var->value, sizeof(retval->uniqueid));
} else if (!strcasecmp(var->name, "pager")) {
@@ -9662,10 +9672,12 @@ static int vm_authenticate(struct ast_channel *chan, char *mailbox, int mailbox_
}
} else if (mailbox[0] == '*') {
/* user entered '*' */
+ ast_verb(4, "Mailbox begins with '*', attempting jump to extension 'a'\n");
if (ast_exists_extension(chan, chan->context, "a", 1,
S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL))) {
return -1;
}
+ ast_verb(4, "Jump to extension 'a' failed; setting mailbox to NULL\n");
mailbox[0] = '\0';
}
@@ -9694,12 +9706,16 @@ static int vm_authenticate(struct ast_channel *chan, char *mailbox, int mailbox_
return -1;
} else if (password[0] == '*') {
/* user entered '*' */
+ ast_verb(4, "Password begins with '*', attempting jump to extension 'a'\n");
if (ast_exists_extension(chan, chan->context, "a", 1,
S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL))) {
mailbox[0] = '*';
return -1;
}
+ ast_verb(4, "Jump to extension 'a' failed; setting mailbox and user to NULL\n");
mailbox[0] = '\0';
+ /* if the password entered was '*', do not let a user mailbox be created if the extension 'a' is not defined */
+ vmu = NULL;
}
}
@@ -10546,6 +10562,14 @@ static struct ast_vm_user *find_or_create(const char *context, const char *box)
{
struct ast_vm_user *vmu;
+ if (!ast_strlen_zero(box) && box[0] == '*') {
+ ast_log(LOG_WARNING, "Mailbox %s in context %s begins with '*' character. The '*' character,"
+ "\n\twhen it is the first character in a mailbox or password, is used to jump to a"
+ "\n\tpredefined extension 'a'. A mailbox or password beginning with '*' is not valid"
+ "\n\tand will be ignored.\n", box, context);
+ return NULL;
+ }
+
AST_LIST_TRAVERSE(&users, vmu, list) {
if (ast_test_flag((&globalflags), VM_SEARCH) && !strcasecmp(box, vmu->mailbox)) {
if (strcasecmp(vmu->context, context)) {
@@ -10594,6 +10618,11 @@ static int append_mailbox(const char *context, const char *box, const char *data
stringp = tmp;
if ((s = strsep(&stringp, ","))) {
+ if (!ast_strlen_zero(s) && s[0] == '*') {
+ ast_log(LOG_WARNING, "Invalid password detected for mailbox %s. The password"
+ "\n\tmust be reset in voicemail.conf.\n", box);
+ }
+ /* assign password regardless of validity to prevent NULL password from being assigned */
ast_copy_string(vmu->password, s, sizeof(vmu->password));
}
if (stringp && (s = strsep(&stringp, ","))) {