From 749b37c58c8e29ba872c0d44912ce17be8952448 Mon Sep 17 00:00:00 2001 From: "Jean-Marc Pigeon (Delson)" Date: Sat, 19 Jul 2025 11:23:03 -0400 Subject: [PATCH] Starting to detect domain whitout MX --- data-feed/feed08.tst | 2 + lib/lvleml.c | 99 +++++++++++++++++++++++++++++++++++++++++--- lib/unieml.h | 2 +- shell/test-spf.sh | 2 +- 4 files changed, 98 insertions(+), 7 deletions(-) diff --git a/data-feed/feed08.tst b/data-feed/feed08.tst index 6d29e5c..a9a66e9 100644 --- a/data-feed/feed08.tst +++ b/data-feed/feed08.tst @@ -14,6 +14,8 @@ R:250-8BITMIME R:250 ENHANCEDSTATUSCODES S:MAIL FROM: R:250 2.1.3 supertool@mxtoolboxsmtpdiag.com.. sender ok +S:RCPT TO: +R:250 2.6.4 Address accepted S:RCPT TO: R:250 2.6.4 SOULD Be rejected S:QUIT diff --git a/lib/lvleml.c b/lib/lvleml.c index 5ba099b..e39304b 100644 --- a/lib/lvleml.c +++ b/lib/lvleml.c @@ -910,6 +910,81 @@ return isok; */ /********************************************************/ /* */ +/* checking if remote recipient is relayable. */ +/* */ +/********************************************************/ +static _Bool is_remote_good(CONTYP *contact,RCPTYP *rmtusr) + +{ +#define OPEP "lvleml.c:is_remote_good," + +_Bool remotegood; +const char *cmt; +int phase; +_Bool proceed; + +remotegood=false; +cmt=(const char *)0; +phase=0; +proceed=true; +while (proceed==true) { + (void) rou_alert(0,"JMPDBG %s phase='%d'",OPEP,phase); + switch (phase) { + case 0 : { //Is there an MX for the user remote domain + MXTYP **mxs; + + cmt="No MX nor IP for"; + if ((mxs=dns_getmx(rmtusr->domain))!=(MXTYP **)0) { + for (int i=0;mxs[i]!=(MXTYP *)0;i++) { + if (mxs[i]->mxip!=(char **)0) { + phase++; //No need to check for domain IP + break; + } + } + mxs=dns_freemxlist(mxs); + } + } + break; + case 1 : //is the domain with an IP address + break; + case 2 : //is connection acceptable + switch (contact->privilege) { + case rel_authentic : + case rel_isrelay : //everything fine + break; + case rel_plain : + cmt="No relay accepted"; + phase=999; //not relaiable + break; + default : + cmt="Unchecked status"; + phase=999; //not relaiable + break; + } + break; + case 3 : //so it a good remote + remotegood=true; + break; + default : //SAFE Guard + if (remotegood==false) { + + (void) transmit(contact,true,"%d 2.7.0 %s for domain <%s>", + NORELAY,cmt,rmtusr->domain); + } + proceed=false; + break; + } + phase++; + } +return remotegood; + +#undef OPEP +} +/* +^L +*/ +/********************************************************/ +/* */ /* Procedure to check if helo or ehlo paratmeter */ /* is a correct one */ /* */ @@ -1557,7 +1632,7 @@ report=(char *)0; proceed=true; phase=0; while (proceed==true) { - //(void) rou_alert(0,"JMPDBG %s phase='%d' rcptto=<%s>",OPEP,phase,rcptto); + (void) rou_alert(0,"JMPDBG %s phase='%d' rcptto=<%s>",OPEP,phase,rcptto); switch (phase) { case 0 : //do we have a mailfrom if ((contact->mailfrom==(char *)0)||(strlen(contact->mailfrom)==0)) { @@ -1594,14 +1669,26 @@ while (proceed==true) { 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 5 : //if the local user acceptable - if ((neu->code=='L')&&(is_user_good(contact,rcptto)==false)) { - neu=eml_freerecipient(neu); - phase=999; + switch (neu->code) { + case 'L' : //local user/domain + if (is_user_good(contact,rcptto)==false) + phase=999; + break; + case 'R' : //remote user/domain + if (is_remote_good(contact,neu)==false) + phase=999; + break; + default : + (void) transmit(contact,true,"%d 5.6.5 %s (domain=%s,code='%c')", + FAILED, + "system error with domain status", + neu->domain,neu->code); + phase=999; //no need to go further + break; } break; case 6 : //Storing rcpt to @@ -1615,6 +1702,8 @@ while (proceed==true) { success=true; break; default : //SAFE guard + if (success==false) + neu=eml_freerecipient(neu); proceed=false; break; } diff --git a/lib/unieml.h b/lib/unieml.h index 5e24048..d7f51b3 100644 --- a/lib/unieml.h +++ b/lib/unieml.h @@ -38,7 +38,7 @@ #define MALABRT 552 //email data rejected #define NOTEML 553 //Not an email address #define FAILED 554 //transaction failed -#define NORELAY 555 //remote do not relay email +#define NORELAY 555 //we do not relay email #define MISSMX 563 //NO MX found for recipient //defining extensions diff --git a/shell/test-spf.sh b/shell/test-spf.sh index 7bc6726..bda07d6 100755 --- a/shell/test-spf.sh +++ b/shell/test-spf.sh @@ -20,7 +20,7 @@ while [ $# -gt 0 ] expect=`echo $data | cut -d ' ' -f1` domain=`echo $data | cut -d ' ' -f2` ipnum=`echo $data | cut -d ' ' -f3` - result=`bin/chkspf $domain $ipnum` + result=`bin-utils/chkspf $domain $ipnum` echo -n "done bin-utils/chkspf $domain $ipnum " if [ "$result" != "$expect" ] ; then echo "Fail!" -- 2.47.3