Skip to content

Commit

Permalink
[Minor] Show real ttl for records
Browse files Browse the repository at this point in the history
  • Loading branch information
vstakhov committed Oct 30, 2019
1 parent afc49e1 commit 8529cf6
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 29 deletions.
24 changes: 11 additions & 13 deletions src/libserver/spf.c
Expand Up @@ -392,15 +392,15 @@ rspamd_spf_process_reference (struct spf_resolved *target,
cur = g_ptr_array_index (elt->elts, i);

if (cur->flags & RSPAMD_SPF_FLAG_TEMPFAIL) {
target->temp_failed = TRUE;
target->flags |= RSPAMD_SPF_RESOLVED_TEMP_FAILED;
continue;
}
if (cur->flags & RSPAMD_SPF_FLAG_PERMFAIL) {
target->perm_failed = TRUE;
target->flags |= RSPAMD_SPF_RESOLVED_PERM_FAILED;
continue;
}
if (cur->flags & RSPAMD_SPF_FLAG_NA) {
target->na = TRUE;
target->flags |= RSPAMD_SPF_RESOLVED_NA;
continue;
}
if (cur->flags & RSPAMD_SPF_FLAG_INVALID) {
Expand Down Expand Up @@ -448,26 +448,24 @@ rspamd_spf_record_flatten (struct spf_record *rec)

g_assert (rec != NULL);

res = g_malloc0 (sizeof (*res));
res->domain = g_strdup (rec->sender_domain);
res->ttl = rec->ttl;
/* Not precise but okay */
res->timestamp = rec->task->task_timestamp;
res->digest = mum_hash_init (0xa4aa40bbeec59e2bULL);
REF_INIT_RETAIN (res, rspamd_flatten_record_dtor);

if (rec->resolved) {
res = g_malloc0 (sizeof (*res));
res->elts = g_array_sized_new (FALSE, FALSE, sizeof (struct spf_addr),
rec->resolved->len);
res->domain = g_strdup (rec->sender_domain);
res->ttl = rec->ttl;
res->digest = mum_hash_init (0xa4aa40bbeec59e2bULL);
REF_INIT_RETAIN (res, rspamd_flatten_record_dtor);

if (rec->resolved->len > 0) {
rspamd_spf_process_reference (res, NULL, rec, TRUE);
}
}
else {
res = g_malloc0 (sizeof (*res));
res->elts = g_array_new (FALSE, FALSE, sizeof (struct spf_addr));
res->domain = g_strdup (rec->sender_domain);
res->ttl = rec->ttl;
res->digest = mum_hash_init (0xa4aa40bbeec59e2bULL);
REF_INIT_RETAIN (res, rspamd_flatten_record_dtor);
}

return res;
Expand Down
12 changes: 9 additions & 3 deletions src/libserver/spf.h
Expand Up @@ -67,12 +67,18 @@ struct spf_addr {
struct spf_addr *prev, *next;
};

enum rspamd_spf_resolved_flags {
RSPAMD_SPF_RESOLVED_NORMAL = 0,
RSPAMD_SPF_RESOLVED_TEMP_FAILED = (1u << 0u),
RSPAMD_SPF_RESOLVED_PERM_FAILED = (1u << 1u),
RSPAMD_SPF_RESOLVED_NA = (1u << 2u),
};

struct spf_resolved {
gchar *domain;
guint ttl;
gboolean temp_failed;
gboolean na;
gboolean perm_failed;
gint flags;
gdouble timestamp;
guint64 digest;
GArray *elts; /* Flat list of struct spf_addr */
ref_entry_t ref; /* Refcounting */
Expand Down
23 changes: 10 additions & 13 deletions src/plugins/spf.c
Expand Up @@ -490,12 +490,12 @@ spf_check_element (struct spf_resolved *rec, struct spf_addr *addr,
spf_result[0] = '-';
spf_message = "(SPF): spf fail";
if (addr->flags & RSPAMD_SPF_FLAG_ANY) {
if (rec->perm_failed) {
if (rec->flags & RSPAMD_SPF_RESOLVED_PERM_FAILED) {
msg_info_task ("do not apply SPF failed policy, as we have "
"some addresses unresolved");
spf_symbol = spf_module_ctx->symbol_permfail;
}
else if (rec->temp_failed) {
else if (rec->flags & RSPAMD_SPF_RESOLVED_TEMP_FAILED) {
msg_info_task ("do not apply SPF failed policy, as we have "
"some addresses unresolved");
spf_symbol = spf_module_ctx->symbol_dnsfail;
Expand All @@ -509,12 +509,12 @@ spf_check_element (struct spf_resolved *rec, struct spf_addr *addr,
spf_result[0] = '~';

if (addr->flags & RSPAMD_SPF_FLAG_ANY) {
if (rec->perm_failed) {
if (rec->flags & RSPAMD_SPF_RESOLVED_PERM_FAILED) {
msg_info_task ("do not apply SPF failed policy, as we have "
"some addresses unresolved");
spf_symbol = spf_module_ctx->symbol_permfail;
}
else if (rec->temp_failed) {
else if (rec->flags & RSPAMD_SPF_RESOLVED_TEMP_FAILED) {
msg_info_task ("do not apply SPF failed policy, as we have "
"some addresses unresolved");
spf_symbol = spf_module_ctx->symbol_dnsfail;
Expand Down Expand Up @@ -567,7 +567,7 @@ spf_check_list (struct spf_resolved *rec, struct rspamd_task *task, gboolean cac
"%d/%d elements in the cache",
rec->domain,
rec->digest,
rec->ttl,
rec->ttl - (task->task_timestamp - rec->timestamp),
rspamd_lru_hash_size (spf_module_ctx->spf_hash),
rspamd_lru_hash_capacity (spf_module_ctx->spf_hash));
}
Expand All @@ -588,19 +588,19 @@ spf_plugin_callback (struct spf_resolved *record, struct rspamd_task *task,
struct rspamd_symcache_item *item = (struct rspamd_symcache_item *)ud;
struct spf_ctx *spf_module_ctx = spf_get_context (task->cfg);

if (record && record->na) {
if (record && (record->flags & RSPAMD_SPF_RESOLVED_NA)) {
rspamd_task_insert_result (task,
spf_module_ctx->symbol_na,
1,
NULL);
}
else if (record && record->elts->len == 0 && record->temp_failed) {
else if (record && record->elts->len == 0 && (record->flags & RSPAMD_SPF_RESOLVED_TEMP_FAILED)) {
rspamd_task_insert_result (task,
spf_module_ctx->symbol_dnsfail,
1,
NULL);
}
else if (record && record->elts->len == 0 && record->perm_failed) {
else if (record && record->elts->len == 0 && (record->flags & RSPAMD_SPF_RESOLVED_PERM_FAILED)) {
rspamd_task_insert_result (task,
spf_module_ctx->symbol_permfail,
1,
Expand All @@ -621,15 +621,12 @@ spf_plugin_callback (struct spf_resolved *record, struct rspamd_task *task,
record->domain, task->task_timestamp)) == NULL) {
l = record;

if (record->ttl > 0 &&
!record->temp_failed &&
!record->perm_failed &&
!record->na) {
if (record->ttl > 0 && record->flags == 0) {

if (spf_module_ctx->spf_hash) {
rspamd_lru_hash_insert (spf_module_ctx->spf_hash,
record->domain, spf_record_ref (l),
task->task_timestamp, record->ttl);
record->timestamp, record->ttl);

msg_info_task ("stored record for %s (0x%xuL) in LRU cache for %d seconds, "
"%d/%d elements in the cache",
Expand Down

0 comments on commit 8529cf6

Please sign in to comment.