From: Aki Tuomi Date: Thu, 12 Apr 2018 11:07:54 +0000 (+0300) Subject: lib-storage: Parse mail parts in mail_set_attachment_keywords if not present X-Git-Tag: 2.3.2.rc1~157 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5a5cd70a82f06df6e1f2fe0a66e12ee8f790860c;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Parse mail parts in mail_set_attachment_keywords if not present --- diff --git a/src/lib-storage/mail.c b/src/lib-storage/mail.c index 9564fcf999..a5b4c386c2 100644 --- a/src/lib-storage/mail.c +++ b/src/lib-storage/mail.c @@ -11,6 +11,7 @@ #include "mail-cache.h" #include "mail-storage-private.h" #include "message-part-data.h" +#include "imap-bodystructure.h" #include @@ -471,6 +472,23 @@ bool mail_has_attachment_keywords(struct mail *mail) str_array_icase_find(kw, MAIL_KEYWORD_HAS_NO_ATTACHMENT)); } +static int mail_parse_parts(struct mail *mail, struct message_part **parts_r) +{ + const char *structure, *error; + struct mail_private *pmail = (struct mail_private*)mail; + + /* need to get bodystructure first */ + if (mail_get_special(mail, MAIL_FETCH_IMAP_BODYSTRUCTURE, &structure) < 0) + return -1; + if (imap_bodystructure_parse_full(structure, pmail->data_pool, parts_r, + &error) < 0) { + mail_set_critical(mail, "imap_bodystructure_parse() failed: %s", + error); + return -1; + } + return 0; +} + int mail_set_attachment_keywords(struct mail *mail) { int ret; @@ -500,6 +518,9 @@ int mail_set_attachment_keywords(struct mail *mail) "mail_get_parts() failed: %s", mail_storage_get_last_internal_error(mail->box->storage, NULL)); ret = -1; + } else if (parts->data == NULL && + mail_parse_parts(mail, &parts) < 0) { + ret = -1; } else if (mailbox_keywords_create(mail->box, keyword_has_attachment, &kw_has) < 0 || mailbox_keywords_create(mail->box, keyword_has_no_attachment, &kw_has_not) < 0) { mail_set_critical(mail, "Failed to add attachment keywords: "