]> SAFE projects GIT repository - jmp/mailleur/commitdiff
Starting to detect domain whitout MX
authorJean-Marc Pigeon (Delson) <jmp@safe.ca>
Sat, 19 Jul 2025 15:23:03 +0000 (11:23 -0400)
committerJean-Marc Pigeon (Delson) <jmp@safe.ca>
Sat, 19 Jul 2025 15:23:03 +0000 (11:23 -0400)
data-feed/feed08.tst
lib/lvleml.c
lib/unieml.h
shell/test-spf.sh

index 6d29e5cc997f528c949b3fac51a86ec8bbd138f7..a9a66e9f0943f8c831754d31ef08a8aa86dabb2e 100644 (file)
@@ -14,6 +14,8 @@ R:250-8BITMIME
 R:250 ENHANCEDSTATUSCODES
 S:MAIL FROM:<supertool@mxtoolboxsmtpdiag.com>
 R:250 2.1.3 supertool@mxtoolboxsmtpdiag.com.. sender ok
+S:RCPT TO: <webmaster@example.com>
+R:250 2.6.4 Address accepted <webmaster@example.com>
 S:RCPT TO:<test@mxtoolboxsmtpdiag.com>
 R:250 2.6.4 SOULD Be rejected
 S:QUIT
index 5ba099b2c93e879dee46ba379fcf46f87aff2436..e39304bcb24eee4a6b9b62be1260f962c5c0c5d5 100644 (file)
@@ -910,6 +910,81 @@ return isok;
 */
 /********************************************************/
 /*                                                      */
+/*     checking if remote recipient is relayable.      */
+/*                                                      */
+/********************************************************/
+static _Bool is_remote_good(CONTYP *contact,RCPTYP *rmtusr)
+
+{
+#define OPEP    "lvleml.c:is_remote_good,"
+
+_Bool remotegood;
+const char *cmt;
+int phase;
+_Bool proceed;
+
+remotegood=false;
+cmt=(const char *)0;
+phase=0;
+proceed=true;
+while (proceed==true) {
+  (void) rou_alert(0,"JMPDBG %s phase='%d'",OPEP,phase);
+  switch (phase) {
+    case 0      :  {    //Is there an MX for the user remote domain
+      MXTYP **mxs;
+
+      cmt="No MX nor IP for";
+      if ((mxs=dns_getmx(rmtusr->domain))!=(MXTYP **)0) {
+        for (int i=0;mxs[i]!=(MXTYP *)0;i++) {
+          if (mxs[i]->mxip!=(char **)0) {
+            phase++;        //No need to check for domain IP
+            break;
+            }
+          }
+        mxs=dns_freemxlist(mxs); 
+        }
+      }
+      break;
+    case 1      :       //is the domain with an IP address
+      break;
+    case 2      :       //is connection acceptable
+      switch (contact->privilege) {
+        case rel_authentic      :
+        case rel_isrelay        :       //everything fine
+          break;
+        case rel_plain          :
+          cmt="No relay accepted";
+          phase=999;    //not relaiable
+          break;
+        default         :
+          cmt="Unchecked status";
+          phase=999;    //not relaiable
+          break;
+        }
+      break;
+    case 3      :       //so it a good remote
+      remotegood=true;
+      break;
+    default     :       //SAFE Guard
+      if (remotegood==false) {
+
+        (void) transmit(contact,true,"%d 2.7.0 %s for domain <%s>",
+                                      NORELAY,cmt,rmtusr->domain);
+        }
+      proceed=false;
+      break;
+    }
+  phase++;
+  }
+return remotegood;
+
+#undef   OPEP
+}
+/*
+^L
+*/
+/********************************************************/
+/*                                                      */
 /*     Procedure to check if helo or ehlo paratmeter   */
 /*      is a correct one                                */
 /*                                                      */
@@ -1557,7 +1632,7 @@ report=(char *)0;
 proceed=true;
 phase=0;
 while (proceed==true) {
-  //(void) rou_alert(0,"JMPDBG %s phase='%d' rcptto=<%s>",OPEP,phase,rcptto);
+  (void) rou_alert(0,"JMPDBG %s phase='%d' rcptto=<%s>",OPEP,phase,rcptto);
   switch (phase) {
     case 0      :       //do we have a mailfrom
       if ((contact->mailfrom==(char *)0)||(strlen(contact->mailfrom)==0)) {
@@ -1594,14 +1669,26 @@ while (proceed==true) {
                                       MISSMX,
                                       "No valid MX found for recipient domain name",
                                       neu->domain);
-        neu=eml_freerecipient(neu);     //free recipient
         phase=999;      //no need to go further
         }
       break;
     case 5      :       //if the local user acceptable
-      if ((neu->code=='L')&&(is_user_good(contact,rcptto)==false)) {
-        neu=eml_freerecipient(neu);
-        phase=999;
+      switch (neu->code) {
+        case 'L'        :       //local user/domain
+          if (is_user_good(contact,rcptto)==false) 
+            phase=999;
+          break; 
+        case 'R'        :       //remote user/domain
+          if (is_remote_good(contact,neu)==false) 
+            phase=999;
+          break; 
+        default         :
+          (void) transmit(contact,true,"%d 5.6.5 %s (domain=%s,code='%c')",
+                                        FAILED,
+                                       "system error with domain status",
+                                       neu->domain,neu->code);
+          phase=999;      //no need to go further
+          break;
         }
       break;
     case 6      :       //Storing rcpt to
@@ -1615,6 +1702,8 @@ while (proceed==true) {
       success=true;
       break;
     default     :       //SAFE guard
+      if (success==false) 
+        neu=eml_freerecipient(neu);
       proceed=false;
       break;
     }
index 5e24048b26fd78f828c3781ef334699b86cf8a22..d7f51b3d6d5f4e9256a45489c43c7f2d766d0194 100644 (file)
@@ -38,7 +38,7 @@
 #define MALABRT 552             //email data rejected
 #define NOTEML  553             //Not an email address
 #define FAILED  554             //transaction failed
-#define NORELAY 555             //remote do not relay email
+#define NORELAY 555             //we do not relay email
 #define MISSMX  563             //NO MX found for recipient
 
 //defining extensions
index 7bc6726a2ee92ed0de68c588a652594654a4b7da..bda07d6f56cadd501d7868c047e6e782d2be9d22 100755 (executable)
@@ -20,7 +20,7 @@ while [ $# -gt 0 ]
     expect=`echo $data | cut -d ' ' -f1`
     domain=`echo $data | cut -d ' ' -f2`
     ipnum=`echo $data | cut -d ' ' -f3`
-    result=`bin/chkspf $domain $ipnum`
+    result=`bin-utils/chkspf $domain $ipnum`
     echo -n "done bin-utils/chkspf $domain $ipnum "
     if [ "$result" != "$expect" ] ; then
       echo "Fail!"