]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Show real ttl for records
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 30 Oct 2019 17:24:52 +0000 (17:24 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 30 Oct 2019 17:24:52 +0000 (17:24 +0000)
src/libserver/spf.c
src/libserver/spf.h
src/plugins/spf.c

index b085467db0905f47a49fe5771258394d222bfa8c..46a6dd0a3aa235d941437bb54551f0e5d909a29a 100644 (file)
@@ -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) {
@@ -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;
index e9ebbbdf9a91d30a6f72836e315404c94cf64de2..9fcb01d1e3855a26bdc1cb3e520476180bc02902 100644 (file)
@@ -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 */
index cc9dd7dd2435c1985bc77ee30e7ebd70ba5dd731..14b2c375a711123854501a0eeb7b90a2d0c05275 100644 (file)
@@ -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;
@@ -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;
@@ -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));
        }
@@ -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,
@@ -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",