You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

spf.h 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #ifndef RSPAMD_SPF_H
  2. #define RSPAMD_SPF_H
  3. #include "config.h"
  4. #include "ref.h"
  5. #include "addr.h"
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. struct rspamd_task;
  10. struct spf_resolved;
  11. typedef void (*spf_cb_t)(struct spf_resolved *record,
  12. struct rspamd_task *task, gpointer cbdata);
  13. typedef enum spf_mech_e {
  14. SPF_FAIL,
  15. SPF_SOFT_FAIL,
  16. SPF_PASS,
  17. SPF_NEUTRAL
  18. } spf_mech_t;
  19. static inline gchar spf_mech_char(spf_mech_t mech)
  20. {
  21. switch (mech) {
  22. case SPF_FAIL:
  23. return '-';
  24. case SPF_SOFT_FAIL:
  25. return '~';
  26. case SPF_PASS:
  27. return '+';
  28. case SPF_NEUTRAL:
  29. default:
  30. return '?';
  31. }
  32. }
  33. typedef enum spf_action_e {
  34. SPF_RESOLVE_MX,
  35. SPF_RESOLVE_A,
  36. SPF_RESOLVE_PTR,
  37. SPF_RESOLVE_AAA,
  38. SPF_RESOLVE_REDIRECT,
  39. SPF_RESOLVE_INCLUDE,
  40. SPF_RESOLVE_EXISTS,
  41. SPF_RESOLVE_EXP
  42. } spf_action_t;
  43. #define RSPAMD_SPF_FLAG_IPV6 (1u << 0u)
  44. #define RSPAMD_SPF_FLAG_IPV4 (1u << 1u)
  45. #define RSPAMD_SPF_FLAG_PROCESSED (1u << 2u)
  46. #define RSPAMD_SPF_FLAG_ANY (1u << 3u)
  47. #define RSPAMD_SPF_FLAG_PARSED (1u << 4u)
  48. #define RSPAMD_SPF_FLAG_INVALID (1u << 5u)
  49. #define RSPAMD_SPF_FLAG_REFERENCE (1u << 6u)
  50. #define RSPAMD_SPF_FLAG_REDIRECT (1u << 7u)
  51. #define RSPAMD_SPF_FLAG_TEMPFAIL (1u << 8u)
  52. #define RSPAMD_SPF_FLAG_NA (1u << 9u)
  53. #define RSPAMD_SPF_FLAG_PERMFAIL (1u << 10u)
  54. #define RSPAMD_SPF_FLAG_RESOLVED (1u << 11u)
  55. #define RSPAMD_SPF_FLAG_CACHED (1u << 12u)
  56. /** Default SPF limits for avoiding abuse **/
  57. #define SPF_MAX_NESTING 10
  58. #define SPF_MAX_DNS_REQUESTS 30
  59. #define SPF_MIN_CACHE_TTL (60 * 5) /* 5 minutes */
  60. struct spf_addr {
  61. guchar addr6[sizeof(struct in6_addr)];
  62. guchar addr4[sizeof(struct in_addr)];
  63. union {
  64. struct {
  65. guint16 mask_v4;
  66. guint16 mask_v6;
  67. } dual;
  68. uint32_t idx;
  69. } m;
  70. guint flags;
  71. spf_mech_t mech;
  72. gchar *spf_string;
  73. struct spf_addr *prev, *next;
  74. };
  75. enum rspamd_spf_resolved_flags {
  76. RSPAMD_SPF_RESOLVED_NORMAL = 0,
  77. RSPAMD_SPF_RESOLVED_TEMP_FAILED = (1u << 0u),
  78. RSPAMD_SPF_RESOLVED_PERM_FAILED = (1u << 1u),
  79. RSPAMD_SPF_RESOLVED_NA = (1u << 2u),
  80. };
  81. struct spf_resolved {
  82. gchar *domain;
  83. gchar *top_record;
  84. guint ttl;
  85. gint flags;
  86. gdouble timestamp;
  87. uint64_t digest;
  88. GArray *elts; /* Flat list of struct spf_addr */
  89. ref_entry_t ref; /* Refcounting */
  90. };
  91. struct rspamd_spf_cred {
  92. gchar *local_part;
  93. gchar *domain;
  94. gchar *sender;
  95. };
  96. /*
  97. * Resolve spf record for specified task and call a callback after resolution fails/succeed
  98. */
  99. gboolean rspamd_spf_resolve(struct rspamd_task *task,
  100. spf_cb_t callback,
  101. gpointer cbdata,
  102. struct rspamd_spf_cred *cred);
  103. /*
  104. * Get a domain for spf for specified task
  105. */
  106. const gchar *rspamd_spf_get_domain(struct rspamd_task *task);
  107. struct rspamd_spf_cred *rspamd_spf_get_cred(struct rspamd_task *task);
  108. /*
  109. * Increase refcount
  110. */
  111. struct spf_resolved *_spf_record_ref(struct spf_resolved *rec, const gchar *loc);
  112. #define spf_record_ref(rec) \
  113. _spf_record_ref((rec), G_STRLOC)
  114. /*
  115. * Decrease refcount
  116. */
  117. void _spf_record_unref(struct spf_resolved *rec, const gchar *loc);
  118. #define spf_record_unref(rec) \
  119. _spf_record_unref((rec), G_STRLOC)
  120. /**
  121. * Prints address + mask in a freshly allocated string (must be freed)
  122. * @param addr
  123. * @return
  124. */
  125. gchar *spf_addr_mask_to_string(struct spf_addr *addr);
  126. /**
  127. * Returns spf address that matches the specific task (or nil if not matched)
  128. * @param task
  129. * @param rec
  130. * @return
  131. */
  132. struct spf_addr *spf_addr_match_task(struct rspamd_task *task,
  133. struct spf_resolved *rec);
  134. void spf_library_config(const ucl_object_t *obj);
  135. #ifdef __cplusplus
  136. }
  137. #endif
  138. #endif