From: Jean-Marc Pigeon (Delson) Date: Thu, 10 Jul 2025 22:57:43 +0000 (-0400) Subject: Feeder is now able to initiate connection X-Git-Tag: tag-0.14~142 X-Git-Url: https://jmp-git.ovh.safe.ca/?a=commitdiff_plain;h=b3461f12eae6dbbed95d20d6e17fb067f8691760;p=jmp%2Fmailleur Feeder is now able to initiate connection --- diff --git a/Makefile.dbg b/Makefile.dbg index 50571f6..1c5e4cc 100644 --- a/Makefile.dbg +++ b/Makefile.dbg @@ -66,9 +66,10 @@ onercvr : clean debug $(EMLPAR)$(TESTITER) onefeed : debug - @ bin/feeder \ + @ \ + bin/feeder \ -f \ - -d 2 \ + -d 9 \ -c ./conf/$(APPNAME).conf.dvl \ $(TESTIP) \ $(TESTPORT) \ diff --git a/app/feeder.c b/app/feeder.c index 6293e10..4580235 100644 --- a/app/feeder.c +++ b/app/feeder.c @@ -41,9 +41,10 @@ typedef struct { typedef enum { //List of command cmd_comment, //Test sequence in int/out comment mode + cmd_connect, //Start connection with smtp server cmd_data, //start the SMTP data sequence cmd_gotls, //going in tls mode - cmd_orgn, //Change peer IP origin + cmd_ipfrom, //Change peer IP origin cmd_restart, //restart connection with remote server cmd_wait, //delay exchange with remote cmd_unknown @@ -303,6 +304,29 @@ return status; #undef OPEP } /* + +*/ +/********************************************************/ +/* */ +/* Procedure to connect to SMTP server if NOT YET */ +/* connected */ +/* */ +/********************************************************/ +static _Bool doconnect(FEEDTYP *fd) + +{ +_Bool isopen; + +isopen=true; +if (fd->socptr==(SOCPTR *)0) + fd->socptr=soc_openfeedsock(pro_smtp,fd->srcip,fd->destip,fd->destport); +if (fd->socptr==(SOCPTR *)0) { + (void) rou_alert(0,"Unable to open link to [%s:%s]",fd->destip,fd->destport); + isopen=false; + } +return isopen; +} +/* ^L */ /************************************************/ @@ -346,9 +370,10 @@ static struct { const char *cmd; }cmdavail[]={ {cmd_comment,"COMMENT"}, + {cmd_connect,"CONNECT"}, {cmd_data,"DATA"}, {cmd_gotls,"GOTLS"}, - {cmd_orgn,"ORGN"}, + {cmd_ipfrom,"IPFROM"}, {cmd_restart,"RESTART"}, {cmd_wait,"WAIT"}, {cmd_unknown,(const char *)0} @@ -392,6 +417,12 @@ switch (getcmd(line)) { if (setcomment(fd,param)==false) (void) report(*numline,line,"Unable to set comment mode"); break; + case cmd_connect : //start link connection + if (doconnect(fd)==false) { + (void) report(*numline,line,"Unable connect!"); + status=false; + } + break; case cmd_data : //sending email content to remote if ((status=dosenddata(fd,numline,param))==false) (void) report(*numline,line,"Unable to fully send data"); @@ -400,10 +431,10 @@ switch (getcmd(line)) { if ((status=gomodetls(fd->socptr))==false) (void) report(*numline,line,"Unable to set TLS mode"); break; - case cmd_orgn : //Changing PEERIP + case cmd_ipfrom : //Change/set the client IP if (param!=(char *)0) { - if(( status=dorestart(fd,param))==false) - (void) report(*numline,line,"Unable to change srcip!"); + fd->srcip=rou_freestr(fd->srcip); + fd->srcip=strdup(param); } else { (void) report(*numline,line,"Missing new PEER IP value"); @@ -459,7 +490,7 @@ tocheck=strlen(line); 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 : //do we have a "..." sequence at the end if (tocheck>0) { @@ -534,6 +565,7 @@ static _Bool scanline(FEEDTYP *fd,int *numline,char *line) { #define OPEP "feeder.c:scanline" + _Bool status; char action; int phase; @@ -563,7 +595,21 @@ while (proceed==true) { action=line[0]; line+=2; break; - case 2 : //discarding comment + case 2 : //check open version action + switch (action) { + case 'R' : //wait Receiving line + case 'S' : //Sending line + if (doconnect(fd)==false) { + status=false; + phase=999; //Not Connected! + } + break; + default : //Nothing to do + break; + } + break; + case 3 : //discarding comment + (void) rou_alert(0,"%s action='%c' line=<%s>",OPEP,action,line); switch (action) { case 'C' : //command to execute status=docommand(fd,numline,line); @@ -592,6 +638,7 @@ while (proceed==true) { phase++; } return status; + #undef OPEP } /* @@ -637,15 +684,7 @@ while (proceed==true) { proceed=false; } break; - case 1 : //Opening the socket - fd->socptr=soc_openfeedsock(pro_smtp,fd->srcip,fd->destip,fd->destport); - if (fd->socptr==(SOCPTR *)0) { - (void) rou_alert(0,"Unable to open link to [%s:%s]", - fd->destip,fd->destport); - (void) fclose(fd->datatst); - fd->datatst=(FILE *)0; - proceed=false; //Can not scan file - } + case 1 : //Opening the socket (obsolete) break; case 2 : //reading line; while (fgets(line,sizeof(line),fd->datatst)!=(char *)0) { diff --git a/data-feed/feed05.tst b/data-feed/feed05.tst index c01354e..e5e10f9 100644 --- a/data-feed/feed05.tst +++ b/data-feed/feed05.tst @@ -1,7 +1,7 @@ T:(feed05) Email testing remote server -R:220 mailleur.example.com, ESMTP (cleartext) mailleur... +C:IPFROM 127.127.0.25 +C:CONNECT #==================================================== -C:ORGN 127.127.0.25 R:220 mailleur.example.com, ESMTP (cleartext) mailleur... S:helo example.com R:250 mailleur.example.com, link (cleartext) ready, your IP/FQDN=[127.127.0.25/No.Reverse] diff --git a/lib/devsql.c b/lib/devsql.c index 6f9ad80..678916b 100644 --- a/lib/devsql.c +++ b/lib/devsql.c @@ -215,46 +215,6 @@ if ((rou_vasprintf(&cmd,fmt,args))>0) { va_end(args); return rs; -#undef OPEP -} -/* - -*/ -/********************************************************/ -/* */ -/* Procedure to do some action to change database */ -/* contents. */ -/* */ -/********************************************************/ -static int sqlrequest(SQLTYP *sql,const char *fmt,...) - -{ -#define OPEP "devsql.c:sqlrequest," - -int number; -va_list args; -char *cmd; - -number=-1; -va_start(args,fmt); -if ((rou_vasprintf(&cmd,fmt,args))>0) { - switch(sql->sqldb) { - case db_postgres : - number=pos_request(sql->db.psql,cmd); - break; - case db_maria : - number=mar_request(sql->db.msql,cmd); - break; - default : - (void) rou_alert(0,"%s Unexpected type='%d' (BUG!?)", - OPEP,(int)sql->sqldb); - break; - } - (void) free(cmd); - } -va_end(args); -return number; - #undef OPEP } /* @@ -405,7 +365,7 @@ static _Bool insert_ses(SQLTYP *sql,char *seskey,SESTYP **ses) #define OPEP "devseql.c:insert_ses," #define INSSES "INSERT INTO "SESSIONS" (sessid) VALUES(%s)" -return (sqlrequest(sql,INSSES,seskey)==1); +return (sql_request(sql,INSSES,seskey)==1); #undef INSSES #undef OPEP @@ -484,7 +444,7 @@ for (int i=0;(isok==true)&&(sesfield[i].name!=(char *)0);i++) { } } if (isok==true) - isok=(sqlrequest(sql,UPDSES,cmtset,seskey)==1); + isok=(sql_request(sql,UPDSES,cmtset,seskey)==1); cmtset=rou_freestr(cmtset); return isok; @@ -698,6 +658,48 @@ while (proceed==true) { phase++; } return gooddata; +#undef OPEP +} +/* + +*/ +/********************************************************/ +/* */ +/* Procedure to do some action to change database */ +/* contents. */ +/* */ +/********************************************************/ +PUBLIC int sql_request(SQLPTR *sqlptr,const char *fmt,...) + +{ +#define OPEP "devsql.c:sql_request," + +int number; +SQLTYP *sql; +va_list args; +char *cmd; + +number=-1; +sql=(SQLTYP *)sqlptr; +va_start(args,fmt); +if ((rou_vasprintf(&cmd,fmt,args))>0) { + switch(sql->sqldb) { + case db_postgres : + number=pos_request(sql->db.psql,cmd); + break; + case db_maria : + number=mar_request(sql->db.msql,cmd); + break; + default : + (void) rou_alert(0,"%s Unexpected type='%d' (BUG!?)", + OPEP,(int)sql->sqldb); + break; + } + (void) free(cmd); + } +va_end(args); +return number; + #undef OPEP } /* @@ -855,7 +857,7 @@ if (act!=(ACTTYP *)0) { char *field; field="code,sessid,rcptto,numline,info"; - (void) sqlrequest(sqlptr,DELACT,goodid,goodrcpt); + (void) sql_request(sqlptr,DELACT,goodid,goodrcpt); if (act->resp!=(char **)0) { char **resp; int num; @@ -866,7 +868,7 @@ if (act!=(ACTTYP *)0) { char *goodinfo; goodinfo=sql_gooddata(sqlptr,*resp); - (void) sqlrequest(sqlptr,INACT,field,goodcode,goodid,goodrcpt,num,goodinfo); + (void) sql_request(sqlptr,INACT,field,goodcode,goodid,goodrcpt,num,goodinfo); goodinfo=rou_freestr(goodinfo); resp++; num++; diff --git a/lib/devsql.h b/lib/devsql.h index 212ba3d..e62bde0 100644 --- a/lib/devsql.h +++ b/lib/devsql.h @@ -32,7 +32,6 @@ extern _Bool sql_mngses(SQLPTR *sqlptr,SQLENUM action,SESTYP **ses); //procedure to manage action stats on email exhange status extern _Bool sql_mngact(SQLPTR *sqlptr,SQLENUM action,ACTTYP *act); -//procedure to locak access to a full table -extern _Bool sql_locktable(SQLPTR *sqlptr,char *tblname,_Bool action); +extern int sql_request(SQLPTR *sqlptr,const char *fmt,...); #endif diff --git a/lib/gessql.c b/lib/gessql.c index b2fba5a..b4f608d 100644 --- a/lib/gessql.c +++ b/lib/gessql.c @@ -8,7 +8,7 @@ #include "subrou.h" #include "gessql.h" -#define REMOTES "remotes" //Table about remotes site +#define RMTTBL "remotes" //Table about remotes site /* ^L @@ -19,48 +19,33 @@ /* IP connection number. */ /* */ /********************************************************/ -PUBLIC int sql_newconnect(SQLPTR *sqlptr,char *rmtip,int delta) +PUBLIC _Bool sql_newconnect(SQLPTR *sqlptr,char *rmtip,int delta) { #define OPEP "gessql.c:sql_newconnect," -int links; -_Bool locked; -SMTTYP *smtpdata; +static const char *updfmt="UPDATE %s SET links=links+%d,lastupdate=now() WHERE remoteip='%s'"; + +_Bool done; int phase; _Bool proceed; -links=0; -locked=false; -smtpdata=(SMTTYP *)0; +done=true; phase=0; proceed=true; while (proceed==true) { switch (phase) { - case 0 : //Locking table - if ((locked=sql_locktable(sqlptr,REMOTES,true))==false) { - (void) rou_alert(0,"%s Unable to lock %s table (Bug?)", - OPEP,REMOTES); - phase=999; //Trouble trouble - } - break; - case 1 : //loading record - break; - case 2 : //creating record if not exiting - break; - case 3 : //updating record - smtpdata->links+=delta; - links=smtpdata->links; - smtpdata=sql_freesmtp(smtpdata); + case 0 : //updating remotes record with links + if (sql_request(sqlptr,updfmt,RMTTBL,delta,rmtip)==1) + phase=999; break; default : //SAFE Guard - if (locked==true) - (void) sql_locktable(sqlptr,REMOTES,false); proceed=false; break; } phase++; } -return links; +return done; + #undef OPEP } diff --git a/lib/gessql.h b/lib/gessql.h index 7d0ab05..505c251 100644 --- a/lib/gessql.h +++ b/lib/gessql.h @@ -13,5 +13,5 @@ //Procedure to increment (or decrement) the remoteip //connection number -extern int sql_newconnect(SQLPTR *sqlptr,char *rmtip,int delta); +extern _Bool sql_newconnect(SQLPTR *sqlptr,char *rmtip,int delta); #endif diff --git a/lib/modrec.c b/lib/modrec.c index adfddeb..b72bea2 100644 --- a/lib/modrec.c +++ b/lib/modrec.c @@ -182,11 +182,12 @@ while (proceed==true) { (void) prc_settitle("%s, incoming contact from [%s] on [%s:%s]", appname,contact->peerip, contact->locname,contact->locserv); - if (sql_newconnect(contact->sqlptr,contact->peerip,1)>1) { - phase=999; //need to explain no contact; - } break; - case 2 : //do contact + case 2 : //check if remote link is acceptable + if (sql_newconnect(contact->sqlptr,contact->peerip,1)==false) + phase=999; //connection rejected + break; + case 3 : //do contact intstat=eml_docontact(contact); switch (intstat) { case 1 : //command 'quit' recieved @@ -205,14 +206,11 @@ while (proceed==true) { break; } break; - case 3 : //check for immediat local delivery - if (contact->recipients!=(RCPTYP **)0) { - } - break; case 4 : //connection terminated + (void) sql_newconnect(contact->sqlptr,contact->peerip,-1); break; default : //SAFE guard - if (contact!=(CONTYP *)0) + if (contact!=(CONTYP *)0) contact=eml_dropcontact(contact); proceed=false; break; diff --git a/sql/datatest.sql b/sql/datatest.sql index 558c443..a918d57 100644 --- a/sql/datatest.sql +++ b/sql/datatest.sql @@ -29,5 +29,5 @@ INSERT INTO emails (email,password) \ values ('user2@mardb.example.com','user2'); //List of remote IP status -INSERT INTO remotes (remoteip,connections,credit,status) \ - values ('127.127.9.25',0,10,'valide'); +INSERT INTO remotes (remoteip,credit,status) \ + values ('127.127.0.25',10,'valide'); diff --git a/sql/mailleur.sql b/sql/mailleur.sql index c5956c7..d1c7df6 100644 --- a/sql/mailleur.sql +++ b/sql/mailleur.sql @@ -97,6 +97,8 @@ GRANT SELECT ON sessions TO mailapache; //defining table about remote server CREATE TABLE remotes ( + lastscan DBTIMESTAMP //record laste update + DFLT NOW(), lastupdate DBTIMESTAMP //record creation DFLT NOW(), remoteip TEXTUNIQUE, //remote IP number @@ -107,9 +109,9 @@ CREATE TABLE remotes ( status TEXT //'toscan','inscan','valide' DFLT 'toscan' ); -CREATE INDEX remotes_ndx ON remotes (lastupdate,INS(status)); -INSERT INTO remotes (remoteip,connections,credit,status) \ - values ('127.0.0.1',0,99,'valide'); +CREATE INDEX remotes_ndx ON remotes (INS(status)); +INSERT INTO remotes (remoteip,credit,status) \ + values ('127.0.0.1',99,'valide'); //-------------------------------------------------------------- //Defining TRIGGER fonctions according database type