/* Array of struct spf_resolved_element */
const gchar *sender;
const gchar *sender_domain;
+ const gchar *top_record;
gchar *local_part;
struct rspamd_task *task;
spf_cb_t callback;
g_free (addr->spf_string);
}
+ g_free (r->top_record);
g_free (r->domain);
g_array_free (r->elts, TRUE);
g_free (r);
/* Not precise but okay */
res->timestamp = rec->task->task_timestamp;
res->digest = mum_hash_init (0xa4aa40bbeec59e2bULL);
+ res->top_record = g_strdup (rec->top_record);
REF_INIT_RETAIN (res, rspamd_flatten_record_dtor);
if (rec->resolved) {
static gboolean
spf_process_txt_record (struct spf_record *rec, struct spf_resolved_element *resolved,
- struct rdns_reply *reply)
+ struct rdns_reply *reply, struct rdns_reply_entry **pselected)
{
struct rdns_reply_entry *elt, *selected = NULL;
gboolean ret = FALSE;
if (strncmp(elt->content.txt.data, "v=spf1", sizeof("v=spf1") - 1)
== 0) {
selected = elt;
- rspamd_mempool_set_variable(rec->task->task_pool,
- RSPAMD_MEMPOOL_SPF_RECORD,
- rspamd_mempool_strdup (rec->task->task_pool,
- elt->content.txt.data), NULL);
+ if (pselected != NULL) {
+ *pselected = selected;
+ }
+
break;
}
}
if (elt->type == RDNS_REQUEST_TXT) {
if (start_spf_parse(rec, resolved, elt->content.txt.data)) {
ret = TRUE;
- rspamd_mempool_set_variable(rec->task->task_pool,
- RSPAMD_MEMPOOL_SPF_RECORD,
- rspamd_mempool_strdup (rec->task->task_pool,
- elt->content.txt.data), NULL);
+ if (pselected != NULL) {
+ *pselected = selected;
+ }
break;
}
}
reply->entries[0].content.txt.data);
}
- if (!spf_process_txt_record (rec, cb->resolved, reply)) {
+ if (!spf_process_txt_record (rec, cb->resolved, reply, NULL)) {
cb->addr->flags |= RSPAMD_SPF_FLAG_PERMFAIL;
}
}
}
cb->addr->flags |= RSPAMD_SPF_FLAG_RESOLVED;
- spf_process_txt_record (rec, cb->resolved, reply);
+ spf_process_txt_record (rec, cb->resolved, reply, NULL);
}
goto end;
}
if (resolved) {
- if (!spf_process_txt_record (rec, resolved, reply)) {
+ struct rdns_reply_entry *selected = NULL;
+
+ if (!spf_process_txt_record (rec, resolved, reply, &selected)) {
resolved = g_ptr_array_index(rec->resolved, 0);
if (rec->resolved->len > 1) {
g_ptr_array_insert (resolved->elts, 0, addr);
}
}
+ else {
+ rec->top_record = rspamd_mempool_strdup(rec->task->task_pool,
+ selected->content.txt.data);
+ rspamd_mempool_set_variable(rec->task->task_pool,
+ RSPAMD_MEMPOOL_SPF_RECORD,
+ (gpointer)rec->top_record, NULL);
+ }
}
rspamd_spf_maybe_return (rec);
if (cached) {
cached->flags |= RSPAMD_SPF_FLAG_CACHED;
+
+ if (cached->top_record) {
+ rspamd_mempool_set_variable(task->task_pool,
+ RSPAMD_MEMPOOL_SPF_RECORD,
+ rspamd_mempool_strdup (task->task_pool,
+ cached->top_record), NULL);
+ }
callback (cached, task, cbdata);
return TRUE;