From 190ff43ee4ff7b82bbe1766b4f339ce97501f4d0 Mon Sep 17 00:00:00 2001 From: "Jean-Marc Pigeon (Delson)" Date: Thu, 15 Aug 2024 10:43:40 -0400 Subject: [PATCH] Improving unidns module --- lib/subrou.c | 2 +- lib/unidns.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 131 insertions(+), 7 deletions(-) diff --git a/lib/subrou.c b/lib/subrou.c index dd512b2..31f6d15 100644 --- a/lib/subrou.c +++ b/lib/subrou.c @@ -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 diff --git a/lib/unidns.c b/lib/unidns.c index 7e1fc6b..4693183 100644 --- a/lib/unidns.c +++ b/lib/unidns.c @@ -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; +} +/* + +*/ +/********************************************************/ +/* */ +/* 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 +} +/* + +*/ +/********************************************************/ +/* */ /* Procedure to query DNS information */ /* */ /********************************************************/ @@ -141,7 +254,8 @@ while((answer-->0)&&(cp 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 -- 2.47.3