26 # ifdef HAVE_STRINGS_H 40 do { if (x) free(x); (x) = NULL; } while(0) 47 sr = (SPF_request_t *)malloc(
sizeof(SPF_request_t));
50 memset(sr, 0,
sizeof(SPF_request_t));
52 sr->spf_server = spf_server;
53 sr->client_ver = AF_UNSPEC;
54 sr->ipv4.s_addr = htonl(INADDR_ANY);
55 sr->ipv6 = in6addr_any;
77 sr->client_dom =
NULL;
79 sr->client_ver = AF_INET;
89 sr->client_dom =
NULL;
91 sr->client_ver = AF_INET6;
102 if (inet_pton(AF_INET, astr, &addr) <= 0)
110 struct in6_addr addr;
113 if (inet_pton(AF_INET6, astr, &addr) <= 0)
120 is_eai(
const char *dom)
122 char *s = (
char *)dom;
125 if(*s++ & 0x80)
return 1;
138 i = idn2_to_ascii_8z(dom, &adom, 0);
146 sr->helo_dom = strdup(dom);
150 if (sr->env_from ==
NULL)
158 SPF_server_t *spf_server;
159 spf_server = sr->spf_server;
160 return spf_server->rec_dom;
174 if (*from ==
'\0' && sr->helo_dom !=
NULL)
176 cp = strrchr(from,
'@');
177 if (cp && (cp != from)) {
178 sr->env_from = strdup(from);
183 sr->env_from_lp = malloc(len + 1);
184 if (!sr->env_from_lp) {
188 strncpy(sr->env_from_lp, from, len);
189 sr->env_from_lp[len] =
'\0';
194 i = idn2_to_ascii_8z(cp+1, &adom, 0);
196 sr->env_from_dp = adom;
203 sr->env_from_dp = strdup(cp + 1);
204 if (!sr->env_from_dp) {
211 if (cp == from) from++;
216 i = idn2_to_ascii_8z(cp+1, &adom, 0);
222 len =
sizeof(
"postmaster@") + strlen(from);
223 sr->env_from = malloc(len + 1);
226 sprintf(sr->env_from,
"postmaster@%s", from);
227 sr->env_from_lp = strdup(
"postmaster");
228 if (!sr->env_from_lp) {
232 sr->env_from_dp = strdup(from);
233 if (!sr->env_from_dp) {
246 SPF_server_t *spf_server;
249 spf_server = sr->spf_server;
252 if (sr->client_dom ==
NULL) {
256 return sr->client_dom;
262 if (sr->client_ver == AF_INET) {
263 if ((ntohl(sr->ipv4.s_addr) & IN_CLASSA_NET) ==
264 (IN_LOOPBACKNET << 24)) {
268 else if (sr->client_ver == AF_INET6) {
269 if (IN6_IS_ADDR_LOOPBACK(&sr->ipv6))
276 SPF_request_prepare(SPF_request_t *sr)
279 sr->cur_dom = sr->helo_dom;
281 sr->cur_dom = sr->env_from_dp;
289 SPF_request_query_record(SPF_request_t *spf_request,
290 SPF_response_t *spf_response,
291 SPF_record_t *spf_record,
297 SPF_i_done(spf_response, spf_response->result, spf_response->reason, spf_response->err);
302 SPF_infof(
"Warning: %d errors in response, " 303 "but no error code. Evaluating.",
306 spf_response->spf_record_exp = spf_record;
308 spf_request, spf_response, 0);
310 spf_response->spf_record_exp =
NULL;
320 SPF_response_t **spf_responsep)
322 SPF_server_t *spf_server;
323 SPF_record_t *spf_record;
327 spf_server = spf_request->spf_server;
331 if (! *spf_responsep)
339 SPF_request_prepare(spf_request);
342 *spf_responsep, &spf_record);
343 return SPF_request_query_record(spf_request, *spf_responsep,
350 SPF_response_t **spf_responsep,
353 SPF_server_t *spf_server;
354 SPF_record_t *spf_record;
358 spf_server = spf_request->spf_server;
362 if (! *spf_responsep)
370 SPF_request_prepare(spf_request);
373 *spf_responsep, &spf_record,
375 return SPF_request_query_record(spf_request, *spf_responsep,
390 SPF_response_t **spf_responsep,
393 SPF_server_t *spf_server;
394 SPF_record_t *spf_record;
396 const char *rcpt_to_dom;
398 char *eai_dom =
NULL;
402 spf_server = spf_request->spf_server;
406 if (! *spf_responsep)
414 rcpt_to_dom = strchr(rcpt_to,
'@');
415 if (rcpt_to_dom ==
NULL)
416 rcpt_to_dom = rcpt_to;
419 if(is_eai(rcpt_to_dom)) {
422 i = idn2_to_ascii_8z(rcpt_to_dom, &eai_dom, 0);
424 spf_request->cur_dom = eai_dom;
428 spf_request->cur_dom = rcpt_to_dom;
430 len =
sizeof(
SPF_VER_STR) + 64 + strlen(rcpt_to_dom);
431 record = malloc(len);
434 snprintf(record, len,
SPF_VER_STR " mx:%s", rcpt_to_dom);
436 *spf_responsep, &spf_record,
439 if(eai_dom) free(eai_dom);
440 return SPF_request_query_record(spf_request, *spf_responsep,
void SPF_record_free(SPF_record_t *rp)
int SPF_response_errors(SPF_response_t *rp)
int SPF_request_is_loopback(SPF_request_t *sr)
SPF_errcode_t SPF_record_compile(SPF_server_t *spf_server, SPF_response_t *spf_response, SPF_record_t **spf_recordp, const char *record)
SPF_errcode_t SPF_request_query_mailfrom(SPF_request_t *spf_request, SPF_response_t **spf_responsep)
#define SPF_ASSERT_NOTNULL(x)
const char * SPF_request_get_rec_dom(SPF_request_t *sr)
SPF_errcode_t SPF_record_interpret(SPF_record_t *spf_record, SPF_request_t *spf_request, SPF_response_t *spf_response, int depth)
int SPF_request_set_env_from(SPF_request_t *sr, const char *from)
SPF_response_t * SPF_response_new(SPF_request_t *spf_request)
SPF_errcode_t SPF_request_set_ipv4_str(SPF_request_t *sr, const char *astr)
SPF_errcode_t SPF_i_done(SPF_response_t *spf_response, SPF_result_t result, SPF_reason_t reason, SPF_errcode_t err)
void SPF_request_free(SPF_request_t *sr)
SPF_errcode_t SPF_request_set_ipv6_str(SPF_request_t *sr, const char *astr)
SPF_errcode_t SPF_request_query_rcptto(SPF_request_t *spf_request, SPF_response_t **spf_responsep, const char *rcpt_to)
char * SPF_dns_get_client_dom(SPF_dns_server_t *spf_dns_server, SPF_request_t *sr)
const char * SPF_request_get_client_dom(SPF_request_t *sr)
SPF_errcode_t SPF_request_set_ipv4(SPF_request_t *sr, struct in_addr addr)
SPF_errcode_t SPF_request_set_helo_dom(SPF_request_t *sr, const char *dom)
SPF_errcode_t SPF_server_get_record(SPF_server_t *spf_server, SPF_request_t *spf_request, SPF_response_t *spf_response, SPF_record_t **spf_recordp)
SPF_request_t * SPF_request_new(SPF_server_t *spf_server)
SPF_errcode_t SPF_request_query_fallback(SPF_request_t *spf_request, SPF_response_t **spf_responsep, const char *record)
SPF_errcode_t SPF_request_set_ipv6(SPF_request_t *sr, struct in6_addr addr)