diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index a616738..53da1e8 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -633,6 +633,7 @@ struct baseio { struct ast_vm_user { char context[AST_MAX_CONTEXT]; /*!< Voicemail context */ char mailbox[AST_MAX_EXTENSION]; /*!< Mailbox id, unique within vm context */ + char mailboxname[AST_MAX_EXTENSION]; char password[80]; /*!< Secret pin code, numbers only */ char fullname[80]; /*!< Full name, for directory app */ char email[80]; /*!< E-mail address */ @@ -1296,6 +1297,10 @@ static void apply_options_full(struct ast_vm_user *retval, struct ast_variable * } 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)); + } else if (!strcasecmp(var->name, "mailbox")) { + ast_copy_string(retval->mailbox, var->value, sizeof(retval->mailbox)); + } else if (!strcasecmp(var->name, "mailboxname")) { + ast_copy_string(retval->mailboxname, var->value, sizeof(retval->mailboxname)); } else if (!strcasecmp(var->name, "uniqueid")) { ast_copy_string(retval->uniqueid, var->value, sizeof(retval->uniqueid)); } else if (!strcasecmp(var->name, "pager")) { @@ -1373,10 +1378,15 @@ static struct ast_vm_user *find_user_realtime(struct ast_vm_user *ivm, const cha if (mailbox) ast_copy_string(retval->mailbox, mailbox, sizeof(retval->mailbox)); populate_defaults(retval); - if (!context && ast_test_flag((&globalflags), VM_SEARCH)) + if (!context && ast_test_flag((&globalflags), VM_SEARCH)) { var = ast_load_realtime("voicemail", "mailbox", mailbox, SENTINEL); - else + if (!var) + var = ast_load_realtime("voicemail", "mailboxname", mailbox, SENTINEL); + } else { var = ast_load_realtime("voicemail", "mailbox", mailbox, "context", context, SENTINEL); + if (!var) + var = ast_load_realtime("voicemail", "mailboxname", mailbox, "context", context, SENTINEL); + } if (var) { apply_options_full(retval, var); ast_variables_destroy(var); @@ -4269,7 +4279,7 @@ static int base_encode(char *filename, FILE *so) return 1; } -static void prep_email_sub_vars(struct ast_channel *ast, struct ast_vm_user *vmu, int msgnum, char *context, char *mailbox, const char *fromfolder, char *cidnum, char *cidname, char *dur, char *date, const char *category, const char *flag) +static void prep_email_sub_vars(struct ast_channel *ast, struct ast_vm_user *vmu, int msgnum, char *context, char *mailbox, const char *mailbox_name, const char *fromfolder, char *cidnum, char *cidname, char *dur, char *date, const char *category, const char *flag) { char callerid[256]; char num[12]; @@ -4287,6 +4297,7 @@ static void prep_email_sub_vars(struct ast_channel *ast, struct ast_vm_user *vmu pbx_builtin_setvar_helper(ast, "VM_MSGNUM", num); pbx_builtin_setvar_helper(ast, "VM_CONTEXT", context); pbx_builtin_setvar_helper(ast, "VM_MAILBOX", mailbox); + pbx_builtin_setvar_helper(ast, "VM_MAILBOXNAME", ast_strlen_zero(mailbox_name) ? mailbox : mailbox_name); pbx_builtin_setvar_helper(ast, "VM_CALLERID", (!ast_strlen_zero(cidname) || !ast_strlen_zero(cidnum)) ? ast_callerid_merge(callerid, sizeof(callerid), cidname, cidnum, NULL) : "an unknown caller"); pbx_builtin_setvar_helper(ast, "VM_CIDNAME", (!ast_strlen_zero(cidname) ? cidname : "an unknown caller")); @@ -4508,7 +4519,7 @@ static void make_email_file(FILE *p, char *srcemail, struct ast_vm_user *vmu, in struct ast_channel *ast; if ((ast = ast_dummy_channel_alloc())) { char *ptr; - prep_email_sub_vars(ast, vmu, msgnum + 1, context, mailbox, fromfolder, enc_cidnum, enc_cidname, dur, date, category, flag); + prep_email_sub_vars(ast, vmu, msgnum + 1, context, mailbox, vmu->mailboxname, fromfolder, enc_cidnum, enc_cidname, dur, date, category, flag); ast_str_substitute_variables(&str1, 0, ast, fromstring); if (check_mime(ast_str_buffer(str1))) { @@ -4553,7 +4564,7 @@ static void make_email_file(FILE *p, char *srcemail, struct ast_vm_user *vmu, in char *e_subj = !ast_strlen_zero(vmu->emailsubject) ? vmu->emailsubject : emailsubject; struct ast_channel *ast; if ((ast = ast_dummy_channel_alloc())) { - prep_email_sub_vars(ast, vmu, msgnum + 1, context, mailbox, fromfolder, cidnum, cidname, dur, date, category, flag); + prep_email_sub_vars(ast, vmu, msgnum + 1, context, mailbox, vmu->mailboxname, fromfolder, cidnum, cidname, dur, date, category, flag); ast_str_substitute_variables(&str1, 0, ast, e_subj); if (check_mime(ast_str_buffer(str1))) { int first_line = 1; @@ -4576,15 +4587,15 @@ static void make_email_file(FILE *p, char *srcemail, struct ast_vm_user *vmu, in } } else if (ast_test_flag((&globalflags), VM_PBXSKIP)) { if (ast_strlen_zero(flag)) { - fprintf(p, "Subject: New message %d in mailbox %s" ENDL, msgnum + 1, mailbox); + fprintf(p, "Subject: New message %d in mailbox %s" ENDL, msgnum + 1, ast_strlen_zero(vmu->mailboxname) ? mailbox : vmu->mailboxname); } else { - fprintf(p, "Subject: New %s message %d in mailbox %s" ENDL, flag, msgnum + 1, mailbox); + fprintf(p, "Subject: New %s message %d in mailbox %s" ENDL, flag, msgnum + 1, ast_strlen_zero(vmu->mailboxname) ? mailbox : vmu->mailboxname); } } else { if (ast_strlen_zero(flag)) { - fprintf(p, "Subject: [PBX]: New message %d in mailbox %s" ENDL, msgnum + 1, mailbox); + fprintf(p, "Subject: [PBX]: New message %d in mailbox %s" ENDL, msgnum + 1, ast_strlen_zero(vmu->mailboxname) ? mailbox : vmu->mailboxname); } else { - fprintf(p, "Subject: [PBX]: New %s message %d in mailbox %s" ENDL, flag, msgnum + 1, mailbox); + fprintf(p, "Subject: [PBX]: New %s message %d in mailbox %s" ENDL, flag, msgnum + 1, ast_strlen_zero(vmu->mailboxname) ? mailbox : vmu->mailboxname); } } @@ -4638,7 +4649,7 @@ static void make_email_file(FILE *p, char *srcemail, struct ast_vm_user *vmu, in char* e_body = vmu->emailbody ? vmu->emailbody : emailbody; struct ast_channel *ast; if ((ast = ast_dummy_channel_alloc())) { - prep_email_sub_vars(ast, vmu, msgnum + 1, context, mailbox, fromfolder, cidnum, cidname, dur, date, category, flag); + prep_email_sub_vars(ast, vmu, msgnum + 1, context, mailbox, vmu->mailboxname, fromfolder, cidnum, cidname, dur, date, category, flag); ast_str_substitute_variables(&str1, 0, ast, e_body); #ifdef IMAP_STORAGE { @@ -4866,7 +4877,7 @@ static int sendpage(char *srcemail, char *pager, int msgnum, char *context, char struct ast_channel *ast; if ((ast = ast_dummy_channel_alloc())) { char *ptr; - prep_email_sub_vars(ast, vmu, msgnum + 1, context, mailbox, fromfolder, enc_cidnum, enc_cidname, dur, date, category, flag); + prep_email_sub_vars(ast, vmu, msgnum + 1, context, mailbox, vmu->mailboxname, fromfolder, enc_cidnum, enc_cidname, dur, date, category, flag); ast_str_substitute_variables(&str1, 0, ast, pagerfromstring); if (check_mime(ast_str_buffer(str1))) { @@ -4910,7 +4921,7 @@ static int sendpage(char *srcemail, char *pager, int msgnum, char *context, char if (!ast_strlen_zero(pagersubject)) { struct ast_channel *ast; if ((ast = ast_dummy_channel_alloc())) { - prep_email_sub_vars(ast, vmu, msgnum + 1, context, mailbox, fromfolder, cidnum, cidname, dur, date, category, flag); + prep_email_sub_vars(ast, vmu, msgnum + 1, context, mailbox, vmu->mailboxname, fromfolder, cidnum, cidname, dur, date, category, flag); ast_str_substitute_variables(&str1, 0, ast, pagersubject); if (check_mime(ast_str_buffer(str1))) { int first_line = 1; @@ -4942,7 +4953,7 @@ static int sendpage(char *srcemail, char *pager, int msgnum, char *context, char if (pagerbody) { struct ast_channel *ast; if ((ast = ast_dummy_channel_alloc())) { - prep_email_sub_vars(ast, vmu, msgnum + 1, context, mailbox, fromfolder, cidnum, cidname, dur, date, category, flag); + prep_email_sub_vars(ast, vmu, msgnum + 1, context, mailbox, vmu->mailboxname, fromfolder, cidnum, cidname, dur, date, category, flag); ast_str_substitute_variables(&str1, 0, ast, pagerbody); fprintf(p, "%s" ENDL, ast_str_buffer(str1)); ast = ast_channel_release(ast); @@ -4982,7 +4993,7 @@ static int get_date(char *s, int len) return ast_strftime(s, len, "%a %b %e %r UTC %Y", &tm); } -static int invent_message(struct ast_channel *chan, char *context, char *ext, int busy, char *ecodes) +static int invent_message(struct ast_channel *chan, char *context, char *ext, char *ext_name, int busy, char *ecodes) { int res; char fn[PATH_MAX]; @@ -5008,7 +5019,7 @@ static int invent_message(struct ast_channel *chan, char *context, char *ext, in res = ast_stream_and_wait(chan, "vm-theperson", ecodes); if (res) return res; - res = ast_say_digit_str(chan, ext, ecodes, chan->language); + res = ast_say_digit_str(chan, ast_strlen_zero(ext_name) ? ext : ext_name, ecodes, chan->language); if (res) return res; } @@ -5696,7 +5707,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, struct leave_vm_ #endif } else { ast_debug(1, "%s doesn't exist, doing what we can\n", prefile); - res = invent_message(chan, vmu->context, ext, ast_test_flag(options, OPT_BUSY_GREETING), ecodes); + res = invent_message(chan, vmu->context, ext, vmu->mailboxname, ast_test_flag(options, OPT_BUSY_GREETING), ecodes); } DISPOSE(prefile, -1); if (res < 0) { @@ -7204,8 +7215,8 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st } /* play name if available, else play extension number */ - snprintf(fn, sizeof(fn), "%s%s/%s/greet", VM_SPOOL_DIR, receiver->context, s); - RETRIEVE(fn, -1, s, receiver->context); + snprintf(fn, sizeof(fn), "%s%s/%s/greet", VM_SPOOL_DIR, receiver->context, receiver->mailbox); + RETRIEVE(fn, -1, receiver->mailbox, receiver->context); if (ast_fileexists(fn, NULL, NULL) > 0) { res = ast_stream_and_wait(chan, fn, ecodes); if (res) { @@ -7229,7 +7240,12 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st if (is_new_message == 1) { struct leave_vm_options leave_options; char mailbox[AST_MAX_EXTENSION * 2 + 2]; - snprintf(mailbox, sizeof(mailbox), "%s@%s", username, context); + if (receiver != NULL) { + snprintf(mailbox, sizeof(mailbox), "%s@%s", receiver->mailbox, receiver->context); + } else { + ast_log(LOG_WARNING, "receiver was unset, using raw username\n"); + snprintf(mailbox, sizeof(mailbox), "%s@%s", username, context); + } /* Send VoiceMail */ memset(&leave_options, 0, sizeof(leave_options));