]> SAFE projects GIT repository - jmp/mailleur/commitdiff
Feeder is now able to initiate connection
authorJean-Marc Pigeon (Delson) <jmp@safe.ca>
Thu, 10 Jul 2025 22:57:43 +0000 (18:57 -0400)
committerJean-Marc Pigeon (Delson) <jmp@safe.ca>
Thu, 10 Jul 2025 22:57:43 +0000 (18:57 -0400)
Makefile.dbg
app/feeder.c
data-feed/feed05.tst
lib/devsql.c
lib/devsql.h
lib/gessql.c
lib/gessql.h
lib/modrec.c
sql/datatest.sql
sql/mailleur.sql

index 50571f6077ae9e88dc8e0de32a7ccbedc33c1f3d..1c5e4cca6df19fbecc8a2f29666141a9d6a27c32 100644 (file)
@@ -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)                     \
index 6293e10a65baa7192ec1eebfe6ef6a8af8a2dd87..45802352226d4eefb81786fd6872dcbb806ff41d 100644 (file)
@@ -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
 }
 /*
+\f
+*/
+/********************************************************/
+/*                                                     */
+/*     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) {
index c01354ef1e0c9f19e80c9dbb0f95dcb213a36424..e5e10f904371717a059e13e48db3f69d9da0da8d 100644 (file)
@@ -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]
index 6f9ad80ea30618c42ab4f66e9212fa89162d2ddb..678916be58e877530587d657d6bcf704a1e4ba41 100644 (file)
@@ -215,46 +215,6 @@ if ((rou_vasprintf(&cmd,fmt,args))>0) {
 va_end(args);
 return rs;
 
-#undef  OPEP
-}
-/*
-\f
-*/
-/********************************************************/
-/*                                                      */
-/*      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
+}
+/*
+\f
+*/
+/********************************************************/
+/*                                                      */
+/*      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++;
index 212ba3d2e3a55ea662cb87e87f1aeb41bdc5a203..e62bde02c9622403f80c84a0b57dd06d708b5eb0 100644 (file)
@@ -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
index b2fba5ab879fb2dc2f2d42529a9c96619e177fc5..b4f608de20772b96cd3bf745c504ef56d4fa8dd5 100644 (file)
@@ -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
 /*      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
 }
index 7d0ab052015fc7da2c412dddb81863661531f30a..505c2515cec2b12dc478de26490eadd52b985cf1 100644 (file)
@@ -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
index adfddeb9a31afb43364784b3860e77e57a9c9ae3..b72bea2d9f0d396cf61594dbfc09163868a8ca45 100644 (file)
@@ -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;
index 558c443d582a3c39e7dd4815cf27e6c5897133ca..a918d575e899a6693406083842747d74896d1087 100644 (file)
@@ -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');
index c5956c745f0e8d5c5135ebdc8cad1ed6516a9009..d1c7df6af74c3b8b817e74fd141fc61c31db1bec 100644 (file)
@@ -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