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.

milter.h 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /*-
  2. * Copyright 2017 Vsevolod Stakhov
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #ifndef RSPAMD_MILTER_H
  17. #define RSPAMD_MILTER_H
  18. #include "config.h"
  19. #include "fstring.h"
  20. #include "addr.h"
  21. #include "contrib/libucl/ucl.h"
  22. #include "ref.h"
  23. enum rspamd_milter_reply {
  24. RSPAMD_MILTER_ADDRCPT = '+',
  25. RSPAMD_MILTER_DELRCPT = '-',
  26. RSPAMD_MILTER_ACCEPT = 'a',
  27. RSPAMD_MILTER_CONTINUE = 'c',
  28. RSPAMD_MILTER_DISCARD = 'd',
  29. RSPAMD_MILTER_CHGFROM = 'e',
  30. RSPAMD_MILTER_ADDHEADER = 'h',
  31. RSPAMD_MILTER_CHGHEADER = 'm',
  32. RSPAMD_MILTER_INSHEADER = 'i',
  33. RSPAMD_MILTER_REJECT = 'r',
  34. RSPAMD_MILTER_TEMPFAIL = 't',
  35. RSPAMD_MILTER_REPLYCODE = 'y',
  36. RSPAMD_MILTER_OPTNEG = 'O',
  37. RSPAMD_MILTER_PROGRESS = 'p',
  38. RSPAMD_MILTER_QUARANTINE = 'q',
  39. };
  40. struct rspamd_email_address;
  41. struct event_base;
  42. struct rspamd_http_message;
  43. struct rspamd_config;
  44. struct rspamd_milter_context {
  45. const gchar *spam_header;
  46. const gchar *client_ca_name;
  47. const gchar *reject_message;
  48. void *sessions_cache;
  49. struct rspamd_config *cfg;
  50. gboolean discard_on_reject;
  51. gboolean quarantine_on_reject;
  52. };
  53. struct rspamd_milter_session {
  54. GHashTable *macros;
  55. rspamd_inet_addr_t *addr;
  56. struct rspamd_email_address *from;
  57. GPtrArray *rcpts;
  58. rspamd_fstring_t *helo;
  59. rspamd_fstring_t *hostname;
  60. rspamd_fstring_t *message;
  61. void *priv;
  62. ref_entry_t ref;
  63. };
  64. typedef void (*rspamd_milter_finish) (gint fd,
  65. struct rspamd_milter_session *session, void *ud);
  66. typedef void (*rspamd_milter_error) (gint fd,
  67. struct rspamd_milter_session *session,
  68. void *ud, GError *err);
  69. /**
  70. * Handles socket with milter protocol
  71. * @param fd
  72. * @param finish_cb
  73. * @param error_cb
  74. * @param ud
  75. * @return
  76. */
  77. gboolean rspamd_milter_handle_socket (gint fd, const struct timeval *tv,
  78. rspamd_mempool_t *pool,
  79. struct event_base *ev_base, rspamd_milter_finish finish_cb,
  80. rspamd_milter_error error_cb, void *ud);
  81. /**
  82. * Updates userdata for a session, returns previous userdata
  83. * @param session
  84. * @param ud
  85. * @return
  86. */
  87. void * rspamd_milter_update_userdata (struct rspamd_milter_session *session,
  88. void *ud);
  89. /**
  90. * Sets SMTP reply string
  91. * @param session
  92. * @param xcode
  93. * @param rcode
  94. * @param reply
  95. * @return
  96. */
  97. gboolean rspamd_milter_set_reply (struct rspamd_milter_session *session,
  98. rspamd_fstring_t *xcode,
  99. rspamd_fstring_t *rcode,
  100. rspamd_fstring_t *reply);
  101. /**
  102. * Send some action to the MTA
  103. * @param fd
  104. * @param session
  105. * @param act
  106. * @return
  107. */
  108. gboolean rspamd_milter_send_action (struct rspamd_milter_session *session,
  109. enum rspamd_milter_reply act, ...);
  110. /**
  111. * Adds some header
  112. * @param session
  113. * @param name
  114. * @param value
  115. * @return
  116. */
  117. gboolean rspamd_milter_add_header (struct rspamd_milter_session *session,
  118. GString *name, GString *value);
  119. /**
  120. * Removes some header
  121. * @param session
  122. * @param name
  123. * @return
  124. */
  125. gboolean rspamd_milter_del_header (struct rspamd_milter_session *session,
  126. GString *name);
  127. void rspamd_milter_session_unref (struct rspamd_milter_session *session);
  128. struct rspamd_milter_session * rspamd_milter_session_ref (
  129. struct rspamd_milter_session *session);
  130. /**
  131. * Converts milter session to HTTP session that is suitable for Rspamd
  132. * @param session
  133. * @return
  134. */
  135. struct rspamd_http_message * rspamd_milter_to_http (
  136. struct rspamd_milter_session *session);
  137. /**
  138. * Sends task results to the
  139. * @param session
  140. * @param results
  141. */
  142. void rspamd_milter_send_task_results (struct rspamd_milter_session *session,
  143. const ucl_object_t *results);
  144. /**
  145. * Init internal milter context
  146. * @param spam_header spam header name (must NOT be NULL)
  147. */
  148. void rspamd_milter_init_library (const struct rspamd_milter_context *ctx);
  149. /**
  150. * Returns pool for a session
  151. * @param session
  152. * @return
  153. */
  154. rspamd_mempool_t *rspamd_milter_get_session_pool (
  155. struct rspamd_milter_session *session);
  156. #endif