isync

mailbox synchronization program
git clone https://git.code.sf.net/p/isync/isync
Log | Files | Refs | README | LICENSE

commit 8979ebbdf221f51290fffbf941f7c517c2bf7ae0
parent 57a0920fcbfb9201f0b9e898d66c3232545aae23
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date:   Tue,  1 Sep 2015 14:21:45 +0200

tolerate case changes in X-TUID header name

it is legal for an email system to simply change the case of rfc2822
headers, and at least one imap server apparently does just that.
this would lead to us not finding our own header, which is obviously not
helpful.

REFMAIL: CA+fD2U3hJEszmvwBsXEpTsaWgJ2Dh373mCESM3M0kg3ZwAYjaw@mail.gmail.com

Diffstat:
Msrc/common.h | 1+
Msrc/drv_imap.c | 2+-
Msrc/sync.c | 2+-
Msrc/util.c | 16++++++++++++++++
4 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/common.h b/src/common.h @@ -116,6 +116,7 @@ void *memrchr( const void *s, int c, size_t n ); #endif int starts_with( const char *str, int strl, const char *cmp, int cmpl ); +int starts_with_upper( const char *str, int strl, const char *cmp, int cmpl ); int equals( const char *str, int strl, const char *cmp, int cmpl ); #ifndef HAVE_TIMEGM diff --git a/src/drv_imap.c b/src/drv_imap.c @@ -967,7 +967,7 @@ parse_fetch_rsp( imap_store_t *ctx, list_t *list, char *s ATTR_UNUSED ) tmp = tmp->next; if (!is_atom( tmp )) goto bfail; - if (starts_with( tmp->val, tmp->len, "X-TUID: ", 8 )) + if (starts_with_upper( tmp->val, tmp->len, "X-TUID: ", 8 )) tuid = tmp->val + 8; } else { bfail: diff --git a/src/sync.c b/src/sync.c @@ -338,7 +338,7 @@ msg_fetched( int sts, void *aux ) if (c == '\r') lcrs++; else if (c == '\n') { - if (starts_with( fmap + start, len - start, "X-TUID: ", 8 )) { + if (starts_with_upper( fmap + start, len - start, "X-TUID: ", 8 )) { extra = (sbreak = start) - (ebreak = i); goto oke; } diff --git a/src/util.c b/src/util.c @@ -27,6 +27,7 @@ #include <unistd.h> #include <fcntl.h> #include <string.h> +#include <ctype.h> #include <pwd.h> static int need_nl; @@ -242,6 +243,21 @@ starts_with( const char *str, int strl, const char *cmp, int cmpl ) } int +starts_with_upper( const char *str, int strl, const char *cmp, int cmpl ) +{ + int i; + + if (strl < 0) + strl = strnlen( str, cmpl + 1 ); + if (strl < cmpl) + return 0; + for (i = 0; i < cmpl; i++) + if (str[i] != cmp[i] && toupper( str[i] ) != cmp[i]) + return 0; + return 1; +} + +int equals( const char *str, int strl, const char *cmp, int cmpl ) { if (strl < 0)