dsync-transaction-log-scan.h
test_programs = \
+ test-dsync-mail \
test-dsync-mailbox-tree-sync
noinst_PROGRAMS = $(test_programs)
../../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)
return mailbox_header_lookup_init(box, hashed_headers);
}
-static void
-dsync_mail_hash_more(struct md5_context *md5_ctx, unsigned int version,
- const unsigned char *data, size_t size)
+void dsync_mail_hash_more(struct md5_context *md5_ctx, unsigned int version,
+ const unsigned char *data, size_t size)
{
size_t i, start;
- 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.
+ fetches, but not POP3 TOP. UTF-8 character sequence writes only a
+ single '?'
- So we'll just replace all control and 8bit chars with '?',
- which hopefully will satisfy everybody.
+ 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] >= 0x80) &&
+ if ((data[i] < 0x20 || data[i] >= 0x7f || data[i] == '?') &&
(data[i] != '\t' && data[i] != '\n')) {
- md5_update(md5_ctx, data + start, i-start);
- md5_update(md5_ctx, "?", 1);
+ /* remove repeated '?' */
+ if (start < i || i == 0) {
+ md5_update(md5_ctx, data + start, i-start);
+ md5_update(md5_ctx, "?", 1);
+ }
start = i+1;
}
}
#include "mail-types.h"
+struct md5_context;
struct mail;
struct mailbox;
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
--- /dev/null
+/* 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);
+}