diff src/conf.c @ 317:55b7bde95d37

reworked allowed and denied addrs for routes The following refactorings had been made: - allowed_mail_locals + allowed_return_paths -> allowed_senders - not_allowed_mail_locals + not_allowed_return_paths -> denied_senders - allowed_rcpt_domains -> allowed_recipients - not_allowed_rcpt_domains -> denied_recipients The new options allow more consistent and more flexible matching.
author meillo@marmaro.de
date Thu, 28 Apr 2011 09:55:06 +0200
parents e230bcd0f1c6
children d41fb3b9ed3e
line wrap: on
line diff
--- a/src/conf.c	Mon Apr 25 15:17:30 2011 +0200
+++ b/src/conf.c	Thu Apr 28 09:55:06 2011 +0200
@@ -142,8 +142,14 @@
 	return list;
 }
 
+/* Split the addrs at '@' into local_part and domain. Without an '@'
+   everything is local_part. Create address structs, which are put
+   into a list and returned.
+   This funktion is used for lists of addrs containing globbing chars (* and ?).
+   We don't need valid RFC821 addresses here, just patterns to match against.
+*/
 static GList*
-parse_address_list(gchar * line, gboolean read_file)
+parse_address_glob_list(gchar * line, gboolean read_file)
 {
 	GList *plain_list = parse_list(line, read_file);
 	GList *node;
@@ -151,13 +157,32 @@
 
 	foreach(plain_list, node) {
 		gchar *item = (gchar *) (node->data);
-		address *addr = create_address(item, TRUE);
-		if (addr)
-			list = g_list_append(list, addr);
+		char* at;
+		char* p;
+		address *addr = calloc(1, sizeof(address));
+
+		for (p=item+strlen(item)-1; isspace(*p) || *p=='>'; p--) {
+			*p = '\0';
+		}
+		for (p=item; isspace(*p) || *p=='<'; p++) {
+		}
+
+		addr->address = strdup(p);
+		at = strrchr(p, '@');
+		if (at) {
+			*at = '\0';
+			addr->local_part = strdup(p);
+			addr->domain = strdup(at+1);
+		} else {
+			addr->local_part = strdup(p);
+			addr->domain = "";
+		}
+		list = g_list_append(list, addr);
+		DEBUG(6) debugf("parse_address_glob_list: read pattern `%s' `%s'\n",
+		                addr->local_part, addr->domain);
 		g_free(item);
 	}
 	g_list_free(plain_list);
-
 	return list;
 }
 
@@ -648,18 +673,16 @@
 			route->instant_helo = parse_boolean(rval);
 		else if (strcmp(lval, "do_pipelining") == 0)
 			route->do_pipelining = parse_boolean(rval);
-		else if (strcmp(lval, "allowed_return_paths") == 0)
-			route->allowed_return_paths = parse_address_list(rval, TRUE);
-		else if (strcmp(lval, "allowed_mail_locals") == 0)
-			route->allowed_mail_locals = parse_list(rval, TRUE);
-		else if (strcmp(lval, "not_allowed_return_paths") == 0)
-			route->not_allowed_return_paths = parse_address_list(rval, TRUE);
-		else if (strcmp(lval, "not_allowed_mail_locals") == 0)
-			route->not_allowed_mail_locals = parse_list(rval, TRUE);
-		else if (strcmp(lval, "allowed_rcpt_domains") == 0)
-			route->allowed_rcpt_domains = parse_list(rval, TRUE);
-		else if (strcmp(lval, "not_allowed_rcpt_domains") == 0)
-			route->not_allowed_rcpt_domains = parse_list(rval, TRUE);
+
+		else if (strcmp(lval, "allowed_senders") == 0)
+			route->allowed_senders = parse_address_glob_list(rval, TRUE);
+		else if (strcmp(lval, "denied_senders") == 0)
+			route->denied_senders = parse_address_glob_list(rval, TRUE);
+		else if (strcmp(lval, "allowed_recipients") == 0)
+			route->allowed_recipients = parse_address_glob_list(rval, TRUE);
+		else if (strcmp(lval, "denied_recipients") == 0)
+			route->denied_recipients = parse_address_glob_list(rval, TRUE);
+
 		else if (strcmp(lval, "set_h_from_domain") == 0)
 			route->set_h_from_domain = g_strdup(rval);
 		else if (strcmp(lval, "set_h_reply_to_domain") == 0)
@@ -808,10 +831,10 @@
 		g_free(r->wrapper);
 	if (r->helo_name)
 		g_free(r->helo_name);
-	_g_list_free_all(r->allowed_mail_locals);
-	_g_list_free_all(r->not_allowed_mail_locals);
-	_g_list_free_all(r->allowed_rcpt_domains);
-	_g_list_free_all(r->not_allowed_rcpt_domains);
+	_g_list_free_all(r->allowed_senders);
+	_g_list_free_all(r->denied_senders);
+	_g_list_free_all(r->allowed_recipients);
+	_g_list_free_all(r->denied_recipients);
 	if (r->set_h_from_domain)
 		g_free(r->set_h_from_domain);
 	if (r->set_h_reply_to_domain)