dovecot-2.2-pigeonhole: lib-sieve: Accept non-standard domain na...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Sat Dec 20 15:45:42 UTC 2014


details:   http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/0a412dd2c168
changeset: 1978:0a412dd2c168
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Sat Dec 20 16:45:32 2014 +0100
description:
lib-sieve: Accept non-standard domain names, e.g. containing '_'.

diffstat:

 src/lib-sieve/sieve-address.c    |  16 ++++++++++------
 tests/extensions/envelope.svtest |  26 ++++++++++++++++++++++++++
 2 files changed, 36 insertions(+), 6 deletions(-)

diffs (83 lines):

diff -r e8882cfd73af -r 0a412dd2c168 src/lib-sieve/sieve-address.c
--- a/src/lib-sieve/sieve-address.c	Wed Dec 17 01:15:04 2014 +0100
+++ b/src/lib-sieve/sieve-address.c	Sat Dec 20 16:45:32 2014 +0100
@@ -696,6 +696,10 @@
 	 * sub-domain = Let-dig [Ldh-str]
 	 * Let-dig = ALPHA / DIGIT
 	 * Ldh-str = *( ALPHA / DIGIT / "-" ) Let-dig
+	 *
+	 * NOTE: A more generic syntax is accepted to be lenient towards
+	 *       systems that don't adhere to the standards. It allows
+	 *       '-' and '_' to occur anywhere in a sub-domain.
 	 */
 
 	str_truncate(parser->str, 0);
@@ -705,27 +709,27 @@
 		if ( ret < 0 ) return ret;
 	} else {
 		for (;;) {
-			if ( !i_isalnum(*parser->data) )
+			if ( parser->data >= parser->end ||
+				(!i_isalnum(*parser->data) && *parser->data != '-' &&
+				*parser->data != '_') )
 				return -1;
 
 			str_append_c(parser->str, *parser->data);
 			parser->data++;
 
 			while ( parser->data < parser->end ) {
-				if ( !i_isalnum(*parser->data) && *parser->data != '-' )
+				if ( !i_isalnum(*parser->data) && *parser->data != '-' &&
+					*parser->data != '_' )
 					break;
 
 				str_append_c(parser->str, *parser->data);
 				parser->data++;
 			}
 
-			if ( !i_isalnum(*(parser->data-1)) )
-				return -1;
-
 			if ( (ret=path_skip_white_space(parser)) < 0 )
 				return ret;
 
-			if ( *parser->data != '.' )
+			if ( parser->data >= parser->end || *parser->data != '.' )
 				break;
 
 			str_append_c(parser->str, *parser->data);
diff -r e8882cfd73af -r 0a412dd2c168 tests/extensions/envelope.svtest
--- a/tests/extensions/envelope.svtest	Wed Dec 17 01:15:04 2014 +0100
+++ b/tests/extensions/envelope.svtest	Sat Dec 20 16:45:32 2014 +0100
@@ -265,5 +265,31 @@
 	if not envelope :localpart :is "to" "..japanese...localpart.." {
 		test_fail "failed to parse japanese local_part (4)";
 	}
+}
 
+test "Envelope - Non-standard hostnames" {
+	test_set "envelope.to" "japanese at _example.com";
+	if not envelope :domain :is "to" "_example.com" {
+		test_fail "failed to parse non-standard domain (1)";
+	}
+
+	test_set "envelope.to" "japanese at ex_ample.com";
+	if not envelope :domain :is "to" "ex_ample.com" {
+		test_fail "failed to parse non-standard domain (2)";
+	}
+
+	test_set "envelope.to" "japanese at example_.com";
+	if not envelope :domain :is "to" "example_.com" {
+		test_fail "failed to parse non-standard domain (3)";
+	}
+
+	test_set "envelope.to" "japanese at -example.com";
+	if not envelope :domain :is "to" "-example.com" {
+		test_fail "failed to parse non-standard domain (4)";
+	}
+
+	test_set "envelope.to" "japanese at example-.com";
+	if not envelope :domain :is "to" "example-.com" {
+		test_fail "failed to parse non-standard domain (5)";
+	}
 }


More information about the dovecot-cvs mailing list