diff options
Diffstat (limited to 'apps/app_voicemail.c')
-rw-r--r-- | apps/app_voicemail.c | 74 |
1 files changed, 65 insertions, 9 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index f4414d68b..8be69e5a6 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -466,7 +466,7 @@ static void vmstate_delete(struct vm_state *vms); static void set_update(MAILSTREAM * stream); static void init_vm_state(struct vm_state *vms); static int save_body(BODY *body, struct vm_state *vms, char *section, char *format, int is_intro); -static void get_mailbox_delimiter(MAILSTREAM *stream); +static void get_mailbox_delimiter(struct vm_state *vms, MAILSTREAM *stream); static void mm_parsequota (MAILSTREAM *stream, unsigned char *msg, QUOTALIST *pquota); static void imap_mailbox_name(char *spec, size_t len, struct vm_state *vms, int box, int target); static int imap_store_file(const char *dir, const char *mailboxuser, const char *mailboxcontext, int msgnum, struct ast_channel *chan, struct ast_vm_user *vmu, char *fmt, int duration, struct vm_state *vms, const char *flag); @@ -726,6 +726,9 @@ struct ast_vm_user { int maxsecs; /*!< Maximum number of seconds per message for this mailbox */ int passwordlocation; /*!< Storage location of the password */ #ifdef IMAP_STORAGE + char imapserver[48]; /*!< IMAP server address */ + char imapport[8]; /*!< IMAP server port */ + char imapflags[128]; /*!< IMAP optional flags */ char imapuser[80]; /*!< IMAP server login */ char imappassword[80]; /*!< IMAP server password if authpassword not defined */ char imapfolder[64]; /*!< IMAP voicemail folder */ @@ -773,6 +776,9 @@ struct vm_state { int vmArrayIndex; char imapuser[80]; /*!< IMAP server login */ char imapfolder[64]; /*!< IMAP voicemail folder */ + char imapserver[48]; /*!< IMAP server address */ + char imapport[8]; /*!< IMAP server port */ + char imapflags[128]; /*!< IMAP optional flags */ int imapversion; int interactive; char introfn[PATH_MAX]; /*!< Name of prepended file */ @@ -1110,6 +1116,9 @@ static void populate_defaults(struct ast_vm_user *vmu) vmu->emailbody = NULL; #ifdef IMAP_STORAGE ast_copy_string(vmu->imapfolder, imapfolder, sizeof(vmu->imapfolder)); + ast_copy_string(vmu->imapserver, imapserver, sizeof(vmu->imapserver)); + ast_copy_string(vmu->imapport, imapport, sizeof(vmu->imapport)); + ast_copy_string(vmu->imapflags, imapflags, sizeof(vmu->imapflags)); #endif } @@ -1146,11 +1155,21 @@ static void apply_option(struct ast_vm_user *vmu, const char *var, const char *v } else if (!strcasecmp(var, "imapuser")) { ast_copy_string(vmu->imapuser, value, sizeof(vmu->imapuser)); vmu->imapversion = imapversion; + } else if (!strcasecmp(var, "imapserver")) { + ast_copy_string(vmu->imapserver, value, sizeof(vmu->imapserver)); + vmu->imapversion = imapversion; + } else if (!strcasecmp(var, "imapport")) { + ast_copy_string(vmu->imapport, value, sizeof(vmu->imapport)); + vmu->imapversion = imapversion; + } else if (!strcasecmp(var, "imapflags")) { + ast_copy_string(vmu->imapflags, value, sizeof(vmu->imapflags)); + 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, "imapfolder")) { ast_copy_string(vmu->imapfolder, value, sizeof(vmu->imapfolder)); + vmu->imapversion = imapversion; } else if (!strcasecmp(var, "imapvmshareid")) { ast_copy_string(vmu->imapvmshareid, value, sizeof(vmu->imapvmshareid)); vmu->imapversion = imapversion; @@ -1417,11 +1436,21 @@ static void apply_options_full(struct ast_vm_user *retval, struct ast_variable * } else if (!strcasecmp(var->name, "imapuser")) { ast_copy_string(retval->imapuser, var->value, sizeof(retval->imapuser)); retval->imapversion = imapversion; + } else if (!strcasecmp(var->name, "imapserver")) { + ast_copy_string(retval->imapserver, var->value, sizeof(retval->imapserver)); + retval->imapversion = imapversion; + } else if (!strcasecmp(var->name, "imapport")) { + ast_copy_string(retval->imapport, var->value, sizeof(retval->imapport)); + retval->imapversion = imapversion; + } else if (!strcasecmp(var->name, "imapflags")) { + ast_copy_string(retval->imapflags, var->value, sizeof(retval->imapflags)); + retval->imapversion = imapversion; } else if (!strcasecmp(var->name, "imappassword") || !strcasecmp(var->name, "imapsecret")) { ast_copy_string(retval->imappassword, var->value, sizeof(retval->imappassword)); retval->imapversion = imapversion; } else if (!strcasecmp(var->name, "imapfolder")) { ast_copy_string(retval->imapfolder, var->value, sizeof(retval->imapfolder)); + retval->imapversion = imapversion; } else if (!strcasecmp(var->name, "imapvmshareid")) { ast_copy_string(retval->imapvmshareid, var->value, sizeof(retval->imapvmshareid)); retval->imapversion = imapversion; @@ -2584,15 +2613,16 @@ static void imap_mailbox_name(char *spec, size_t len, struct vm_state *vms, int } /* Build up server information */ - ast_build_string(&t, &left, "{%s:%s/imap", imapserver, imapport); + ast_build_string(&t, &left, "{%s:%s/imap", S_OR(vms->imapserver, imapserver), S_OR(vms->imapport, imapport)); /* Add authentication user if present */ if (!ast_strlen_zero(authuser)) ast_build_string(&t, &left, "/authuser=%s", authuser); /* Add flags if present */ - if (!ast_strlen_zero(imapflags)) - ast_build_string(&t, &left, "/%s", imapflags); + if (!ast_strlen_zero(imapflags) || !(ast_strlen_zero(vms->imapflags))) { + ast_build_string(&t, &left, "/%s", S_OR(vms->imapflags, imapflags)); + } /* End with username */ #if 1 @@ -2651,7 +2681,7 @@ static int init_mailstream(struct vm_state *vms, int box) ast_log(LOG_ERROR, "Can't connect to imap server %s\n", tmp); return -1; } - get_mailbox_delimiter(stream); + get_mailbox_delimiter(vms, stream); /* update delimiter in imapfolder */ for (cp = vms->imapfolder; *cp; cp++) if (*cp == '/') @@ -2684,6 +2714,9 @@ 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_copy_string(vms->imapfolder, vmu->imapfolder, sizeof(vms->imapfolder)); + ast_copy_string(vms->imapserver, vmu->imapserver, sizeof(vms->imapserver)); + ast_copy_string(vms->imapport, vmu->imapport, sizeof(vms->imapport)); + ast_copy_string(vms->imapflags, vmu->imapflags, sizeof(vms->imapflags)); vms->imapversion = vmu->imapversion; ast_debug(3, "Before init_mailstream, user is %s\n", vmu->imapuser); @@ -3049,6 +3082,9 @@ static struct vm_state *create_vm_state_from_user(struct ast_vm_user *vmu) return NULL; ast_copy_string(vms_p->imapuser, vmu->imapuser, sizeof(vms_p->imapuser)); ast_copy_string(vms_p->imapfolder, vmu->imapfolder, sizeof(vms_p->imapfolder)); + ast_copy_string(vms_p->imapserver, vmu->imapserver, sizeof(vms_p->imapserver)); + ast_copy_string(vms_p->imapport, vmu->imapport, sizeof(vms_p->imapport)); + ast_copy_string(vms_p->imapflags, vmu->imapflags, sizeof(vms_p->imapflags)); 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 */ @@ -3280,14 +3316,15 @@ static int save_body(BODY *body, struct vm_state *vms, char *section, char *form /*! * \brief Get delimiter via mm_list callback + * \param vms The voicemail state object * \param stream * * Determines the delimiter character that is used by the underlying IMAP based mail store. */ /* MUTEX should already be held */ -static void get_mailbox_delimiter(MAILSTREAM *stream) { +static void get_mailbox_delimiter(struct vm_state *vms, MAILSTREAM *stream) { char tmp[50]; - snprintf(tmp, sizeof(tmp), "{%s}", imapserver); + snprintf(tmp, sizeof(tmp), "{%s}", S_OR(vms->imapserver, imapserver)); mail_list(stream, tmp, "*"); } @@ -10877,7 +10914,7 @@ AST_TEST_DEFINE(test_voicemail_vmuser) "[PBX]: New message \\\\${VM_MSGNUM}\\\\ in mailbox ${VM_MAILBOX}"; #ifdef IMAP_STORAGE static const char option_string2[] = "imapuser=imapuser|imappassword=imappasswd|" - "imapfolder=INBOX|imapvmshareid=6000"; + "imapfolder=INBOX|imapvmshareid=6000|imapserver=imapserver|imapport=1234|imapflags=flagged"; #endif switch (cmd) { @@ -11031,6 +11068,18 @@ AST_TEST_DEFINE(test_voicemail_vmuser) ast_test_status_update(test, "Parse failure for imapvmshareid option\n"); res = 1; } + if (strcasecmp(vmu->imapserver, "imapserver")) { + ast_test_status_update(test, "Parse failure for imapserver option\n"); + res = 1; + } + if (strcasecmp(vmu->imapport, "1234")) { + ast_test_status_update(test, "Parse failure for imapport option\n"); + res = 1; + } + if (strcasecmp(vmu->imapflags, "flagged")) { + ast_test_status_update(test, "Parse failure for imapflags option\n"); + res = 1; + } #endif free_user(vmu); @@ -11823,6 +11872,9 @@ static int manager_list_voicemail_users(struct mansession *s, const struct messa #ifdef IMAP_STORAGE "OldMessageCount: %d\r\n" "IMAPUser: %s\r\n" + "IMAPServer: %s\r\n" + "IMAPPort: %s\r\n" + "IMAPFlags: %s\r\n" #endif "\r\n", actionid, @@ -11851,7 +11903,11 @@ static int manager_list_voicemail_users(struct mansession *s, const struct messa vmu->maxmsg, vmu->maxsecs, #ifdef IMAP_STORAGE - new, old, vmu->imapuser + new, old, + vmu->imapuser, + vmu->imapserver, + vmu->imapport, + vmu->imapflags #else count_messages(vmu, dirname) #endif |