Browse Source

[Feature] Allow to quarantine rejected messages using milter interface

tags/1.7.0
Vsevolod Stakhov 6 years ago
parent
commit
929a9746c9
4 changed files with 32 additions and 5 deletions
  1. 13
    1
      src/libserver/milter.c
  2. 4
    2
      src/libserver/milter.h
  3. 4
    1
      src/libserver/milter_internal.h
  4. 11
    1
      src/rspamd_proxy.c

+ 13
- 1
src/libserver/milter.c View File

@@ -50,6 +50,7 @@ struct rspamd_milter_context {
gchar *spam_header;
void *sessions_cache;
gboolean discard_on_reject;
gboolean quarantine_on_reject;
};

static struct rspamd_milter_context *milter_ctx = NULL;
@@ -1072,6 +1073,7 @@ rspamd_milter_handle_socket (gint fd, const struct timeval *tv,
priv->state = RSPAMD_MILTER_READ_MORE;
priv->pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), "milter");
priv->discard_on_reject = milter_ctx->discard_on_reject;
priv->quarantine_on_reject = milter_ctx->quarantine_on_reject;

if (pool) {
/* Copy tag */
@@ -1567,8 +1569,13 @@ rspamd_milter_process_milter_block (struct rspamd_milter_session *session,
priv->discard_on_reject = TRUE;
msg_info_milter ("discard message instead of rejection");
}
else if (strcmp (ucl_object_tostring (elt), "quarantine") == 0) {
priv->quarantine_on_reject = TRUE;
msg_info_milter ("quarantine message instead of rejection");
}
else {
priv->discard_on_reject = FALSE;
priv->quarantine_on_reject = FALSE;
}
}

@@ -1713,6 +1720,10 @@ rspamd_milter_send_task_results (struct rspamd_milter_session *session,
if (priv->discard_on_reject) {
rspamd_milter_send_action (session, RSPAMD_MILTER_DISCARD);
}
else if (priv->quarantine_on_reject) {
/* TODO: need to add quarantine message */
rspamd_milter_send_action (session, RSPAMD_MILTER_QUARANTINE);
}
else {
rcode = rspamd_fstring_new_init (RSPAMD_MILTER_RCODE_REJECT,
sizeof (RSPAMD_MILTER_RCODE_REJECT) - 1);
@@ -1789,7 +1800,7 @@ cleanup:

void
rspamd_milter_init_library (const gchar *spam_header, void *sessions_cache,
gboolean discard_on_reject)
gboolean discard_on_reject, gboolean quarantine_on_reject)
{
if (milter_ctx) {
g_free (milter_ctx->spam_header);
@@ -1807,6 +1818,7 @@ rspamd_milter_init_library (const gchar *spam_header, void *sessions_cache,

milter_ctx->sessions_cache = sessions_cache;
milter_ctx->discard_on_reject = discard_on_reject;
milter_ctx->quarantine_on_reject = quarantine_on_reject;
}

rspamd_mempool_t *

+ 4
- 2
src/libserver/milter.h View File

@@ -36,7 +36,8 @@ enum rspamd_milter_reply {
RSPAMD_MILTER_TEMPFAIL = 't',
RSPAMD_MILTER_REPLYCODE = 'y',
RSPAMD_MILTER_OPTNEG = 'O',
RSPAMD_MILTER_PROGRESS = 'p'
RSPAMD_MILTER_PROGRESS = 'p',
RSPAMD_MILTER_QUARANTINE = 'q',
};

struct rspamd_email_address;
@@ -151,7 +152,8 @@ void rspamd_milter_send_task_results (struct rspamd_milter_session *session,
* @param spam_header spam header name (must NOT be NULL)
*/
void rspamd_milter_init_library (const gchar *spam_header,
void *sessions_cache, gboolean discard_on_reject);
void *sessions_cache, gboolean discard_on_reject,
gboolean quarantine_on_reject);

/**
* Returns pool for a session

+ 4
- 1
src/libserver/milter_internal.h View File

@@ -67,6 +67,7 @@ struct rspamd_milter_private {
enum rspamd_milter_io_state state;
int fd;
gboolean discard_on_reject;
gboolean quarantine_on_reject;
gboolean no_action;
};

@@ -124,10 +125,12 @@ enum rspamd_milter_io_cmd {
#define RSPAMD_MILTER_FLAG_ADDRCPT (1L<<2) /* filter may add recipients */
#define RSPAMD_MILTER_FLAG_DELRCPT (1L<<3) /* filter may delete recipients */
#define RSPAMD_MILTER_FLAG_CHGHDRS (1L<<4) /* filter may change/delete headers */
#define RSPAMD_MILTER_FLAG_QUARANTINE (1L<<5) /* filter may request quarantine */

#define RSPAMD_MILTER_ACTIONS_MASK \
(RSPAMD_MILTER_FLAG_ADDHDRS | RSPAMD_MILTER_FLAG_ADDRCPT | \
RSPAMD_MILTER_FLAG_DELRCPT | RSPAMD_MILTER_FLAG_CHGHDRS)
RSPAMD_MILTER_FLAG_DELRCPT | RSPAMD_MILTER_FLAG_CHGHDRS | \
RSPAMD_MILTER_FLAG_QUARANTINE)

enum rspamd_milter_connect_proto {
RSPAMD_MILTER_CONN_UNKNOWN = 'U',

+ 11
- 1
src/rspamd_proxy.c View File

@@ -138,6 +138,8 @@ struct rspamd_proxy_ctx {
gboolean milter;
/* Discard messages instead of rejecting them */
gboolean discard_on_reject;
/* Quarantine messages instead of rejecting them */
gboolean quarantine_on_reject;
/* Milter spam header */
gchar *spam_header;
/* Sessions cache */
@@ -810,6 +812,14 @@ init_rspamd_proxy (struct rspamd_config *cfg)
G_STRUCT_OFFSET (struct rspamd_proxy_ctx, discard_on_reject),
0,
"Tell MTA to discard rejected messages silently");
rspamd_rcl_register_worker_option (cfg,
type,
"quarantine_on_reject",
rspamd_rcl_parse_struct_boolean,
ctx,
G_STRUCT_OFFSET (struct rspamd_proxy_ctx, quarantine_on_reject),
0,
"Tell MTA to quarantine rejected messages");
rspamd_rcl_register_worker_option (cfg,
type,
"spam_header",
@@ -2115,7 +2125,7 @@ start_rspamd_proxy (struct rspamd_worker *worker) {
}

rspamd_milter_init_library (ctx->spam_header, ctx->sessions_cache,
ctx->discard_on_reject);
ctx->discard_on_reject, ctx->quarantine_on_reject);
rspamd_lua_run_postloads (ctx->cfg->lua_state, ctx->cfg, ctx->ev_base,
worker);


Loading…
Cancel
Save