]> SAFE projects GIT repository - jmp/mailleur/commitdiff
Improving unidns module
authorJean-Marc Pigeon (Delson) <jmp@safe.ca>
Thu, 15 Aug 2024 14:43:40 +0000 (10:43 -0400)
committerJean-Marc Pigeon (Delson) <jmp@safe.ca>
Thu, 15 Aug 2024 14:43:40 +0000 (10:43 -0400)
lib/subrou.c
lib/unidns.c

index dd512b2bbdf979b3e506d70aa86914eeb7d5d0bc..31f6d15f39ceda1980003e5e7a85d74ec5b2eb3e 100644 (file)
@@ -21,7 +21,7 @@
 
 //version definition 
 #define VERSION "0.4.2"
-#define RELEASE "6"
+#define RELEASE "7"
 
 //Public variables
 PUBLIC  int debug=0;            //debug level
index 7e1fc6bd58a43bb1aa1559e65fb385d86afda42a..469318349bf9615485cc7d2c06c6d4e978251664 100644 (file)
@@ -35,15 +35,15 @@ static  _Bool modopen;          //module open/close status
 /*     Procedure to display SPF debug information      */
 /*                                                      */
 /********************************************************/
-static void dbgspf(int dbg,char *spf,AFNTYP *afnnum,char *seq,SPFENU status)
+static void dbgspf(int dbg,AFNTYP *afnnum,char *seq,SPFENU status)
 
 {
 if (debug>-dbg) {
   char *strip;
 
   strip=afn_stripnum(afnnum);
-  (void) rou_alert(dbg,"Current SPF Value <%s>]\n\tSEQ=<%s>\n\tIP=[%s]\n\tSPF=<%s>",
-                        dns_spfASCII(status),spf,strip,seq);
+  (void) rou_alert(dbg,"Current SPF Value <%s>\n\tIP=[%s]\n\tSPF=<%s>",
+                        dns_spfASCII(status),strip,seq);
   strip=rou_freestr(strip); 
   }
 }
@@ -52,6 +52,119 @@ if (debug>-dbg) {
 */
 /********************************************************/
 /*                                                      */
+/*     Procedure to get the next SPF component         */
+/*      return a dynamic char pointer with the isolated */
+/*      SPF sequence.                                   */
+/*                                                      */
+/********************************************************/
+static char *getspfseq(char *fullspf)
+
+{
+char *seq;
+int phase;
+_Bool proceed;
+
+seq=(char *)0;
+phase=0;
+proceed=true;
+while (proceed==true) {
+  switch (phase) {
+    case 0      :       //Converting the IP number
+      if (fullspf==(char *)0)
+        phase=999;      //no need to go further
+      break;
+    case 1      :       //skipping blank
+      while ((*fullspf==' ')||(*fullspf=='\t'))
+        fullspf++;      //scanning blank
+      if (strlen(fullspf)==0)
+        phase=999;      //no need to go further
+      break;
+    case 2      :       //detecting specific char
+      seq=strdup(fullspf);
+      if (strchr("?~-+",fullspf[0])!=(char *)0) {
+        seq[1]='\000';  //on char only
+        phase=999;      //no need to go further
+        }
+      break;
+    case 3      :       //cleaning sequence
+      if (seq!=(char *)0) {     //always
+        char *ptr;
+  
+        if ((ptr=strchr(seq,' '))!=(char *)0)
+          *ptr='\000';
+        if ((ptr=strchr(seq,'\t'))!=(char *)0)
+          *ptr='\000';
+        }
+      break;
+    default     :       //SAFE Guard
+      proceed=false;
+      break;
+    }
+  phase++;
+  }
+return seq;
+}
+/*
+\f
+*/
+/********************************************************/
+/*                                                      */
+/*     Procedure to return an spf status according     */
+/*      sequence contents                               */
+/*                                                      */
+/********************************************************/
+static SPFENU checkseq(char *seq,AFNTYP *afnum,SPFENU spf)
+
+{
+#define OPEP    "unidns.c:checkseq"
+int phase;
+_Bool proceed;
+
+phase=0;
+proceed=true;
+(void) printf("JMPDBG checkseq seq=<%s>\n",seq);
+while (proceed==true) {
+  switch (phase) {
+    case 0      :       //is the sequence an SPF Mechanisms
+      if (strlen(seq)==1) {
+        switch (seq[0]) {
+          case '?'      :
+            spf=spf_neutral;
+            break;
+          case '~'      :
+            spf=spf_softfail;
+            break;
+          case '+'      :
+            spf=spf_pass;
+            break;
+          case '-'      :
+            spf=spf_fail;
+            break;
+          default       :
+            (void) rou_alert(0,"%s <%s> is not an expected SPF Mechanisms (Bug?)",
+                               OPEP,seq);
+            break;
+          }
+        phase=999;      //no need to go further
+        }
+      break;
+    case 1      :       //check directive
+      break;
+    default     :       //SAFE guard
+      proceed=false;
+      break;
+    }
+  phase++;
+  }
+return spf;
+
+#undef  OPEP
+}
+/*
+\f
+*/
+/********************************************************/
+/*                                                      */
 /*     Procedure to query DNS information              */
 /*                                                      */
 /********************************************************/
@@ -141,7 +254,8 @@ while((answer-->0)&&(cp<eom)) {
     GETLONG(ttl,cp);
     GETSHORT(dlen,cp);
     if (class!=1) {
-      (void) rou_alert(0,"%s unexpected class='%d' on request <%s> field=<%s> (ttl='%d')",
+      (void) rou_alert(0,"%s unexpected class='%d' on request "
+                         "<%s> field=<%s> (ttl='%d')",
                          OPEP,class,request,field,ttl);
       cp+=dlen;
       break;           /*no need to go further                 */
@@ -326,7 +440,18 @@ while (proceed==true) {
         }
       break;
     case 2      :       //making sure spfrec is an SPF1
-      (void) dbgspf(2,spfrec,afnnum,spfrec,spf);
+      spfrec+=strlen(SPF1);
+      (void) dbgspf(2,afnnum,spfrec,spf);
+      if (strlen(spfrec)>0) {
+        char *seq;
+
+        while ((seq=getspfseq(spfrec))!=(char *)0) {
+          spfrec=strstr(spfrec,seq);
+          spfrec+=strlen(seq);
+          spf=checkseq(seq,afnnum,spf);
+          seq=rou_freestr(seq);
+          }
+        }
       break;
     default     :       //SAFE Guard
       proceed=false;
@@ -334,7 +459,6 @@ while (proceed==true) {
     }
   phase++;
   }
-spf=spf_neutral;
 return spf;
 
 #undef  OPEP