]> SAFE projects GIT repository - jmp/mailleur/commitdiff
Starting to have is_local_domain working
authorJean-Marc Pigeon (Delson) <jmp@safe.ca>
Wed, 11 Jun 2025 13:45:59 +0000 (09:45 -0400)
committerJean-Marc Pigeon (Delson) <jmp@safe.ca>
Wed, 11 Jun 2025 13:45:59 +0000 (09:45 -0400)
conf/mailleur.conf.dvl
data-feed/feed10.tst
lib/lvleml.c
lib/unidns.c
lib/unidns.h
lib/unieml.h

index 9e7af639cc639751b30c2e5a017998737b95a7e2..07270a7bf60a67fdf0717ae367137c8674d19999 100644 (file)
@@ -11,8 +11,8 @@
 #::                    -> smtp:0.0.0.0:25:2
 #SMTPPORTS     "       "::"
 #SMTPPORTS     =       ":127.127.10.25:1025:,smtps:127.127.10.25:1026:1"
-#SMTPPORTS     =       ":127.127.10.25:1025:"
-SMTPPORTS      =       "smtps:127.127.10.25:1065:1"
+SMTPPORTS      =       ":127.127.10.25:1025:"
+#SMTPPORTS     =       "smtps:127.127.10.25:1065:1"
 #------------------------------------------------
 #Defining SERVER mode Certificate data
 CA_ROOT_SRV    =       "./certs/root-safe_CA.pem"
index 0e998fd107c8b390c6f14f7270d29e6f7fffb636..5483ec541ac3b0d1bc66533d55331258a9c2396e 100644 (file)
@@ -10,6 +10,8 @@ S:MAIL FROM: <trouble@subdom1.example.com>
 R:250 2.1.3 trouble@subdom1.example.com.. sender ok
 S:RCPT TO: <dom1user3@subdom1.example.com>
 R:250 2.6.4 Address accepted
+S:RCPT TO: <dom1user3@example.com>
+R:250 2.6.4 Address accepted
 #-------------------------------------------------------------------------
 #-sending data
 C:DATA
index 473596346ebd160fe541d3ee09c7909ea0203fa6..95b85737a21ef7ff909b4d4205fd05874029bc31 100644 (file)
@@ -89,14 +89,25 @@ while (proceed==true) {
         }
       break;
     case 1      :       //check about local domain, TEMPORARY code
-      if (strcmp(rcpt->domain,"example.com")==0) {
-        rcpt->code='L';       //domain is local
-        phase=999;      //No need to go further
+      int status;
+
+      status=dns_is_domain_local(rcpt->domain);
+      switch (status) {
+        case dns_nomx   :
+          done=false;
+          break;
+        case dns_local  :
+          rcpt->code='L';       //domain is local
+          break;
+        case dns_remote :
+          rcpt->code='R';       //domain is remote
+          break;
+        default         :
+          (void) rou_alert(0,"%s Unexpected status='%d' for domain<%s>",
+                              OPEP,status,rcpt->domain);
+          break;
         }
       break;
-    case 2      :       //domain is a remote one
-      rcpt->code='R';        
-      break;
     default     :       //SAFE Guard
       proceed=false;
       break;
@@ -648,19 +659,13 @@ while (proceed==true) {
         }
       break;
     case 3      :       //Do we have a domain MX
-      (void) setlocdom(contact,neu);
-      if (neu->domain!=(const char *)0) {  //always
-        MXTYP **mx;
-
-        if ((mx=dns_getmx(neu->domain))==(MXTYP **)0) {
-          (void) transmit(contact,"%d 5.6.3 %s (rcpt=%s)",
-                                  MISSMX,
-                                  "No valid MX found for recipient domain name",
-                                  neu->domain);
-          neu=eml_freerecipient(neu);
-          phase=999;      //no need to go further
-          }
-        mx=dns_freemxlist(mx);
+      if (setlocdom(contact,neu)==false) {
+        (void) transmit(contact,"%d 5.6.3 %s (domain=%s)",
+                                 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 4      :       //Storing rcpt to
index ad398ab47825f15f9dad0778a7e98b93d6416673..41db7e3200ce6cec614fcb4215d4403910bb46fa 100644 (file)
@@ -381,6 +381,7 @@ while (proceed==true) {
          mx=(MXTYP *)calloc(1,sizeof(MXTYP));
          mx->preference=atoi(list[i]);
          mx->mxname=strdup(list[i+1]);
+          //(void) rou_alert(0,"%s JMPDBG MX[%d]=<%s>",OPEP,i,mx->mxname);
          mxlist=(MXTYP **)rou_addlist((void **)mxlist,(void *)mx);
           answer++;
          }
@@ -468,3 +469,59 @@ else {
 return match;
 #undef  OPEP
 }
+/*
+\f
+*/
+/********************************************************/
+/*                                                     */
+/*     Procedure to check if a domain is handle by the */
+/*     local interface (serveur is primary MX).        */
+/*                                                     */
+/********************************************************/
+PUBLIC LOCTYP dns_is_domain_local(const char *domain)
+
+
+{
+#define OPEP    "unidns.c:dns_is_domain_local,"
+
+LOCTYP status;
+MXTYP **dns;
+int phase;
+_Bool proceed;
+
+status=dns_nomx;
+phase=0;
+proceed=true;
+while (proceed==true) {
+  switch (phase) {
+    case 0      :       //Do we have a domain
+      if ((domain==(char *)0)||(strlen(domain)==0))
+        phase=999;      //No domain (Bug?)
+      break;
+    case 1      :       //getting MX list
+      if ((dns=dns_getmx(domain))==(MXTYP **)0)
+        phase=999;      //domain without MX?
+      break;
+    case 2      :       //listing MX
+      MXTYP **ptr;
+
+      ptr=dns;
+      while ((*ptr)!=(MXTYP *)0) {
+        (void) rou_alert(0,"%s JMPDBG pref='%d' mxname=<%s>",
+                            OPEP,(*ptr)->preference,(*ptr)->mxname);
+        ptr++;
+        }
+      break;
+    case 3      :       //cleaning MX list
+      dns=dns_freemxlist(dns);
+      break;
+    default     :       //SAFE Guard
+      proceed=false;
+      break;
+    }
+  phase++;
+  }
+return status;
+
+#undef  OPEP
+}
index 74b3306dd609a5502cd002ec866ca1b372735453..1114ee8b31903fe0310a197dae1a89022d2a6659 100644 (file)
@@ -17,6 +17,13 @@ typedef      struct  {
         char **mxip;    //MX IPNUM list
        }MXTYP;
 
+typedef enum    {       //domain MX status
+        dns_nomx,       //Domain without MX
+        dns_local,      //Domain is local
+        dns_remote,     //Domain is remote
+        dns_unknown     //Unknow domain status.
+        }LOCTYP;
+
 //Procedure to get ONE SPF entry within domain dns
 extern char *dns_getspf(char *domain);
 
@@ -33,6 +40,6 @@ extern _Bool dns_matchiprec(char *hostname,AFNTYP *afnnum,int mask);
 
 //procedure to detect if a domain is served by a local
 //smtp server
-extern _Bool dns_is_domain_local(const char *domain);
+extern LOCTYP dns_is_domain_local(const char *domain);
 
 #endif
index a325007c7adb8d8e08dc3ed43526d387ea410b45..2c755e2249ecf26f3d031eb313237142becd6d3b 100644 (file)
@@ -21,6 +21,7 @@
 #define BADPAR  501             //error in parameters
 #define CMDBAD  502             //command not implemented
 #define DATRJC  521             //Data Rejected
+#define REJECT  550             //E-mail/domain rejected
 #define UKNUSER 551             //Unknown user
 #define MALABRT 552             //email data rejected
 #define NOTEML  553             //Not an email address