From 5fb5469e41b98ebcb9347faad5f7ffa83acf3eb8 Mon Sep 17 00:00:00 2001 From: "Jean-Marc Pigeon (Delson)" Date: Fri, 16 Aug 2024 00:54:16 -0400 Subject: [PATCH] unidns.c procedure checkip seems to be working --- lib/subrou.c | 2 +- lib/unidns.c | 87 +++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 67 insertions(+), 22 deletions(-) diff --git a/lib/subrou.c b/lib/subrou.c index 50b71db..bb907d8 100644 --- a/lib/subrou.c +++ b/lib/subrou.c @@ -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 diff --git a/lib/unidns.c b/lib/unidns.c index 2fd72de..8234a26 100644 --- a/lib/unidns.c +++ b/lib/unidns.c @@ -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 } /* @@ -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 -- 2.47.3