Mercurial > dovecot > core-2.2
changeset 22926:1e7e7ea7482d
lib-storage: Parse mail parts in mail_set_attachment_keywords if not present
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Thu, 12 Apr 2018 14:07:54 +0300 |
parents | 8307cbdd18bc |
children | 73eef2e5e7cc |
files | src/lib-storage/mail.c |
diffstat | 1 files changed, 21 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/mail.c Thu Apr 19 10:19:15 2018 +0300 +++ b/src/lib-storage/mail.c Thu Apr 12 14:07:54 2018 +0300 @@ -11,6 +11,7 @@ #include "mail-cache.h" #include "mail-storage-private.h" #include "message-part-data.h" +#include "imap-bodystructure.h" #include <time.h> @@ -496,6 +497,23 @@ 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_storage_set_critical(mail->box->storage, + "imap_bodystructure_parse() failed: %s", error); + return -1; + } + return 0; +} + int mail_set_attachment_keywords(struct mail *mail) { int ret; @@ -526,6 +544,9 @@ "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_storage_set_critical(mail->box->storage,