]> SAFE projects GIT repository - jmp/mailleur/commitdiff
function creditchecking seems to be working
authorJean-Marc Pigeon (Delson) <jmp@safe.ca>
Sat, 12 Jul 2025 00:58:32 +0000 (20:58 -0400)
committerJean-Marc Pigeon (Delson) <jmp@safe.ca>
Sat, 12 Jul 2025 00:58:32 +0000 (20:58 -0400)
data-feed/feed05.tst
lib/devsql.c
lib/devsql.h
lib/lvleml.c
lib/unieml.h

index f77302d77bc00aee4b58e2882621fee45dab6fe3..9adf397dc06d2c28021826b7cf62fd55d1ee5f64 100644 (file)
@@ -6,7 +6,7 @@ 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.99.25/No.Reverse]
 S:MAIL FROM: <trouble@mailref1.example.com>
-R:457-5.5.3 Your Credential need to be checked
+R:457-4.5.7 Your Credential need to be checked
 R:457 5.5.3 Closing connection
 R:Disconnected
 #-------------------------------------------------------------------------
index 1a627e515b22f6d91b9e61de5c6a44cbd6ef53ff..f24686c951b414e3d83f918a8be2481be720ad91 100644 (file)
@@ -75,6 +75,71 @@ return value;
 */
 /********************************************************/
 /*                                                      */
+/*      Procedure to make sure a string to be use to    */
+/*      access database is clean.                       */
+/*      (no character to be misunderstood by database)  */
+/*                                                      */
+/********************************************************/
+PUBLIC char *sql_gooddata(SQLPTR *sqlptr,char *key)
+
+{
+#define OPEP    "devsql.c:sql_gooddata,"
+
+char *gooddata;
+char *sqlkey;
+SQLTYP *sql;
+int phase;
+_Bool proceed;
+
+gooddata=(char *)0;
+sqlkey=(char *)0;
+sql=(SQLTYP *)sqlptr;
+phase=0;
+proceed=true;
+while (proceed==true) {
+  switch (phase) {
+    case 0      :       //do we have a string to encode
+      if ((key==(char *)0)||(strlen(key)==0)) {
+        gooddata=strdup("NULL");    //no, force a 'NULL' string.
+        phase=999;
+        }
+      break;
+    case 1      :       //checking the key encoding
+      if ((sqlkey=sql_checkencoding(key))==(char *)0) {
+        (void) rou_alert(0,"%s dbkey <%s> encoding is wrong (config?)",OPEP,key);
+        gooddata=strdup("NULL");    //Let assum NULL
+        phase=999;      //trouble trouble
+        }
+      break;
+    case 2      :       //cleaning quote according daemon type
+      switch(sql->sqldb) {
+        case (db_postgres)     :
+          gooddata=pos_cleanquote(sqlkey);
+          break;
+        case (db_maria)        :
+          gooddata=mar_cleanquote(sqlkey);
+          break;
+        case (db_unknown)     :
+        default               :
+          (void) rou_alert(0,"%s Unknown SQL daemon (type='%d')",OPEP,sql->sqldb);
+          break;
+        }
+      sqlkey=rou_freestr(sqlkey);
+      break;
+    default     :       //SAFE Guard
+      proceed=false;
+      break;
+    }
+  phase++;
+  }
+return gooddata;
+#undef  OPEP
+}
+/*
+\f
+*/
+/********************************************************/
+/*                                                      */
 /*      Procedure to create an SQL pointer for proper   */
 /*      database type.                                  */
 /*                                                      */
@@ -314,71 +379,6 @@ if (sqlptr!=(SQLPTR *)0) {
   }
 return unlocked;
 
-#undef  OPEP
-}
-/*
-\f
-*/
-/********************************************************/
-/*                                                      */
-/*      Procedure to make sure a string to be use to    */
-/*      access database is clean.                       */
-/*      (no character to be misunderstood by database)  */
-/*                                                      */
-/********************************************************/
-PUBLIC char *sql_gooddata(SQLPTR *sqlptr,char *key)
-
-{
-#define OPEP    "devsql.c:sql_gooddata,"
-
-char *gooddata;
-char *sqlkey;
-SQLTYP *sql;
-int phase;
-_Bool proceed;
-
-gooddata=(char *)0;
-sqlkey=(char *)0;
-sql=(SQLTYP *)sqlptr;
-phase=0;
-proceed=true;
-while (proceed==true) {
-  switch (phase) {
-    case 0      :       //do we have a string to encode
-      if ((key==(char *)0)||(strlen(key)==0)) {
-        gooddata=strdup("NULL");    //no, force a 'NULL' string.
-        phase=999;
-        }
-      break;
-    case 1      :       //checking the key encoding
-      if ((sqlkey=sql_checkencoding(key))==(char *)0) {
-        (void) rou_alert(0,"%s dbkey <%s> encoding is wrong (config?)",OPEP,key);
-        gooddata=strdup("NULL");    //Let assum NULL
-        phase=999;      //trouble trouble
-        }
-      break;
-    case 2      :       //cleaning quote according daemon type
-      switch(sql->sqldb) {
-        case (db_postgres)     :
-          gooddata=pos_cleanquote(sqlkey);
-          break;
-        case (db_maria)        :
-          gooddata=mar_cleanquote(sqlkey);
-          break;
-        case (db_unknown)     :
-        default               :
-          (void) rou_alert(0,"%s Unknown SQL daemon (type='%d')",OPEP,sql->sqldb);
-          break;
-        }
-      sqlkey=rou_freestr(sqlkey);
-      break;
-    default     :       //SAFE Guard
-      proceed=false;
-      break;
-    }
-  phase++;
-  }
-return gooddata;
 #undef  OPEP
 }
 /*
index 6ec49d237145d60817a1e36d994e40e9fa9fa319..4c5d5defcd42fb55346031f203f6e49efcf7b05e 100644 (file)
@@ -16,6 +16,10 @@ typedef void SQLPTR;
 //An SQL database result reference
 typedef void SQLRES;
 
+//procedure to make sure a string is acceptable
+//as key search by database
+extern char *sql_gooddata(SQLPTR *sqlptr,char *key);
+
 //to connect a remote SQL server
 extern SQLPTR *sql_opensql();
 
@@ -28,10 +32,6 @@ extern _Bool sql_lock(SQLPTR *sqlptr,char *tablename);
 //procedure to UNLOCK access to a database table
 extern _Bool sql_unlock(SQLPTR *sqlptr,_Bool commit);
 
-//procedure to make sure a string is acceptable
-//as key search by database
-extern char *sql_gooddata(SQLPTR *sqlptr,char *key);
-
 //procedure to transmit a simple data-base action
 extern int sql_request(SQLPTR *sqlptr,const char *fmt,...);
 
index 2f5a0f0eac54c16eac08ef2082d3e32390bdf57c..eca101796d2eb121d807853094c5dbcfded4591f 100644 (file)
@@ -111,22 +111,6 @@ return contact;
 */
 /********************************************************/
 /*                                                      */
-/*     Procedure to check remote IP credit             */
-/*                                                      */
-/********************************************************/
-static _Bool checkcredit(CONTYP *contact)
-
-{
-_Bool goodcredit;
-
-goodcredit=false;
-return goodcredit;
-}
-/*
-^L
-*/
-/********************************************************/
-/*                                                      */
 /*     Procedure to get the domain code                */
 /*                                                      */
 /********************************************************/
@@ -333,6 +317,66 @@ return status;
 */
 /********************************************************/
 /*                                                      */
+/*     Procedure to check remote IP credit             */
+/*                                                      */
+/********************************************************/
+static int checkcredit(CONTYP *contact)
+
+{
+#define OPEP     "lvleml.c:checkcredit,"
+
+int status;
+SRVTYP *srv;
+int phase;
+_Bool proceed;
+
+status=FAILED;
+srv=(SRVTYP *)0;
+phase=0;
+proceed=true;
+while (proceed==true) {
+  switch (phase) {
+    case 0      :       //reading remote server information
+      if (sql_mngremote(contact->sqlptr,sql_select,contact->peerip,&srv)==false) {
+        (void) rou_alert(0,"%s Unable to find server data for remote <%s> (BUg?)",
+                            OPEP,contact->peerip);
+        phase=999;
+        }
+      break;
+    case 1      :       //checking credential
+      if (srv->links>1) {
+        status=ALREADY;
+        (void) transmit(contact,true,"%d-4.5.6 Server already connected",status);
+        phase=999;      //To many server connected
+        }
+      break;
+    case 2      :       //freeing memory
+      if (srv->credit<0) {
+        status=NEWSITE;
+        (void) transmit(contact,true,"%d-4.5.7 Your Credential need to be checked",
+                                     status);
+        phase=999;      //To many server connected
+        }
+      break;
+    case 3      :       //freeing memory
+      status=CMDOK;
+      break;
+    default     :       //SAFE Guard
+      srv=sql_freesrv(srv);
+      proceed=false;
+      break;
+    }
+  phase++;
+  }
+return status;
+
+#undef  OPEP
+}
+/*
+^L
+*/
+/********************************************************/
+/*                                                      */
 /*     Procedure to split a plain authentication string*/
 /*      Match with the user provided.                   */
 /*                                                      */
@@ -1291,9 +1335,11 @@ static _Bool checkfrom(CONTYP *contact,char *mailfrom)
 {
 _Bool success;
 _Bool proceed;
+int status;
 int phase;
 
 success=false;
+status=CMDOK;
 proceed=true;
 phase=0;
 while (proceed==true) {
@@ -1327,10 +1373,8 @@ while (proceed==true) {
         phase++;        //No need to check remote "credits
       break;
     case 4      :       //check remote credit
-      if (checkcredit(contact)==false) {
-        (void) transmit(contact,true,"%d-5.5.3 Your Credential need to be checked",
-                                     NEWSITE);
-        (void) transmit(contact,true,"%d 5.5.3 Closing connection",NEWSITE);
+      if ((status=checkcredit(contact))!=CMDOK) {
+        (void) transmit(contact,true,"%d 5.5.3 Closing connection",status);
         phase=999;      //bad credit not need to go further
         }
       break;
index c12a74bcac0038b9c85ec92952a293e233b51bf8..e1bd85a5a3a36afae1adb2151c5be757e73c6674 100644 (file)
@@ -22,6 +22,7 @@
 #define SENDB64 334             //send a B64 sequence
 #define        DATAOK  354             //Ready to accept EMAIL data
 #define        ERRPROC 451             //local processing error
+#define ALREADY 456             //remote server already connected
 #define NEWSITE 457             //Site credential need to be checked
 #define NOANSWR 460             //no answer from remote
 #define BADPAR  501             //error in parameters