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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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_milter_context {
  44. const gchar *spam_header;
  45. const gchar *client_ca_name;
  46. const gchar *reject_message;
  47. void *sessions_cache;
  48. gboolean discard_on_reject;
  49. gboolean quarantine_on_reject;
  50. };
  51. struct rspamd_milter_session {
  52. GHashTable *macros;
  53. rspamd_inet_addr_t *addr;
  54. struct rspamd_email_address *from;
  55. GPtrArray *rcpts;
  56. rspamd_fstring_t *helo;
  57. rspamd_fstring_t *hostname;
  58. rspamd_fstring_t *message;
  59. void *priv;
  60. ref_entry_t ref;
  61. };
  62. typedef void (*rspamd_milter_finish) (gint fd,
  63. struct rspamd_milter_session *session, void *ud);
  64. typedef void (*rspamd_milter_error) (gint fd,
  65. struct rspamd_milter_session *session,
  66. void *ud, GError *err);
  67. /**
  68. * Handles socket with milter protocol
  69. * @param fd
  70. * @param finish_cb
  71. * @param error_cb
  72. * @param ud
  73. * @return
  74. */
  75. gboolean rspamd_milter_handle_socket (gint fd, const struct timeval *tv,
  76. rspamd_mempool_t *pool,
  77. struct event_base *ev_base, rspamd_milter_finish finish_cb,
  78. rspamd_milter_error error_cb, void *ud);
  79. /**
  80. * Updates userdata for a session, returns previous userdata
  81. * @param session
  82. * @param ud
  83. * @return
  84. */
  85. void * rspamd_milter_update_userdata (struct rspamd_milter_session *session,
  86. void *ud);
  87. /**
  88. * Sets SMTP reply string
  89. * @param session
  90. * @param xcode
  91. * @param rcode
  92. * @param reply
  93. * @return
  94. */
  95. gboolean rspamd_milter_set_reply (struct rspamd_milter_session *session,
  96. rspamd_fstring_t *xcode,
  97. rspamd_fstring_t *rcode,
  98. rspamd_fstring_t *reply);
  99. /**
  100. * Send some action to the MTA
  101. * @param fd
  102. * @param session
  103. * @param act
  104. * @return
  105. */
  106. gboolean rspamd_milter_send_action (struct rspamd_milter_session *session,
  107. enum rspamd_milter_reply act, ...);
  108. /**
  109. * Adds some header
  110. * @param session
  111. * @param name
  112. * @param value
  113. * @return
  114. */
  115. gboolean rspamd_milter_add_header (struct rspamd_milter_session *session,
  116. GString *name, GString *value);
  117. /**
  118. * Removes some header
  119. * @param session
  120. * @param name
  121. * @return
  122. */
  123. gboolean rspamd_milter_del_header (struct rspamd_milter_session *session,
  124. GString *name);
  125. void rspamd_milter_session_unref (struct rspamd_milter_session *session);
  126. struct rspamd_milter_session * rspamd_milter_session_ref (
  127. struct rspamd_milter_session *session);
  128. /**
  129. * Converts milter session to HTTP session that is suitable for Rspamd
  130. * @param session
  131. * @return
  132. */
  133. struct rspamd_http_message * rspamd_milter_to_http (
  134. struct rspamd_milter_session *session);
  135. /**
  136. * Sends task results to the
  137. * @param session
  138. * @param results
  139. */
  140. void rspamd_milter_send_task_results (struct rspamd_milter_session *session,
  141. const ucl_object_t *results);
  142. /**
  143. * Init internal milter context
  144. * @param spam_header spam header name (must NOT be NULL)
  145. */
  146. void rspamd_milter_init_library (const struct rspamd_milter_context *ctx);
  147. /**
  148. * Returns pool for a session
  149. * @param session
  150. * @return
  151. */
  152. rspamd_mempool_t *rspamd_milter_get_session_pool (
  153. struct rspamd_milter_session *session);
  154. #endif