Skip to content
Snippets Groups Projects
Commit 42e9eb8b authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Allow email.can to contain email sender/recipient *names* as well as addresses

Allow filtering/blocking email based on the name portion of email header
fields.
parent 774d2854
No related branches found
No related tags found
No related merge requests found
Pipeline #7019 passed
...@@ -1932,30 +1932,66 @@ static ulong dns_blacklisted(SOCKET sock, const char* prot, union xp_sockaddr *a ...@@ -1932,30 +1932,66 @@ static ulong dns_blacklisted(SOCKET sock, const char* prot, union xp_sockaddr *a
return(found); return(found);
} }
static void parse_mail_address(const char* p
,char* name, size_t name_len
,char* addr, size_t addr_len)
{
char* tp;
char tmp[256];
if(p == NULL || addr == NULL)
return;
SKIP_WHITESPACE(p);
/* Get the address */
if((tp=strchr(p,'<'))!=NULL)
tp++;
else
tp=(char*)p;
SKIP_WHITESPACE(tp);
sprintf(addr,"%.*s",(int)addr_len,tp);
truncstr(addr,">( ");
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 chk_email_addr(SOCKET socket, const char* prot, char* p, char* host_name, char* host_ip static BOOL chk_email_addr(SOCKET socket, const char* prot, char* p, char* host_name, char* host_ip
,char* to, char* from, char* source) ,char* to, char* from, char* source)
{ {
char addr[64]; char name[128];
char addr[128];
char tmp[128]; char tmp[128];
SKIP_WHITESPACE(p); parse_mail_address(p, name, sizeof name, addr, sizeof addr);
char* lt = strchr(p, '<');
if(lt!= NULL)
p = lt+1;
SAFECOPY(addr,p);
truncstr(addr,">( ");
struct trash trash; struct trash trash;
if(!trashcan2(&scfg, addr, NULL, "email", &trash)) if(!trashcan2(&scfg, name, addr, "email", &trash))
return(TRUE); return(TRUE);
char details[128]; char details[128];
lprintf(LOG_NOTICE,"%04d %s [%s] !BLOCKED %s e-mail address: %s %s" lprintf(LOG_NOTICE,"%04d %s [%s] !BLOCKED %s e-mail address: %s %s"
,socket, prot, host_ip, source, addr, trash_details(&trash, details, sizeof details)); ,socket, prot, host_ip, source, p, trash_details(&trash, details, sizeof details));
SAFEPRINTF2(tmp,"Blocked %s e-mail address: %s", source, addr); SAFEPRINTF2(tmp,"Blocked %s e-mail address: %s", source, p);
spamlog(&scfg, &mqtt, (char*)prot, "REFUSED", tmp, host_name, host_ip, to, from); spamlog(&scfg, &mqtt, (char*)prot, "REFUSED", tmp, host_name, host_ip, to, from);
return(FALSE); return(FALSE);
} }
...@@ -2738,49 +2774,6 @@ static int chk_received_hdr(SOCKET socket,const char* prot,const char *buf,IN_AD ...@@ -2738,49 +2774,6 @@ static int chk_received_hdr(SOCKET socket,const char* prot,const char *buf,IN_AD
return(dnsbl_result->s_addr); return(dnsbl_result->s_addr);
} }
static void parse_mail_address(char* p
,char* name, size_t name_len
,char* addr, size_t addr_len)
{
char* tp;
char tmp[256];
if(p == NULL || addr == NULL)
return;
SKIP_WHITESPACE(p);
/* Get the address */
if((tp=strchr(p,'<'))!=NULL)
tp++;
else
tp=p;
SKIP_WHITESPACE(tp);
sprintf(addr,"%.*s",(int)addr_len,tp);
truncstr(addr,">( ");
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) static BOOL checktag(scfg_t *scfg, char *tag, uint usernum)
{ {
char fname[MAX_PATH+1]; char fname[MAX_PATH+1];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment