diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c index e274aa07fbca7f0c809be6f7f6a2c42e517defd4..9a9348c1d20085e6b4f46614a9cfe4ad7a2b7c9b 100644 --- a/src/sbbs3/mailsrvr.c +++ b/src/sbbs3/mailsrvr.c @@ -1923,13 +1923,12 @@ static BOOL email_addr_is_exempt(const char* addr) if(*addr==0 || strcmp(addr,"<>")==0) return FALSE; + angle_bracket(netmail, sizeof(netmail), addr); SAFEPRINTF(fname,"%sdnsbl_exempt.cfg",scfg.ctrl_dir); - if(findstr((char*)addr,fname)) + if(findstr(netmail, fname)) return TRUE; - SAFECOPY(netmail, addr); - if(*(p=netmail)=='<') - p++; - truncstr(p,">"); + p = netmail + 1; + *lastchar(p) = '\0'; return userdatdupe(&scfg, 0, U_NETMAIL, LEN_NETMAIL, p, /* del */FALSE, /* next */FALSE, NULL, NULL); } @@ -2700,7 +2699,7 @@ static void parse_mail_address(char* p char* tp; char tmp[256]; - if(p == NULL || name == NULL || addr == NULL) + if(p == NULL || addr == NULL) return; SKIP_WHITESPACE(p); @@ -2714,24 +2713,26 @@ static void parse_mail_address(char* p sprintf(addr,"%.*s",(int)addr_len,tp); truncstr(addr,">( "); - SAFECOPY(tmp,p); - p=tmp; - /* Get the "name" (if possible) */ - if((tp=strchr(p,'"'))!=NULL) { /* name in quotes? */ - p=tp+1; - tp=strchr(p,'"'); - } else if((tp=strchr(p,'('))!=NULL) { /* name in parenthesis? */ - p=tp+1; - tp=strchr(p,')'); - } else if(*p=='<') { /* address in brackets? */ - p++; - tp=strchr(p,'>'); - } else /* name, then address in brackets */ - tp=strchr(p,'<'); - if(tp) *tp=0; - sprintf(name,"%.*s",(int)name_len,p); - truncsp(name); - strip_char(name, name, '\\'); + if(name != NULL) { + SAFECOPY(tmp,p); + p=tmp; + /* Get the "name" (if possible) */ + if((tp=strchr(p,'"'))!=NULL) { /* name in quotes? */ + p=tp+1; + tp=strchr(p,'"'); + } else if((tp=strchr(p,'('))!=NULL) { /* name in parenthesis? */ + p=tp+1; + tp=strchr(p,')'); + } else if(*p=='<') { /* address in brackets? */ + p++; + tp=strchr(p,'>'); + } else /* name, then address in brackets */ + tp=strchr(p,'<'); + if(tp) *tp=0; + sprintf(name,"%.*s",(int)name_len,p); + truncsp(name); + strip_char(name, name, '\\'); + } } static BOOL checktag(scfg_t *scfg, char *tag, uint usernum) @@ -3159,7 +3160,8 @@ static void smtp_thread(void* arg) if(trashcan(&scfg,host_name,"smtpspy") || trashcan(&scfg,host_ip,"smtpspy")) { - SAFEPRINTF(str,"%ssmtpspy.txt", scfg.logs_dir); + SAFEPRINTF2(path,"%s%sspy.txt", scfg.logs_dir, client.protocol); + strlwr(str); spy=fopen(str,"a"); } @@ -3524,11 +3526,20 @@ static void smtp_thread(void* arg) smb_hfield_str(&msg, hfield_type=RFC822SUBJECT, p); continue; } - if(relay_user.number==0 && stricmp(field, "FROM")==0 - && !chk_email_addr(socket, client.protocol,p,host_name,host_ip,rcpt_addr,reverse_path,"FROM")) { - errmsg="554 Sender not allowed."; - smb_error=SMB_FAILURE; - break; + if(stricmp(field, "FROM")==0) { + if(relay_user.number==0 + && !chk_email_addr(socket, client.protocol,p,host_name,host_ip,rcpt_addr,reverse_path,"FROM")) { + errmsg="554 Sender not allowed."; + smb_error=SMB_FAILURE; + break; + } + char from_addr[128]; + parse_mail_address(p, from_addr, sizeof(from_addr)-1, /* name: */NULL, 0); + if(dnsbl_result.s_addr && email_addr_is_exempt(from_addr)) { + lprintf(LOG_INFO,"%04d %s %s Ignoring DNSBL results for exempt sender (from): %s" + ,socket, client.protocol, client_id, from_addr); + dnsbl_result.s_addr=0; + } } if(relay_user.number==0 && stricmp(field, "TO")==0 && !spam_bait_result && !chk_email_addr(socket, client.protocol,p,host_name,host_ip,rcpt_addr,reverse_path,"TO")) { @@ -4550,6 +4561,7 @@ static void smtp_thread(void* arg) && (trashcan(&scfg,reverse_path,"smtpspy") || trashcan(&scfg,rcpt_addr,"smtpspy"))) { SAFEPRINTF2(path,"%s%sspy.txt", scfg.logs_dir, client.protocol); + strlwr(path); spy=fopen(path,"a"); }