summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/app_voicemail.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index fece02aca..a311b6e8d 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -250,6 +250,13 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
may be specified. If a <replaceable>mailbox</replaceable> is not provided, the calling party will
be prompted to enter one. If a <replaceable>context</replaceable> is not specified, the
<literal>default</literal> context will be used.</para>
+ <para>The VoiceMailMain application will exit if the following DTMF digit is entered as Mailbox
+ or Password, and the extension exists:</para>
+ <enumlist>
+ <enum name="*">
+ <para>Jump to the <literal>a</literal> extension in the current dialplan context.</para>
+ </enum>
+ </enumlist>
</description>
</application>
<application name="MailboxExists" language="en_US">
@@ -303,6 +310,13 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
specified, only that mailbox's password will be considered valid. If the <replaceable>mailbox</replaceable>
is not specified, the channel variable <variable>AUTH_MAILBOX</variable> will be set with the authenticated
mailbox.</para>
+ <para>The VMAuthenticate application will exit if the following DTMF digit is entered as Mailbox
+ or Password, and the extension exists:</para>
+ <enumlist>
+ <enum name="*">
+ <para>Jump to the <literal>a</literal> extension in the current dialplan context.</para>
+ </enum>
+ </enumlist>
</description>
</application>
<application name="VMSayName" language="en_US">
@@ -9342,7 +9356,14 @@ static int vm_authenticate(struct ast_channel *chan, char *mailbox, int mailbox_
ast_verb(3, "Username not entered\n");
return -1;
}
+ } else if (mailbox[0] == '*') {
+ /* user entered '*' */
+ if (ast_exists_extension(chan, chan->context, "a", 1, chan->cid.cid_num)) {
+ return -1;
+ }
+ mailbox[0] = '\0';
}
+
if (useadsi)
adsi_password(chan);
@@ -9366,6 +9387,13 @@ static int vm_authenticate(struct ast_channel *chan, char *mailbox, int mailbox_
if (ast_readstring(chan, password, sizeof(password) - 1, 2000, 10000, "#") < 0) {
ast_log(AST_LOG_WARNING, "Unable to read password\n");
return -1;
+ } else if (password[0] == '*') {
+ /* user entered '*' */
+ if (ast_exists_extension(chan, chan->context, "a", 1, chan->cid.cid_num)) {
+ mailbox[0] = '*';
+ return -1;
+ }
+ mailbox[0] = '\0';
}
}
@@ -9531,6 +9559,17 @@ static int vm_execmain(struct ast_channel *chan, const char *data)
res = vm_authenticate(chan, vms.username, sizeof(vms.username), &vmus, context, prefixstr, skipuser, maxlogins, 0);
ast_debug(1, "After vm_authenticate\n");
+
+ if (vms.username[0] == '*') {
+ ast_debug(1, "user pressed * in context '%s'\n", chan->context);
+
+ /* user entered '*' */
+ if (!ast_goto_if_exists(chan, chan->context, "a", 1)) {
+ res = 0; /* prevent hangup */
+ goto out;
+ }
+ }
+
if (!res) {
valid = 1;
if (!skipuser)
@@ -10536,6 +10575,11 @@ static int vmauthenticate(struct ast_channel *chan, const char *data)
pbx_builtin_setvar_helper(chan, "AUTH_CONTEXT", vmus.context);
ast_play_and_wait(chan, "auth-thankyou");
res = 0;
+ } else if (mailbox[0] == '*') {
+ /* user entered '*' */
+ if (!ast_goto_if_exists(chan, chan->context, "a", 1)) {
+ res = 0; /* prevent hangup */
+ }
}
return res;