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);
}
Exemple #5
0
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);
}
Exemple #6
0
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);
}
Exemple #7
0
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);
}
Exemple #9
0
static void
filter_dispatch_data(uint64_t id)
{
	if (fi.cb.data)
		fi.cb.data(id);
	else
		filter_api_accept(id);
}
Exemple #10
0
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);
}
Exemple #11
0
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);
}
Exemple #13
0
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);
}
Exemple #15
0
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!");
}
Exemple #16
0
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);
}