Commit | Line | Data |
---|---|---|
92f1b170 TK |
1 | /************************************************* |
2 | * Exim - an Internet mail transport agent * | |
3 | *************************************************/ | |
4 | ||
5 | /* | |
6 | * Exim - SPF lookup module using libspf2 | |
7 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
8 | * | |
9 | * Copyright (c) 2005 Chris Webb, Arachsys Internet Services Ltd | |
10 | * | |
11 | * This program is free software; you can redistribute it and/or | |
12 | * modify it under the terms of the GNU General Public License | |
13 | * as published by the Free Software Foundation; either version 2 | |
14 | * of the License, or (at your option) any later version. | |
15 | * | |
80fea873 | 16 | * Copyright (c) The Exim Maintainers 2016 |
92f1b170 TK |
17 | */ |
18 | ||
19 | #include "../exim.h" | |
20 | ||
7952eef9 | 21 | #ifndef SUPPORT_SPF |
e1d15f5e JH |
22 | static void dummy(int x); |
23 | static void dummy2(int x) { dummy(x-1); } | |
24 | static void dummy(int x) { dummy2(x-1); } | |
92f1b170 TK |
25 | #else |
26 | ||
27 | #include "lf_functions.h" | |
bda76da8 JH |
28 | #if !defined(HAVE_NS_TYPE) && defined(NS_INADDRSZ) |
29 | # define HAVE_NS_TYPE | |
56dda33c | 30 | #endif |
92f1b170 TK |
31 | #include <spf2/spf.h> |
32 | #include <spf2/spf_dns_resolv.h> | |
33 | #include <spf2/spf_dns_cache.h> | |
34 | ||
14b3c5bc JH |
35 | static void * |
36 | spf_open(uschar *filename, uschar **errmsg) | |
37 | { | |
de2e5b3d JH |
38 | SPF_server_t *spf_server; |
39 | if ((spf_server = SPF_server_new(SPF_DNS_CACHE, 0))) | |
92f1b170 | 40 | return (void *) spf_server; |
de2e5b3d JH |
41 | *errmsg = US"SPF_server_new() failed"; |
42 | return NULL; | |
92f1b170 TK |
43 | } |
44 | ||
14b3c5bc JH |
45 | static void |
46 | spf_close(void *handle) | |
47 | { | |
de2e5b3d JH |
48 | SPF_server_t *spf_server = handle; |
49 | if (spf_server) SPF_server_free(spf_server); | |
92f1b170 TK |
50 | } |
51 | ||
14b3c5bc | 52 | static int |
eac732ad | 53 | spf_find(void *handle, uschar *filename, const uschar *keystring, int key_len, |
14b3c5bc JH |
54 | uschar **result, uschar **errmsg, uint *do_cache) |
55 | { | |
de2e5b3d JH |
56 | SPF_server_t *spf_server = handle; |
57 | SPF_request_t *spf_request; | |
58 | SPF_response_t *spf_response = NULL; | |
92f1b170 | 59 | |
de2e5b3d JH |
60 | if (!(spf_request = SPF_request_new(spf_server))) |
61 | { | |
62 | *errmsg = US"SPF_request_new() failed"; | |
63 | return FAIL; | |
92f1b170 TK |
64 | } |
65 | ||
de2e5b3d JH |
66 | #if HAVE_IPV6 |
67 | switch (string_is_ip_address(filename, NULL)) | |
68 | { | |
69 | case 4: | |
70 | #endif | |
71 | if (!SPF_request_set_ipv4_str(spf_request, CS filename)) | |
72 | break; | |
73 | *errmsg = string_sprintf("invalid IPv4 address '%s'", filename); | |
92f1b170 | 74 | return FAIL; |
de2e5b3d JH |
75 | #if HAVE_IPV6 |
76 | ||
77 | case 6: | |
78 | if (!SPF_request_set_ipv6_str(spf_request, CS filename)) | |
79 | break; | |
80 | *errmsg = string_sprintf("invalid IPv6 address '%s'", filename); | |
81 | return FAIL; | |
82 | ||
83 | default: | |
84 | *errmsg = string_sprintf("invalid IP address '%s'", filename); | |
92f1b170 TK |
85 | return FAIL; |
86 | } | |
de2e5b3d JH |
87 | #endif |
88 | ||
89 | if (SPF_request_set_env_from(spf_request, CS keystring)) | |
90 | { | |
91 | *errmsg = string_sprintf("invalid envelope from address '%s'", keystring); | |
92 | return FAIL; | |
93 | } | |
92f1b170 | 94 | |
de2e5b3d JH |
95 | SPF_request_query_mailfrom(spf_request, &spf_response); |
96 | *result = string_copy(US SPF_strresult(SPF_response_result(spf_response))); | |
97 | SPF_response_free(spf_response); | |
98 | SPF_request_free(spf_request); | |
99 | return OK; | |
92f1b170 TK |
100 | } |
101 | ||
6545de78 PP |
102 | |
103 | /************************************************* | |
104 | * Version reporting entry point * | |
105 | *************************************************/ | |
106 | ||
107 | /* See local README for interface description. */ | |
108 | ||
109 | #include "../version.h" | |
110 | ||
111 | void | |
112 | spf_version_report(FILE *f) | |
113 | { | |
114 | #ifdef DYNLOOKUP | |
115 | fprintf(f, "Library version: SPF: Exim version %s\n", EXIM_VERSION_STR); | |
116 | #endif | |
117 | } | |
118 | ||
119 | ||
e6d225ae DW |
120 | static lookup_info _lookup_info = { |
121 | US"spf", /* lookup name */ | |
122 | 0, /* not absfile, not query style */ | |
123 | spf_open, /* open function */ | |
124 | NULL, /* no check function */ | |
125 | spf_find, /* find function */ | |
126 | spf_close, /* close function */ | |
127 | NULL, /* no tidy function */ | |
6545de78 PP |
128 | NULL, /* no quoting function */ |
129 | spf_version_report /* version reporting */ | |
e6d225ae DW |
130 | }; |
131 | ||
132 | #ifdef DYNLOOKUP | |
133 | #define spf_lookup_module_info _lookup_module_info | |
134 | #endif | |
135 | ||
136 | static lookup_info *_lookup_list[] = { &_lookup_info }; | |
137 | lookup_module_info spf_lookup_module_info = { LOOKUP_MODULE_INFO_MAGIC, _lookup_list, 1 }; | |
138 | ||
7952eef9 | 139 | #endif /* SUPPORT_SPF */ |