From 3f573f875988d4fe2f8c35ccca95c066b77ec13b Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Sat, 7 Feb 2009 18:26:50 +0100
Subject: [PATCH] Defined very basic function for address comparison.

---
 TODO                                          |  4 +++-
 src/lib-sieve/cmd-redirect.c                  |  5 +++--
 src/lib-sieve/plugins/enotify/ntfy-mailto.c   |  8 +++++---
 src/lib-sieve/plugins/vacation/cmd-vacation.c |  9 ++++++---
 src/lib-sieve/sieve-address.c                 | 15 +++++++++++++++
 src/lib-sieve/sieve-address.h                 |  3 +++
 6 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/TODO b/TODO
index e4bc25e80..b0ccb34ad 100644
--- a/TODO
+++ b/TODO
@@ -46,7 +46,9 @@ Next (in order of descending priority/precedence):
 	- add support for testing the content of result actions
 	- test as many error/warning/info conditions as possible. 
 	- review the specification documents and check whether the given conditions
-	  are tested at least once. 
+	  are tested at least once.
+* Code cleanup:
+	- Make address handling more uniform. 
 
 * Build a sieve tool to filter an entire existing mailbox through a sieve 
   script.
diff --git a/src/lib-sieve/cmd-redirect.c b/src/lib-sieve/cmd-redirect.c
index 1692ae3c5..1efff576c 100644
--- a/src/lib-sieve/cmd-redirect.c
+++ b/src/lib-sieve/cmd-redirect.c
@@ -251,8 +251,9 @@ static bool act_redirect_equals
 	struct act_redirect_context *rd_ctx2 = 
 		(struct act_redirect_context *) ctx2;
 
-	/* Address is already normalized, strcmp suffices to assess duplicates */
-	return ( strcmp(rd_ctx1->to_address, rd_ctx2->to_address) == 0 );
+	/* Address is already normalized */
+	return ( sieve_address_compare
+		(rd_ctx1->to_address, rd_ctx2->to_address, TRUE) == 0 );
 }
  
 static int act_redirect_check_duplicate
diff --git a/src/lib-sieve/plugins/enotify/ntfy-mailto.c b/src/lib-sieve/plugins/enotify/ntfy-mailto.c
index 87262bf62..aeb556095 100644
--- a/src/lib-sieve/plugins/enotify/ntfy-mailto.c
+++ b/src/lib-sieve/plugins/enotify/ntfy-mailto.c
@@ -284,7 +284,8 @@ static bool _uri_add_valid_recipient
 		
 		/* Check for duplicate first */
 		for ( i = 0; i < count; i++ ) {
-			if ( strcmp(rcpts[i].normalized, normalized) == 0 ) {
+			if ( sieve_address_compare(rcpts[i].normalized, normalized, TRUE) == 0 ) 
+				{
 				/* Upgrade existing Cc: recipient to a To: recipient if possible */
 				rcpts[i].carbon_copy = ( rcpts[i].carbon_copy && cc );
 				
@@ -772,8 +773,9 @@ static int ntfy_mailto_action_check_duplicates
 
 	for ( i = 0; i < new_count; i++ ) {
 		for ( j = 0; j < old_count; j++ ) {
-			if ( strcmp(new_rcpts[i].normalized, old_rcpts[j].normalized) == 0 )
-				 break;				
+			if ( sieve_address_compare
+				(new_rcpts[i].normalized, old_rcpts[j].normalized, TRUE) == 0 )
+				break;				
 		}
 
 		if ( j == old_count ) {
diff --git a/src/lib-sieve/plugins/vacation/cmd-vacation.c b/src/lib-sieve/plugins/vacation/cmd-vacation.c
index f62c189e7..5ecaac59f 100644
--- a/src/lib-sieve/plugins/vacation/cmd-vacation.c
+++ b/src/lib-sieve/plugins/vacation/cmd-vacation.c
@@ -834,10 +834,12 @@ static inline bool _contains_my_address
 
 			while ( addr != NULL && !result ) {
 				if (addr->domain != NULL) {
+					const char *hdr_address; 
+					
 					i_assert(addr->mailbox != NULL);
 
-					if ( strcasecmp(t_strconcat(addr->mailbox, "@", addr->domain, NULL),
-						my_address) == 0 ) {
+					hdr_address = t_strconcat(addr->mailbox, "@", addr->domain, NULL);
+					if ( sieve_address_compare(hdr_address, my_address, TRUE) == 0 ) {
 						result = TRUE;
 						break;
 					}
@@ -975,7 +977,8 @@ static bool act_vacation_commit
 	/* Are we perhaps trying to respond to ourselves ? 
 	 * (FIXME: verify this to :addresses as well?)
 	 */
-	if ( strcasecmp(msgdata->return_path, msgdata->to_address) == 0 ) {
+	if ( sieve_address_compare(msgdata->return_path, msgdata->to_address, TRUE) 
+		== 0 ) {
 		sieve_result_log(aenv, "discarded vacation reply to own address");	
 		return TRUE;
 	}
diff --git a/src/lib-sieve/sieve-address.c b/src/lib-sieve/sieve-address.c
index e46fe5b77..1666180c9 100644
--- a/src/lib-sieve/sieve-address.c
+++ b/src/lib-sieve/sieve-address.c
@@ -350,6 +350,21 @@ bool sieve_address_validate
 	return TRUE;
 }
 
+int sieve_address_compare
+(const char *address1, const char *address2, bool normalized ATTR_UNUSED)
+{
+	/* NOTE: this deviates from RFC specification in that it compares the local 
+	 * part of the address case-insensitively. This however conforms to the 
+	 * consensus in mail software.
+	 */
+	 
+	/* FIXME: provided addresses are currently assumed to be normalized to 
+	 * local_part@domain
+	 */
+	 
+	return strcasecmp(address1, address2);
+}
+
 /*
  * RFC 2821 addresses (envelope paths)
  */
diff --git a/src/lib-sieve/sieve-address.h b/src/lib-sieve/sieve-address.h
index 200bcb811..8593ce8be 100644
--- a/src/lib-sieve/sieve-address.h
+++ b/src/lib-sieve/sieve-address.h
@@ -27,6 +27,9 @@ const char *sieve_address_normalize
 	(string_t *address, const char **error_r);
 bool sieve_address_validate
 	(string_t *address, const char **error_r);
+	
+int sieve_address_compare
+	(const char *address1, const char *address2, bool normalized);
 
 /*
  * RFC 2821 addresses (paths)
-- 
GitLab