#include #include #include #include #include #include #include #include "config.h" #include "inews.h" /************************************************************************/ /* validate_header */ /* */ /* Returns true if header is valid or false otherwise. */ /* */ /************************************************************************/ int validate_header(char *buf, int bufsiz) { int valid = 1; char *item = malloc(MAX_ITEMSIZE); int i; size_t len; *item = '\0'; for(i = 0; valid && i < ID_LASTENTRY; i++) { switch(i) { /* * In any case we need the newsgroups line */ case ID_Newsgroups: if(cfg.newsgroups[0]) header[i].info = cfg.newsgroups; if(header[i].info == NULL) { lprintf("Newsgroups missing\n"); valid = 0; } break; /* * If the article contains a path line then we * put our machine name in front of it. * If there is no such line then we'll create one. */ case ID_Path: if(header[i].info) { char c; char *cp = header[i].info; while(*cp && strchr(" !:@^%", *cp) == NULL) cp++; c = *cp; *cp = '\0'; if(stricmp(header[i].info, cfg.mynode)) { strcpy(item, cfg.mynode); strcat(item, "!"); } *cp = c; strcat(item, header[i].info); } else sprintf(item, "%s!%s", cfg.mynode, "not-for-mail"); break; case ID_From: if(cfg.sender[0]) header[i].info = cfg.sender; if(header[i].info == NULL) sprintf(item, "%s@%s (%s)", "unknown", cfg.mydomain, "Unknown User"); break; case ID_Subject: if(cfg.subject[0]) header[i].info = cfg.subject; else if(header[i].info == NULL) { strcpy(item, ""); lprintf("Created missing subject line"); } break; case ID_Distribution: if(cfg.distribution[0]) header[i].info = cfg.distribution; if(header[i].info == NULL) strcpy(item, "world"); break; case ID_Date: if(header[i].info == NULL) rfc_date(item, MAX_ITEMSIZE); break; case ID_Message_ID: if(header[i].info == NULL) { char pck[MAX_PCKSTRING]; sprintf(item, "<%s$%s@%s>", radixpack(time(NULL), pck), job_id(0), cfg.mydomain); if(cfg.printid) puts(item); } break; case ID_Followup_To: if(cfg.followup[0]) header[i].info = cfg.followup; break; case ID_Approved: if(cfg.approved[0]) header[i].info = cfg.approved; break; case ID_Organization: if(cfg.organization[0]) header[i].info = cfg.organization; break; case ID_Expires: if(cfg.expire[0]) header[i].info = cfg.expire; break; case ID_Reply_To: if(cfg.replyto[0]) header[i].info = cfg.replyto; break; /* * Remove any xref leftovers */ case ID_Xref: header[i].info = NULL; break; } if(*item) { if((len = strlen(item) + 1) > (size_t)bufsiz) { lprintf("Buffer overflow\n"); valid = 0; } else { strcpy(buf, item); header[i].info = buf; buf += len; bufsiz -= len; *item = '\0'; } } } if(valid) { if(strnicmp(header[ID_Newsgroups].info, "local.", 6)) lprintf("Spooling news from %s via %s", header[ID_From].info, cfg.newsserver); else lprintf("Spooling news from %s (local)", header[ID_From].info); } free(item); return(valid); }