Postfix SRS Patch ?

Michel Bouissou <[email protected]> Wed, 30 Jun 2004 00:06:59 +0200
Newsgroups gmane.mail.spam.srs.general
Organization Completely disorganized
Message-ID <[email protected]>
Hi there,

Has anybody had any success with the 
http://www.libsrs2.org/patch/postfix-libsrs2-2.0.19-1.patch Postfix patch ?

I have patched a Mandrake postfix-2.1.1-0.1.92mdk RPM with it, and first had 
difficulties applying the patch ("patch" itself was complaining that the 
patchfile was incorrect).

I performed a couple manual fixes, then got the patch to apply and Postfix to 
compile. (Please find attached my "fixed"' version of the patch).

Postfix seems to be running fine, I have configured the SRS parameters as 
follows :

[root@totor BUILD]# postconf | grep srs
srs_alwaysrewrite = yes
srs_hashlength = 8
srs_hashmin = 8
srs_maxage = 15
srs_secrets = thisisasecretkey
srs_separator = =

...after having found out that first the values didn't have the "sensible 
defaults" they were supposed to have (local crashed if srs_hashlength was not 
specified for example), and second the documentation is very unclear about 
which values should be used (for the hash length, or secret length and 
contents) as well as for the maxage unit (seconds ? hours ? days ?)  after 
having reviewed the libSRS website I decided for myself that this was 
probably days ;-)

Anyway, Postfix is now running without any complaint and without any special 
error message, but however doesn't perform _any_ SRS rewriting for messages 
that are forwarded to an external address, in any way (either by virtual, or 
by aliases, or by .forward).

It just behaves as if it simply wasn't there.

I have installed the libsrs2-1.0.13-1 RPM gotten from 
http://www.libsrs2.org/download.html

Any hint or clue would be greatly appreciated.

Best regards.

-- 
Michel Bouissou <[email protected]> OpenPGP ID 0xDDE8AC6E

-------
To unsubscribe, change your address, or temporarily deactivate your subscription, 
please go to http://v2.listbox.com/member/[email protected]
postfix-libsrs2-2.0.19-1.MiB.patch (text/x-diff, 9.3 KB)
diff -aurN --exclude=Makefile --exclude='*.orig' postfix-2.1.1-patch-Mdk/src/global/mail_params.h postfix-2.1.1-patch-Mdk-SRS/src/global/mail_params.h
--- postfix-2.1.1-patch-Mdk/src/global/mail_params.h	2004-06-29 12:14:22.000000000 +0200
+++ postfix-2.1.1-patch-Mdk-SRS/src/global/mail_params.h	2004-06-29 12:15:49.000000000 +0200
@@ -2112,6 +2112,33 @@
 extern bool var_strict_encoding;
 
  /*
+  * SRS. Shevek <[email protected]>
+  */
+#define VAR_SRS_ALWAYSREWRITE		"srs_alwaysrewrite"
+#define DEF_SRS_ALWAYSREWRITE		0
+extern bool var_srs_alwaysrewrite;
+
+#define VAR_SRS_HASHLENGTH		"srs_hashlength"
+#define DEF_SRS_HASHLENGTH		0
+extern int var_srs_hashlength;
+
+#define VAR_SRS_HASHMIN			"srs_hashmin"
+#define DEF_SRS_HASHMIN			0
+extern int var_srs_hashmin;
+
+#define VAR_SRS_MAXAGE			"srs_maxage"
+#define DEF_SRS_MAXAGE			0
+extern int var_srs_maxage;
+
+#define VAR_SRS_SECRETS			"srs_secrets"
+#define DEF_SRS_SECRETS			0
+extern char *var_srs_secrets;
+
+#define VAR_SRS_SEPARATOR		"srs_separator"
+#define DEF_SRS_SEPARATOR		0
+extern char *var_srs_separator;
+
+ /*
   * Bizarre.
   */
 #define VAR_SENDER_ROUTING		"sender_based_routing"
diff -aurN --exclude=Makefile --exclude='*.orig' postfix-2.1.1-patch-Mdk/src/local/indirect.c postfix-2.1.1-patch-Mdk-SRS/src/local/indirect.c
--- postfix-2.1.1-patch-Mdk/src/local/indirect.c	2002-11-17 00:44:57.000000000 +0100
+++ postfix-2.1.1-patch-Mdk-SRS/src/local/indirect.c	2004-06-29 12:15:49.000000000 +0200
@@ -71,6 +71,9 @@
     if (been_here(state.dup_filter, "indirect %s", state.msg_attr.recipient))
 	return (0);
 
+    /* Rewrite the sender address according to SRS. */
+    srs_forward(&state);
+
     /*
      * Don't forward a trace-only request.
      */
diff -aurN --exclude=Makefile --exclude='*.orig' postfix-2.1.1-patch-Mdk/src/local/local.c postfix-2.1.1-patch-Mdk-SRS/src/local/local.c
--- postfix-2.1.1-patch-Mdk/src/local/local.c	2004-04-11 22:03:08.000000000 +0200
+++ postfix-2.1.1-patch-Mdk-SRS/src/local/local.c	2004-06-29 12:15:49.000000000 +0200
@@ -522,6 +522,12 @@
 int     var_mailtool_compat;
 char   *var_mailbox_lock;
 int     var_mailbox_limit;
+bool    var_srs_alwaysrewrite;	/* Always perform SRS rewriting */
+int     var_srs_hashlength;		/* Hash length to generate */
+int     var_srs_hashmin;		/* Hash length to check */
+int     var_srs_maxage;			/* Max age of an SRS address */
+char   *var_srs_secrets;		/* Secret keys. Ssssssh! */
+char   *var_srs_separator;		/* Initial separator. */
 
 int     local_cmd_deliver_mask;
 int     local_file_deliver_mask;
@@ -735,6 +741,9 @@
     static CONFIG_INT_TABLE int_table[] = {
 	VAR_DUP_FILTER_LIMIT, DEF_DUP_FILTER_LIMIT, &var_dup_filter_limit, 0, 0,
 	VAR_MAILBOX_LIMIT, DEF_MAILBOX_LIMIT, &var_mailbox_limit, 0, 0,
+	VAR_SRS_HASHLENGTH, DEF_SRS_HASHLENGTH, &var_srs_hashlength, 1, 20,
+	VAR_SRS_HASHMIN, DEF_SRS_HASHMIN, &var_srs_hashmin, 0, 20,
+	VAR_SRS_MAXAGE, DEF_SRS_MAXAGE, &var_srs_maxage, 0, 0,
 	0,
     };
     static CONFIG_STR_TABLE str_table[] = {
@@ -751,6 +760,8 @@
 	VAR_PROP_EXTENSION, DEF_PROP_EXTENSION, &var_prop_extension, 0, 0,
 	VAR_DELIVER_HDR, DEF_DELIVER_HDR, &var_deliver_hdr, 0, 0,
 	VAR_MAILBOX_LOCK, DEF_MAILBOX_LOCK, &var_mailbox_lock, 1, 0,
+	VAR_SRS_SECRETS, DEF_SRS_SECRETS, &var_srs_secrets, 1, 0,
+	VAR_SRS_SEPARATOR, DEF_SRS_SEPARATOR, &var_srs_separator, 1, 1,
 	0,
     };
     static CONFIG_BOOL_TABLE bool_table[] = {
@@ -758,6 +769,7 @@
 	VAR_EXP_OWN_ALIAS, DEF_EXP_OWN_ALIAS, &var_exp_own_alias,
 	VAR_STAT_HOME_DIR, DEF_STAT_HOME_DIR, &var_stat_home_dir,
 	VAR_MAILTOOL_COMPAT, DEF_MAILTOOL_COMPAT, &var_mailtool_compat,
+	VAR_SRS_ALWAYSREWRITE, DEF_SRS_ALWAYSREWRITE, &var_srs_alwaysrewrite,
 	0,
     };
 
diff -aurN --exclude=Makefile --exclude='*.orig' postfix-2.1.1-patch-Mdk/src/local/Makefile.in postfix-2.1.1-patch-Mdk-SRS/src/local/Makefile.in
--- postfix-2.1.1-patch-Mdk/src/local/Makefile.in	2004-04-22 21:37:40.000000000 +0200
+++ postfix-2.1.1-patch-Mdk-SRS/src/local/Makefile.in	2004-06-29 12:19:07.000000000 +0200
@@ -13,8 +13,8 @@
 CFLAGS	= $(DEBUG) $(OPT) $(DEFS)
 PROG	= local
 TESTPROG= 
-INC_DIR	= ../../include
-LIBS	= ../../lib/libmaster.a ../../lib/libglobal.a ../../lib/libutil.a
+INC_DIR	= ../../include -I/usr/include
+LIBS	= ../../lib/libmaster.a ../../lib/libglobal.a ../../lib/libutil.a /usr/lib/libsrs2.a
 
 .c.o:;	$(CC) $(CFLAGS) -c $*.c
 
diff -aurN --exclude=Makefile --exclude='*.orig' postfix-2.1.1-patch-Mdk/src/local/recipient.c postfix-2.1.1-patch-Mdk-SRS/src/local/recipient.c
--- postfix-2.1.1-patch-Mdk/src/local/recipient.c	2002-12-09 20:11:25.000000000 +0100
+++ postfix-2.1.1-patch-Mdk-SRS/src/local/recipient.c	2004-06-29 12:15:49.000000000 +0200
@@ -112,6 +112,13 @@
 	MSG_LOG_STATE(myname, state);
 
 
+    if (strncasecmp(state.msg_attr.recipient, "SRS", 3) == 0) {
+    	status = srs_reverse(state, usr_attr);
+	/* SRS might return 1 if it thinks it was called in error. */
+	if (status <= 0)
+	    return (status);
+    }
+
     /*
      * \user is special: it means don't do any alias or forward expansion.
      * 
diff -aurN --exclude=Makefile --exclude='*.orig' postfix-2.1.1-patch-Mdk/src/local/srs.c postfix-2.1.1-patch-Mdk-SRS/src/local/srs.c
--- postfix-2.1.1-patch-Mdk/src/local/srs.c	1970-01-01 01:00:00.000000000 +0100
+++ postfix-2.1.1-patch-Mdk-SRS/src/local/srs.c	2004-06-29 12:15:49.000000000 +0200
@@ -0,0 +1,168 @@
+/*++
+/* NAME
+/*	srs 3
+/* SUMMARY
+/*	Sender Rewriting Scheme
+/* SYNOPSIS
+/*	#include "local.h"
+/*
+/*	void	srs_reverse(state, usr_attr)
+/*	LOCAL_STATE state;
+/*	USER_ATTR usr_attr
+/*
+/*	int srs_forward(state)
+/*	LOCAL_STATE *state;
+/* DESCRIPTION
+/*	This module rewrites addresses according to the Sender Rewriting
+/*  Scheme, documented at http://www.libsrs2.org/.
+/*
+/*	srs_reverse() reverse-rewrites the rewritten
+/*	form of an address and resubmits for delivery.
+/*
+/*	srs_forward() rewrites the msg_attr.sender field of the
+/*	given state so that it may be submitted to the forwarding
+/*	service.
+/*
+/* DIAGNOSTICS
+/* LICENSE
+/* .ad
+/* .fi
+/*	The Secure Mailer license must be distributed with this software.
+/* AUTHOR(S)
+/*	Shevek <[email protected]>
+/*--*/
+
+/* System library. */
+
+#include <sys_defs.h>
+#include <string.h>
+
+#ifdef STRCASECMP_IN_STRINGS_H
+#include <strings.h>
+#endif
+
+#include <srs2.h>
+
+/* Utility library. */
+
+#include <msg.h>
+#include <vstring.h>
+#include <argv.h>
+#include <htable.h>
+#include <mymalloc.h>
+#include <stringops.h>
+
+/* Global library. */
+
+#include <bounce.h>
+#include <defer.h>
+#include <mail_params.h>
+#include <split_addr.h>
+#include <strip_addr.h>
+#include <ext_prop.h>
+#include <mypwd.h>
+#include <canon_addr.h>
+
+/* Application-specific. */
+
+#include "local.h"
+
+#define SRS_FAIL_UNLESS(x) do { int __ret = (x); +    if (__ret != SRS_SUCCESS)  +	msg_fatal("SRS configuration error: %s", srs_strerror(__ret)); +    } while(0)
+
+/* srs_reverse - reverse-rewrite an SRS address */
+
+static srs_t *srs;
+
+static void srs_init()
+{
+    char        *saved_secrets;
+    char        *secret;
+    char        *ptr;
+
+    if (srs == NULL) {
+    	srs_set_malloc((srs_malloc_t)mymalloc,
+			(srs_realloc_t)myrealloc,
+			(srs_free_t)myfree);
+	srs = srs_new();
+	srs_set_alwaysrewrite(srs, var_srs_alwaysrewrite);
+	if (var_srs_hashlength > 0)
+	    SRS_FAIL_UNLESS(srs_set_hashlength(srs,var_srs_hashlength));
+    	if (var_srs_hashmin > 0)
+	    SRS_FAIL_UNLESS(srs_set_hashmin(srs, var_srs_hashmin));
+	if (var_srs_maxage > 0)
+	    SRS_FAIL_UNLESS(srs_set_maxage(srs, var_srs_maxage));
+	if (var_srs_separator > 0)
+	    SRS_FAIL_UNLESS(srs_set_separator(srs,var_srs_separator[0]));
+	if (var_srs_secrets) {
+	    ptr = saved_secrets = mystrdup(var_srs_secrets);
+	    while ((secret = mystrtok(&ptr, ", \t\r\n")) != 0)
+		SRS_FAIL_UNLESS(srs_add_secret(srs, secret));
+	    myfree(saved_secrets);
+	}
+    }
+}
+
+/* Called from recipient.c */
+int srs_reverse(LOCAL_STATE state, USER_ATTR usr_attr)
+{
+    char        *out;
+    int          ret;
+    TOK822	*addr;
+    int		 status;
+
+    if (!SRS_IS_SRS_ADDRESS(state.msg_attr.recipient))
+    	return 1;
+
+    srs_init();
+
+    ret = srs_reverse_alloc(srs, &out, state.msg_attr.recipient);
+    if (ret != SRS_SUCCESS) {
+	switch (SRS_ERROR_TYPE(ret)) {
+	    case SRS_ERRTYPE_CONFIG:
+		msg_fatal("SRS configuration error: %s",
+		    srs_strerror(ret));
+	    case SRS_ERRTYPE_INPUT:
+		msg_fatal("SRS input error: %s",
+		    srs_strerror(ret));
+	    case SRS_ERRTYPE_SYNTAX:
+		msg_warn("SRS syntax error: %s",
+		    srs_strerror(ret));
+		return 1;	/* Might not be SRS */
+	    case SRS_ERRTYPE_SRS:
+		msg_warn("SRS semantic error: %s",
+		    srs_strerror(ret));
+		/* Bin the mail, with prejudice. */
+		return DEL_STAT_FINAL;
+	}
+	return DEL_STAT_DEFER;
+    }
+
+    addr = tok822_scan_addr(out);
+    myfree(out);
+    status = deliver_resolve_tree(state, usr_attr, addr);
+    tok822_free_tree(addr);
+    return (status);
+}
+
+/* Called from [resolve.c ->] indirect.c [->forward.c] */
+int srs_forward(LOCAL_STATE *state)
+{
+    const char	*sender;
+    char        *out;
+    int          ret;
+    int		 status;
+
+    srs_init();
+
+    sender = state->msg_attr.sender;
+    ret = srs_forward_alloc(srs, &out, sender, "XXX.COM");
+    if (ret != SRS_SUCCESS) {
+	msg_warn("SRS forward failed (%s, %s): %s\n",
+			    sender, domain, srs_strerror(ret));
+	return DEL_STAT_DEFER;
+    }
+    /* XXX We leak this RAM later. */
+    state->msg_attr.sender = out;
+
+    return DEL_STAT_FINAL;
+}