From a0cc43db18bb97ec1c6ca649ba0e5e9288ae2403 Mon Sep 17 00:00:00 2001 From: "Jean-Marc Pigeon (Delson)" Date: Fri, 15 Aug 2025 11:02:03 -0400 Subject: [PATCH] Credit detetcion is NOT done correctly --- conf/mailleur.conf | 4 ++++ data-feed/feed010.tst | 9 ++++++++ lib/lvleml.c | 3 ++- lib/modrec.c | 50 +++++++++++++++++++++++++++++++------------ sql/datatest.sql | 4 ++++ 5 files changed, 55 insertions(+), 15 deletions(-) create mode 100644 data-feed/feed010.tst diff --git a/conf/mailleur.conf b/conf/mailleur.conf index ee36bcb..0da4310 100644 --- a/conf/mailleur.conf +++ b/conf/mailleur.conf @@ -68,3 +68,7 @@ BLACKLISTER=/etc/mailleur/blacklister.conf #the list of IP from which we accept to relay email RELAYABLE=/etc/mailleur/relayed.conf #------------------------------------------------ +#Minimal credit level to which remote is rejected at once +#if credit is equal or below that level +RJCTCRED=-50 +#------------------------------------------------ diff --git a/data-feed/feed010.tst b/data-feed/feed010.tst new file mode 100644 index 0000000..5d46aca --- /dev/null +++ b/data-feed/feed010.tst @@ -0,0 +1,9 @@ +T:(feed010) Making sure we can reject a remote +C:CONNECT +#==================================================== +R:220 mailleur.example.com, ESMTP (cleartext) mailleur... +#take a "invalide" imp number as server remote IP +C:ORGN: 8.8.8.8. +R:250 3.5.3 Message accepted for delivery +S:QUIT +R:221 2.0.0 Bye, closing connection... diff --git a/lib/lvleml.c b/lib/lvleml.c index c8f6a59..a328102 100644 --- a/lib/lvleml.c +++ b/lib/lvleml.c @@ -30,6 +30,7 @@ #include "geseml.h" #include "lvleml.h" +//env variable to define the list of relayable #define RELAYS "RELAYABLE" static const char *cry="(crypted link is now set in '%s' mode, security level='%d')"; @@ -2028,7 +2029,7 @@ while (proceed==true) { phase=999; //No NX found! } break; - case 3 : //waitin MX signon + case 3 : //waiting MX signon int res; res=tcp_get_smtp_reply(rmt,WAITRMT,(char ***)0); diff --git a/lib/modrec.c b/lib/modrec.c index d104233..079f5d4 100644 --- a/lib/modrec.c +++ b/lib/modrec.c @@ -22,6 +22,9 @@ #include "lvleml.h" #include "modrec.h" +//env variable to set the rejection level +#define ENVRJCT "RJCTCRED" +#define DFLTRJCT -50 //default reject max level /* */ @@ -188,10 +191,30 @@ while (proceed==true) { (void) eml_transmit(contact,true,"%d contact denied <%s>",NOTNOW,end); contact->credit=-1; //small penalty (void) sleep(1); //To avoid avalanche - phase++; //connection rejected + phase=999; //no Need to go further } break; - case 2 : //do contact + case 2 : { //checking remote credit + static char *cmt="Remote server credit too low"; + int reject; + char *ptr; + SRVTYP *srv; + + reject=DFLTRJCT; + if ((ptr=getenv(ENVRJCT))!=(char *)0) + reject=atoi(ptr); + if (sql_mngremote(contact->sqlptr,sql_select,contact->peerip,&srv)==true) { + if (srv->credit<=reject) { + contact->termend=rou_freestr(contact->termend); + contact->termend=strdup(cmt); + (void) eml_transmit(contact,true,"%d 7.0.0 %s",DATRJC,cmt); + phase=999; //rejecting remote first hand + } + srv=sql_freesrv(srv); + } + } + break; + case 3 : //do contact intstat=eml_docontact(contact); switch (intstat) { case 1 : //command 'quit' recieved @@ -210,20 +233,19 @@ while (proceed==true) { break; } break; - case 3 : { //connection terminated - static const char *cmt; - SRVTYP *srv; + default : //SAFE guard + if (contact!=(CONTYP *)0) { + static const char *cmt; + SRVTYP *srv; - cmt="(Contact terminated, condition=<%s>)"; - if (sql_mngremote(contact->sqlptr,sql_select,contact->peerip,&srv)==true) { - srv=sql_freesrv(srv); + cmt="(Contact terminated, condition=<%s>)"; + if (sql_mngremote(contact->sqlptr,sql_select,contact->peerip,&srv)==true) { + srv=sql_freesrv(srv); + } + (void) log_fprintlog(contact->logptr,true,cmt,contact->termend); + (void) sql_newconnect(contact->sqlptr,contact->peerip,-1); + contact=eml_dropcontact(contact); } - (void) log_fprintlog(contact->logptr,true,cmt,contact->termend); - (void) sql_newconnect(contact->sqlptr,contact->peerip,-1); - contact=eml_dropcontact(contact); - } - break; - default : //SAFE guard proceed=false; break; } diff --git a/sql/datatest.sql b/sql/datatest.sql index 0d4826a..e5ffa4d 100644 --- a/sql/datatest.sql +++ b/sql/datatest.sql @@ -56,3 +56,7 @@ INSERT INTO remotes (remoteip) \ values ('192.219.254.189'); INSERT INTO remotes (remoteip) \ values ('216.252.69.41'); + +//selected IP with low credit +INSERT INTO remotes (remoteip,credit) \ + values ('8.8.8.8',-50); -- 2.47.3