postscreen_tests.c [plain text]
#include <sys_defs.h>
#include <stdio.h>
#include <msg.h>
#include <mail_params.h>
#include <postscreen.h>
#define PSC_PREGR_TEST_ENABLE() (*var_psc_pregr_banner != 0)
#define PSC_DNSBL_TEST_ENABLE() (*var_psc_dnsbl_sites != 0)
void psc_new_tests(PSC_STATE *state)
{
state->flags = PSC_STATE_FLAG_NEW;
state->pregr_stamp = PSC_TIME_STAMP_NEW;
state->dnsbl_stamp = PSC_TIME_STAMP_NEW;
state->pipel_stamp = PSC_TIME_STAMP_NEW;
state->nsmtp_stamp = PSC_TIME_STAMP_NEW;
state->barlf_stamp = PSC_TIME_STAMP_NEW;
state->penal_stamp = PSC_TIME_STAMP_NEW;
if (PSC_PREGR_TEST_ENABLE())
state->flags |= PSC_STATE_FLAG_PREGR_TODO;
if (PSC_DNSBL_TEST_ENABLE())
state->flags |= PSC_STATE_FLAG_DNSBL_TODO;
if (var_psc_pipel_enable)
state->flags |= PSC_STATE_FLAG_PIPEL_TODO;
if (var_psc_nsmtp_enable)
state->flags |= PSC_STATE_FLAG_NSMTP_TODO;
if (var_psc_barlf_enable)
state->flags |= PSC_STATE_FLAG_BARLF_TODO;
}
void psc_parse_tests(PSC_STATE *state,
const char *stamp_str,
time_t time_value)
{
unsigned long pregr_stamp;
unsigned long dnsbl_stamp;
unsigned long pipel_stamp;
unsigned long nsmtp_stamp;
unsigned long barlf_stamp;
unsigned long penal_stamp;
#ifdef NONPROD
time_t penalty_left;
#endif
state->flags = 0;
switch (sscanf(stamp_str, "%lu;%lu;%lu;%lu;%lu;%lu",
&pregr_stamp, &dnsbl_stamp, &pipel_stamp, &nsmtp_stamp,
&barlf_stamp, &penal_stamp)) {
case 0:
pregr_stamp = PSC_TIME_STAMP_DISABLED;
case 1:
dnsbl_stamp = PSC_TIME_STAMP_DISABLED;
case 2:
pipel_stamp = PSC_TIME_STAMP_DISABLED;
case 3:
nsmtp_stamp = PSC_TIME_STAMP_DISABLED;
case 4:
barlf_stamp = PSC_TIME_STAMP_DISABLED;
case 5:
penal_stamp = PSC_TIME_STAMP_DISABLED;
default:
break;
}
state->pregr_stamp = pregr_stamp;
state->dnsbl_stamp = dnsbl_stamp;
state->pipel_stamp = pipel_stamp;
state->nsmtp_stamp = nsmtp_stamp;
state->barlf_stamp = barlf_stamp;
state->penal_stamp = penal_stamp;
if (pregr_stamp == PSC_TIME_STAMP_NEW
|| dnsbl_stamp == PSC_TIME_STAMP_NEW
|| pipel_stamp == PSC_TIME_STAMP_NEW
|| nsmtp_stamp == PSC_TIME_STAMP_NEW
|| barlf_stamp == PSC_TIME_STAMP_NEW)
state->flags |= PSC_STATE_FLAG_NEW;
if (PSC_PREGR_TEST_ENABLE() && time_value > state->pregr_stamp) {
state->flags |= PSC_STATE_FLAG_PREGR_TODO;
if (state->pregr_stamp > PSC_TIME_STAMP_DISABLED)
state->flags |= PSC_STATE_FLAG_CACHE_EXPIRED;
}
if (PSC_DNSBL_TEST_ENABLE() && time_value > state->dnsbl_stamp) {
state->flags |= PSC_STATE_FLAG_DNSBL_TODO;
if (state->dnsbl_stamp > PSC_TIME_STAMP_DISABLED)
state->flags |= PSC_STATE_FLAG_CACHE_EXPIRED;
}
if (var_psc_pipel_enable && time_value > state->pipel_stamp) {
state->flags |= PSC_STATE_FLAG_PIPEL_TODO;
if (state->pipel_stamp > PSC_TIME_STAMP_DISABLED)
state->flags |= PSC_STATE_FLAG_CACHE_EXPIRED;
}
if (var_psc_nsmtp_enable && time_value > state->nsmtp_stamp) {
state->flags |= PSC_STATE_FLAG_NSMTP_TODO;
if (state->nsmtp_stamp > PSC_TIME_STAMP_DISABLED)
state->flags |= PSC_STATE_FLAG_CACHE_EXPIRED;
}
if (var_psc_barlf_enable && time_value > state->barlf_stamp) {
state->flags |= PSC_STATE_FLAG_BARLF_TODO;
if (state->barlf_stamp > PSC_TIME_STAMP_DISABLED)
state->flags |= PSC_STATE_FLAG_CACHE_EXPIRED;
}
#if 0
if (state->flags & PSC_STATE_MASK_EARLY_TODO) {
if (PSC_PREGR_TEST_ENABLE())
state->flags |= PSC_STATE_FLAG_PREGR_TODO;
if (PSC_DNSBL_TEST_ENABLE())
state->flags |= PSC_STATE_FLAG_DNSBL_TODO;
}
#endif
#ifdef NONPROD
if ((penalty_left = state->penal_stamp - event_time()) > 0) {
msg_info("PENALTY %ld for %s",
(long) penalty_left, state->smtp_client_addr);
PSC_FAIL_SESSION_STATE(state, PSC_STATE_FLAG_PENAL_FAIL);
#if 0
switch (psc_penal_action) {
case PSC_ACT_DROP:
PSC_DROP_SESSION_STATE(state,
"421 4.3.2 Service currently unavailable\r\n");
break;
case PSC_ACT_ENFORCE:
#endif
PSC_ENFORCE_SESSION_STATE(state,
"450 4.3.2 Service currently unavailable\r\n");
#if 0
break;
case PSC_ACT_IGNORE:
PSC_UNFAIL_SESSION_STATE(state, PSC_STATE_FLAG_PENAL_FAIL);
break;
default:
msg_panic("%s: unknown penalty action value %d",
myname, psc_penal_action);
}
#endif
}
#endif
}
char *psc_print_tests(VSTRING *buf, PSC_STATE *state)
{
const char *myname = "psc_print_tests";
if ((state->flags & PSC_STATE_MASK_ANY_UPDATE) == 0)
msg_panic("%s: attempt to save a no-update record", myname);
#ifdef NONPROD
if (state->flags & PSC_STATE_FLAG_PENAL_FAIL) {
state->pregr_stamp = state->dnsbl_stamp = state->pipel_stamp =
state->nsmtp_stamp = state->barlf_stamp =
((state->flags & PSC_STATE_FLAG_NEW) ?
PSC_TIME_STAMP_NEW : PSC_TIME_STAMP_DISABLED);
}
#endif
if (PSC_PREGR_TEST_ENABLE() == 0 && state->pregr_stamp == PSC_TIME_STAMP_NEW)
state->pregr_stamp = PSC_TIME_STAMP_DISABLED;
if (PSC_DNSBL_TEST_ENABLE() == 0 && state->dnsbl_stamp == PSC_TIME_STAMP_NEW)
state->dnsbl_stamp = PSC_TIME_STAMP_DISABLED;
if (var_psc_pipel_enable == 0 && state->pipel_stamp == PSC_TIME_STAMP_NEW)
state->pipel_stamp = PSC_TIME_STAMP_DISABLED;
if (var_psc_nsmtp_enable == 0 && state->nsmtp_stamp == PSC_TIME_STAMP_NEW)
state->nsmtp_stamp = PSC_TIME_STAMP_DISABLED;
if (var_psc_barlf_enable == 0 && state->barlf_stamp == PSC_TIME_STAMP_NEW)
state->barlf_stamp = PSC_TIME_STAMP_DISABLED;
vstring_sprintf(buf, "%lu;%lu;%lu;%lu;%lu;%lu",
(unsigned long) state->pregr_stamp,
(unsigned long) state->dnsbl_stamp,
(unsigned long) state->pipel_stamp,
(unsigned long) state->nsmtp_stamp,
(unsigned long) state->barlf_stamp,
(unsigned long) state->penal_stamp);
return (STR(buf));
}
char *psc_print_grey_key(VSTRING *buf, const char *client,
const char *helo, const char *sender,
const char *rcpt)
{
return (STR(vstring_sprintf(buf, "%s/%s/%s/%s",
client, helo, sender, rcpt)));
}