/* 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
/* 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"
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
/* 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"
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
}
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