From 863908931fee506fa98c6fa254c0d667abf0a02e Mon Sep 17 00:00:00 2001 From: Alexander Krotov Date: Sat, 2 Jun 2018 20:08:50 +0300 Subject: [PATCH 1/4] initialize from_addr_norm with NULL Otherwise, if mimeparser is NULL, "goto cleanup" is triggered and uninitialized pointer will be freed. clang warns about this during compilation. --- src/mrmimeparser.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mrmimeparser.c b/src/mrmimeparser.c index 5e47c711..26c7cea8 100644 --- a/src/mrmimeparser.c +++ b/src/mrmimeparser.c @@ -1862,7 +1862,7 @@ int mrmimeparser_sender_equals_recipient(mrmimeparser_t* mimeparser) const struct mailimf_field* fld; const struct mailimf_from* fld_from; struct mailimf_mailbox* mb; - char* from_addr_norm; + char* from_addr_norm = NULL; mrhash_t* recipients = NULL; if( mimeparser == NULL || mimeparser->m_header_root == NULL ) { From 5adbaa5795bf533731a7e68f59fb4a6332d31f49 Mon Sep 17 00:00:00 2001 From: Thomas Oster Date: Sun, 3 Jun 2018 00:22:22 +0200 Subject: [PATCH 2/4] Use INBOX.Chats as fallback if Chats can't be created --- src/mrchat-private.h | 1 + src/mrimap.c | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/mrchat-private.h b/src/mrchat-private.h index 032734ed..30eb90c1 100644 --- a/src/mrchat-private.h +++ b/src/mrchat-private.h @@ -62,6 +62,7 @@ int mrchat_are_all_members_verified__ (mrchat_t*); #define MR_CHAT_PREFIX "Chat:" /* you MUST NOT modify this or the following strings */ #define MR_CHATS_FOLDER "Chats" /* if we want to support Gma'l-labels - "Chats" is a reserved word for Gma'l */ +#define MR_CHATS_FOLDER_FALLBACK "INBOX.Chats"/* This is used if the toplevel folder can't be created (e.g DomainFactory) */ #ifdef __cplusplus diff --git a/src/mrimap.c b/src/mrimap.c index ff090cc1..23bf4a0c 100644 --- a/src/mrimap.c +++ b/src/mrimap.c @@ -316,7 +316,7 @@ static int init_chat_folders__(mrimap_t* ths) folder_list = list_folders__(ths); for( iter1 = clist_begin(folder_list); iter1 != NULL ; iter1 = clist_next(iter1) ) { mrimapfolder_t* folder = (struct mrimapfolder_t*)clist_content(iter1); - if( strcmp(folder->m_name_utf8, MR_CHATS_FOLDER)==0 ) { + if( strcmp(folder->m_name_utf8, MR_CHATS_FOLDER)==0 || strcmp(folder->m_name_utf8, MR_CHATS_FOLDER_FALLBACK)==0 ) { chats_folder = safe_strdup(folder->m_name_to_select); break; } @@ -332,8 +332,16 @@ static int init_chat_folders__(mrimap_t* ths) mrmailbox_log_info(ths->m_mailbox, 0, "Creating IMAP-folder \"%s\"...", MR_CHATS_FOLDER); int r = mailimap_create(ths->m_hEtpan, MR_CHATS_FOLDER); if( is_error(ths, r) ) { - /* continue on errors, we'll just use a different folder then */ - mrmailbox_log_warning(ths->m_mailbox, 0, "Cannot create IMAP-folder, using default."); + mrmailbox_log_warning(ths->m_mailbox, 0, "Cannot create IMAP-folder, using trying INBOX subfolder."); + r = mailimap_create(ths->m_hEtpan, MR_CHATS_FOLDER_FALLBACK); + if( is_error(ths, r) ) { + /* continue on errors, we'll just use a different folder then */ + mrmailbox_log_warning(ths->m_mailbox, 0, "Cannot create IMAP-folder, using default."); + } + else { + chats_folder = safe_strdup(MR_CHATS_FOLDER_FALLBACK); + mrmailbox_log_info(ths->m_mailbox, 0, "IMAP-folder created (inbox subfolder)."); + } } else { chats_folder = safe_strdup(MR_CHATS_FOLDER); From 9bd3ececeb8421b1fe8735ebdf3b5eda21007739 Mon Sep 17 00:00:00 2001 From: Thomas Oster Date: Mon, 4 Jun 2018 09:20:16 +0200 Subject: [PATCH 3/4] Feature: Detect IMAP separator for INBOX subfolder --- src/mrchat-private.h | 1 - src/mrimap.c | 21 ++++++++++++++++----- src/mrimap.h | 1 + 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/mrchat-private.h b/src/mrchat-private.h index 30eb90c1..032734ed 100644 --- a/src/mrchat-private.h +++ b/src/mrchat-private.h @@ -62,7 +62,6 @@ int mrchat_are_all_members_verified__ (mrchat_t*); #define MR_CHAT_PREFIX "Chat:" /* you MUST NOT modify this or the following strings */ #define MR_CHATS_FOLDER "Chats" /* if we want to support Gma'l-labels - "Chats" is a reserved word for Gma'l */ -#define MR_CHATS_FOLDER_FALLBACK "INBOX.Chats"/* This is used if the toplevel folder can't be created (e.g DomainFactory) */ #ifdef __cplusplus diff --git a/src/mrimap.c b/src/mrimap.c index 23bf4a0c..2e233e44 100644 --- a/src/mrimap.c +++ b/src/mrimap.c @@ -233,10 +233,16 @@ static clist* list_folders__(mrimap_t* ths) mrmailbox_log_warning(ths->m_mailbox, 0, "Cannot get folder list."); goto cleanup; } - + //default IMAP delimiter if none is returned by the list command + ths->m_imap_delimiter = '.'; for( iter1 = clist_begin(imap_list); iter1 != NULL ; iter1 = clist_next(iter1) ) { struct mailimap_mailbox_list* imap_folder = (struct mailimap_mailbox_list*)clist_content(iter1); + if (imap_folder->mb_delimiter) { + /* Set IMAP delimiter */ + ths->m_imap_delimiter = imap_folder->mb_delimiter; + } + mrimapfolder_t* ret_folder = calloc(1, sizeof(mrimapfolder_t)); if( strcasecmp(imap_folder->mb_name, "INBOX")==0 ) { @@ -312,11 +318,16 @@ static int init_chat_folders__(mrimap_t* ths) free(ths->m_moveto_folder); ths->m_moveto_folder = NULL; - + //this sets ths->m_imap_delimiter as side-effect folder_list = list_folders__(ths); + + //as a fallback, the chats_folder is created under INBOX as required e.g. for DomainFactory + char fallback_folder[64]; + snprintf(fallback_folder, sizeof(fallback_folder), "INBOX%c%s", ths->m_imap_delimiter, MR_CHATS_FOLDER); + for( iter1 = clist_begin(folder_list); iter1 != NULL ; iter1 = clist_next(iter1) ) { mrimapfolder_t* folder = (struct mrimapfolder_t*)clist_content(iter1); - if( strcmp(folder->m_name_utf8, MR_CHATS_FOLDER)==0 || strcmp(folder->m_name_utf8, MR_CHATS_FOLDER_FALLBACK)==0 ) { + if( strcmp(folder->m_name_utf8, MR_CHATS_FOLDER)==0 || strcmp(folder->m_name_utf8, fallback_folder)==0 ) { chats_folder = safe_strdup(folder->m_name_to_select); break; } @@ -333,13 +344,13 @@ static int init_chat_folders__(mrimap_t* ths) int r = mailimap_create(ths->m_hEtpan, MR_CHATS_FOLDER); if( is_error(ths, r) ) { mrmailbox_log_warning(ths->m_mailbox, 0, "Cannot create IMAP-folder, using trying INBOX subfolder."); - r = mailimap_create(ths->m_hEtpan, MR_CHATS_FOLDER_FALLBACK); + r = mailimap_create(ths->m_hEtpan, fallback_folder); if( is_error(ths, r) ) { /* continue on errors, we'll just use a different folder then */ mrmailbox_log_warning(ths->m_mailbox, 0, "Cannot create IMAP-folder, using default."); } else { - chats_folder = safe_strdup(MR_CHATS_FOLDER_FALLBACK); + chats_folder = safe_strdup(fallback_folder); mrmailbox_log_info(ths->m_mailbox, 0, "IMAP-folder created (inbox subfolder)."); } } diff --git a/src/mrimap.h b/src/mrimap.h index 80f64c83..08b7b455 100644 --- a/src/mrimap.h +++ b/src/mrimap.h @@ -68,6 +68,7 @@ typedef struct mrimap_t int m_has_xlist; char* m_moveto_folder;/* Folder, where reveived chat messages should go to. Normally "Chats" but may be NULL to leave them in the INBOX */ char* m_sent_folder; /* Folder, where send messages should go to. Normally "Chats". */ + char m_imap_delimiter;/* IMAP Path separator. Set as a side-effect in list_folders__ */ pthread_mutex_t m_idlemutex; /* set, if idle is not possible; morover, the interrupted IDLE thread waits a second before IDLEing again; this allows several jobs to be executed */ pthread_mutex_t m_inwait_mutex; /* only used to wait for mailstream_wait_idle()/mailimap_idle_done() to terminate. */ From 4222fcf7c5742552410ba3f7d731058137dbf53e Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Mon, 4 Jun 2018 22:10:47 +0200 Subject: [PATCH 4/4] rename folder Chats to DeltaChat, fixes #47 --- src/mrchat-private.h | 2 +- src/mrimap.h | 4 ++-- src/mrmailbox_receive_imf.c | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/mrchat-private.h b/src/mrchat-private.h index 032734ed..a9e8328f 100644 --- a/src/mrchat-private.h +++ b/src/mrchat-private.h @@ -61,7 +61,7 @@ int mrchat_are_all_members_verified__ (mrchat_t*); #define MR_CHAT_PREFIX "Chat:" /* you MUST NOT modify this or the following strings */ -#define MR_CHATS_FOLDER "Chats" /* if we want to support Gma'l-labels - "Chats" is a reserved word for Gma'l */ +#define MR_CHATS_FOLDER "DeltaChat" // make sure not to use reserved words here, eg. "Chats" or "Chat" are reserved in gmail #ifdef __cplusplus diff --git a/src/mrimap.h b/src/mrimap.h index 08b7b455..6a9ee7c3 100644 --- a/src/mrimap.h +++ b/src/mrimap.h @@ -66,8 +66,8 @@ typedef struct mrimap_t int m_can_idle; int m_has_xlist; - char* m_moveto_folder;/* Folder, where reveived chat messages should go to. Normally "Chats" but may be NULL to leave them in the INBOX */ - char* m_sent_folder; /* Folder, where send messages should go to. Normally "Chats". */ + char* m_moveto_folder;// Folder, where reveived chat messages should go to. Normally MR_CHATS_FOLDER, may be NULL to leave them in the INBOX + char* m_sent_folder; // Folder, where send messages should go to. Normally MR_CHATS_FOLDER. char m_imap_delimiter;/* IMAP Path separator. Set as a side-effect in list_folders__ */ pthread_mutex_t m_idlemutex; /* set, if idle is not possible; morover, the interrupted IDLE thread waits a second before IDLEing again; this allows several jobs to be executed */ pthread_mutex_t m_inwait_mutex; /* only used to wait for mailstream_wait_idle()/mailimap_idle_done() to terminate. */ diff --git a/src/mrmailbox_receive_imf.c b/src/mrmailbox_receive_imf.c index 6d16d8b1..7ba46f00 100644 --- a/src/mrmailbox_receive_imf.c +++ b/src/mrmailbox_receive_imf.c @@ -1261,17 +1261,17 @@ void mrmailbox_receive_imf(mrmailbox_t* mailbox, const char* imf_raw_not_termina mrmailbox_unarchive_chat__(mailbox, chat_id); /* if the message is not sent by a messenger, check if it is sent at least as a reply to a messenger message - (later, we move these replies to the Chats-folder) */ + (later, we move these replies to the folder used for DeltaChat messages) */ int msgrmsg = mime_parser->m_is_send_by_messenger; /* 1 or 0 for yes/no */ if( msgrmsg ) { - mrmailbox_log_info(mailbox, 0, "Message sent by another messenger (will be moved to Chats-folder)."); + mrmailbox_log_info(mailbox, 0, "Message sent by another messenger."); } else { if( mrmailbox_is_reply_to_messenger_message__(mailbox, mime_parser) ) { - mrmailbox_log_info(mailbox, 0, "Message is a reply to a messenger message (will be moved to Chats-folder)."); + mrmailbox_log_info(mailbox, 0, "Message is a reply to a messenger message."); msgrmsg = 2; /* 2=no, but is reply to messenger message */ } }