dovecot-2.2-pigeonhole: lib-sieve: Made message part content typ...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Sun Nov 15 21:46:07 UTC 2015


details:   http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/f2c5a9f92e0d
changeset: 2132:f2c5a9f92e0d
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Sun Nov 15 22:46:01 2015 +0100
description:
lib-sieve: Made message part content type and disposition available to extensions.

diffstat:

 src/lib-sieve/sieve-message.c |  42 +++++++++++++++++++++++++++++++++++++++---
 src/lib-sieve/sieve-message.h |   3 +++
 2 files changed, 42 insertions(+), 3 deletions(-)

diffs (100 lines):

diff -r e26cb6c0bf07 -r f2c5a9f92e0d src/lib-sieve/sieve-message.c
--- a/src/lib-sieve/sieve-message.c	Sat Nov 14 00:36:19 2015 +0100
+++ b/src/lib-sieve/sieve-message.c	Sun Nov 15 22:46:01 2015 +0100
@@ -61,6 +61,7 @@
 
 struct sieve_message_body_part_cached {
 	const char *content_type;
+	const char *content_disposition;
 
 	const char *decoded_body;
 	const char *text_body;
@@ -892,6 +893,8 @@
 
 		/* Add new item to the result */
 		return_part = array_append_space(&msgctx->return_body_parts);
+		return_part->content_type = body_parts[i].content_type;
+		return_part->content_disposition = body_parts[i].content_disposition;
 
 		/* Depending on whether a decoded body part is requested, the appropriate
 		 * cache item is read. If it is missing, this function fails and the cache
@@ -990,6 +993,30 @@
 	return str_c(content_type);
 }
 
+static const char *
+_parse_content_disposition(const struct message_header_line *hdr)
+{
+	struct rfc822_parser_context parser;
+	string_t *content_disp;
+
+	/* Initialize parsing */
+	rfc822_parser_init(&parser, hdr->full_value, hdr->full_value_len, NULL);
+	(void)rfc822_skip_lwsp(&parser);
+
+	/* Parse content type */
+	content_disp = t_str_new(64);
+	if (rfc822_parse_mime_token(&parser, content_disp) < 0)
+		return "";
+
+	/* Content-type value must end here, otherwise it is invalid after all */
+	(void)rfc822_skip_lwsp(&parser);
+	if ( parser.data != parser.end && *parser.data != ';' )
+		return "";
+
+	/* Success */
+	return str_c(content_disp);
+}
+
 /* sieve_message_body_parts_add_missing():
  *   Add requested message body parts to the cache that are missing.
  */
@@ -1107,6 +1134,8 @@
 		}
 
 		if ( block.hdr != NULL || block.size == 0 ) {
+			bool is_ctype = FALSE;
+
 			/* Reading headers */
 
 			/* Decode block */
@@ -1150,7 +1179,9 @@
 			}
 
 			/* We're interested in only the Content-Type: header */
-			if ( strcasecmp(block.hdr->name, "Content-Type" ) != 0 )
+			if ( strcasecmp(block.hdr->name, "Content-Type" ) == 0 )
+				is_ctype = TRUE;
+			else if ( strcasecmp(block.hdr->name, "Content-Disposition" ) != 0 )
 				continue;
 
 			/* Header can have folding whitespace. Acquire the full value before
@@ -1165,8 +1196,13 @@
 
 			/* Parse the content type from the Content-type header */
 			T_BEGIN {
-				body_part->content_type =
-					p_strdup(pool, _parse_content_type(block.hdr));
+				if ( is_ctype ) {
+					body_part->content_type =
+						p_strdup(pool, _parse_content_type(block.hdr));
+				} else {
+					body_part->content_disposition =
+						p_strdup(pool, _parse_content_disposition(block.hdr));
+				}
 			} T_END;
 
 			continue;
diff -r e26cb6c0bf07 -r f2c5a9f92e0d src/lib-sieve/sieve-message.h
--- a/src/lib-sieve/sieve-message.h	Sat Nov 14 00:36:19 2015 +0100
+++ b/src/lib-sieve/sieve-message.h	Sun Nov 15 22:46:01 2015 +0100
@@ -173,6 +173,9 @@
  */
 
 struct sieve_message_body_part {
+	const char *content_type;
+	const char *content_disposition;
+
 	const char *content;
 	unsigned long size;
 };


More information about the dovecot-cvs mailing list