typedef struct greylist_config_t {
unsigned lookup_by_host : 1;
+ unsigned no_sender : 1;
+ unsigned no_recipient : 1;
int delay;
int retry_window;
int client_awl;
} greylist_config_t;
#define GREYLIST_INIT { .lookup_by_host = false, \
+ .no_sender = false, \
+ .no_recipient = false, \
.delay = 300, \
.retry_window = 2 * 24 * 3600, \
.client_awl = 5, \
return NULL;
}
} else {
+ unlink(tmppath);
info("database cleanup finished: nothing to do, %u entries", new_count);
}
}
*/
klen = snprintf(key, sizeof(key), "%s/%s/%s",
c_net(config, c_addr, c_name, cnet, sizeof(cnet)),
- sender_normalize(sender, sbuf, sizeof(sbuf)), rcpt);
+ config->no_sender ? "" : sender_normalize(sender, sbuf, sizeof(sbuf)),
+ config->no_recipient ? "" : rcpt);
klen = MIN(klen, ssizeof(key) - 1);
res = tcbdbget3(config->obj_db, key, klen, &len);
FILTER_PARAM_PARSE_STRING(PATH, path);
FILTER_PARAM_PARSE_STRING(PREFIX, prefix);
FILTER_PARAM_PARSE_BOOLEAN(LOOKUP_BY_HOST, config->lookup_by_host);
+ FILTER_PARAM_PARSE_BOOLEAN(NO_SENDER, config->no_sender);
+ FILTER_PARAM_PARSE_BOOLEAN(NO_RECIPIENT, config->no_recipient);
FILTER_PARAM_PARSE_INT(RETRY_WINDOW, config->retry_window);
FILTER_PARAM_PARSE_INT(CLIENT_AWL, config->client_awl);
FILTER_PARAM_PARSE_INT(DELAY, config->delay);
filter_context_t *context)
{
const greylist_config_t *config = filter->data;
- if (query->state != SMTP_RCPT) {
- warn("greylisting only works as smtpd_recipient_restrictions");
+ if (!config->no_recipient && query->state != SMTP_RCPT) {
+ warn("greylisting on recipient only works as smtpd_recipient_restrictions");
+ return HTK_ABORT;
+ }
+ if (!config->no_sender && query->state < SMTP_MAIL) {
+ warn("greylisting on sender must be performed after (or at) MAIL TO");
return HTK_ABORT;
}
/* Parameters.
*/
(void)filter_param_register(type, "lookup_by_host");
+ (void)filter_param_register(type, "no_sender");
+ (void)filter_param_register(type, "no_recipient");
(void)filter_param_register(type, "delay");
(void)filter_param_register(type, "retry_window");
(void)filter_param_register(type, "client_awl");