Skip to content
Snippets Groups Projects
Commit 313c7c7f authored by rswindell's avatar rswindell
Browse files

Configurable blacklisted mail header tag (e.g. "X-DNSBL" or "X-RBL").

New option: MAIL_OPT_DNSBL_BADUSER - reject mail from blacklisted servers.
parent e33a88fe
No related branches found
No related tags found
No related merge requests found
...@@ -1168,7 +1168,7 @@ static BOOL chk_email_addr(SOCKET socket, char* p, char* host_name, char* host_i ...@@ -1168,7 +1168,7 @@ static BOOL chk_email_addr(SOCKET socket, char* p, char* host_name, char* host_i
lprintf("%04d !SMTP BLOCKED SOURCE: %s" lprintf("%04d !SMTP BLOCKED SOURCE: %s"
,socket, addr); ,socket, addr);
sprintf(tmp,"Blocked source e-mail address: %s", addr); sprintf(tmp,"Blocked source e-mail address: %s", addr);
spamlog(&scfg, "SMTP", "REFUSED", tmp, host_name, host_ip, to); spamlog(&scfg, "SMTP", "MAIL REFUSED", tmp, host_name, host_ip, to);
sockprintf(socket, "554 Sender not allowed."); sockprintf(socket, "554 Sender not allowed.");
return(FALSE); return(FALSE);
...@@ -1331,17 +1331,17 @@ static void smtp_thread(void* arg) ...@@ -1331,17 +1331,17 @@ static void smtp_thread(void* arg)
/* SPAM Filters (mail-abuse.org) */ /* SPAM Filters (mail-abuse.org) */
dnsbl_result.s_addr = dns_blacklisted(smtp.client_addr.sin_addr.s_addr,dnsbl); dnsbl_result.s_addr = dns_blacklisted(smtp.client_addr.sin_addr.s_addr,dnsbl);
if(dnsbl_result.s_addr) { if(dnsbl_result.s_addr) {
lprintf("%04d SMTP BLACKLISTED SERVER on %s: %s [%s] = %s" lprintf("%04d !SMTP BLACKLISTED SERVER on %s: %s [%s] = %s"
,socket, dnsbl, host_name, host_ip, inet_ntoa(dnsbl_result)); ,socket, dnsbl, host_name, host_ip, inet_ntoa(dnsbl_result));
if(startup->options&MAIL_OPT_DNSBL_REFUSE) { if(startup->options&MAIL_OPT_DNSBL_REFUSE) {
sprintf(str,"Listed on %s as %s", dnsbl, inet_ntoa(dnsbl_result)); sprintf(str,"Listed on %s as %s", dnsbl, inet_ntoa(dnsbl_result));
spamlog(&scfg, "SMTP", "REFUSED", str, host_name, host_ip, NULL); spamlog(&scfg, "SMTP", "SESSION REFUSED", str, host_name, host_ip, NULL);
sockprintf(socket sockprintf(socket
,"550 Mail from %s refused due to listing at %s" ,"550 Mail from %s refused due to listing at %s"
,host_ip, dnsbl); ,host_ip, dnsbl);
mail_close_socket(socket); mail_close_socket(socket);
thread_down(); thread_down();
lprintf("%04d !SMTP REFUSED MAIL from blacklisted server" lprintf("%04d !SMTP REFUSED SESSION from blacklisted server"
,socket); ,socket);
return; return;
} }
...@@ -1413,7 +1413,7 @@ static void smtp_thread(void* arg) ...@@ -1413,7 +1413,7 @@ static void smtp_thread(void* arg)
if(dnsbl_result.s_addr) { if(dnsbl_result.s_addr) {
if(startup->options&MAIL_OPT_DNSBL_IGNORE) { if(startup->options&MAIL_OPT_DNSBL_IGNORE) {
lprintf("%04d SMTP IGNORED MAIL from blacklisted server" lprintf("%04d !SMTP IGNORED MAIL from blacklisted server"
,socket); ,socket);
sprintf(str,"Listed on %s as %s", dnsbl, inet_ntoa(dnsbl_result)); sprintf(str,"Listed on %s as %s", dnsbl, inet_ntoa(dnsbl_result));
spamlog(&scfg, "SMTP", "IGNORED", str, host_name, host_ip, rcpt_addr); spamlog(&scfg, "SMTP", "IGNORED", str, host_name, host_ip, rcpt_addr);
...@@ -1421,14 +1421,19 @@ static void smtp_thread(void* arg) ...@@ -1421,14 +1421,19 @@ static void smtp_thread(void* arg)
sockprintf(socket,SMTP_OK); sockprintf(socket,SMTP_OK);
continue; continue;
} }
/* flag message as spam (should this be X-DNSBL?) */ /* tag message as spam (should this be X-DNSBL?) */
sprintf(str,"X-RBL: %s is listed on %s as %s" if(startup->dnsbl_hdr[0]) {
,host_ip, dnsbl, inet_ntoa(dnsbl_result)); sprintf(str,"%s: %s is listed on %s as %s"
smb_hfield(&msg,RFC822HEADER,strlen(str),str); ,startup->dnsbl_hdr, host_ip
lprintf("%04d SMTP FLAGGED MAIL from blacklisted server" ,dnsbl, inet_ntoa(dnsbl_result));
,socket); smb_hfield(&msg,RFC822HEADER,strlen(str),str);
sprintf(str,"Listed on %s as %s", dnsbl, inet_ntoa(dnsbl_result)); lprintf("%04d !SMTP TAGGED MAIL HEADER from blacklisted server with: %s"
spamlog(&scfg, "SMTP", "FLAGGED", str, host_name, host_ip, rcpt_addr); ,socket, startup->dnsbl_hdr);
}
if(startup->dnsbl_hdr[0] || startup->dnsbl_tag[0]) {
sprintf(str,"Listed on %s as %s", dnsbl, inet_ntoa(dnsbl_result));
spamlog(&scfg, "SMTP", "TAGGED", str, host_name, host_ip, rcpt_addr);
}
} }
if(telegram==TRUE) { /* Telegram */ if(telegram==TRUE) { /* Telegram */
...@@ -1731,15 +1736,18 @@ static void smtp_thread(void* arg) ...@@ -1731,15 +1736,18 @@ static void smtp_thread(void* arg)
,socket, p, reverse_path); ,socket, p, reverse_path);
sprintf(tmp,"Blocked subject (%s) from: %s" sprintf(tmp,"Blocked subject (%s) from: %s"
,p, reverse_path); ,p, reverse_path);
spamlog(&scfg, "SMTP", "REFUSED", tmp, host_name, host_ip, rcpt_addr); spamlog(&scfg, "SMTP", "MAIL REFUSED", tmp, host_name, host_ip, rcpt_addr);
sockprintf(socket, "554 Subject not allowed."); sockprintf(socket, "554 Subject not allowed.");
break; break;
} }
if(dnsbl_result.s_addr && startup->dnsbl_flag[0]) { if(dnsbl_result.s_addr && startup->dnsbl_tag[0]
&& !(startup->options&MAIL_OPT_DNSBL_IGNORE)) {
sprintf(str,"%.*s: %.*s" sprintf(str,"%.*s: %.*s"
,(int)sizeof(str)/2, startup->dnsbl_flag ,(int)sizeof(str)/2, startup->dnsbl_tag
,(int)sizeof(str)/2, p); ,(int)sizeof(str)/2, p);
p=str; p=str;
lprintf("%04d !SMTP TAGGED MAIL SUBJECT from blacklisted server with: %s"
,socket, startup->dnsbl_tag);
} }
smb_hfield(&msg, SUBJECT, (ushort)strlen(p), p); smb_hfield(&msg, SUBJECT, (ushort)strlen(p), p);
strlwr(p); strlwr(p);
...@@ -1984,7 +1992,7 @@ static void smtp_thread(void* arg) ...@@ -1984,7 +1992,7 @@ static void smtp_thread(void* arg)
,socket, MAX_RECIPIENTS); ,socket, MAX_RECIPIENTS);
sprintf(tmp,"Maximum recipient count (%d) from: %s" sprintf(tmp,"Maximum recipient count (%d) from: %s"
,MAX_RECIPIENTS, reverse_path); ,MAX_RECIPIENTS, reverse_path);
spamlog(&scfg, "SMTP", "REFUSED", tmp, host_name, host_ip, rcpt_addr); spamlog(&scfg, "SMTP", "MAIL REFUSED", tmp, host_name, host_ip, rcpt_addr);
sockprintf(socket, "552 Too many recipients"); sockprintf(socket, "552 Too many recipients");
continue; continue;
} }
...@@ -1995,11 +2003,22 @@ static void smtp_thread(void* arg) ...@@ -1995,11 +2003,22 @@ static void smtp_thread(void* arg)
,socket, rcpt_addr, reverse_path); ,socket, rcpt_addr, reverse_path);
sprintf(str,"Blocked recipient e-mail address from: %s" sprintf(str,"Blocked recipient e-mail address from: %s"
,reverse_path); ,reverse_path);
spamlog(&scfg, "SMTP", "REFUSED", str, host_name, host_ip, rcpt_addr); spamlog(&scfg, "SMTP", "MAIL REFUSED", str, host_name, host_ip, rcpt_addr);
sockprintf(socket, "550 Unknown User:%s", buf+8); sockprintf(socket, "550 Unknown User:%s", buf+8);
continue; continue;
} }
if(dnsbl_result.s_addr && startup->options&MAIL_OPT_DNSBL_BADUSER) {
lprintf("%04d !SMTP REFUSED MAIL from blacklisted server"
,socket);
sprintf(str,"Listed on %s as %s", dnsbl, inet_ntoa(dnsbl_result));
spamlog(&scfg, "SMTP", "MAIL REFUSED", str, host_name, host_ip, NULL);
sockprintf(socket
,"550 Mail from %s refused due to listing at %s"
,host_ip, dnsbl);
continue;
}
/* Check for full address aliases */ /* Check for full address aliases */
p=alias(&scfg,p,alias_buf); p=alias(&scfg,p,alias_buf);
if(p==alias_buf) if(p==alias_buf)
...@@ -2037,7 +2056,7 @@ static void smtp_thread(void* arg) ...@@ -2037,7 +2056,7 @@ static void smtp_thread(void* arg)
,socket, reverse_path, host_ip, p); ,socket, reverse_path, host_ip, p);
sprintf(tmp,"Relay attempt from: %s to: %s" sprintf(tmp,"Relay attempt from: %s to: %s"
,reverse_path, p); ,reverse_path, p);
spamlog(&scfg, "SMTP", "REFUSED", tmp, host_name, host_ip, rcpt_addr); spamlog(&scfg, "SMTP", "MAIL REFUSED", tmp, host_name, host_ip, rcpt_addr);
if(startup->options&MAIL_OPT_ALLOW_RELAY) if(startup->options&MAIL_OPT_ALLOW_RELAY)
sockprintf(socket, "553 Relaying through this server " sockprintf(socket, "553 Relaying through this server "
"requires authentication. " "requires authentication. "
......
...@@ -79,7 +79,9 @@ typedef struct { ...@@ -79,7 +79,9 @@ typedef struct {
char relay_server[128]; char relay_server[128];
char dns_server[128]; char dns_server[128];
char default_user[128]; char default_user[128];
char dnsbl_flag[128]; char dnsbl_tag[32]; // Tag to add to blacklisted subject
char dnsbl_hdr[32]; // Header field to add to msg header
char reserved_string[64];
char reserved_path6[128]; char reserved_path6[128];
char reserved_path5[128]; char reserved_path5[128];
char reserved_path4[128]; char reserved_path4[128];
...@@ -106,6 +108,7 @@ typedef struct { ...@@ -106,6 +108,7 @@ typedef struct {
#define MAIL_OPT_ALLOW_RELAY (1<<14) /* Allow relays from stored user IPs */ #define MAIL_OPT_ALLOW_RELAY (1<<14) /* Allow relays from stored user IPs */
#define MAIL_OPT_DNSBL_REFUSE (1<<15) /* Refuse session, return error */ #define MAIL_OPT_DNSBL_REFUSE (1<<15) /* Refuse session, return error */
#define MAIL_OPT_DNSBL_IGNORE (1<<16) /* Dump mail, return success */ #define MAIL_OPT_DNSBL_IGNORE (1<<16) /* Dump mail, return success */
#define MAIL_OPT_DNSBL_BADUSER (1<<17) /* Refuse mail (bad user name) */
#define MAIL_OPT_LOCAL_TIMEZONE (1<<30) /* Don't force UTC/GMT */ #define MAIL_OPT_LOCAL_TIMEZONE (1<<30) /* Don't force UTC/GMT */
#define MAIL_OPT_MUTE (1<<31) #define MAIL_OPT_MUTE (1<<31)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment