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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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. guint32 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. guint ttl;
  84. gint flags;
  85. gdouble timestamp;
  86. guint64 digest;
  87. GArray *elts; /* Flat list of struct spf_addr */
  88. ref_entry_t ref; /* Refcounting */
  89. };
  90. struct rspamd_spf_cred {
  91. gchar *local_part;
  92. gchar *domain;
  93. gchar *sender;
  94. };
  95. /*
  96. * Resolve spf record for specified task and call a callback after resolution fails/succeed
  97. */
  98. gboolean rspamd_spf_resolve (struct rspamd_task *task,
  99. spf_cb_t callback,
  100. gpointer cbdata,
  101. struct rspamd_spf_cred *cred);
  102. /*
  103. * Get a domain for spf for specified task
  104. */
  105. const gchar *rspamd_spf_get_domain (struct rspamd_task *task);
  106. struct rspamd_spf_cred *rspamd_spf_get_cred (struct rspamd_task *task);
  107. /*
  108. * Increase refcount
  109. */
  110. struct spf_resolved *_spf_record_ref (struct spf_resolved *rec, const gchar *loc);
  111. #define spf_record_ref(rec) \
  112. _spf_record_ref ((rec), G_STRLOC)
  113. /*
  114. * Decrease refcount
  115. */
  116. void _spf_record_unref (struct spf_resolved *rec, const gchar *loc);
  117. #define spf_record_unref(rec) \
  118. _spf_record_unref((rec), G_STRLOC)
  119. /**
  120. * Prints address + mask in a freshly allocated string (must be freed)
  121. * @param addr
  122. * @return
  123. */
  124. gchar *spf_addr_mask_to_string (struct spf_addr *addr);
  125. /**
  126. * Returns spf address that matches the specific task (or nil if not matched)
  127. * @param task
  128. * @param rec
  129. * @return
  130. */
  131. struct spf_addr *spf_addr_match_task (struct rspamd_task *task,
  132. struct spf_resolved *rec);
  133. void spf_library_config (const ucl_object_t *obj);
  134. #ifdef __cplusplus
  135. }
  136. #endif
  137. #endif