From 9d2a8810e6b0d7b4f7daad123d853db32eedf0f6 Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Fri, 5 Dec 2008 15:56:15 +0000 Subject: [PATCH] When using IMAP_STORAGE, it's important to convert bare newlines (\n) in emailbody and pagerbody to CR-LF so that the IMAP server doesn't spit out an error. This was informally reported on #asterisk-dev a few weeks ago. Reviewed by Mark M. on IRC. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@161349 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_voicemail.c | 101 ++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 50 deletions(-) diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 5f2f9b250e..333e38a74e 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -10086,6 +10086,51 @@ static void free_vm_zones(void) AST_LIST_UNLOCK(&zones); } +static char *substitute_escapes(const char *value) +{ + char *current, *result; + + /* Add 16 for fudge factor */ + struct ast_str *str = ast_str_create(strlen(value) + 16); + + /* Substitute strings \r, \n, and \t into the appropriate characters */ + for (current = (char *) value; *current; current++) { + if (*current == '\\') { + current++; + if (!*current) { + ast_log(AST_LOG_NOTICE, "Incomplete escape at end of value.\n"); + break; + } + switch (*current) { + case 'r': + ast_str_append(&str, 0, "\r"); + break; + case 'n': +#ifdef IMAP_STORAGE + if (!str->used || str->str[str->used - 1] != '\r') { + ast_str_append(&str, 0, "\r"); + } +#endif + ast_str_append(&str, 0, "\n"); + break; + case 't': + ast_str_append(&str, 0, "\t"); + break; + default: + ast_log(AST_LOG_NOTICE, "Substitution routine does not support this character: \\%c\n", *current); + break; + } + } else { + ast_str_append(&str, 0, "%c", *current); + } + } + + result = ast_strdup(str->str); + free(str); + + return result; +} + static int load_config(int reload) { struct ast_vm_user *current; @@ -10690,61 +10735,17 @@ static int load_config(int reload) adsiver = atoi(val); } } - if ((val = ast_variable_retrieve(cfg, "general", "emailsubject"))) + if ((val = ast_variable_retrieve(cfg, "general", "emailsubject"))) { emailsubject = ast_strdup(val); + } if ((val = ast_variable_retrieve(cfg, "general", "emailbody"))) { - char *tmpread, *tmpwrite; - emailbody = ast_strdup(val); - - /* substitute strings \t and \n into the appropriate characters */ - tmpread = tmpwrite = emailbody; - while ((tmpwrite = strchr(tmpread,'\\'))) { - switch (tmpwrite[1]) { - case 'r': - memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1); - *tmpwrite = '\r'; - break; - case 'n': - memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1); - *tmpwrite = '\n'; - break; - case 't': - memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1); - *tmpwrite = '\t'; - break; - default: - ast_log(AST_LOG_NOTICE, "Substitution routine does not support this character: %c\n", tmpwrite[1]); - } - tmpread = tmpwrite + 1; - } + emailbody = substitute_escapes(val); } - if ((val = ast_variable_retrieve(cfg, "general", "pagersubject"))) + if ((val = ast_variable_retrieve(cfg, "general", "pagersubject"))) { pagersubject = ast_strdup(val); + } if ((val = ast_variable_retrieve(cfg, "general", "pagerbody"))) { - char *tmpread, *tmpwrite; - pagerbody = ast_strdup(val); - - /* substitute strings \t and \n into the appropriate characters */ - tmpread = tmpwrite = pagerbody; - while ((tmpwrite = strchr(tmpread, '\\'))) { - switch (tmpwrite[1]) { - case 'r': - memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1); - *tmpwrite = '\r'; - break; - case 'n': - memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1); - *tmpwrite = '\n'; - break; - case 't': - memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1); - *tmpwrite = '\t'; - break; - default: - ast_log(AST_LOG_NOTICE, "Substitution routine does not support this character: %c\n", tmpwrite[1]); - } - tmpread = tmpwrite + 1; - } + pagerbody = substitute_escapes(val); } AST_LIST_UNLOCK(&users); ast_config_destroy(cfg);