/* 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);
}
}
*/
/********************************************************/
/* */
+/* 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 */
/* */
/********************************************************/
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 */
}
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;
}
phase++;
}
-spf=spf_neutral;
return spf;
#undef OPEP