]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Parse mail parts in mail_set_attachment_keywords if not present
authorAki Tuomi <aki.tuomi@dovecot.fi>
Thu, 12 Apr 2018 11:07:54 +0000 (14:07 +0300)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Fri, 27 Apr 2018 06:29:44 +0000 (09:29 +0300)
src/lib-storage/mail.c

index 9564fcf99947ff433a87df5253430a9c31b93442..a5b4c386c224d70b755f60a4e042b49485cd19c9 100644 (file)
@@ -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>
 
@@ -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: "