diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-09-22 21:47:41 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-09-22 21:47:41 +0000 |
commit | f18cfcc1eed181785ade44d4bc9aedb26cc51826 (patch) | |
tree | 9fb59e050b1e92191e961c36ac8f2315cb225e1b /apps | |
parent | 15ba8494e5d8f23d33404b1e473237922a0b06fc (diff) |
Merged revisions 219818 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
................
r219818 | tilghman | 2009-09-22 16:43:22 -0500 (Tue, 22 Sep 2009) | 17 lines
Merged revisions 219816 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r219816 | tilghman | 2009-09-22 16:37:03 -0500 (Tue, 22 Sep 2009) | 10 lines
When IMAP variables were changed during a reload, Voicemail did not use the new values.
This change introduces a configuration version variable, which ensures that
connections with the old values are not reused but are allowed to expire
normally.
(closes issue #15934)
Reported by: viniciusfontes
Patches:
20090922__issue15934.diff.txt uploaded by tilghman (license 14)
Tested by: viniciusfontes
........
................
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.1@219820 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r-- | apps/app_voicemail.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 429ed3e29..74825f2ca 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -133,6 +133,7 @@ static char imapparentfolder[64] = "\0"; static char greetingfolder[64]; static char authuser[32]; static char authpassword[42]; +static int imapversion = 1; static int expungeonhangup = 1; static int imapgreetings = 0; @@ -400,6 +401,7 @@ struct ast_vm_user { char imapuser[80]; /*!< IMAP server login */ char imappassword[80]; /*!< IMAP server password if authpassword not defined */ char imapvmshareid[80]; /*!< Shared mailbox ID to use rather than the dialed one */ + int imapversion; /*!< If configuration changes, use the new values */ #endif double volgain; /*!< Volume gain for voicemails sent via email */ AST_LIST_ENTRY(ast_vm_user) list; @@ -440,6 +442,7 @@ struct vm_state { MAILSTREAM *mailstream; int vmArrayIndex; char imapuser[80]; /*!< IMAP server login */ + int imapversion; int interactive; char introfn[PATH_MAX]; /*!< Name of prepended file */ unsigned int quota_limit; @@ -778,10 +781,13 @@ static void apply_option(struct ast_vm_user *vmu, const char *var, const char *v #ifdef IMAP_STORAGE } else if (!strcasecmp(var, "imapuser")) { ast_copy_string(vmu->imapuser, value, sizeof(vmu->imapuser)); + vmu->imapversion = imapversion; } else if (!strcasecmp(var, "imappassword") || !strcasecmp(var, "imapsecret")) { ast_copy_string(vmu->imappassword, value, sizeof(vmu->imappassword)); + vmu->imapversion = imapversion; } else if (!strcasecmp(var, "imapvmshareid")) { ast_copy_string(vmu->imapvmshareid, value, sizeof(vmu->imapvmshareid)); + vmu->imapversion = imapversion; #endif } else if (!strcasecmp(var, "delete") || !strcasecmp(var, "deletevoicemail")) { ast_set2_flag(vmu, ast_true(value), VM_DELETE); @@ -1014,10 +1020,13 @@ static void apply_options_full(struct ast_vm_user *retval, struct ast_variable * #ifdef IMAP_STORAGE } else if (!strcasecmp(tmp->name, "imapuser")) { ast_copy_string(retval->imapuser, tmp->value, sizeof(retval->imapuser)); + retval->imapversion = imapversion; } else if (!strcasecmp(tmp->name, "imappassword") || !strcasecmp(tmp->name, "imapsecret")) { ast_copy_string(retval->imappassword, tmp->value, sizeof(retval->imappassword)); + retval->imapversion = imapversion; } else if (!strcasecmp(var->name, "imapvmshareid")) { ast_copy_string(retval->imapvmshareid, var->value, sizeof(retval->imapvmshareid)); + retval->imapversion = imapversion; #endif } else apply_option(retval, tmp->name, tmp->value); @@ -1104,6 +1113,11 @@ static struct ast_vm_user *find_user(struct ast_vm_user *ivm, const char *contex context = "default"; AST_LIST_TRAVERSE(&users, cur, list) { +#ifdef IMAP_STORAGE + if (cur->imapversion != imapversion) { + continue; + } +#endif if (ast_test_flag((&globalflags), VM_SEARCH) && !strcasecmp(mailbox, cur->mailbox)) break; if (context && (!strcasecmp(context, cur->context)) && (!strcasecmp(mailbox, cur->mailbox))) @@ -2126,6 +2140,7 @@ static int open_mailbox(struct vm_state *vms, struct ast_vm_user *vmu, int box) ast_copy_string(vms->imapuser,vmu->imapuser, sizeof(vms->imapuser)); ast_debug(3,"Before init_mailstream, user is %s\n",vmu->imapuser); + vms->imapversion = vmu->imapversion; if ((ret = init_mailstream(vms, box)) || !vms->mailstream) { ast_log(AST_LOG_ERROR, "Could not initialize mailstream\n"); @@ -2481,6 +2496,7 @@ static struct vm_state *create_vm_state_from_user(struct ast_vm_user *vmu) ast_copy_string(vms_p->username, vmu->mailbox, sizeof(vms_p->username)); /* save for access from interactive entry point */ ast_copy_string(vms_p->context, vmu->context, sizeof(vms_p->context)); vms_p->mailstream = NIL; /* save for access from interactive entry point */ + vms_p->imapversion = vmu->imapversion; if (option_debug > 4) ast_log(AST_LOG_DEBUG,"Copied %s to %s\n",vmu->imapuser,vms_p->imapuser); vms_p->updated = 1; @@ -2508,6 +2524,9 @@ static struct vm_state *get_vm_state_by_imapuser(const char *user, int interacti ast_debug(3, "error: vms is NULL for %s\n", user); continue; } + if (vlist->vms->imapversion != imapversion) { + continue; + } if (!vlist->vms->imapuser) { ast_debug(3, "error: imapuser is NULL for %s\n", user); continue; @@ -2544,6 +2563,9 @@ static struct vm_state *get_vm_state_by_mailbox(const char *mailbox, const char ast_debug(3, "error: vms is NULL for %s\n", mailbox); continue; } + if (vlist->vms->imapversion != imapversion) { + continue; + } if (!vlist->vms->username || !vlist->vms->context) { ast_debug(3, "error: username is NULL for %s\n", mailbox); continue; @@ -10532,6 +10554,8 @@ static int load_config(int reload) mail_parameters(NIL, SET_CLOSETIMEOUT, (void *) 60L); } + /* Increment configuration version */ + imapversion++; #endif /* External voicemail notify application */ if ((val = ast_variable_retrieve(cfg, "general", "externnotify"))) { |