char *backalias(faddr *fa) { struct aliaslist *tmp; for (tmp = alist; tmp; tmp = tmp->next) if ((!fa->domain || !tmp->addr->domain || !strcasecmp(fa->domain,tmp->addr->domain)) && (!fa->zone || (fa->zone == tmp->addr->zone)) && (fa->net == tmp->addr->net) && (fa->node == tmp->addr->node) && (fa->point == tmp->addr->point) && (fa->name) && (tmp->addr->name) && (strcasecmp(fa->name,tmp->addr->name) == 0)) { Syslog('m', "Address \"%s\" has local alias \"%s\"", ascinode(fa,0x7f), MBSE_SS(tmp->alias)); return tmp->alias; } return NULL; }
ftnmsg *mkftnhdr(rfcmsg *msg, int newsmode, faddr *recipient) { char *freename = NULL, *rfcfrom = NULL, *p, *q, *l, *r; char *fbuf = NULL, *ftnfrom=NULL; static ftnmsg *tmsg; int needreplyaddr = 1; faddr *tmp, *tmp2; tmsg=(ftnmsg *)malloc(sizeof(ftnmsg)); memset(tmsg, 0, sizeof(ftnmsg)); if (newsmode) { p = xstrcpy(hdr((char *)"Comment-To",msg)); if (p == NULL) p = xstrcpy(hdr((char *)"X-Comment-To",msg)); if (p == NULL) p = xstrcpy(hdr((char *)"X-FTN-To",msg)); if (p == NULL) p = xstrcpy(hdr((char *)"X-Fidonet-Comment-To",msg)); if (p == NULL) p = xstrcpy(hdr((char *)"X-Apparently-To",msg)); if (p == NULL) p = xstrcpy(hdr((char *)"To", msg)); /* 14-Aug-2001 MB */ if (p) { Syslog('m', "Getting `to' address from \"%s\"", MBSE_SS(p)); if ((tmsg->to = parsefaddr(p)) == NULL) tmsg->to = parsefaddr((char *)"[email protected]"); if ((l = strrchr(p,'<')) && (r = strchr(p,'>')) && (l < r)) { r = l; *r-- = '\0'; if ((l = strchr(p,'"')) && (r = strrchr(p,'"')) && (l < r)) { l++; *r-- = '\0'; } while (isspace(*r)) *r-- = '\0'; if (!l) l = p; while (isspace(*l)) l++; } else if ((l = strrchr(p,'(')) && (r = strchr(p,')')) && (l < r)) { *r-- = '\0'; while (isspace(*r)) *r-- = '\0'; l++; while (isspace(*l)) l++; } else { l = p; while (isspace(*l)) l++; r = p + strlen(p) -1; if (*r == '\n') *r-- = '\0'; while (isspace(*r)) *r-- = '\0'; } if (*l) { if (strlen(l) > MAXNAME) l[MAXNAME]='\0'; free(tmsg->to->name); tmsg->to->name=xstrcpy(l); } free(p); /* * It will become echomail, the destination FTN address must * be our address. 14-Aug-2001 MB. */ tmsg->to->zone = msgs.Aka.zone; tmsg->to->net = msgs.Aka.net; tmsg->to->node = msgs.Aka.node; tmsg->to->point = msgs.Aka.point; tmsg->to->domain = xstrcpy(msgs.Aka.domain); } else { /* * Filling a default To: address. */ tmsg->to = (faddr*)malloc(sizeof(faddr)); tmsg->to->name = xstrcpy((char *)"All"); tmsg->to->zone = msgs.Aka.zone; tmsg->to->net = msgs.Aka.net; tmsg->to->node = msgs.Aka.node; tmsg->to->point = msgs.Aka.point; tmsg->to->domain = xstrcpy(msgs.Aka.domain); } } else { if (recipient) { /* * In mbmail mode the recipient is valid and must be used * as the destination address. The To: field is probably * an RFC address an cannot be used to route the message. */ tmsg->to = (faddr *)malloc(sizeof(faddr)); tmsg->to->point = recipient->point; tmsg->to->node = recipient->node; tmsg->to->net = recipient->net; tmsg->to->zone = recipient->zone; tmsg->to->name = xstrcpy(recipient->name); if (tmsg->to->name && (strlen(tmsg->to->name) > MAXNAME)) tmsg->to->name[MAXNAME]='\0'; tmsg->to->domain = xstrcpy(recipient->domain); Syslog('m', "Recipient TO: %s", ascfnode(tmsg->to,0xff)); } else { p = xstrcpy(hdr((char *)"To",msg)); if (p == NULL) p = xstrcpy(hdr((char *)"X-Apparently-To",msg)); if (p) { if ((tmsg->to = parsefaddr(p)) == NULL) WriteError("Unparsable destination address"); else Syslog('m', "RFC parsed TO: %s",ascfnode(tmsg->to,0xff)); } } } /* else (newsmode) */ p = fbuf = xstrcpy(hdr((char *)"Reply-To", msg)); if (fbuf == NULL) p = fbuf = xstrcpy(hdr((char *)"From", msg)); if (fbuf == NULL) p = fbuf = xstrcpy(hdr((char *)"X-UUCP-From", msg)); if (p) { q = p; while (isspace(*q)) q++; fbuf = parserfcaddr(q).remainder; if (parserfcaddr(q).target) { fbuf = xstrcat(fbuf, (char *)"@"); fbuf = xstrcat(fbuf, parserfcaddr(q).target); } rfcfrom = fbuf; } if (p) free(p); p = NULL; if (!rfcfrom) rfcfrom = xstrcpy((char *)"postmaster"); p = fbuf = xstrcpy(hdr((char *)"From", msg)); if (fbuf == NULL) p = fbuf = xstrcpy(hdr((char *)"X-UUCP-From", msg)); if (p) { q = p; while (isspace(*q)) q++; if ((q) && (*q != '\0')) freename = parserfcaddr(q).comment; else freename = NULL; } else freename = xstrcpy((char *)"Unidentified User"); if (freename) { while (isspace(*freename)) freename++; } if (rfcfrom) { while (isspace(*rfcfrom)) rfcfrom++; p = rfcfrom + strlen(rfcfrom) -1; while ((isspace(*p)) || (*p == '\n')) *(p--)='\0'; } if ((freename) && (*freename != '\0')) { while (isspace(*freename)) freename++; p = freename + strlen(freename) -1; while ((isspace(*p)) || (*p == '\n')) *(p--)='\0'; if ((*freename == '\"') && (*(p=freename+strlen(freename)-1) == '\"')) { freename++; *p='\0'; } } // if (*freename == '\0') freename=rfcfrom; if ((!freename) || ((freename) && (*freename == '\0')) || (strcmp(freename,".")==0)) freename=rfcfrom; if (! newsmode) Syslog('+', "from: %s <%s>",freename,rfcfrom); needreplyaddr = 1; if ((tmsg->from=parsefaddr(rfcfrom)) == NULL) { if (freename && rfcfrom) if (!strchr(freename,'@') && !strchr(freename,'%') && strncasecmp(freename,rfcfrom,MAXNAME) && strncasecmp(freename,"uucp",4) && strncasecmp(freename,"usenet",6) && strncasecmp(freename,"news",4) && strncasecmp(freename,"super",5) && strncasecmp(freename,"admin",5) && strncasecmp(freename,"postmaster",10) && strncasecmp(freename,"sys",3)) needreplyaddr=registrate(freename,rfcfrom); } else { tmsg->ftnorigin = 1; tmsg->from->name = xstrcpy(freename); if (strlen(tmsg->from->name) > MAXNAME) tmsg->from->name[MAXNAME]='\0'; } if (replyaddr) { free(replyaddr); replyaddr=NULL; } if (needreplyaddr && (tmsg->from == NULL)) { replyaddr=xstrcpy(rfcfrom); } if (tmsg->from) Syslog('m', "From address was%s distinguished as ftn", tmsg->from ? "" : " not"); if (newsmode) { tmp2 = fido2faddr(msgs.Aka); bestaka = bestaka_s(tmp2); tidy_faddr(tmp2); } else bestaka = bestaka_s(tmsg->to); if ((tmsg->from == NULL) && (bestaka)) { if (CFG.dontregate) { p = xstrcpy(hdr((char *)"X-FTN-Sender",msg)); if (p == NULL) { if ((p = hdr((char *)"X-FTN-From",msg))) { tmp = parsefnode(p); p = xstrcpy(ascinode(tmp, 0xff)); tidy_faddr(tmp); } } if (p) { q = p; while (isspace(*q)) q++; ftnfrom = parserfcaddr(q).remainder; if (parserfcaddr(q).target) { ftnfrom = xstrcat(ftnfrom,(char *)"@"); ftnfrom = xstrcat(ftnfrom,parserfcaddr(q).target); } Syslog('m', "Ftn gateway: \"%s\"", ftnfrom); Syslog('+', "Ftn sender: %s",ftnfrom); if (ftnfrom) tmsg->from = parsefaddr(ftnfrom); if ((tmsg->from) && (!tmsg->from->name)) tmsg->from->name = xstrcpy(rfcfrom); } if (p) free(p); p = NULL; if (tmsg->from == NULL) { tmsg->from=(faddr *)malloc(sizeof(faddr)); tmsg->from->name=xstrcpy(freename); if (tmsg->from->name && (strlen(tmsg->from->name) > MAXNAME)) tmsg->from->name[MAXNAME]='\0'; tmsg->from->point=bestaka->point; tmsg->from->node=bestaka->node; tmsg->from->net=bestaka->net; tmsg->from->zone=bestaka->zone; tmsg->from->domain=xstrcpy(bestaka->domain); } } else { tmsg->from=(faddr *)xmalloc(sizeof(faddr)); tmsg->from->name=xstrcpy(freename); if (tmsg->from->name && (strlen(tmsg->from->name) > MAXNAME)) tmsg->from->name[MAXNAME]='\0'; tmsg->from->point=bestaka->point; tmsg->from->node=bestaka->node; tmsg->from->net=bestaka->net; tmsg->from->zone=bestaka->zone; tmsg->from->domain=xstrcpy(bestaka->domain); } } if (fbuf) free(fbuf); fbuf = NULL; p = hdr((char *)"Subject", msg); if (p) { while (isspace(*p)) p++; tmsg->subj = xstrcpy(p); if (*(p=tmsg->subj+strlen(tmsg->subj)-1) == '\n') *p='\0'; if (strlen(tmsg->subj) > MAXSUBJ) tmsg->subj[MAXSUBJ]='\0'; } else { tmsg->subj = xstrcpy((char *)" "); } if ((p = hdr((char *)"X-FTN-FLAGS",msg))) tmsg->flags |= flagset(p); if (hdr((char *)"Return-Receipt-To",msg)) tmsg->flags |= M_RRQ; if (hdr((char *)"Notice-Requested-Upon-Delivery-To",msg)) tmsg->flags |= M_RRQ; if (!newsmode) { tmsg->flags |= M_PVT; tmsg->flags |= M_KILLSENT; } if ((p = hdr((char *)"X-Origin-Date",msg))) tmsg->date = parsedate(p, NULL) - (gmt_offset((time_t)0) * 60); else if ((p = hdr((char *)"Date",msg))) tmsg->date = parsedate(p, NULL) - (gmt_offset((time_t)0) * 60); else tmsg->date = time((time_t *)NULL); /* * SunMail 1.0 creates invalid date formats like: Wed, 19 Jun 2002 18:21:07 GMT-08:00 * ^---- not allowed. */ if (tmsg->date == -1) { Syslog('!', "Parsing date \"%s\" failed, using current date", p); tmsg->date = time((time_t *)NULL); } if ((p = hdr((char *)"X-FTN-MSGID", msg))) { tmsg->ftnorigin &= 1; while (isspace(*p)) p++; tmsg->msgid_s = xstrcpy(p); if (*(p = tmsg->msgid_s + strlen(tmsg->msgid_s) -1) == '\n') *p='\0'; } else if ((p = hdr((char *)".MSGID",msg))) { tmsg->ftnorigin &= 1; while (isspace(*p)) p++; tmsg->msgid_s = xstrcpy(p); if (*(p = tmsg->msgid_s + strlen(tmsg->msgid_s) -1) == '\n') *p='\0'; } else if ((p = hdr((char *)"Message-ID",msg))) { tmsg->ftnorigin &= ftnmsgid(p,&(tmsg->msgid_a),&(tmsg->msgid_n),tmsg->area); } else tmsg->msgid_a = NULL; if ((p = hdr((char *)"X-FTN-REPLY",msg))) { while (isspace(*p)) p++; tmsg->reply_s = xstrcpy(p); if (*(p=tmsg->reply_s + strlen(tmsg->reply_s) -1) == '\n') *p='\0'; } else { if (newsmode) { p = hdr((char *)"References",msg); if (p) { l = xstrcpy(p); r = strtok(l," \t\n"); while ((l=strtok(NULL," \t\n")) != NULL) r = l; p = r; free(l); } } else p = hdr((char *)"In-Reply-To",msg); } if (p) (void)ftnmsgid(p,&(tmsg->reply_a),&(tmsg->reply_n),NULL); else tmsg->reply_a=NULL; p = hdr((char *)"Organization",msg); if (p == NULL) p = hdr((char *)"Organisation",msg); if (p) { while (isspace(*p)) p++; tmsg->origin = xstrcpy(p); if (tmsg->origin) if (*(p = tmsg->origin + strlen(tmsg->origin)-1) == '\n') *p='\0'; } else { /* * No Organization header, insert the default BBS origin. */ tmsg->origin = xstrcpy(CFG.origin); } return tmsg; }
/* * Reply message, in Msg.From and Msg.Subject must be the * name to reply to and the subject. */ void Reply_Email(int IsReply) { int i, j, x; char to[101], from[101], subj[101], msgid[101], replyto[101], replyaddr[101], *tmp, *buf, qin[9], temp[81]; faddr *Dest = NULL; snprintf(from, 101, "%s", Msg.To); snprintf(to, 101, "%s", Msg.From); snprintf(replyto, 101, "%s", Msg.ReplyTo); snprintf(replyaddr, 101, "%s", Msg.ReplyAddr); if (strncasecmp(Msg.Subject, "Re:", 3) && IsReply) { snprintf(subj, 101, "Re: %s", Msg.Subject); } else { snprintf(subj, 101, "%s", Msg.Subject); } mbse_CleanSubject(subj); Syslog('m', "Reply msg to %s, subject %s", to, subj); Syslog('m', "Msgid was %s", Msg.Msgid); snprintf(msgid, 101, "%s", Msg.Msgid); x = 0; Line = 1; WhosDoingWhat(READ_POST, NULL); clear(); snprintf(temp, 81, " %-70s", sMailbox); pout(BLUE, LIGHTGRAY, temp); snprintf(temp, 81, "#%-5u", EmailBase.Highest + 1); pout(RED, LIGHTGRAY, temp); Enter(1); colour(CFG.HiliteF, CFG.HiliteB); if (utf8) chartran_init((char *)"CP437", (char *)"UTF-8", 'B'); PUTSTR(chartran(sLine_str())); chartran_close(); Enter(1); for (i = 0; i < (TEXTBUFSIZE + 1); i++) Message[i] = (char *) calloc(MAX_LINE_LENGTH +1, sizeof(char)); Line = 1; Msg_New(); snprintf(Msg.Replyid, sizeof(Msg.Replyid), "%s", msgid); snprintf(Msg.ReplyTo, sizeof(Msg.ReplyTo), "%s", replyto); snprintf(Msg.ReplyAddr, sizeof(Msg.ReplyAddr), "%s", replyaddr); /* From : */ pout(YELLOW, BLACK, (char *) Language(209)); if (CFG.EmailMode != E_PRMISP) { /* * If not permanent connected to the internet, use fidonet.org style addressing. */ Dest = fido2faddr(CFG.EmailFidoAka); snprintf(Msg.From, 101, "%s@%s (%s)", exitinfo.sUserName, ascinode(Dest, 0x2f), exitinfo.sUserName); } else { snprintf(Msg.From, 101, "%s@%s (%s)", exitinfo.Name, CFG.sysdomain, exitinfo.sUserName); } for (i = 0; i < strlen(Msg.From); i++) { if (Msg.From[i] == ' ') Msg.From[i] = '_'; if (Msg.From[i] == '@') break; } pout(CFG.MsgInputColourF, CFG.MsgInputColourB, Msg.From); Enter(1); Syslog('b', "Setting From: %s", Msg.From); /* To : */ snprintf(Msg.To, 101, "%s", to); pout(YELLOW, BLACK, (char *) Language(208)); pout(CFG.MsgInputColourF, CFG.MsgInputColourB, Msg.To); Enter(1); /* Enter to keep Subject. */ pout(LIGHTRED, BLACK, (char *) Language(219)); Enter(1); /* Subject : */ pout(YELLOW, BLACK, (char *) Language(210)); snprintf(Msg.Subject, 101, "%s", subj); pout(CFG.MsgInputColourF, CFG.MsgInputColourB, Msg.Subject); x = strlen(subj); colour(CFG.MsgInputColourF, CFG.MsgInputColourB); GetstrP(subj, 50, x); if (strlen(subj)) strcpy(Msg.Subject, subj); Msg.Private = TRUE; Enter(1); // Check_Attach(); /* * Quote original message now, format the original users * initials into qin. If its a [email protected] the use the * first 8 characters of the name part. */ snprintf(Message[1], TEXTBUFSIZE +1, "%s wrote to %s:", to, from); memset(&qin, 0, sizeof(qin)); if (strchr(to, '@')) { tmp = xstrcpy(strtok(to, "@")); tmp[8] = '\0'; snprintf(qin, 9, "%s", tmp); free(tmp); } else { x = TRUE; j = 0; for (i = 0; i < strlen(to); i++) { if (x && isalpha(to[i])) { qin[j] = to[i]; j++; x = FALSE; } if (to[i] == ' ' || to[i] == '.') x = TRUE; if (j == 6) break; } } Line = 2; tmp = calloc(PATH_MAX, sizeof(char)); buf = calloc(TEXTBUFSIZE +1, sizeof(char)); snprintf(tmp, PATH_MAX, "%s/%s/.quote", CFG.bbs_usersdir, exitinfo.Name); if ((qf = fopen(tmp, "r")) != NULL) { while ((fgets(buf, TEXTBUFSIZE, qf)) != NULL) { Striplf(buf); snprintf(Message[Line], TEXTBUFSIZE +1, "%s> %s", (char *)qin, buf); Line++; if (Line == TEXTBUFSIZE) break; } fclose(qf); } else WriteError("$Can't read %s", tmp); free(buf); free(tmp); if (Edit_Msg()) Save_Email(IsReply); for (i = 0; i < (TEXTBUFSIZE + 1); i++) free(Message[i]); }
void Write_Email(void) { faddr *Dest = NULL; int i; char *orgbox; if (HasNoEmail()) return; orgbox = xstrcpy(sMailbox); SetEmailArea((char *)"mailbox"); WhosDoingWhat(READ_POST, NULL); clear(); for (i = 0; i < (TEXTBUFSIZE + 1); i++) Message[i] = (char *) calloc(MAX_LINE_LENGTH +1, sizeof(char)); Line = 1; Msg_New(); Enter(1); colour(LIGHTBLUE, BLACK); /* Posting message in area: */ pout(LIGHTBLUE, BLACK, (char *) Language(156)); PUTSTR((char *)"\"mailbox\""); Enter(2); /* From : */ pout(YELLOW, BLACK, (char *) Language(157)); if (CFG.EmailMode != E_PRMISP) { /* * If not permanent connected to the internet, use fidonet.org style addressing. */ Dest = fido2faddr(CFG.EmailFidoAka); snprintf(Msg.From, 101, "%s@%s (%s)", exitinfo.sUserName, ascinode(Dest, 0x2f), exitinfo.sUserName); } else snprintf(Msg.From, 101, "%s@%s (%s)", exitinfo.Name, CFG.sysdomain, exitinfo.sUserName); for (i = 0; i < strlen(Msg.From); i++) { if (Msg.From[i] == ' ') Msg.From[i] = '_'; if (Msg.From[i] == '@') break; } pout(CFG.MsgInputColourF, CFG.MsgInputColourB, Msg.From); Syslog('b', "Setting From: %s", Msg.From); Enter(1); /* To : */ pout(YELLOW, BLACK, (char *) Language(158)); colour(CFG.MsgInputColourF, CFG.MsgInputColourB); alarm_on(); GetstrU(Msg.To, 63); if ((strcmp(Msg.To, "")) == 0) { for (i = 0; i < (TEXTBUFSIZE + 1); i++) free(Message[i]); SetEmailArea(orgbox); free(orgbox); return; } /* Subject : */ pout(YELLOW, BLACK, (char *) Language(161)); colour(CFG.MsgInputColourF, CFG.MsgInputColourB); alarm_on(); GetstrP(Msg.Subject, 65, 0); mbse_CleanSubject(Msg.Subject); if ((strcmp(Msg.Subject, "")) == 0) { Enter(1); /* Abort Message [y/N] ?: */ pout(CYAN, BLACK, (char *) Language(162)); alarm_on(); if (toupper(Readkey()) == Keystroke(162, 0)) { for (i = 0; i < (TEXTBUFSIZE + 1); i++) free(Message[i]); SetEmailArea(orgbox); free(orgbox); return; } } Msg.Private = TRUE; if (Edit_Msg()) { Save_Email(FALSE); } for (i = 0; i < (TEXTBUFSIZE + 1); i++) free(Message[i]); SetEmailArea(orgbox); free(orgbox); }
char *route(char *adr0) { FILE *f1; char *a1; int i=0; char adr1[100]; char *adr2=adr1; char *adrp; char *routeadr; tfaddr=parsefaddr(adr0); adr2=ascfnode(tfaddr, 0x6); if (strcmp(adr2, my_addr) == 0) return(adr0); f1=fopen(ROUTE_CFG,"r"); while(fgets(adr[i],100,f1) != NULL) { a[i]=adr[i]; i++; } if(i==0) i++; a[i]=NULL; /* i=0; while(a[i]!=NULL) printf("%s",a[i++]); */ fclose(f1); /* printf("\n%s\n", adr2);*/ if ((adrp=strchr(adr2, '.')) != NULL) *adrp='\0'; if ((routeadr=routea(adr2)) == NULL) { adrp=(strchr(adr2, '/')); *(adrp+1)='*'; *(adrp+2)='\0'; if ((routeadr=routea(adr2)) == NULL) { strcpy(adr2, "*/*"); if ((routeadr=routea(adr2)) == NULL) { printf("\nerror in route table\n"); } } } if (routeadr != NULL) { strcpy(adr1, routeadr); tfaddr=parsefnode(adr1); routeadr=adr1; routeadr=ascinode(tfaddr, 0x6); } /* printf("\nrouteaddr = %s\n", routeadr);*/ return(routeadr); }