static int on_rcpt(uint64_t id, const char *mail) { printf("filter-trace: RCPT id=%016"PRIx64", %s@%s\n", id, mail); return filter_api_accept(id); }
static int on_connect(uint64_t id, struct filter_connect *conn) { printf("filter-trace: id=%016"PRIx64", hostname=%s\n", id, conn->hostname); return filter_api_accept(id); }
static int on_rcpt(uint64_t id, struct mailaddr *rcpt) { log_info("info: session %016"PRIx64": on_rcpt: to=%s@%s", id, rcpt->user, rcpt->domain); return filter_api_accept(id); }
static int on_mail(uint64_t id, struct mailaddr *mail) { log_info("info: session %016"PRIx64": on_mail: from=%s@%s", id, mail->user, mail->domain); return filter_api_accept(id); }
static void filter_dispatch_mail(uint64_t id, struct mailaddr *mail) { if (fi.cb.mail) fi.cb.mail(id, mail); else filter_api_accept(id); }
static void filter_dispatch_helo(uint64_t id, const char *helo) { if (fi.cb.helo) fi.cb.helo(id, helo); else filter_api_accept(id); }
static void filter_dispatch_connect(uint64_t id, struct filter_connect *conn) { if (fi.cb.connect) fi.cb.connect(id, conn); else filter_api_accept(id); }
static int on_connect(uint64_t id, struct filter_connect *conn) { log_info("info: session %016"PRIx64": on_connect: hostname=%s", id, conn->hostname); return filter_api_accept(id); }
static void filter_dispatch_data(uint64_t id) { if (fi.cb.data) fi.cb.data(id); else filter_api_accept(id); }
static void filter_dispatch_rcpt(uint64_t id, struct mailaddr *rcpt) { if (fi.cb.rcpt) fi.cb.rcpt(id, rcpt); else filter_api_accept(id); }
static PyObject * py_filter_accept(PyObject *self, PyObject *args) { uint64_t id; if (! PyArg_ParseTuple(args, "K", &id)) return NULL; filter_api_accept(id); Py_RETURN_TRUE; }
static int clamav_on_data(uint64_t id) { struct clamav *cl; cl = xcalloc(1, sizeof(struct clamav), "on_data"); if (clamav_init(cl) == -1) { clamav_clear(cl); return filter_api_accept(id); } if (clamav_open(cl) == -1) { clamav_clear(cl); return filter_api_accept(id); } if (clamav_request(cl) == -1) { clamav_clear(cl); return filter_api_accept(id); } filter_api_set_udata(id, cl); return filter_api_accept(id); }
static void filter_trigger_eom(struct filter_session *s) { log_trace(TRACE_FILTERS, "filter-api:%s %016"PRIx64" filter_trigger_eom(%d, %d, %zu, %zu, %zu)", filter_name, s->id, s->pipe.iev.sock, s->pipe.oev.sock, s->datalen, s->pipe.idatalen, s->pipe.odatalen); /* This is called when * - EOM query is first received * - input data is closed * - output has been written */ /* input not done yet, or EOM query not received */ if (s->pipe.iev.sock != -1 || s->qid == 0) return; if (s->pipe.error) goto fail; /* if size don't match, error out */ if (s->pipe.idatalen != s->datalen) { log_trace(TRACE_FILTERS, "filter-api:%s tx datalen mismatch: %zu/%zu", filter_name, s->pipe.idatalen, s->datalen); s->pipe.error = 1; goto fail; } /* if we didn't send the eom to the user do it now */ if (!s->pipe.eom_called) { s->pipe.eom_called = 1; if (fi.cb.eom) fi.cb.eom(s->id, s->datalen); else filter_api_accept(s->id); return; } if (s->pipe.error) goto fail; /* wait for the output socket to be closed */ if (s->pipe.oev.sock != -1) return; s->datalen = s->pipe.odatalen; filter_send_response(s); fail: /* XXX */ return; }
static int clamav_on_eom(uint64_t id, size_t size) { struct clamav *cl; int r; if ((cl = filter_api_get_udata(id)) == NULL) return filter_api_accept(id); if (clamav_response(cl) == -1) { clamav_clear(cl); filter_api_set_udata(id, NULL); return filter_api_reject_code(id, FILTER_FAIL, 451, "4.7.1 Virus filter failed"); } r = cl->r; clamav_clear(cl); filter_api_set_udata(id, NULL); if (r) { log_warnx("warn: session %016"PRIx64": on_eom: REJECT virus", id); return filter_api_reject_code(id, FILTER_CLOSE, 554, "5.7.1 Virus found"); } return filter_api_accept(id); }
static void monkey(uint64_t id) { uint32_t r; r = arc4random_uniform(100); if (r < 70) filter_api_accept(id); else if (r < 90) filter_api_reject_code(id, FILTER_FAIL, 666, "I am a monkey!"); else filter_api_reject_code(id, FILTER_CLOSE, 666, "I am a funny monkey!"); }
static int l_filter_accept(lua_State *L) { uint64_t id; const char *s_id; if (lua_gettop(L) != 1) return (0); s_id = luaL_checklstring(L, 1, NULL); id = strtoumax(s_id, (char **)NULL, 10); filter_api_accept(id); return (0); }
static int on_eom(uint64_t id) { printf("filter-trace: EOM id=%016"PRIx64, id); return filter_api_accept(id); }
static int on_helo(uint64_t id, const char *helo) { log_info("info: session %016"PRIx64": on_helo: helo=%s", id, helo); return filter_api_accept(id); }
static int on_data(uint64_t id) { log_info("info: session %016"PRIx64": on_data", id); return filter_api_accept(id); }
static int on_eom(uint64_t id, size_t size) { log_info("info: session %016"PRIx64": on_eom: size=%zu", id, size); return filter_api_accept(id); }
static int on_helo(uint64_t id, const char *helo) { printf("filter-trace: HELO id=%016"PRIx64", %s\n", id, helo); return filter_api_accept(id); }
static int on_data(uint64_t id) { printf("filter-trace: RCPT id=%016"PRIx64, id); return filter_api_accept(id); }