]> SAFE projects GIT repository - jmp/mailleur/commitdiff
Rset fonction is working, updating cursesid
authorJean-Marc Pigeon (Delson) <jmp@safe.ca>
Tue, 13 Aug 2024 00:06:40 +0000 (20:06 -0400)
committerJean-Marc Pigeon (Delson) <jmp@safe.ca>
Tue, 13 Aug 2024 00:06:40 +0000 (20:06 -0400)
lib/gestcp.c
lib/gestcp.h
lib/lvleml.c
lib/subrou.c
lib/subrou.h
lib/unieml.c
lib/unieml.h
lib/unitls.c

index 5e171e34e53443f1931788262b5811db3ad53703..3c1a08f863b440551bf24f323f6f077e522daaa7 100644 (file)
@@ -35,7 +35,8 @@ static CONTYP *freecontact(CONTYP *contact)
 #define OPEP    "gesttcp.c:freecontact"
 
 if (contact!=(CONTYP *)0) {
-  contact->sessid=rou_freestr(contact->sessid);
+  contact->cursesid=rou_freestr(contact->cursesid);
+  contact->mainsesid=rou_freestr(contact->mainsesid);
   contact->fqdn=rou_freestr(contact->fqdn);
   contact->peerip=rou_freestr(contact->peerip);
   contact->locname=rou_freestr(contact->locname);
@@ -202,7 +203,8 @@ while (proceed==true) {
       contact->locname=soc_getaddrinfo(contact->socptr,true,true);
       contact->locserv=soc_getaddrinfo(contact->socptr,true,false);
       contact->peerip=soc_getaddrinfo(contact->socptr,false,true);
-      contact->sessid=eml_getsessionid();
+      contact->mainsesid=eml_getmainsesid();
+      contact->cursesid=eml_getcursesid(contact->mainsesid,contact->numreset);
       if ((contact->locname==(char *)0)||(contact->peerip==(char *)0)) {
         (void) rou_alert(0,"%s Unable to establish contact entities",OPEP);
         contact=freecontact(contact);
index b8201651f5dec1c81bcbf20645947b27cf74fd75..ad822e7e8eeb6df93be95959efd7b82891d86db3 100644 (file)
@@ -19,8 +19,9 @@ typedef struct  {
         char *locname;  //socket local hostname
         char *locserv;  //local service port
         char *peerip;   //socket remote peer IP
-        char *sessid;   //current session ID
         int numreset;   //number of SMTP reset received
+        char *mainsesid;//session main ID
+        char *cursesid; //current session ID
         }CONTYP;
 
 //read a line from contact up to CRLF
index e00e819f196985f4a526650d5228a63c92c73151..905f4d0bc7708e2b9cbf4d6972f811d19ee7d7e5 100644 (file)
@@ -148,6 +148,23 @@ return done;
 #undef  OPEP
 }
 /*
+\f
+*/
+/************************************************/
+/*                                             */
+/*     Procedure to rset the current session   */
+/*                                             */
+/************************************************/
+static _Bool dorset(CONTYP *contact,char *keyword,char *parameter)
+
+{
+(void) transmit(contact,"%d 2.0.0 Flushed session %s",CMDOK,contact->cursesid);
+contact->numreset++;
+contact->cursesid=rou_freestr(contact->cursesid);
+contact->cursesid=eml_getcursesid(contact->mainsesid,contact->numreset);
+return true;
+}
+/*
 ^L
 */
 /********************************************************/
@@ -196,9 +213,12 @@ while (proceed==true) {
       break;
     case c_quit         :       //QUIT SMTP protocol
       (void) transmit(contact,"%d 2.0.0 Bye, closing connection %s",
-                              QUITOK,contact->sessid);
+                              QUITOK,contact->mainsesid);
       proceed=false;
       break;
+    case c_rset         :       //Doing session reset
+      proceed=dorset(contact,line,parameter);
+      break;
     case c_starttls     :       //EHLO start encryptel link
       switch (soc_starttls(contact->socptr,contact->peerip)) {
         case true       :       //link now in TLS crypted mode
index d69da9437ab2e61133b8b511e24e5042cdea3422..f995dd4bbf4a033dcc7ddc930ee0a0507a7440ed 100644 (file)
@@ -21,7 +21,7 @@
 
 //version definition 
 #define VERSION "0.4.1"
-#define RELEASE "1"
+#define RELEASE "2"
 
 //Public variables
 PUBLIC  int debug=0;            //debug level
@@ -106,6 +106,35 @@ if ((debug>2)&&(current!=onoff)) {
 */
 /********************************************************/
 /*                                                      */
+/*     Procedure to assign enough memory to format     */
+/*      a string.                                       */
+/*      Known as asprintf in GNU_SOURCE.                */
+/*                                                      */
+/********************************************************/
+PUBLIC int rou_asprintf(char **str,const char *fmt,...)
+
+{
+va_list args;
+int taille;
+char loc[10];
+
+va_start(args,fmt);
+if ((taille=vsnprintf(loc,4,fmt,args))>0) {
+  va_list argssup;
+
+  va_start(argssup,fmt);
+  *str=calloc(taille+2,sizeof(char));
+  taille=vsnprintf(*str,taille+1,fmt,argssup);
+  va_end(argssup);
+  }
+va_end(args);
+return taille;
+}
+/*
+\f
+*/
+/********************************************************/
+/*                                                      */
 /*     Procedure to return the current time            */
 /*     expressed with a millisecond precision starting */
 /*     from the firt time it was called.               */
@@ -309,16 +338,12 @@ PUBLIC char *rou_apppath(const char *path)
 {
 char *root;
 char *newpath;
-int taille;
-char loc[300];
 
 root="";
 newpath=(char *)0;
 if (rootdir!=(char *)0)
   root=rootdir;
-taille=snprintf(loc,sizeof(loc),"%s%s",root,path);
-newpath=(char *)calloc(taille+3,sizeof(char));
-(void) sprintf(newpath,"%s%s",root,path);
+(void) rou_asprintf(&newpath,"%s%s",root,path);
 return newpath;
 }
 /*
index 2b2bce30f26208f43d628e0fa93fb99d2f18b445..acd55982dc8ead7e3aadce4c7e13c7dbc52470a3 100644 (file)
@@ -31,6 +31,9 @@ extern char          *appname;  //application "official" name
 //open/close memory leak detector.
 extern void rou_checkleak(_Bool onoff);
 
+//procedure to assign memory according a format and parameter list
+extern int rou_asprintf(char **str,const char *fmt,...);
+
 //procedure to return the current number of milli-second
 extern unsigned int rou_getmillisec();
 
index 4f9e4379b2660279735bf45d7d6904d8b841027a..6e98a938ce8ddbd26ac7bb7e4ee462cf33c8b6ce 100644 (file)
@@ -25,6 +25,7 @@ static VOCTYP vocsmtp[]={
                 {c_helo,"HELO"},
                 {c_ehlo,"EHLO"},
                 {c_quit,"QUIT"},
+                {c_rset,"RSET"},
                 {c_starttls,"STARTTLS"},
                 {c_unknown,(const char *)0}
                 };
@@ -37,20 +38,23 @@ static VOCTYP vocsmtp[]={
 /*      allocated char array filled with uniq session ID*/
 /*                                                      */
 /********************************************************/
-PUBLIC char *eml_getsessionid()
+PUBLIC char *eml_getmainsesid()
 
 {
 #define UFTIME  "%Y%m%d%H%M%S"
 #define UNIQUE  "%05d-%s-%04d"
 
+char *sesid;
 time_t curtime;
 char asctemps[100];
-char buffer[300];
 
+
+
+sesid=(char *)0;
 curtime=time((time_t)0);
 (void) strftime(asctemps,sizeof(asctemps),UFTIME,localtime(&curtime));
-(void) snprintf(buffer,sizeof(buffer),UNIQUE,getpid(),asctemps,rou_getmillisec());
-return strdup(buffer);
+(void) rou_asprintf(&sesid,UNIQUE,getpid(),asctemps,rou_getmillisec());
+return sesid;
 #undef  UNIQUE
 #undef  UFTIME
 }
@@ -59,6 +63,24 @@ return strdup(buffer);
 */
 /********************************************************/
 /*                                                      */
+/*     Procedure to format and return a dynamicaly     */
+/*      allocated char array with the current seesion ID*/
+/*                                                      */
+/********************************************************/
+PUBLIC char *eml_getcursesid(char *mainsesid,int numreset)
+
+{
+char *sesid;
+
+sesid=(char *)0;
+(void) rou_asprintf(&sesid,"%s-%04d",mainsesid,numreset);
+return sesid;
+}
+/*
+^L
+*/
+/********************************************************/
+/*                                                      */
 /*     Procedure to return a protocol keywork code     */
 /*                                                      */
 /********************************************************/
index 924ae8fdf5c71ba0ae515dfb9dee21526cc08409..b168b0b1f028f47bdc2763a5a1e32f494ea73c79 100644 (file)
@@ -21,12 +21,16 @@ typedef enum    {               //list of SMTP protocol keyword
                 c_helo,         //Basic Helo command
                 c_ehlo,         //EHLO command
                 c_quit,         //quit exchange
+                c_rset,         //resetting session
                 c_starttls,     //Starting a TLS crypted link
                 c_unknown       //key word unknown
                 }CODTYP;
 
 //get a session unique id
-extern char *eml_getsessionid();
+extern char *eml_getmainsesid();
+
+//get the current session ID
+extern char *eml_getcursesid(char *mainid,int numreset);
 
 //convert SMTP keyword to CODTYP
 extern CODTYP eml_getcode(char *keyword);
index f8efe358a9ba8be5bd9bf0318466edab5b7459bb..9aecd747aad4ba29940056660682af21178370ff 100644 (file)
@@ -582,6 +582,7 @@ if (tls!=(TLSTYP *)0) {
           (void) rou_alert(0,"%s Unexpected SSL_read error='%d'",
                               OPEP,SSL_get_error(tls->ssl,0));
           (void) showtlserror(tls,0,"show SSL error",OPEP);
+          got=-1;
           break;
         }
       break;