From f195fbba3481c875a41a72a6610a5da439931556 Mon Sep 17 00:00:00 2001 From: "Jean-Marc Pigeon (Delson)" Date: Thu, 12 Jun 2025 16:37:40 -0400 Subject: [PATCH] reject DATA sequence partially set --- Makefile | 6 +++--- app/feeder.c | 18 +++++++----------- data-feed/feed12.tst | 17 +++++++++++++++++ lib/lvleml.c | 26 ++++++++++++++++++-------- lib/unieml.h | 1 + 5 files changed, 46 insertions(+), 22 deletions(-) create mode 100644 data-feed/feed12.tst diff --git a/Makefile b/Makefile index 56db44a..8c40e72 100644 --- a/Makefile +++ b/Makefile @@ -139,11 +139,11 @@ onefeed : debug @ rm -fr $(TESTDIR)/var/spool/$(APPNAME)/queue/* @ bin/feeder \ -f \ - -d 2 \ + -d 6 \ -c ./conf/$(APPNAME).conf.dvl \ $(TESTIP) \ $(TESTPORT) \ - ./$(DATATST)/feed00.tst + ./$(DATATST)/feed12.tst @ rm -fr ./data-sorter/* @ cp -a \ $(TESTDIR)/var/spool/$(APPNAME)/queue/* \ @@ -176,7 +176,7 @@ dbgfeed : debug -c ./conf/feeder.conf.dvl \ $(TESTIP) \ $(TESTPORT) \ - $(DATATST)/dbgfeed.tst + $(DATATST)/feed12.tst valfeed : debug #valgring of emlrcvr @ echo "feed valgrind test" diff --git a/app/feeder.c b/app/feeder.c index 708fb85..c6b84ac 100644 --- a/app/feeder.c +++ b/app/feeder.c @@ -120,7 +120,7 @@ return done; /* server. */ /* */ /************************************************/ -static _Bool dosenddata(FEEDTYP *fd,int *numline) +static _Bool dosenddata(FEEDTYP *fd,int *numline,char *expected) { #define OPEP "feeder.c:dosenddata," @@ -139,7 +139,7 @@ action="DATA"; phase=0; proceed=true; while (proceed==true) { - //(void) rou_alert(0,"%s JMPDBG phase='%d'",OPEP,phase); + (void) rou_alert(0,"%s JMPDBG phase='%d'",OPEP,phase); switch (phase) { case 0 : //Transmit "DATA" to remote if (tcp_write(fd->socptr,action)!=(strlen(action)+2)) @@ -150,14 +150,10 @@ while (proceed==true) { phase=999; //Didn't get signon break; case 2 : //did we received the Proper "proceed" acknoledge - if (line!=(char *)0) { //Always - int code; - - code=0; - (void) sscanf(line,"%d",&code); - if (code!=DATAOK) - phase=999; - line=rou_freestr(line); + if (strcmp(line,expected)!=0) { + (void) rou_alert(0,"expecting\t'%s'",expected); + (void) rou_alert(0,"found\t\t'%s'",line); + phase=999; //did NOT get proper signon } break; case 3 : // @@ -369,7 +365,7 @@ switch (getcmd(line)) { (void) report(*numline,line,"Unable to set comment mode"); break; case cmd_data : //sending email content to remote - if ((status=dosenddata(fd,numline))==false) + if ((status=dosenddata(fd,numline,param))==false) (void) report(*numline,line,"Unable to fully send data"); break; case cmd_gotls : //GOTLS diff --git a/data-feed/feed12.tst b/data-feed/feed12.tst new file mode 100644 index 0000000..21da61f --- /dev/null +++ b/data-feed/feed12.tst @@ -0,0 +1,17 @@ +#==================================================== +T:(feed12) Trying to send Email whil there no recipient known +R:220 mailleur.example.com, ESMTP (cleartext) emlrcvr... +#==================================================== +S:HELO example.com +R:250 mailleur.example.com, link (cleartext) ready,... +S:MAIL FROM: +R:250 2.1.3 trouble@subdom1.example.com.. sender ok +S:RCPT TO: +R:563 5.6.3 No valid MX found for recipient domain name (domain=subdom0.example.com) +#------------------------------------------------------------------------- +#-sending data +C:DATA 503 5.5.0 RCPT first. transaction protocol command out of sequence +C:. +#------------------------------------------------------------------------- +S:QUIT +R:221 2.0.0 Bye, closing connection... diff --git a/lib/lvleml.c b/lib/lvleml.c index 57182ed..8d552a1 100644 --- a/lib/lvleml.c +++ b/lib/lvleml.c @@ -466,20 +466,30 @@ proceed=setdirectives(contact,EXTMP); while (proceed==true) { //(void) rou_alert(0,"JMPDBG %s phase='%d'",OPEP,phase); switch (phase) { - case 0 : //opening the queue email + case 0 : //checking if we have recipient + if (rou_nbrlist((void **)contact->recipients)==0) { + char *cmt; + + cmt="RCPT first. transaction protocol command out of sequence"; + (void) transmit(contact,"%d 5.5.0 %s",BADSEQ,cmt); + done=true; //lets say DATA will be issued + proceed=false; //No recipients + } + break; + case 1 : //opening the queue email if ((queue=eml_createqfile(contact->cursesid,""))==(FILE *)0) phase=999; //trouble trouble break; - case 1 : //adding received stamp to file + case 2 : //adding received stamp to file if (addreceived(contact,queue)==false) phase=999; //trouble trouble break; - case 2 : //sending 'go ahead' to remote + case 3 : //sending 'go ahead' to remote (void) clock_gettime(CLOCK_REALTIME,&start); (void) transmit(contact,"%d 3.5.0 %s", DATAOK,"End data with ."); break; - case 3 : //get incoming line, detect 'single dot' as end + case 4 : //get incoming line, detect 'single dot' as end while (completed==false) { int got; char *line; @@ -502,19 +512,19 @@ while (proceed==true) { line=rou_freestr(line); } break; - case 4 : //got all data + case 5 : //got all data if (eml_closeqfile(queue)<0) phase=999; //Trouble trouble break; - case 5 : //creating the count file + case 6 : //creating the count file if (setcountfile(contact)==false) phase=999; //Unable to create count file??? break; - case 6 : //renameing directive + case 7 : //renameing directive if (eml_renameqfile(contact->cursesid,EXTMP,EXTRANS)==false) phase=999; //Trouble trouble break; - case 7 : //everything fine + case 8 : //everything fine const char *fmt; unsigned int delta; diff --git a/lib/unieml.h b/lib/unieml.h index 06ab772..5083877 100644 --- a/lib/unieml.h +++ b/lib/unieml.h @@ -20,6 +20,7 @@ #define NOANSWR 460 //no answer from remote #define BADPAR 501 //error in parameters #define CMDBAD 502 //command not implemented +#define BADSEQ 503 //out of sequence command #define DATRJC 521 //Data Rejected #define REJECT 550 //E-mail/domain rejected #define UKNUSER 551 //Unknown user -- 2.47.3