From ad243c630ca6a3b9cb0bedd2ac305e493b48f91d Mon Sep 17 00:00:00 2001 From: "Jean-Marc Pigeon (Delson)" Date: Mon, 11 Aug 2025 11:44:46 -0400 Subject: [PATCH] Double feed detection seesm to be working --- data-feed/feed20.tst | 2 ++ data-feed/feed21.tst | 7 +++---- lib/gessql.c | 38 +++++++++++++++++++++++++++----------- lib/lvleml.c | 13 +++++++++++-- 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/data-feed/feed20.tst b/data-feed/feed20.tst index 4f98f24..30e31b6 100644 --- a/data-feed/feed20.tst +++ b/data-feed/feed20.tst @@ -5,6 +5,8 @@ R:220 mailleur.example.com, ESMTP (cleartext) mailleur... #==================================================== S:HELO example.com R:250 mailleur.example.com, link (cleartext) ready,... +C:ORGN: 185.242.226.23 +R:220 mailleur.example.com, ESMTP (cleartext) mailleur... C:WAIT 120 $wait "forever" S:QUIT R:221 2.0.0 Bye, closing connection... diff --git a/data-feed/feed21.tst b/data-feed/feed21.tst index da5c4cf..080eb8f 100644 --- a/data-feed/feed21.tst +++ b/data-feed/feed21.tst @@ -5,10 +5,9 @@ R:220 mailleur.example.com, ESMTP (cleartext) mailleur... #==================================================== S:HELO example.com R:250 mailleur.example.com, link (cleartext) ready,... -S:MAIL FROM: -R:250 2.1.3 trouble@mailref1.example.com sender ok -S:RCPT TO: -R:250 2.6.4 Address accepted +C:ORGN: 185.242.226.23 +R:220 mailleur.example.com, ESMTP (cleartext) mailleur... +C:WAIT 5 #wait 5 sec S:QUIT R:221 2.0.0 Bye, closing connection... #------------------------------------------------------------------------- diff --git a/lib/gessql.c b/lib/gessql.c index abc9bf5..8c54299 100644 --- a/lib/gessql.c +++ b/lib/gessql.c @@ -679,10 +679,12 @@ PUBLIC int sql_newconnect(SQLPTR *sqlptr,char *rmtip,int delta) { #define OPEP "gessql.c:sql_newconnect," +static const char *sel="SELECT * FROM %s WHERE remoteip='%s' FOR UPDATE"; static const char *upd="UPDATE %s SET links=links+%d,lastupdate=now() WHERE remoteip='%s'"; static const char *ins="INSERT INTO %s (remoteip) values('%s')"; int connect; +SQLRES *sqlres; SRVTYP *srv; int phase; _Bool proceed; @@ -701,24 +703,38 @@ while (proceed==true) { } break; case 1 : //updating remotes record with links - if (sql_request(sqlptr,upd,RMTTBL,delta,rmtip)==1) - phase++; //Record is existing + if ((sqlres=sql_gettupple(sqlptr,sel,RMTTBL,rmtip))==(SQLRES *)0) { + (void) rou_alert(0,"%s Unable to get tupple for remote ip <%s> " + "in table <%s> (DB trouble?)", + OPEP,rmtip,RMTTBL); + phase=999; //no tupple information? + } break; - case 2 : //Let create a record + case 2 : //is record already existing + if (sql_getnbrtupple(sqlptr,sqlres)==1) { + phase++; //No need to create it + } + sqlres=sql_droptupple(sqlptr,sqlres); + break; + case 3 : //Let create a new unique record if (sql_request(sqlptr,ins,RMTTBL,rmtip)!=1) { (void) rou_alert(0,"%s Unable to create entry " "for remote ip <%s> in table <%s> (DB trouble?)", OPEP,rmtip,RMTTBL); + (void) sql_unlock(sqlptr,true); + phase=999; } - else { - if (sql_request(sqlptr,ins,RMTTBL,rmtip)!=1) { - (void) rou_alert(0,"%s Unable to create entry " - "for remote ip <%s> in table <%s> (DB trouble?)", - OPEP,rmtip,RMTTBL); - } + else + phase++; //record open + break; + case 4 : //lets update link + if (sql_request(sqlptr,upd,RMTTBL,delta,rmtip)!=1) { + (void) rou_alert(0,"%s Unable to update entry " + "for remote ip <%s> in table <%s> (DB trouble?)", + OPEP,rmtip,RMTTBL); } break; - case 3 : //lets find the the number of connection + case 5 : //lets find the the number of connection if (sql_mngremote(sqlptr,sql_select,rmtip,&srv)==false) { (void) rou_alert(0,"%s Unable to get record " "for remote ip <%s> in table <%s> (DB trouble?)", @@ -729,7 +745,7 @@ while (proceed==true) { srv=sql_freesrv(srv); } break; - case 4 : //unlock database + case 6 : //unlock database (void) sql_unlock(sqlptr,true); break; default : //SAFE Guard diff --git a/lib/lvleml.c b/lib/lvleml.c index 234272d..8ebab75 100644 --- a/lib/lvleml.c +++ b/lib/lvleml.c @@ -1495,7 +1495,7 @@ while (proceed==true) { switch (contact->privilege) { case rel_authentic : break; - case rel_isrelay : //ne to force rel_plain + case rel_isrelay : //need to force rel_plain contact->privilege=rel_plain; //NO BREAK; case rel_plain : @@ -1511,9 +1511,18 @@ while (proceed==true) { break; case 4 : //let update links if (sql_newconnect(contact->sqlptr,rmtip,1)!=1) { + static char *end; + + end="You have another connection still in progress"; (void) rou_alert(0,"%s <%s> Too many '%d' links! (Testing?)", OPEP,rmtip,sql_newconnect(contact->sqlptr,rmtip,0)); - phase=999; + (void) eml_transmit(contact,true,"%d contact denied <%s>",NOTNOW,end); + contact->termend=rou_freestr(contact->termend); + contact->termend=strdup(end); + contact->credit=-1; //small penalty + (void) sleep(1); //To avoid avalanche + (void) sql_newconnect(contact->sqlptr,rmtip,-1); + phase++; //connection rejected } break; case 5 : //everything is now fine -- 2.47.3