dovecot-2.2-pigeonhole: Added support for Japanese mail addresse...
pigeonhole at rename-it.nl
pigeonhole at rename-it.nl
Sat Aug 23 20:52:36 UTC 2014
details: http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/62abeb85c8a5
changeset: 1910:62abeb85c8a5
user: Stephan Bosch <stephan at rename-it.nl>
date: Sat Aug 23 22:52:30 2014 +0200
description:
Added support for Japanese mail addresses with dots at non-standard places in localpart.
Based on patch by Timo Sirainen.
diffstat:
src/lib-sieve/sieve-address.c | 52 +++++++++++++++++++++++----------
tests/compile/errors/out-address.sieve | 5 +++
tests/extensions/envelope.svtest | 23 +++++++++++++++
3 files changed, 64 insertions(+), 16 deletions(-)
diffs (129 lines):
diff -r 0b25efe31d79 -r 62abeb85c8a5 src/lib-sieve/sieve-address.c
--- a/src/lib-sieve/sieve-address.c Sat Aug 23 21:16:34 2014 +0200
+++ b/src/lib-sieve/sieve-address.c Sat Aug 23 22:52:30 2014 +0200
@@ -276,10 +276,28 @@
}
str_truncate(ctx->local_part, 0);
- if (*ctx->parser.data == '"')
+ if (*ctx->parser.data == '"') {
ret = rfc822_parse_quoted_string(&ctx->parser, ctx->local_part);
- else
- ret = rfc822_parse_dot_atom(&ctx->parser, ctx->local_part);
+ } else {
+ ret = -1;
+ /* NOTE: this deviates from dot-atom syntax to allow some Japanese
+ mail addresses with dots at non-standard places to be accepted. */
+ do {
+ while (*ctx->parser.data == '.') {
+ str_append_c(ctx->local_part, '.');
+ ctx->parser.data++;
+ if (ctx->parser.data == ctx->parser.end) {
+ /* @domain is missing, but local-part
+ parsing was successful */
+ return 0;
+ }
+ ret = 1;
+ }
+ if (*ctx->parser.data == '@')
+ break;
+ ret = rfc822_parse_atom(&ctx->parser, ctx->local_part);
+ } while (ret > 0 && *ctx->parser.data == '.');
+ }
if (ret < 0) {
sieve_address_error(ctx, "invalid local part");
@@ -780,6 +798,7 @@
str_truncate(parser->str, 0);
if ( *parser->data == '"' ) {
+ /* Quoted-string = DQUOTE *qcontent DQUOTE */
str_append_c(parser->str, *parser->data);
parser->data++;
@@ -813,13 +832,15 @@
if ( (ret=path_skip_white_space(parser)) < 0 )
return ret;
} else {
- for (;;) {
- if ( !IS_ATEXT(*parser->data) )
- return -1;
- str_append_c(parser->str, *parser->data);
- parser->data++;
+ /* Dot-string = Atom *("." Atom) */
- while ( parser->data < parser->end && IS_ATEXT(*parser->data)) {
+ /* NOTE: this deviates from Dot-String syntax to allow some Japanese
+ mail addresses with dots at non-standard places to be accepted. */
+
+ if ( !IS_ATEXT(*parser->data) && *parser->data != '.' )
+ return -1;
+ while ( IS_ATEXT(*parser->data) || *parser->data == '.' ) {
+ while ( parser->data < parser->end && IS_ATEXT(*parser->data) ) {
str_append_c(parser->str, *parser->data);
parser->data++;
}
@@ -827,14 +848,13 @@
if ( (ret=path_skip_white_space(parser)) < 0 )
return ret;
- if ( *parser->data != '.' )
- break;
+ while ( parser->data < parser->end && *parser->data == '.' ) {
+ str_append_c(parser->str, *parser->data);
+ parser->data++;
+ }
- str_append_c(parser->str, *parser->data);
- parser->data++;
-
- if ( path_skip_white_space(parser) <= 0 )
- return -1;
+ if ( (ret=path_skip_white_space(parser)) < 0 )
+ return ret;
}
}
diff -r 0b25efe31d79 -r 62abeb85c8a5 tests/compile/errors/out-address.sieve
--- a/tests/compile/errors/out-address.sieve Sat Aug 23 21:16:34 2014 +0200
+++ b/tests/compile/errors/out-address.sieve Sat Aug 23 22:52:30 2014 +0200
@@ -24,4 +24,9 @@
redirect "ok at example.com";
redirect " more @ example.com ";
+redirect ".japanese at example.com";
+redirect "japanese. at example.com";
+redirect "japanese...localpart at example.com";
+redirect "..japanese...localpart.. at example.com";
+
vacation :from "good at voorbeeld.nl.example.com" "Ik ben weg!";
diff -r 0b25efe31d79 -r 62abeb85c8a5 tests/extensions/envelope.svtest
--- a/tests/extensions/envelope.svtest Sat Aug 23 21:16:34 2014 +0200
+++ b/tests/extensions/envelope.svtest Sat Aug 23 22:52:30 2014 +0200
@@ -244,3 +244,26 @@
test_fail "failed to parse local_part only path with whitespace";
}
}
+
+test "Envelope - Japanese localpart" {
+ test_set "envelope.to" ".japanese at example.com";
+ if not envelope :localpart :is "to" ".japanese" {
+ test_fail "failed to parse japanese local_part (1)";
+ }
+
+ test_set "envelope.to" "japanese. at example.com";
+ if not envelope :localpart :is "to" "japanese." {
+ test_fail "failed to parse japanese local_part (2)";
+ }
+
+ test_set "envelope.to" "japanese...localpart at example.com";
+ if not envelope :localpart :is "to" "japanese...localpart" {
+ test_fail "failed to parse japanese local_part (3)";
+ }
+
+ test_set "envelope.to" "..japanese...localpart.. at example.com";
+ if not envelope :localpart :is "to" "..japanese...localpart.." {
+ test_fail "failed to parse japanese local_part (4)";
+ }
+
+}
More information about the dovecot-cvs
mailing list