From 92f1b1705a69394b944ea16aafbdb9d1351b3b81 Mon Sep 17 00:00:00 2001 From: Tom Kistner Date: Wed, 25 May 2005 20:07:55 +0000 Subject: Add simple SPF lookup method (armored in EXPERIMENTAL_SPF) --- src/scripts/MakeLinks | 4 ++- src/src/drtables.c | 23 ++++++++++++++- src/src/lookups/Makefile | 5 ++-- src/src/lookups/spf.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++ src/src/lookups/spf.h | 26 +++++++++++++++++ src/src/spf.c | 4 +-- 6 files changed, 131 insertions(+), 6 deletions(-) create mode 100644 src/src/lookups/spf.c create mode 100644 src/src/lookups/spf.h (limited to 'src') 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 +#include +#include + +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"); -- cgit v1.2.3