]> SAFE projects GIT repository - jmp/mailleur/commitdiff
Credit detetcion is NOT done correctly
authorJean-Marc Pigeon (Delson) <jmp@safe.ca>
Fri, 15 Aug 2025 15:02:03 +0000 (11:02 -0400)
committerJean-Marc Pigeon (Delson) <jmp@safe.ca>
Fri, 15 Aug 2025 15:02:03 +0000 (11:02 -0400)
conf/mailleur.conf
data-feed/feed010.tst [new file with mode: 0644]
lib/lvleml.c
lib/modrec.c
sql/datatest.sql

index ee36bcb7d93ca1f1ba72889d68a4997ef1478ce6..0da43101635832ff74dab00a9539193f3b6832f5 100644 (file)
@@ -68,3 +68,7 @@ BLACKLISTER=/etc/mailleur/blacklister.conf
 #the list of IP from which we accept to relay email
 RELAYABLE=/etc/mailleur/relayed.conf
 #------------------------------------------------
+#Minimal credit level to which remote is rejected at once
+#if credit is equal or below that level
+RJCTCRED=-50
+#------------------------------------------------
diff --git a/data-feed/feed010.tst b/data-feed/feed010.tst
new file mode 100644 (file)
index 0000000..5d46aca
--- /dev/null
@@ -0,0 +1,9 @@
+T:(feed010) Making sure we can reject a remote
+C:CONNECT
+#====================================================
+R:220 mailleur.example.com, ESMTP (cleartext) mailleur...
+#take a "invalide" imp number as server remote IP
+C:ORGN: 8.8.8.8.
+R:250 3.5.3 Message accepted for delivery
+S:QUIT
+R:221 2.0.0 Bye, closing connection...
index c8f6a5977b7d6929227261dac259b071f008d430..a3281028283975f32defb759924e481b9b10e66a 100644 (file)
@@ -30,6 +30,7 @@
 #include       "geseml.h"
 #include       "lvleml.h"
 
+//env variable to define the list of relayable
 #define RELAYS  "RELAYABLE"
 
 static const char *cry="(crypted link is now set in '%s' mode, security level='%d')";
@@ -2028,7 +2029,7 @@ while (proceed==true) {
         phase=999;              //No NX found!
         }
       break;
-    case 3      :       //waitin MX signon
+    case 3      :       //waiting MX signon
       int res;
 
       res=tcp_get_smtp_reply(rmt,WAITRMT,(char ***)0);
index d10423323e0bad04b7c37e2d19f4da2473ca2f26..079f5d4799f1c588caf855caa2715cb6c98caf3e 100644 (file)
@@ -22,6 +22,9 @@
 #include        "lvleml.h"
 #include        "modrec.h"
 
+//env variable to set the rejection level
+#define ENVRJCT         "RJCTCRED"
+#define DFLTRJCT        -50     //default reject max level
 /*
 \f
 */
@@ -188,10 +191,30 @@ while (proceed==true) {
         (void) eml_transmit(contact,true,"%d contact denied <%s>",NOTNOW,end);
         contact->credit=-1;     //small penalty
         (void) sleep(1);        //To avoid avalanche
-        phase++;        //connection rejected
+        phase=999;              //no Need to go further
         }
       break;
-    case 2      :       //do contact
+    case 2      :  {     //checking remote credit
+      static char *cmt="Remote server credit too low";
+      int reject;
+      char *ptr;
+      SRVTYP *srv;
+
+      reject=DFLTRJCT;
+      if ((ptr=getenv(ENVRJCT))!=(char *)0)
+        reject=atoi(ptr);
+      if (sql_mngremote(contact->sqlptr,sql_select,contact->peerip,&srv)==true) {
+        if (srv->credit<=reject) {
+          contact->termend=rou_freestr(contact->termend);
+          contact->termend=strdup(cmt);
+          (void) eml_transmit(contact,true,"%d 7.0.0 %s",DATRJC,cmt);
+          phase=999;    //rejecting remote first hand
+          }
+        srv=sql_freesrv(srv);
+        }
+      }
+      break;
+    case 3      :       //do contact
       intstat=eml_docontact(contact);
       switch (intstat) {
         case  1 :       //command 'quit' recieved
@@ -210,20 +233,19 @@ while (proceed==true) {
           break;
         }
       break;
-    case 3      :   {   //connection terminated
-      static const char *cmt;
-      SRVTYP *srv;
+    default     :       //SAFE guard
+      if (contact!=(CONTYP *)0) { 
+        static const char *cmt;
+        SRVTYP *srv;
 
-      cmt="(Contact terminated, condition=<%s>)";
-      if (sql_mngremote(contact->sqlptr,sql_select,contact->peerip,&srv)==true) {
-        srv=sql_freesrv(srv);
+        cmt="(Contact terminated, condition=<%s>)";
+        if (sql_mngremote(contact->sqlptr,sql_select,contact->peerip,&srv)==true) {
+          srv=sql_freesrv(srv);
+          }
+        (void) log_fprintlog(contact->logptr,true,cmt,contact->termend);
+        (void) sql_newconnect(contact->sqlptr,contact->peerip,-1);
+        contact=eml_dropcontact(contact);
         }
-      (void) log_fprintlog(contact->logptr,true,cmt,contact->termend);
-      (void) sql_newconnect(contact->sqlptr,contact->peerip,-1);
-      contact=eml_dropcontact(contact);
-      }
-      break;
-    default     :       //SAFE guard
       proceed=false;
       break;
     }
index 0d4826a76899e18e1bc870420c5a198f56e35c15..e5ffa4db10d62a7fc8577c504893b68ce5da74d7 100644 (file)
@@ -56,3 +56,7 @@ INSERT INTO remotes (remoteip)                                        \
          values ('192.219.254.189');
 INSERT INTO remotes (remoteip)                                 \
          values ('216.252.69.41');
+
+//selected IP with low credit
+INSERT INTO remotes (remoteip,credit)                          \
+         values ('8.8.8.8',-50);