if (! parse_smtp_command (session, line, &cmd)) {
session->error = SMTP_ERROR_BAD_COMMAND;
+ session->errors ++;
return FALSE;
}
if (parse_smtp_helo (session, cmd)) {
session->state = SMTP_STATE_FROM;
}
+ else {
+ session->errors ++;
+ }
return TRUE;
}
else {
session->state = SMTP_STATE_RCPT;
}
else {
+ session->errors ++;
return FALSE;
}
}
return TRUE;
}
else {
+ session->errors ++;
return FALSE;
}
}
if (session->state == SMTP_STATE_RCPT) {
if (session->rcpt == NULL) {
session->error = SMTP_ERROR_RECIPIENTS;
+ session->errors ++;
return FALSE;
}
if (session->upstream == NULL) {
return TRUE;
improper_sequence:
+ session->errors ++;
session->error = SMTP_ERROR_SEQUENCE;
return FALSE;
}
case SMTP_STATE_DATA:
read_smtp_command (session, in);
if (session->state != SMTP_STATE_WAIT_UPSTREAM) {
+ if (session->errors > session->ctx->max_errors) {
+ session->error = SMTP_ERROR_LIMIT;
+ session->state = SMTP_STATE_CRITICAL_ERROR;
+ rspamd_dispatcher_write (session->dispatcher, session->error, 0, FALSE, TRUE);
+ destroy_session (session->s);
+ return FALSE;
+ }
smtp_write_socket (session);
}
break;
else {
ctx->metric = DEFAULT_METRIC;
}
+ if ((value = g_hash_table_lookup (worker->cf->params, "smtp_max_errors")) != NULL) {
+ ctx->max_errors = strtoul (value, NULL, 10);
+ }
+ else {
+ ctx->max_errors = DEFAULT_MAX_ERRORS;
+ }
if ((value = g_hash_table_lookup (worker->cf->params, "smtp_reject_message")) != NULL) {
ctx->reject_message = memory_pool_strdup (ctx->pool, value);
}
#define SMTP_ERROR_SEQUENCE "503 Bad sequence of commands" CRLF
#define SMTP_ERROR_RECIPIENTS "554 No valid recipients" CRLF
#define SMTP_ERROR_UNIMPLIMENTED "502 Command not implemented" CRLF
+#define SMTP_ERROR_LIMIT "505 Too many errors. Aborting." CRLF
#define SMTP_ERROR_UPSTREAM "421 Service not available, closing transmission channel" CRLF
#define SMTP_ERROR_FILE "420 Service not available, filesystem error" CRLF
#define SMTP_ERROR_OK "250 Requested mail action okay, completed" CRLF