diff --git a/UPGRADE.txt b/UPGRADE.txt index 63eaf563c45c88a4cda44107a06b8124e8425e76..67fa6a628ea882aecd314a1dc83e76e8b350d4a1 100644 --- a/UPGRADE.txt +++ b/UPGRADE.txt @@ -78,6 +78,10 @@ From 1.6.2 to 1.8: * The Manager event 'iax2 show peers' output has been updated. It now has a similar output of 'sip show peers'. +* VoiceMailMain and VMAuthenticate, if a '*' is entered in the first position + of a Mailbox or Password, will, if it exists, jump to the 'a' extension in + the current dialplan context. + From 1.6.1 to 1.6.2: * SIP no longer sends the 183 progress message for early media by diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index fece02aca6e0eec2f66f528730e7825f6e75cc68..a311b6e8d829996461a595ffdb46f4b6ea21a01d 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;