app_voicemail: IMAP logout on MWI unsubscribe
authorAlexei Gradinari <alex2grad@gmail.com>
Mon, 12 Jun 2017 22:55:15 +0000 (18:55 -0400)
committerAlexei Gradinari <alex2grad@gmail.com>
Wed, 14 Jun 2017 16:30:34 +0000 (11:30 -0500)
Closing IMAP connection on MWI unsubscribe.

ASTERISK-24052 #close

Change-Id: I4ff964026002b2817b48c20fb4239f0a880228fd

apps/app_voicemail.c

index 06f4830..ba93783 100644 (file)
@@ -13106,6 +13106,40 @@ static void mwi_sub_destroy(struct mwi_sub *mwi_sub)
        ast_free(mwi_sub);
 }
 
+#ifdef IMAP_STORAGE
+static void imap_logout(const char *mailbox_id)
+{
+       char *context;
+       char *mailbox;
+       struct ast_vm_user vmus;
+       RAII_VAR(struct ast_vm_user *, vmu, NULL, free_user);
+       struct vm_state *vms = NULL;
+
+       if (ast_strlen_zero(mailbox_id)
+               || separate_mailbox(ast_strdupa(mailbox_id), &mailbox, &context)) {
+               return;
+       }
+
+       memset(&vmus, 0, sizeof(vmus));
+
+       if (!(vmu = find_user(&vmus, context, mailbox)) || vmu->imapuser[0] == '\0') {
+               return;
+       }
+
+       vms = get_vm_state_by_imapuser(vmu->imapuser, 0);
+       if (!vms) {
+               vms = get_vm_state_by_mailbox(mailbox, context, 0);
+       }
+       if (!vms) {
+               return;
+       }
+
+       vms->mailstream = mail_close(vms->mailstream);
+       vmstate_delete(vms);
+}
+
+#endif
+
 static int handle_unsubscribe(void *datap)
 {
        struct mwi_sub *mwi_sub;
@@ -13117,6 +13151,9 @@ static int handle_unsubscribe(void *datap)
                        AST_LIST_REMOVE_CURRENT(entry);
                        /* Don't break here since a duplicate uniqueid
                         * may have been added as a result of a cache dump. */
+#ifdef IMAP_STORAGE
+                       imap_logout(mwi_sub->mailbox);
+#endif
                        mwi_sub_destroy(mwi_sub);
                }
        }