Add simple SPF lookup method (armored in EXPERIMENTAL_SPF)
authorTom Kistner <tom@duncanthrax.net>
Wed, 25 May 2005 20:07:55 +0000 (20:07 +0000)
committerTom Kistner <tom@duncanthrax.net>
Wed, 25 May 2005 20:07:55 +0000 (20:07 +0000)
src/scripts/MakeLinks
src/src/drtables.c
src/src/lookups/Makefile
src/src/lookups/spf.c [new file with mode: 0644]
src/src/lookups/spf.h [new file with mode: 0644]
src/src/spf.c

index fea7c1d06cc1dc4c2bc72ee1f627c6120f5740e2..1b6c1d83ee6dd0bb1929c714a113558854a1efae 100755 (executable)
@@ -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
index 686b395297a40e6d2269f4556b189869eb9bdad4..e9084b2acaa5226f8ffcf26d122e3c681840d7b8 100644 (file)
@@ -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
index da3260a98802a1aee9ea8ea1b2fa0c76d117ce56..40301e0deac50bf1a8dfeca2990ec6260f3d919e 100644 (file)
@@ -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 (file)
index 0000000..ba5cf6b
--- /dev/null
@@ -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 (file)
index 0000000..6b9056a
--- /dev/null
@@ -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 *);
+
index 6fd7445615ceb95a86087bbcceb1640dc860bfeb..23c02be208286b1195606f21e5d73e8d4effc737 100644 (file)
@@ -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");