]> SAFE projects GIT repository - jmp/mailleur/commitdiff
Detecting black listed seems to be working
authorJean-Marc Pigeon (Delson) <jmp@safe.ca>
Fri, 25 Jul 2025 09:24:33 +0000 (05:24 -0400)
committerJean-Marc Pigeon (Delson) <jmp@safe.ca>
Fri, 25 Jul 2025 09:24:33 +0000 (05:24 -0400)
lib/unidns.c
lib/unidns.h

index 590ca1cbb52591b4a0f4f3eb0389682551a9a83d..be4bfcb4b09e0c6828f32e5d440679f717da8914 100644 (file)
@@ -315,7 +315,8 @@ PUBLIC BLKTYP *dns_freeblk(BLKTYP *blk)
 {
 if (blk!=(BLKTYP *)0) {
   blk->sitename=rou_freestr(blk->sitename);
-  blk->target=rou_freestr(blk->target);
+  blk->targets=(char **)rou_freelist((void **)blk->targets,
+                                     (genfree_t)rou_freestr);
   (void) free(blk);
   blk=(BLKTYP *)0;
   }
@@ -338,18 +339,33 @@ PUBLIC BLKTYP **dns_addblklist(BLKTYP **blklist,char *entry)
 
 if ((entry!=(char *)0)&&(strlen(entry)>0)) {
   int delta;
-  char target[300];
+  int sofar;
   char sitename[300];
 
-  (void) memset(target,'\000',sizeof(target));
   (void) memset(sitename,'\000',sizeof(sitename));
-  if (sscanf(entry,"%d %s %s",&delta,target,sitename)==3) {
+  sofar=0;
+  if (sscanf(entry,"%d %s%n",&delta,sitename,&sofar)==2) {
     BLKTYP *blk;
+    char **targets;
+    char *ptr;
 
     blk=calloc(1,sizeof(BLKTYP));
     blk->delta=delta;
-    blk->target=strdup(target);
     blk->sitename=strdup(sitename);
+    ptr=entry+sofar;
+    while ((ptr!=(char *)0)&&(strlen(ptr)>0)) {
+      char *coma;
+
+      while ((*ptr==' ')||(*ptr=='\t'))
+        ptr++;
+      if ((coma=strchr(ptr,','))!=(char *)0) {
+        *coma='\000';
+        coma++;
+        }
+      targets=(char **)rou_addlist((void **)targets,(void *)strdup(ptr)); 
+      ptr=coma;
+      }
+    blk->targets=targets;
     blklist=(BLKTYP **)rou_addlist((void **)blklist,(void *)blk);
     }
   else 
@@ -688,28 +704,61 @@ PUBLIC char *dns_is_blacklisted(BLKTYP *blk,char *reversip)
 char *listed;
 char **txt;
 char dnsquest[300];
+int phase;
+_Bool proceed;
 
 listed=(char *)0;
-(void) snprintf(dnsquest,sizeof(dnsquest),"%s.%s",reversip,blk->sitename);
-//(void) rou_alert(0,"%s, JMPDBG checking <%s>",OPEP,dnsquest);
-if ((txt=gettxt(dnsquest,T_A,"TXT"))!=(char **)0) {
-  int num;
-  char **ptr;
-
-  num=0;
-  ptr=txt;
-  while (*ptr!=(char *)0) {
-    (void) rou_alert(0,"JMPDBG site <%s> got txt[%d]=<%s>",
-                        dnsquest,num,*ptr);
-    num++;
-    ptr++;
+phase=0;
+proceed=(blk->targets!=(char **)0);
+while (proceed==true) {
+  switch (phase) {
+    case 0      :       //Building the request
+      (void) snprintf(dnsquest,sizeof(dnsquest),"%s.%s",reversip,blk->sitename);
+      break;
+    case 1      :       //do we have a list of IP
+      if ((txt=gettxt(dnsquest,T_A,"TXT"))==(char **)0)
+        phase=999;      //No answer no need to go further
+      break;
+    case 2      :  {    //chek is the list of IP ia amongs targets
+      char *foundit;
+      char **ptr;
+    
+      foundit=(char *)0; 
+      ptr=txt;
+      while ((*ptr!=(char *)0)&&(foundit==(char *)0)) {
+        char **tgt;
+
+        tgt=blk->targets;
+        while (*tgt!=(char *)0) {
+          if (strcmp(*tgt,*ptr)==0) {
+            foundit=*tgt;
+            break;
+            }
+          tgt++;
+          }
+        ptr++;
+        } 
+      txt=(char **)rou_freelist((void **)txt,(genfree_t)rou_freestr);
+      if (foundit==(char *)0)
+        phase=999;
+      }
+      break;
+    case 3      :       //get the explainantion
+      if ((txt=gettxt(dnsquest,T_TXT,"TXT"))!=(char **)0) {
+        (void) rou_asprintf(&listed,"%s -> %s",blk->sitename,txt[0]);
+        txt=(char **)rou_freelist((void **)txt,(genfree_t)rou_freestr);
+        phase=999;      //every thing found
+        }
+      break;
+    case 4      :       //blakc list but no explaination?
+      (void) rou_alert(0,"%s <%s> blacklisted but no explainantion!",
+                          OPEP,dnsquest);
+      break;
+    default     :       //SAFE Guard
+      proceed=false;
+      break;
     }
-  (void) rou_asprintf(&listed,"IP %s -> %s",blk->sitename,txt[0]);
-  txt=(char **)rou_freelist((void **)txt,(genfree_t)rou_freestr);
-  }
-if ((txt=gettxt(dnsquest,T_TXT,"TXT"))!=(char **)0) {
-  (void) rou_asprintf(&listed,"%s -> %s",blk->sitename,txt[0]);
-  txt=(char **)rou_freelist((void **)txt,(genfree_t)rou_freestr);
+  phase++;
   }
 return listed;
 
index 10cb8bf70e16cc0d910034f4ad243d89d1ddbb75..4d38a4c362e1b19b164b603f99a38bd8608d387f 100644 (file)
@@ -22,8 +22,8 @@ typedef       struct  {
 //defining a blacklist entrry
 typedef struct  {
         int delta;      //black list delta value
-        char *target;   //listing entry;
         char *sitename; //black lister domain entry
+        char **targets; //listing entry;
         }BLKTYP;
 
 typedef enum    {       //domain MX status