changeset 22781:4b60d9bdc1a7

lib-storage: Add attachment detection settings
author Aki Tuomi <aki.tuomi@dovecot.fi>
date Mon, 20 Nov 2017 10:09:23 +0200
parents a982d52a740b
children db50f01b8373
files src/lib-storage/mail-storage-settings.c src/lib-storage/mail-storage-settings.h
diffstat 2 files changed, 37 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/mail-storage-settings.c	Fri Nov 10 14:32:44 2017 +0200
+++ b/src/lib-storage/mail-storage-settings.c	Mon Nov 20 10:09:23 2017 +0200
@@ -30,6 +30,7 @@
 	DEF(SET_STR_VARS, mail_attachment_dir),
 	DEF(SET_STR, mail_attachment_hash),
 	DEF(SET_SIZE, mail_attachment_min_size),
+	DEF(SET_STR, mail_attachment_detection_options),
 	DEF(SET_STR_VARS, mail_attribute_dict),
 	DEF(SET_UINT, mail_prefetch_count),
 	DEF(SET_STR, mail_cache_fields),
@@ -85,6 +86,7 @@
 	.mail_attachment_dir = "",
 	.mail_attachment_hash = "%{sha1}",
 	.mail_attachment_min_size = 1024*128,
+	.mail_attachment_detection_options = "",
 	.mail_attribute_dict = "",
 	.mail_prefetch_count = 0,
 	.mail_cache_fields = "flags",
@@ -395,7 +397,7 @@
 }
 
 /* <settings checks> */
-static bool mail_storage_settings_check(void *_set, pool_t pool ATTR_UNUSED,
+static bool mail_storage_settings_check(void *_set, pool_t pool,
 					const char **error_r)
 {
 	struct mail_storage_settings *set = _set;
@@ -499,6 +501,34 @@
 
 	// FIXME: check set->mail_server_admin syntax (RFC 5464, Section 6.2.2)
 
+	/* parse mail_attachment_indicator_options */
+	if (*set->mail_attachment_detection_options != '\0') {
+		ARRAY_TYPE(const_string) content_types;
+		p_array_init(&content_types, pool, 2);
+
+		const char *const *options =
+			t_strsplit_spaces(set->mail_attachment_detection_options, " ");
+
+		while(*options != NULL) {
+			const char *opt = *options;
+
+			if (strcmp(opt, "add-flags-on-save") == 0) {
+				set->parsed_mail_attachment_detection_add_flags_on_save = TRUE;
+			} else if (strcmp(opt, "add-flags-on-fetch") == 0) {
+				set->parsed_mail_attachment_detection_add_flags_on_fetch = TRUE;
+			} else if (strcmp(opt, "exclude-inlined") == 0) {
+				set->parsed_mail_attachment_exclude_inlined = TRUE;
+			} else if (strncmp(opt, "content-type=", 13) == 0) {
+				const char *value = p_strdup(pool, opt+13);
+				array_append(&content_types, &value, 1);
+			}
+			options++;
+		}
+
+		array_append_zero(&content_types);
+		set->parsed_mail_attachment_content_type_filter = array_idx(&content_types, 0);
+	}
+
 	return TRUE;
 }
 
--- a/src/lib-storage/mail-storage-settings.h	Fri Nov 10 14:32:44 2017 +0200
+++ b/src/lib-storage/mail-storage-settings.h	Mon Nov 20 10:09:23 2017 +0200
@@ -61,9 +61,15 @@
 	const char *ssl_client_ca_dir;
 	const char *ssl_client_ca_file;
 	const char *ssl_crypto_device;
+	const char *mail_attachment_detection_options;
 
 	enum file_lock_method parsed_lock_method;
 	enum fsync_mode parsed_fsync_mode;
+
+	const char *const *parsed_mail_attachment_content_type_filter;
+	bool parsed_mail_attachment_exclude_inlined;
+	bool parsed_mail_attachment_detection_add_flags_on_save;
+	bool parsed_mail_attachment_detection_add_flags_on_fetch;
 };
 
 struct mail_namespace_settings {