# HG changeset patch # User Timo Sirainen # Date 1454018913 -7200 # Node ID d3aa060852e67ff98642ed1dca8403c5040c7cac # Parent 71627df0160885becd61b8c50ce15c355eb4320b lib-mail, dsync: Moved dsync_mail_hash_more() to lib-mail/message-header-hash.* diff -r 71627df01608 -r d3aa060852e6 src/doveadm/dsync/Makefile.am --- a/src/doveadm/dsync/Makefile.am Mon Feb 01 14:44:11 2016 +0200 +++ b/src/doveadm/dsync/Makefile.am Fri Jan 29 00:08:33 2016 +0200 @@ -58,7 +58,6 @@ dsync-transaction-log-scan.h test_programs = \ - test-dsync-mail \ test-dsync-mailbox-tree-sync noinst_PROGRAMS = $(test_programs) @@ -67,10 +66,6 @@ ../../lib-test/libtest.la \ ../../lib/liblib.la -test_dsync_mail_SOURCES = test-dsync-mail.c -test_dsync_mail_LDADD = $(pkglib_LTLIBRARIES) $(test_libs) -test_dsync_mail_DEPENDENCIES = $(pkglib_LTLIBRARIES) $(test_libs) - test_dsync_mailbox_tree_sync_SOURCES = test-dsync-mailbox-tree-sync.c test_dsync_mailbox_tree_sync_LDADD = dsync-mailbox-tree-sync.lo dsync-mailbox-tree.lo $(test_libs) test_dsync_mailbox_tree_sync_DEPENDENCIES = $(pkglib_LTLIBRARIES) $(test_libs) diff -r 71627df01608 -r d3aa060852e6 src/doveadm/dsync/dsync-mail.c --- a/src/doveadm/dsync/dsync-mail.c Mon Feb 01 14:44:11 2016 +0200 +++ b/src/doveadm/dsync/dsync-mail.c Fri Jan 29 00:08:33 2016 +0200 @@ -6,6 +6,7 @@ #include "md5.h" #include "istream.h" #include "istream-crlf.h" +#include "message-header-hash.h" #include "message-size.h" #include "mail-storage.h" #include "dsync-mail.h" @@ -24,45 +25,6 @@ return mailbox_header_lookup_init(box, hashed_headers); } -void dsync_mail_hash_more(struct md5_context *md5_ctx, unsigned int version, - const unsigned char *data, size_t size) -{ - size_t i, start; - - i_assert(version == 1 || version == 2); - - if (version == 1) { - md5_update(md5_ctx, data, size); - return; - } - /* - Dovecot IMAP replaces NULs with 0x80 character. - - Dovecot POP3 with outlook-no-nuls workaround replaces NULs - with 0x80 character. - - Zimbra replaces 8bit chars with '?' in header fetches, - but not body fetches. - - Yahoo replaces 8bit chars with '?' in partial header - fetches, but not POP3 TOP. UTF-8 character sequence writes only a - single '?' - - So we'll just replace all control and 8bit chars with '?' and - remove any repeated '?', which hopefully will satisfy everybody. - - (Keep this code in sync with pop3-migration plugin.) - */ - for (i = start = 0; i < size; i++) { - if ((data[i] < 0x20 || data[i] >= 0x7f || data[i] == '?') && - (data[i] != '\t' && data[i] != '\n')) { - /* remove repeated '?' */ - if (start < i || i == 0) { - md5_update(md5_ctx, data + start, i-start); - md5_update(md5_ctx, "?", 1); - } - start = i+1; - } - } - md5_update(md5_ctx, data + start, i-start); -} - int dsync_mail_get_hdr_hash(struct mail *mail, unsigned int version, const char **hdr_hash_r) { @@ -88,7 +50,7 @@ break; if (size == 0) break; - dsync_mail_hash_more(&md5_ctx, version, data, size); + message_header_hash_more(&md5_ctx, version, data, size); i_stream_skip(input, size); } if (input->stream_errno != 0) diff -r 71627df01608 -r d3aa060852e6 src/doveadm/dsync/dsync-mail.h --- a/src/doveadm/dsync/dsync-mail.h Mon Feb 01 14:44:11 2016 +0200 +++ b/src/doveadm/dsync/dsync-mail.h Fri Jan 29 00:08:33 2016 +0200 @@ -96,8 +96,4 @@ void dsync_mail_change_dup(pool_t pool, const struct dsync_mail_change *src, struct dsync_mail_change *dest_r); -/* private: */ -void dsync_mail_hash_more(struct md5_context *md5_ctx, unsigned int version, - const unsigned char *data, size_t size); - #endif diff -r 71627df01608 -r d3aa060852e6 src/doveadm/dsync/test-dsync-mail.c --- a/src/doveadm/dsync/test-dsync-mail.c Mon Feb 01 14:44:11 2016 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -/* Copyright (c) 2016 Dovecot authors, see the included COPYING file */ - -#include "lib.h" -#include "md5.h" -#include "dsync-mail.h" -#include "test-common.h" - -static const unsigned char test_input[] = - "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" - "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" - "\x20!?x??yz\x7f\x80\x90\xff-plop\xff"; -static const unsigned char test_output[] = - "?\t\n? !?x?yz?-plop?"; - -static void test_dsync_mail_hash_more(void) -{ - struct md5_context md5_ctx; - unsigned char md5_input[MD5_RESULTLEN], md5_output[MD5_RESULTLEN]; - - test_begin("dsync_mail_hash_more v2"); - md5_init(&md5_ctx); - dsync_mail_hash_more(&md5_ctx, 2, test_input, sizeof(test_input)-1); - md5_final(&md5_ctx, md5_input); - - md5_init(&md5_ctx); - md5_update(&md5_ctx, test_output, sizeof(test_output)-1); - md5_final(&md5_ctx, md5_output); - - test_assert(memcmp(md5_input, md5_output, MD5_RESULTLEN) == 0); - test_end(); -} - -int main(void) -{ - static void (*test_functions[])(void) = { - test_dsync_mail_hash_more, - NULL - }; - return test_run(test_functions); -} diff -r 71627df01608 -r d3aa060852e6 src/lib-mail/Makefile.am --- a/src/lib-mail/Makefile.am Mon Feb 01 14:44:11 2016 +0200 +++ b/src/lib-mail/Makefile.am Fri Jan 29 00:08:33 2016 +0200 @@ -22,6 +22,7 @@ message-decoder.c \ message-header-decode.c \ message-header-encode.c \ + message-header-hash.c \ message-header-parser.c \ message-id.c \ message-parser.c \ @@ -57,6 +58,7 @@ message-decoder.h \ message-header-decode.h \ message-header-encode.h \ + message-header-hash.h \ message-header-parser.h \ message-id.h \ message-parser.h \ @@ -87,6 +89,7 @@ test-message-decoder \ test-message-header-decode \ test-message-header-encode \ + test-message-header-hash \ test-message-header-parser \ test-message-id \ test-message-parser \ @@ -157,6 +160,10 @@ test_message_header_encode_LDADD = message-header-encode.lo $(test_libs) test_message_header_encode_DEPENDENCIES = $(test_deps) +test_message_header_hash_SOURCES = test-message-header-hash.c +test_message_header_hash_LDADD = message-header-hash.lo $(test_libs) +test_message_header_hash_DEPENDENCIES = $(test_deps) + test_message_header_parser_SOURCES = test-message-header-parser.c test_message_header_parser_LDADD = message-header-parser.lo $(test_libs) test_message_header_parser_DEPENDENCIES = $(test_deps) diff -r 71627df01608 -r d3aa060852e6 src/lib-mail/message-header-hash.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib-mail/message-header-hash.c Fri Jan 29 00:08:33 2016 +0200 @@ -0,0 +1,45 @@ +/* Copyright (c) 2013-2016 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "md5.h" +#include "message-header-hash.h" + +void message_header_hash_more(struct md5_context *md5_ctx, + unsigned int version, + const unsigned char *data, size_t size) +{ + size_t i, start; + + i_assert(version == 1 || version == 2); + + if (version == 1) { + md5_update(md5_ctx, data, size); + return; + } + /* - Dovecot IMAP replaces NULs with 0x80 character. + - Dovecot POP3 with outlook-no-nuls workaround replaces NULs + with 0x80 character. + - Zimbra replaces 8bit chars with '?' in header fetches, + but not body fetches. + - Yahoo replaces 8bit chars with '?' in partial header + fetches, but not POP3 TOP. UTF-8 character sequence writes only a + single '?' + + So we'll just replace all control and 8bit chars with '?' and + remove any repeated '?', which hopefully will satisfy everybody. + + (Keep this code in sync with pop3-migration plugin.) + */ + for (i = start = 0; i < size; i++) { + if ((data[i] < 0x20 || data[i] >= 0x7f || data[i] == '?') && + (data[i] != '\t' && data[i] != '\n')) { + /* remove repeated '?' */ + if (start < i || i == 0) { + md5_update(md5_ctx, data + start, i-start); + md5_update(md5_ctx, "?", 1); + } + start = i+1; + } + } + md5_update(md5_ctx, data + start, i-start); +} diff -r 71627df01608 -r d3aa060852e6 src/lib-mail/message-header-hash.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib-mail/message-header-hash.h Fri Jan 29 00:08:33 2016 +0200 @@ -0,0 +1,10 @@ +#ifndef MESSAGE_HEADER_HASH_H +#define MESSAGE_HEADER_HASH_H + +struct md5_context; + +void message_header_hash_more(struct md5_context *md5_ctx, + unsigned int version, + const unsigned char *data, size_t size); + +#endif diff -r 71627df01608 -r d3aa060852e6 src/lib-mail/test-message-header-hash.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib-mail/test-message-header-hash.c Fri Jan 29 00:08:33 2016 +0200 @@ -0,0 +1,40 @@ +/* Copyright (c) 2016 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "test-common.h" +#include "md5.h" +#include "message-header-hash.h" + +static const unsigned char test_input[] = + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" + "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + "\x20!?x??yz\x7f\x80\x90\xff-plop\xff"; +static const unsigned char test_output[] = + "?\t\n? !?x?yz?-plop?"; + +static void test_dsync_mail_hash_more(void) +{ + struct md5_context md5_ctx; + unsigned char md5_input[MD5_RESULTLEN], md5_output[MD5_RESULTLEN]; + + test_begin("dsync_mail_hash_more v2"); + md5_init(&md5_ctx); + message_header_hash_more(&md5_ctx, 2, test_input, sizeof(test_input)-1); + md5_final(&md5_ctx, md5_input); + + md5_init(&md5_ctx); + md5_update(&md5_ctx, test_output, sizeof(test_output)-1); + md5_final(&md5_ctx, md5_output); + + test_assert(memcmp(md5_input, md5_output, MD5_RESULTLEN) == 0); + test_end(); +} + +int main(void) +{ + static void (*test_functions[])(void) = { + test_dsync_mail_hash_more, + NULL + }; + return test_run(test_functions); +}