]> SAFE projects GIT repository - jmp/mailleur/commitdiff
unidns.c procedure checkip seems to be working
authorJean-Marc Pigeon (Delson) <jmp@safe.ca>
Fri, 16 Aug 2024 04:54:16 +0000 (00:54 -0400)
committerJean-Marc Pigeon (Delson) <jmp@safe.ca>
Fri, 16 Aug 2024 04:54:16 +0000 (00:54 -0400)
lib/subrou.c
lib/unidns.c

index 50b71db99e4d853036defc547af9c8eb18476ca0..bb907d853526e472f046571b44204ca62eec7d89 100644 (file)
@@ -21,7 +21,7 @@
 
 //version definition 
 #define VERSION "0.4.2"
-#define RELEASE "12"
+#define RELEASE "13"
 
 //Public variables
 PUBLIC  int debug=0;            //debug level
index 2fd72defd343d47c797405fb7a1e6bf44c3867e5..8234a26ca3c6ba9379a4270fa57c02a73dbc38c3 100644 (file)
@@ -165,28 +165,73 @@ return seq;
 /*      spf sequence                                    */
 /*                                                      */
 /********************************************************/
-static _Bool checkip(AFNTYP *afnnum,char *seq)
+static _Bool checkip(char *domain,AFNTYP *afnnum,char *seq)
 
 {
-_Bool bingo;
-AFNTYP *target;
-char *ptr;
+#define OPEP    "unidns.c:checkip"
+_Bool found;
 int cidr;
-char *got;
+AFNTYP *target;
+int phase;
+_Bool proceed;
 
-bingo=false;
+found=false;
 cidr=128;
-if ((seq!=(char *)0)&&((ptr=strchr(seq,'/'))!=(char *)0)) {
-  *ptr='\000'; 
-  cidr=atoi(ptr+1);
+target=(AFNTYP *)0;
+phase=0;
+proceed=true;
+while (proceed==true) {
+  switch (phase) {
+    case 0      :       //Converting the IP number
+      if (seq==(char *)0) {
+        (void) rou_alert(2,"%s Sequence missing from domain <%s> "
+                           "(Wrong SPF sequence wrong)",OPEP,domain);
+        phase=999;
+        }
+      break;
+    case 1      :       //calculating the local cidr
+      if (seq!=(char *)0) {     //always
+        char *ptr;
+
+        if ((ptr=strchr(seq,'/'))!=(char *)0) {
+          *ptr='\000'; 
+          cidr=atoi(ptr+1);
+          }
+        }
+      break;
+    case 2      :       //computing the target ipnumber
+      if ((target=afn_getipnum(seq))==(AFNTYP *)0) {
+        (void) rou_alert(0,"%s Unable to convert <%s> from "
+                           "domain <%s> (SPF bug?)",
+                           OPEP,seq,domain);
+        phase=999;      //no need to go further
+        }
+      break;
+    case 3      :       //calculating the local cidr
+      switch (afn_cmpipnum(afnnum,target,cidr)) {
+        case -1 :
+          (void) rou_alert(0,"%s Unable to compare IP [%s] from SPF "
+                             "domain <%s> (errno=<%s>) (SPF?)",
+                            OPEP,seq,domain);
+          break;
+        case 1  :
+          found=true;
+          break;
+        case 0  :
+          found=false;
+          break;
+        }
+      target=afn_freeipnum(target);
+      break;
+    default     :       //SAFE guard
+      proceed=false;
+      break;
+    }
+  phase++;
   }
-(void) printf("JMPDBG seq=<%s> cidr='%d'\n",seq,cidr);
-target=afn_getipnum(seq);
-got=afn_stripnum(target);
-bingo=(_Bool)afn_cmpipnum(afnnum,target,cidr);
-(void) printf("JMPDBG checkip bingo='%d' peerip=<%s> seq=<%s> got=<%s>\n",
-              bingo,afnnum->strnumip,seq,got);
-return bingo;
+return found;
+
+#undef  OPEP
 }
 /*
 \f
@@ -197,7 +242,7 @@ return bingo;
 /*      sequence contents                               */
 /*                                                      */
 /********************************************************/
-static SPFENU checkseq(int *try,char *seq,AFNTYP *afnnum,SPFENU spf)
+static SPFENU checkseq(int *try,char *domain,char *seq,AFNTYP *afnnum,SPFENU spf)
 
 {
 #define OPEP    "unidns.c:checkseq"
@@ -241,7 +286,7 @@ while (proceed==true) {
           break;
         case mch_ip4            :       //This is IPV4 number
         case mch_ip6            :       //This is IPV6 number
-          if (checkip(afnnum,seq+1)==true)
+          if (checkip(domain,afnnum,seq+1)==true)
             spf=locspf;
           break;
         case mch_include        :       //include sub domain
@@ -522,7 +567,7 @@ return infspf;
 /*      spf allowed IP                                  */
 /*                                                      */
 /********************************************************/
-static SPFENU is_peerip_ok(int *try,AFNTYP *afnnum,char *spfrec)
+static SPFENU is_peerip_ok(int *try,char *domain,AFNTYP *afnnum,char *spfrec)
 
 {
 #define OPEP    "unidns.c:is_peerip_ok"
@@ -556,7 +601,7 @@ while (proceed==true) {
         while ((seq=getspfseq(spfrec))!=(char *)0) {
           spfrec=strstr(spfrec,seq);
           spfrec+=strlen(seq);
-          spf=checkseq(try,seq,afnnum,spf);
+          spf=checkseq(try,domain,seq,afnnum,spf);
           seq=rou_freestr(seq);
           if (spf!=spf_neutral)
             break;      //Found a status breaking loop
@@ -671,7 +716,7 @@ while (proceed==true) {
         }
       break;
     case 4      :       //gett the spf LIST related to SPF
-      spf=is_peerip_ok(try,afnnum,list[0]);
+      spf=is_peerip_ok(try,domain,afnnum,list[0]);
       list=(char **)rou_freelist((void **)list,(freehandler_t)rou_freestr);
       break;
     default     :       //SAFE guard