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.

smtp.h 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #ifndef RSPAMD_SMTP_H
  2. #define RSPAMD_SMTP_H
  3. #include "config.h"
  4. #include "main.h"
  5. #include "upstream.h"
  6. struct smtp_upstream {
  7. struct upstream up;
  8. const gchar *name;
  9. struct in_addr addr;
  10. guint16 port;
  11. gboolean is_unix;
  12. };
  13. struct rspamd_dns_resolver;
  14. #define MAX_UPSTREAM 128
  15. #define DEFAULT_MAX_ERRORS 10
  16. enum rspamd_smtp_stage {
  17. SMTP_STAGE_CONNECT = 0,
  18. SMTP_STAGE_HELO,
  19. SMTP_STAGE_MAIL,
  20. SMTP_STAGE_RCPT,
  21. SMTP_STAGE_DATA,
  22. SMTP_STAGE_MAX
  23. };
  24. struct smtp_worker_ctx {
  25. struct smtp_upstream upstreams[MAX_UPSTREAM];
  26. size_t upstream_num;
  27. gchar *upstreams_str;
  28. memory_pool_t *pool;
  29. gchar *smtp_banner;
  30. gchar *smtp_banner_str;
  31. guint32 smtp_delay;
  32. guint32 delay_jitter;
  33. guint32 smtp_timeout_raw;
  34. struct timeval smtp_timeout;
  35. gboolean use_xclient;
  36. gboolean helo_required;
  37. gchar *smtp_capabilities;
  38. gchar *smtp_capabilities_str;
  39. gchar *reject_message;
  40. gsize max_size;
  41. guint32 max_errors;
  42. gchar *metric;
  43. GList *smtp_filters[SMTP_STAGE_MAX];
  44. struct rspamd_dns_resolver *resolver;
  45. struct event_base *ev_base;
  46. };
  47. enum rspamd_smtp_state {
  48. SMTP_STATE_RESOLVE_REVERSE = 0,
  49. SMTP_STATE_RESOLVE_NORMAL,
  50. SMTP_STATE_DELAY,
  51. SMTP_STATE_GREETING,
  52. SMTP_STATE_HELO,
  53. SMTP_STATE_FROM,
  54. SMTP_STATE_RCPT,
  55. SMTP_STATE_BEFORE_DATA,
  56. SMTP_STATE_DATA,
  57. SMTP_STATE_AFTER_DATA,
  58. SMTP_STATE_END,
  59. SMTP_STATE_QUIT,
  60. SMTP_STATE_WAIT_UPSTREAM,
  61. SMTP_STATE_IN_SENDFILE,
  62. SMTP_STATE_ERROR,
  63. SMTP_STATE_CRITICAL_ERROR,
  64. SMTP_STATE_WRITE_ERROR
  65. };
  66. struct smtp_session {
  67. struct smtp_worker_ctx *ctx;
  68. struct config_file *cfg;
  69. memory_pool_t *pool;
  70. enum rspamd_smtp_state state;
  71. enum rspamd_smtp_state upstream_state;
  72. struct rspamd_worker *worker;
  73. struct worker_task *task;
  74. struct in_addr client_addr;
  75. gchar *hostname;
  76. gchar *error;
  77. gchar *temp_name;
  78. gint sock;
  79. gint upstream_sock;
  80. gint temp_fd;
  81. size_t temp_size;
  82. time_t session_time;
  83. gchar *helo;
  84. GList *from;
  85. GList *rcpt;
  86. GList *cur_rcpt;
  87. guint errors;
  88. struct rspamd_async_session *s;
  89. rspamd_io_dispatcher_t *dispatcher;
  90. rspamd_io_dispatcher_t *upstream_dispatcher;
  91. struct smtp_upstream *upstream;
  92. struct event *delay_timer;
  93. gboolean resolved;
  94. gboolean esmtp;
  95. struct rspamd_dns_resolver *resolver;
  96. struct event_base *ev_base;
  97. };
  98. typedef gboolean (*smtp_filter_t)(struct smtp_session *session, gpointer filter_data);
  99. struct smtp_filter {
  100. smtp_filter_t filter;
  101. gpointer filter_data;
  102. };
  103. /*
  104. * Register new SMTP filter
  105. * XXX: work is still in progress
  106. */
  107. void register_smtp_filter (struct smtp_worker_ctx *ctx, enum rspamd_smtp_stage stage, smtp_filter_t filter, gpointer filter_data);
  108. #endif