changeset 21:09564d4acd9e stable-1-0-8

patches from Marco d'Itri for postfix
author Carl Byington <carl@five-ten-sg.com>
date Fri, 24 Dec 2010 15:13:18 -0800
parents a7564d29fd53
children 67481a1a502f
files AUTHORS ChangeLog NEWS configure.in sm-archive.spec.in src/context.cpp src/sm-archive.cpp
diffstat 7 files changed, 33 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/AUTHORS	Thu Jun 12 18:19:42 2008 -0700
+++ b/AUTHORS	Fri Dec 24 15:13:18 2010 -0800
@@ -1,2 +1,3 @@
 510 Software Group <carl@five-ten-sg.com>
 Sergey Shapovalov <shasn@reso.ru>
+Marco d'Itri <md@Linux.IT>
--- a/ChangeLog	Thu Jun 12 18:19:42 2008 -0700
+++ b/ChangeLog	Fri Dec 24 15:13:18 2010 -0800
@@ -1,3 +1,6 @@
+1.8 2010-12-24
+    patches from Marco d'Itri for postfix
+
 1.7 2008-06-12
     Fedora 9 compile and const correctness.
 
--- a/NEWS	Thu Jun 12 18:19:42 2008 -0700
+++ b/NEWS	Fri Dec 24 15:13:18 2010 -0800
@@ -1,3 +1,4 @@
+1.8  2010-12-24 patches from Marco d'Itri for postfix
 1.7  2008-06-12 Fedora 9 compile and const correctness.
 1.6  2008-03-21 Add src/daemon* missing from source control.
 1.5  2007-08-24 GPL3. Can now remove original recipients.
--- a/configure.in	Thu Jun 12 18:19:42 2008 -0700
+++ b/configure.in	Fri Dec 24 15:13:18 2010 -0800
@@ -1,5 +1,5 @@
 AC_PREREQ(2.59)
-AC_INIT(sm-archive,1.7,carl@five-ten-sg.com)
+AC_INIT(sm-archive,1.8,carl@five-ten-sg.com)
 AC_CONFIG_SRCDIR([config.h.in])
 AC_CONFIG_HEADER([config.h])
 
--- a/sm-archive.spec.in	Thu Jun 12 18:19:42 2008 -0700
+++ b/sm-archive.spec.in	Fri Dec 24 15:13:18 2010 -0800
@@ -83,6 +83,9 @@
 
 
 %changelog
+* Fri Dec 24 2010 Carl Byington <carl@five-ten-sg.com> - 1.8-1
+- patches from Marco d'Itri for postfix
+
 * Thu Jun 12 2008 Carl Byington <carl@five-ten-sg.com> - 1.7-1
 - Fedora 9 compile and const correctness.
 
--- a/src/context.cpp	Thu Jun 12 18:19:42 2008 -0700
+++ b/src/context.cpp	Fri Dec 24 15:13:18 2010 -0800
@@ -33,15 +33,13 @@
 bool CONFIG::find(const char *needle, string_set &haystack) {
 	string_set::iterator i = haystack.find(needle);
 	if (i != haystack.end()) return true;		   // found user@domain.tld key
-	char *x = strchr(needle, '@');
+	const char *x = strchr(needle, '@');
 	if (x) {
 		x++;
 		i = haystack.find(x);
 		if (i != haystack.end()) return true;	   // found domain.tld key
-		char y = *x;
-		*x = '\0';
-		i = haystack.find(needle);
-		*x = y;
+		string userpart(needle, x-needle);
+		i = haystack.find(userpart.c_str());
 		if (i != haystack.end()) return true;	   // found user@ key
 	}
 	return false;
@@ -51,15 +49,13 @@
 const char *CONFIG::find(const char *needle, string_map &haystack) {
 	string_map::iterator i = haystack.find(needle);
 	if (i != haystack.end()) return (*i).second;		// found user@domain.tld key
-	char *x = strchr(needle, '@');
+	const char *x = strchr(needle, '@');
 	if (x) {
 		x++;
 		i = haystack.find(x);
 		if (i != haystack.end()) return (*i).second;	// found domain.tld key
-		char y = *x;
-		*x = '\0';
-		i = haystack.find(needle);
-		*x = y;
+		string userpart(needle, x-needle);
+		i = haystack.find(userpart.c_str());
 		if (i != haystack.end()) return (*i).second;	// found user@ key
 	}
 	return NULL;
--- a/src/sm-archive.cpp	Thu Jun 12 18:19:42 2008 -0700
+++ b/src/sm-archive.cpp	Fri Dec 24 15:13:18 2010 -0800
@@ -108,7 +108,8 @@
 void my_syslog(mlfiPriv *priv, const char *text) {
 	char buf[maxlen];
 	if (priv) {
-		snprintf(buf, sizeof(buf), "%s: %s", priv->queueid, text);
+		snprintf(buf, sizeof(buf), "%s: %s",
+		    priv->queueid ? priv->queueid : "NOQUEUE", text);
 		text = buf;
 	}
 	if (use_syslog) {
@@ -135,14 +136,21 @@
 // always be enclosed in <>. It may have mixed case, just
 // as the mail client sent it. We dup the string and convert
 // the duplicate to lower case.
+// Postfix will return addresses without <> if they have been provided
+// this way in the SMTP dialog.
 //
 const char *to_lower_string(const char *email);
 const char *to_lower_string(const char *email) {
-	int n = strlen(email)-2;
-	if (n < 1) return strdup(email);
-	char *key = strdup(email+1);
-	key[n] = '\0';
-	for (int i=0; i<n; i++) key[i] = tolower(key[i]);
+	char *key, *p;
+	int i;
+
+	if (strcmp(email, "<>") == 0) return strdup(email);
+	if (email[0] == '<') p = (char *) email + 1;
+	else                 p = (char *) email;
+	key = (char *) malloc(strlen(p) + 1);
+	for (i = 0; p[i] != '\0'; i++) key[i] = tolower(p[i]);
+	if (p[i - 1] == '>') i--;
+	key[i] = '\0';
 	return key;
 }
 
@@ -189,7 +197,8 @@
 {
 	mlfiPriv &priv = *MLFIPRIV;
 	CONFIG &dc = *priv.pc;
-	if (!priv.queueid) priv.queueid = strdup(smfi_getsymval(ctx, (char*)"i"));
+	const char *i_macro = smfi_getsymval(ctx, (char*)"i");
+	if (!priv.queueid && i_macro) priv.queueid = strdup(i_macro);
 	const char *rcptaddr	= to_lower_string(rcpt[0]);
 	if (debug_syslog > 1) {
 		char msg[maxlen];
@@ -208,6 +217,8 @@
 {
 	mlfiPriv &priv = *MLFIPRIV;
 	CONFIG &dc = *priv.pc;
+	const char *i_macro = smfi_getsymval(ctx, (char*)"i");
+	if (!priv.queueid && i_macro) priv.queueid = strdup(i_macro);
 	const char *target = dc.find_from(priv.mailaddr);
 	add_target(priv, target);
 	for (string_set::iterator i=priv.targets.begin(); i!=priv.targets.end(); i++) {