summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Kistner <tom@duncanthrax.net>2005-05-25 20:07:55 +0000
committerTom Kistner <tom@duncanthrax.net>2005-05-25 20:07:55 +0000
commit92f1b1705a69394b944ea16aafbdb9d1351b3b81 (patch)
tree3e61a919a250269f5748fecd1af0793afbd9b5c1 /src
parent892a2814d206db660df9cc195ddff899ee4598d9 (diff)
Add simple SPF lookup method (armored in EXPERIMENTAL_SPF)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/scripts/MakeLinks4
-rw-r--r--src/src/drtables.c23
-rw-r--r--src/src/lookups/Makefile5
-rw-r--r--src/src/lookups/spf.c75
-rw-r--r--src/src/lookups/spf.h26
-rw-r--r--src/src/spf.c4
6 files changed, 131 insertions, 6 deletions
diff --git a/src/scripts/MakeLinks b/src/scripts/MakeLinks
index fea7c1d06..1b6c1d83e 100755
--- a/src/scripts/MakeLinks
+++ b/src/scripts/MakeLinks
@@ -1,5 +1,5 @@
#!/bin/sh
-# $Cambridge: exim/src/scripts/MakeLinks,v 1.3 2005/03/08 15:32:02 tom Exp $
+# $Cambridge: exim/src/scripts/MakeLinks,v 1.4 2005/05/25 20:07:55 tom Exp $
# Script to build links for all the exim source files from the system-
# specific build directory. It should be run from within that directory.
@@ -74,6 +74,8 @@ ln -s ../../src/lookups/passwd.h passwd.h
ln -s ../../src/lookups/passwd.c passwd.c
ln -s ../../src/lookups/pgsql.h pgsql.h
ln -s ../../src/lookups/pgsql.c pgsql.c
+ln -s ../../src/lookups/spf.h spf.h
+ln -s ../../src/lookups/spf.c spf.c
ln -s ../../src/lookups/testdb.h testdb.h
ln -s ../../src/lookups/testdb.c testdb.c
ln -s ../../src/lookups/whoson.h whoson.h
diff --git a/src/src/drtables.c b/src/src/drtables.c
index 686b39529..e9084b2ac 100644
--- a/src/src/drtables.c
+++ b/src/src/drtables.c
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/drtables.c,v 1.3 2005/05/24 08:15:02 tom Exp $ */
+/* $Cambridge: exim/src/src/drtables.c,v 1.4 2005/05/25 20:07:55 tom Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -89,6 +89,10 @@ be NULL for methods that don't need them. */
#include "lookups/pgsql.h"
#endif
+#ifdef EXPERIMENTAL_SPF
+#include "lookups/spf.h"
+#endif
+
#ifdef LOOKUP_TESTDB
#include "lookups/testdb.h"
#endif
@@ -437,6 +441,23 @@ Shares many functions with lsearch. */
#endif
},
+/* SPF lookup */
+
+ {
+ US"spf", /* lookup name */
+ 0, /* not absfile, not query style */
+#ifdef EXPERIMENTAL_SPF
+ spf_open, /* open function */
+ NULL, /* no check function */
+ spf_find, /* find function */
+ spf_close, /* close function */
+ NULL, /* no tidy function */
+ NULL /* no quoting function */
+#else
+ NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
+#endif
+ },
+
/* Testdb lookup is for testing Exim, not useful for normal running.
For that reason, we omit the entry entirely when not building it into
the binary, so that attempts to use it give "unknown lookup type" instead
diff --git a/src/src/lookups/Makefile b/src/src/lookups/Makefile
index da3260a98..40301e0de 100644
--- a/src/src/lookups/Makefile
+++ b/src/src/lookups/Makefile
@@ -1,4 +1,4 @@
-# $Cambridge: exim/src/src/lookups/Makefile,v 1.2 2005/05/17 09:53:35 ph10 Exp $
+# $Cambridge: exim/src/src/lookups/Makefile,v 1.3 2005/05/25 20:07:55 tom Exp $
# Make file for building a library containing all the available lookups and
# calling it lookups.a. This is called from the main make file, after cd'ing
@@ -6,7 +6,7 @@
# defined, dummy modules get compiled.
OBJ = cdb.o dbmdb.o dnsdb.o dsearch.o ibase.o ldap.o lsearch.o mysql.o nis.o \
- nisplus.o oracle.o passwd.o pgsql.o testdb.o whoson.o lf_check_file.o \
+ nisplus.o oracle.o passwd.o pgsql.o spf.o testdb.o whoson.o lf_check_file.o \
lf_quote.o
lookups.a: $(OBJ)
@@ -36,6 +36,7 @@ nisplus.o: $(HDRS) nisplus.c nisplus.h
oracle.o: $(HDRS) oracle.c oracle.h
passwd.o: $(HDRS) passwd.c passwd.h
pgsql.o: $(HDRS) pgsql.c pgsql.h
+spf.o: $(HDRS) spf.c spf.h
testdb.o: $(HDRS) testdb.c testdb.h
whoson.o: $(HDRS) whoson.c whoson.h
diff --git a/src/src/lookups/spf.c b/src/src/lookups/spf.c
new file mode 100644
index 000000000..ba5cf6b69
--- /dev/null
+++ b/src/src/lookups/spf.c
@@ -0,0 +1,75 @@
+/* $Cambridge: exim/src/src/lookups/spf.c,v 1.1 2005/05/25 20:07:55 tom Exp $ */
+
+/*************************************************
+* Exim - an Internet mail transport agent *
+*************************************************/
+
+/*
+ * Exim - SPF lookup module using libspf2
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * Copyright (c) 2005 Chris Webb, Arachsys Internet Services Ltd
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ */
+
+#include "../exim.h"
+
+#ifndef EXPERIMENTAL_SPF
+static void dummy(int x) { dummy(x-1); }
+#else
+
+#include "lf_functions.h"
+#include "spf.h"
+#include <spf2/spf.h>
+#include <spf2/spf_dns_resolv.h>
+#include <spf2/spf_dns_cache.h>
+
+void *spf_open(uschar *filename, uschar **errmsg) {
+ SPF_server_t *spf_server = NULL;
+ spf_server = SPF_server_new(SPF_DNS_CACHE, 0);
+ if (spf_server == NULL) {
+ *errmsg = US"SPF_server_new() failed";
+ return NULL;
+ }
+ return (void *) spf_server;
+}
+
+void spf_close(void *handle) {
+ SPF_server_t *spf_server = handle;
+ if (spf_server) SPF_server_free(spf_server);
+}
+
+int spf_find(void *handle, uschar *filename, uschar *keystring, int key_len,
+ uschar **result, uschar **errmsg, BOOL *do_cache) {
+ SPF_server_t *spf_server = handle;
+ SPF_request_t *spf_request = NULL;
+ SPF_response_t *spf_response = NULL;
+
+ spf_request = SPF_request_new(spf_server);
+ if (spf_request == NULL) {
+ *errmsg = US"SPF_request_new() failed";
+ return FAIL;
+ }
+
+ if (SPF_request_set_ipv4_str(spf_request, filename)) {
+ *errmsg = string_sprintf("invalid IP address '%s'", filename);
+ return FAIL;
+ }
+ if (SPF_request_set_env_from(spf_request, keystring)) {
+ *errmsg = string_sprintf("invalid envelope from address '%s'", keystring);
+ return FAIL;
+ }
+
+ SPF_request_query_mailfrom(spf_request, &spf_response);
+ *result = string_copy(US SPF_strresult(SPF_response_result(spf_response)));
+ SPF_response_free(spf_response);
+ SPF_request_free(spf_request);
+ return OK;
+}
+
+#endif /* EXPERIMENTAL_SPF */
diff --git a/src/src/lookups/spf.h b/src/src/lookups/spf.h
new file mode 100644
index 000000000..6b9056afc
--- /dev/null
+++ b/src/src/lookups/spf.h
@@ -0,0 +1,26 @@
+/* $Cambridge: exim/src/src/lookups/spf.h,v 1.1 2005/05/25 20:07:55 tom Exp $ */
+
+/*************************************************
+* Exim - an Internet mail transport agent *
+*************************************************/
+
+/*
+ * Exim - SPF lookup module using libspf2
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * Copyright (c) 2005 Chris Webb, Arachsys Internet Services Ltd
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+*/
+
+
+
+extern void *spf_open(uschar *, uschar **);
+extern void spf_close(void *);
+extern int spf_find(void *, uschar *, uschar *, int, uschar **, uschar **,
+ BOOL *);
+
diff --git a/src/src/spf.c b/src/src/spf.c
index 6fd744561..23c02be20 100644
--- a/src/src/spf.c
+++ b/src/src/spf.c
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/spf.c,v 1.4 2005/05/24 08:15:02 tom Exp $ */
+/* $Cambridge: exim/src/src/spf.c,v 1.5 2005/05/25 20:07:55 tom Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -25,7 +25,7 @@ SPF_response_t *spf_response_2mx = NULL;
int spf_init(uschar *spf_helo_domain, uschar *spf_remote_addr) {
uschar *p;
- spf_server = SPF_server_new(SPF_DNS_CACHE, 1);
+ spf_server = SPF_server_new(SPF_DNS_CACHE, 0);
if ( spf_server == NULL ) {
debug_printf("spf: SPF_server_new() failed.\n");