From e274e37ef6bdd6b39b48d4d2fb652b34bd4f7a3d Mon Sep 17 00:00:00 2001 From: "Jean-Marc Pigeon (Delson)" Date: Sun, 8 Jun 2025 04:45:29 -0400 Subject: [PATCH] ehlo command is working properly --- lib/lvleml.c | 47 ++++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/lib/lvleml.c b/lib/lvleml.c index 127fcea..8e01a6a 100644 --- a/lib/lvleml.c +++ b/lib/lvleml.c @@ -27,7 +27,8 @@ typedef struct { SOCPTR *socptr; //socket to remote pointer LOGPTR *logptr; //Log pointer - const char *domain; //Domain to be reached + char *orgdomain; //originator domain + char *dstdomain; //Domain to be reached MXTYP *curmx; //Current MX number MXTYP **mxs; //MX list form domain }RMTTYP; @@ -743,7 +744,7 @@ while (proceed==true) { case 0 : //Sending EHLO char cmt[100]; - (void) snprintf(cmt,sizeof(cmt),"EHLO %s",rmt->domain); + (void) snprintf(cmt,sizeof(cmt),"EHLO %s",rmt->orgdomain); (void) tcp_write(rmt->socptr,cmt); (void) log_fprintlog(rmt->logptr,false,cmt); break; @@ -788,7 +789,7 @@ while (proceed==true) { case 0 : //do we have MX if (rmt->mxs==(MXTYP **)0) { (void) log_fprintlog(rmt->logptr,false,"NO MX found for domain <%s>", - rmt->domain); + rmt->dstdomain); phase=999; } break; @@ -848,7 +849,7 @@ return done; /* Procedure to send the whole email transaction */ /* */ /********************************************************/ -static void sending_email(char *domain,char *sessid,TRATYP **tra) +static void sending_email(char *orgdomain,char *dstdomain,char *sessid,TRATYP **tra) { #define OPEP "lvleml.c:sending_email," @@ -861,8 +862,9 @@ _Bool proceed; isnow=time((time_t *)0); (void) memset(&rmt,'\000',sizeof(rmt)); -rmt.mxs=dns_getmx(domain); -rmt.domain=domain; +rmt.mxs=dns_getmx(dstdomain); +rmt.dstdomain=dstdomain; +rmt.orgdomain=orgdomain; tosend=(TRATYP **)0; phase=0; proceed=true; @@ -912,7 +914,7 @@ while (proceed==true) { char cmt[100]; (void) snprintf(cmt,sizeof(cmt),"Unable to contact ANY MX for domain <%s>", - domain); + dstdomain); (void) log_fprintlog(rmt.logptr,false,cmt); phase=999; //No need to go further } @@ -1314,12 +1316,14 @@ PUBLIC void eml_remote_email(TRATYP **tra) { #define OPEP "lvleml.c:eml_remote_email," -char *domain; +char *orgdomain; +char *dstdomain; char *sessid; int phase; _Bool proceed; -domain=(char *)0; +orgdomain=(char *)0; +dstdomain=(char *)0; sessid=(char *)0; phase=0; proceed=true; @@ -1331,24 +1335,33 @@ while (proceed==true) { phase=999; } break; - case 1 : //detecting remote domain - if ((domain=strrchr((*tra)->rcptto,'@'))!=(char *)0) - domain++; - if (domain==(char *)0) { + case 1 : //set originator domain + if ((orgdomain=strrchr((*tra)->mailfrom,'@'))!=(char *)0) + orgdomain++; + if (orgdomain==(char *)0) { + (void) rou_alert(0,"%s Originator address <%s> without domain? (Bug?)", + OPEP,(*tra)->mailfrom); + phase=999; + } + break; + case 2 : //detecting remote domain + if ((dstdomain=strrchr((*tra)->rcptto,'@'))!=(char *)0) + dstdomain++; + if (dstdomain==(char *)0) { (void) rou_alert(0,"%s Recipient address <%s> without domain? (Bug?)", OPEP,(*tra)->rcptto); phase=999; } break; - case 2 : //checking if we have a session ID + case 3 : //checking if we have a session ID sessid=(*tra)->sessid; if (sessid==(char *)0) { (void) rou_alert(0,"%s Session ID is NULL (Bug?)",OPEP); - phase=999; + sessid="0000-0000"; } break; - case 3 : //sending the whole transaction to remote server - (void) sending_email(domain,sessid,tra); + case 4 : //sending the whole transaction to remote server + (void) sending_email(orgdomain,dstdomain,sessid,tra); break; default : //SAFE Guard proceed=false; -- 2.47.3