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