From 0cef7b9d4ef3a7f55685203328960a89dd7fd247 Mon Sep 17 00:00:00 2001 From: Alexei Gradinari <alex2grad@gmail.com> Date: Mon, 19 Jun 2017 18:21:29 -0400 Subject: [PATCH] app_voicemail: IMAP connection control A new global option "imap_poll_logout" was added to specify whether need to disconnect from the IMAP server after polling of mailboxes. ASTERISK-27068 #close Closing IMAP connection after loading mailbox from voicemail.conf ASTERISK-24052 #close Change-Id: Ib7558ba04516240a32b65f42e9be64372a0ae12a --- CHANGES | 6 ++++++ apps/app_voicemail.c | 17 +++++++++++++++++ configs/samples/voicemail.conf.sample | 3 +++ 3 files changed, 26 insertions(+) diff --git a/CHANGES b/CHANGES index 9cd579b656..97cdda96ea 100644 --- a/CHANGES +++ b/CHANGES @@ -21,6 +21,12 @@ app_queue --- Functionality changes from Asterisk 14.5.0 to Asterisk 14.6.0 ------------ ------------------------------------------------------------------------------ +app_voicemail +------------------ + * A new global option "imap_poll_logout" was added to specify whether need to + disconnect from the IMAP server after polling of mailboxes. + Default: no + res_pjsip ------------------ * A new endpoint option "refer_blind_progress" was added to turn off notifying diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index a951680133..783cab69ec 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -505,6 +505,7 @@ static int imapversion = 1; static int expungeonhangup = 1; static int imapgreetings = 0; +static int imap_poll_logout = 0; static char delimiter = '\0'; /* mail_open cannot be protected on a stream basis */ @@ -542,6 +543,8 @@ static int imap_retrieve_file (const char *dir, const int msgnum, const char *ma static int imap_delete_old_greeting (char *dir, struct vm_state *vms); static void check_quota(struct vm_state *vms, char *mailbox); static int open_mailbox(struct vm_state *vms, struct ast_vm_user *vmu, int box); +static void imap_logout(const char *mailbox_id); + struct vmstate { struct vm_state *vms; AST_LIST_ENTRY(vmstate) list; @@ -12303,6 +12306,9 @@ static int append_mailbox(const char *context, const char *box, const char *data strcat(mailbox_full, context); inboxcount2(mailbox_full, &urgent, &new, &old); +#ifdef IMAP_STORAGE + imap_logout(mailbox_full); +#endif queue_mwi_event(NULL, mailbox_full, urgent, new, old); return 0; @@ -13055,6 +13061,12 @@ static void poll_subscribed_mailbox(struct mwi_sub *mwi_sub) inboxcount2(mwi_sub->mailbox, &urgent, &new, &old); +#ifdef IMAP_STORAGE + if (imap_poll_logout) { + imap_logout(mwi_sub->mailbox); + } +#endif + if (urgent != mwi_sub->old_urgent || new != mwi_sub->old_new || old != mwi_sub->old_old) { mwi_sub->old_urgent = urgent; mwi_sub->old_new = new; @@ -13775,6 +13787,11 @@ static int actual_load_config(int reload, struct ast_config *cfg, struct ast_con } else { ast_copy_string(greetingfolder, imapfolder, sizeof(greetingfolder)); } + if ((val = ast_variable_retrieve(cfg, "general", "imap_poll_logout"))) { + imap_poll_logout = ast_true(val); + } else { + imap_poll_logout = 0; + } /* There is some very unorthodox casting done here. This is due * to the way c-client handles the argument passed in. It expects a diff --git a/configs/samples/voicemail.conf.sample b/configs/samples/voicemail.conf.sample index f8221eebe0..84e83a3447 100644 --- a/configs/samples/voicemail.conf.sample +++ b/configs/samples/voicemail.conf.sample @@ -227,6 +227,9 @@ pagerdateformat=%A, %B %d, %Y at %r ;imapclosetimeout=60 ; The TCP close timeout (in seconds) ;imapreadtimeout=60 ; The TCP read timeout (in seconds) ;imapwritetimeout=60 ; The TCP write timeout (in seconds) +;imap_poll_logout=no ; If pollmailboxes=yes, then specify whether need to + ; disconnect from the IMAP server after polling. + ; Default: no ; ----------------------------------------------------------------------------- ; -- GitLab