From 19ab9bb5942a6fea259c9436d270d6e0445f7245 Mon Sep 17 00:00:00 2001 From: "Jean-Marc Pigeon (Delson)" Date: Wed, 11 Jun 2025 09:45:59 -0400 Subject: [PATCH] Starting to have is_local_domain working --- conf/mailleur.conf.dvl | 4 +-- data-feed/feed10.tst | 2 ++ lib/lvleml.c | 43 +++++++++++++++++-------------- lib/unidns.c | 57 ++++++++++++++++++++++++++++++++++++++++++ lib/unidns.h | 9 ++++++- lib/unieml.h | 1 + 6 files changed, 94 insertions(+), 22 deletions(-) diff --git a/conf/mailleur.conf.dvl b/conf/mailleur.conf.dvl index 9e7af63..07270a7 100644 --- a/conf/mailleur.conf.dvl +++ b/conf/mailleur.conf.dvl @@ -11,8 +11,8 @@ #:: -> smtp:0.0.0.0:25:2 #SMTPPORTS " "::" #SMTPPORTS = ":127.127.10.25:1025:,smtps:127.127.10.25:1026:1" -#SMTPPORTS = ":127.127.10.25:1025:" -SMTPPORTS = "smtps:127.127.10.25:1065:1" +SMTPPORTS = ":127.127.10.25:1025:" +#SMTPPORTS = "smtps:127.127.10.25:1065:1" #------------------------------------------------ #Defining SERVER mode Certificate data CA_ROOT_SRV = "./certs/root-safe_CA.pem" diff --git a/data-feed/feed10.tst b/data-feed/feed10.tst index 0e998fd..5483ec5 100644 --- a/data-feed/feed10.tst +++ b/data-feed/feed10.tst @@ -10,6 +10,8 @@ S:MAIL FROM: R:250 2.1.3 trouble@subdom1.example.com.. sender ok S:RCPT TO: R:250 2.6.4 Address accepted +S:RCPT TO: +R:250 2.6.4 Address accepted #------------------------------------------------------------------------- #-sending data C:DATA diff --git a/lib/lvleml.c b/lib/lvleml.c index 4735963..95b8573 100644 --- a/lib/lvleml.c +++ b/lib/lvleml.c @@ -89,14 +89,25 @@ while (proceed==true) { } break; case 1 : //check about local domain, TEMPORARY code - if (strcmp(rcpt->domain,"example.com")==0) { - rcpt->code='L'; //domain is local - phase=999; //No need to go further + int status; + + status=dns_is_domain_local(rcpt->domain); + switch (status) { + case dns_nomx : + done=false; + break; + case dns_local : + rcpt->code='L'; //domain is local + break; + case dns_remote : + rcpt->code='R'; //domain is remote + break; + default : + (void) rou_alert(0,"%s Unexpected status='%d' for domain<%s>", + OPEP,status,rcpt->domain); + break; } break; - case 2 : //domain is a remote one - rcpt->code='R'; - break; default : //SAFE Guard proceed=false; break; @@ -648,19 +659,13 @@ while (proceed==true) { } break; case 3 : //Do we have a domain MX - (void) setlocdom(contact,neu); - if (neu->domain!=(const char *)0) { //always - MXTYP **mx; - - if ((mx=dns_getmx(neu->domain))==(MXTYP **)0) { - (void) transmit(contact,"%d 5.6.3 %s (rcpt=%s)", - MISSMX, - "No valid MX found for recipient domain name", - neu->domain); - neu=eml_freerecipient(neu); - phase=999; //no need to go further - } - mx=dns_freemxlist(mx); + if (setlocdom(contact,neu)==false) { + (void) transmit(contact,"%d 5.6.3 %s (domain=%s)", + MISSMX, + "No valid MX found for recipient domain name", + neu->domain); + neu=eml_freerecipient(neu); //free recipient + phase=999; //no need to go further } break; case 4 : //Storing rcpt to diff --git a/lib/unidns.c b/lib/unidns.c index ad398ab..41db7e3 100644 --- a/lib/unidns.c +++ b/lib/unidns.c @@ -381,6 +381,7 @@ while (proceed==true) { mx=(MXTYP *)calloc(1,sizeof(MXTYP)); mx->preference=atoi(list[i]); mx->mxname=strdup(list[i+1]); + //(void) rou_alert(0,"%s JMPDBG MX[%d]=<%s>",OPEP,i,mx->mxname); mxlist=(MXTYP **)rou_addlist((void **)mxlist,(void *)mx); answer++; } @@ -468,3 +469,59 @@ else { return match; #undef OPEP } +/* + +*/ +/********************************************************/ +/* */ +/* Procedure to check if a domain is handle by the */ +/* local interface (serveur is primary MX). */ +/* */ +/********************************************************/ +PUBLIC LOCTYP dns_is_domain_local(const char *domain) + + +{ +#define OPEP "unidns.c:dns_is_domain_local," + +LOCTYP status; +MXTYP **dns; +int phase; +_Bool proceed; + +status=dns_nomx; +phase=0; +proceed=true; +while (proceed==true) { + switch (phase) { + case 0 : //Do we have a domain + if ((domain==(char *)0)||(strlen(domain)==0)) + phase=999; //No domain (Bug?) + break; + case 1 : //getting MX list + if ((dns=dns_getmx(domain))==(MXTYP **)0) + phase=999; //domain without MX? + break; + case 2 : //listing MX + MXTYP **ptr; + + ptr=dns; + while ((*ptr)!=(MXTYP *)0) { + (void) rou_alert(0,"%s JMPDBG pref='%d' mxname=<%s>", + OPEP,(*ptr)->preference,(*ptr)->mxname); + ptr++; + } + break; + case 3 : //cleaning MX list + dns=dns_freemxlist(dns); + break; + default : //SAFE Guard + proceed=false; + break; + } + phase++; + } +return status; + +#undef OPEP +} diff --git a/lib/unidns.h b/lib/unidns.h index 74b3306..1114ee8 100644 --- a/lib/unidns.h +++ b/lib/unidns.h @@ -17,6 +17,13 @@ typedef struct { char **mxip; //MX IPNUM list }MXTYP; +typedef enum { //domain MX status + dns_nomx, //Domain without MX + dns_local, //Domain is local + dns_remote, //Domain is remote + dns_unknown //Unknow domain status. + }LOCTYP; + //Procedure to get ONE SPF entry within domain dns extern char *dns_getspf(char *domain); @@ -33,6 +40,6 @@ extern _Bool dns_matchiprec(char *hostname,AFNTYP *afnnum,int mask); //procedure to detect if a domain is served by a local //smtp server -extern _Bool dns_is_domain_local(const char *domain); +extern LOCTYP dns_is_domain_local(const char *domain); #endif diff --git a/lib/unieml.h b/lib/unieml.h index a325007..2c755e2 100644 --- a/lib/unieml.h +++ b/lib/unieml.h @@ -21,6 +21,7 @@ #define BADPAR 501 //error in parameters #define CMDBAD 502 //command not implemented #define DATRJC 521 //Data Rejected +#define REJECT 550 //E-mail/domain rejected #define UKNUSER 551 //Unknown user #define MALABRT 552 //email data rejected #define NOTEML 553 //Not an email address -- 2.47.3