]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 219818 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Tue, 22 Sep 2009 21:47:41 +0000 (21:47 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Tue, 22 Sep 2009 21:47:41 +0000 (21:47 +0000)
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: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@219820 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_voicemail.c

index 429ed3e2957e691c4d9e75fed29baa972d7d9eac..74825f2ca53bad25aaee4f75f2d0d334750bbe3a 100644 (file)
@@ -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"))) {