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