Bad netmail goes into the badmail area

This commit is contained in:
Michiel Broek 2002-10-19 11:43:45 +00:00
parent 1c8e9f2769
commit 9c5300b9b6
3 changed files with 127 additions and 105 deletions

View File

@ -33,6 +33,8 @@ v0.35.04 29-Sep-2002
Removed some debug logging with files replace. Removed some debug logging with files replace.
Fixed trashing news dupes file when mbfido was called multiple Fixed trashing news dupes file when mbfido was called multiple
times. Improved program locking. times. Improved program locking.
Netmail received for a zone/net without netmail board will be
stored in the badmail area.
mbsetup: mbsetup:
Added setup for the nodes record for security flags. Added setup for the nodes record for security flags.

4
TODO
View File

@ -81,6 +81,10 @@ mbfido:
L: Add netmail notification of changed areas. L: Add netmail notification of changed areas.
L: Maybe store insecure echomail in badmail area.
L: Maybe store echomail for unknown areas in badmail area.
mbcico: mbcico:
L: Implement modem connect response translation for ISDN lines, i.e. L: Implement modem connect response translation for ISDN lines, i.e.
make the CAUSE responses human readable. see McMail for this make the CAUSE responses human readable. see McMail for this

View File

@ -64,114 +64,130 @@ extern int net_bad; /* Bad netmails (tracking errors */
*/ */
int storenet(faddr *f, faddr *t, time_t mdate, int flags, char *Subj, char *msgid, char *reply, FILE *fp, char *flagstr) int storenet(faddr *f, faddr *t, time_t mdate, int flags, char *Subj, char *msgid, char *reply, FILE *fp, char *flagstr)
{ {
int result, i, empty = TRUE; int result = FALSE, i, empty = TRUE, bad;
unsigned long crc2; unsigned long crc2;
char *Buf; char *Buf;
if (SearchNetBoard(t->zone, t->net)) { if (! SearchNetBoard(t->zone, t->net)) {
StatAdd(&msgs.Received, 1L); bad = TRUE;
msgs.LastRcvd = time(NULL); WriteError("Can't find netmail board for %d:%d/%d", t->zone, t->net, t->node);
UpdateMsgs(); if (strlen(CFG.badboard) == 0) {
Syslog('+', "Killing bad message, no badmail area");
result = Msg_Open(msgs.Base); net_bad++;
if (!result) { return 2;
WriteError("Can't open msgbase %s", msgs.Base);
net_bad++;
return 1;
}
if (Msg_Lock(30L)) {
Msg_New();
Syslog('m', "Flagfield 0x%04x", flags);
strcpy(Msg.From, f->name);
strcpy(Msg.To, usr.sUserName);
strcpy(Msg.FromAddress, ascfnode(f,0x1f));
strcpy(Msg.ToAddress, ascfnode(t,0x1f));
strcpy(Msg.Subject, Subj);
Msg.Written = mdate;
Msg.Arrived = time(NULL) - (gmt_offset((time_t)0) * 60);
Msg.Netmail = TRUE;
/*
* Set flags for the message base.
*/
if ((msgs.MsgKinds == BOTH) || (msgs.MsgKinds == PRIVATE))
Msg.Private = (((flags & M_PVT) ? TRUE:FALSE) || flag_on((char *)"PVT", flagstr));
else
Msg.Private = TRUE; /* Allways */
Msg.Crash = ((flags & M_CRASH) || flag_on((char *)"CRA", flagstr));
Msg.FileAttach = ((flags & M_FILE) || flag_on((char *)"FIL", flagstr));
Msg.Intransit = ((flags & M_TRANSIT));
Msg.FileRequest = ((flags & M_REQ) || flag_on((char *)"FRQ", flagstr));
Msg.ReceiptRequest = ((flags & M_RRQ) || flag_on((char *)"RRQ", flagstr));
Msg.Immediate = flag_on((char *)"IMM", flagstr);
Msg.Direct = flag_on((char *)"DIR", flagstr);
Msg.Gate = flag_on((char *)"ZON", flagstr);
Msg.ConfirmRequest = ((flags & M_AUDIT) || flag_on((char *)"CFM", flagstr));
Msg.Orphan = ((flags & M_ORPHAN));
if (Msg.ReceiptRequest) {
Syslog('+', "Netmail has ReceiptRequest flag, no message created");
}
/*
* Set MSGID and REPLY crc.
*/
if (msgid != NULL) {
crc2 = -1;
Msg.MsgIdCRC = upd_crc32(msgid, crc2, strlen(msgid));
}
if (reply != NULL) {
crc2 = -1;
Msg.ReplyCRC = upd_crc32(reply, crc2, strlen(reply));
}
/*
* Check if this is an empty netmail
*/
rewind(fp);
Buf = calloc(2049, sizeof(char));
while ((fgets(Buf, 2048, fp)) != NULL) {
for (i = 0; i < strlen(Buf); i++) {
if (*(Buf + i) == '\0')
break;
if (*(Buf + i) == '\n')
*(Buf + i) = '\0';
if (*(Buf + i) == '\r')
*(Buf + i) = '\0';
}
if (*(Buf) != '\0') {
if ((*(Buf) != '\001') &&
(strcmp(Buf, (char *)"--- ")))
empty = FALSE;
}
}
free(Buf);
if (!empty) {
Syslog('+', "Import netmail to %s", usr.sUserName);
rewind(fp);
Msg_Write(fp);
Msg_AddMsg();
net_imp++;
} else {
Syslog('+', "Empty netmail for %s dropped", usr.sUserName);
}
Msg_UnLock();
Msg_Close();
return 0;
} else {
WriteError("Can't lock msgbase %s", msgs.Base);
Msg_Close();
return 1;
}
} else { } else {
WriteError("Can't find a netmail board"); if ((result = Msg_Open(CFG.badboard)))
Syslog('+', "Tossing in bad board");
}
} else {
bad = FALSE;
StatAdd(&msgs.Received, 1L);
msgs.LastRcvd = time(NULL);
UpdateMsgs();
result = Msg_Open(msgs.Base);
}
if (!result) {
WriteError("Can't open msgbase %s", msgs.Base);
net_bad++;
return 1;
}
if (Msg_Lock(30L)) {
Msg_New();
Syslog('m', "Flagfield 0x%04x", flags);
strcpy(Msg.From, f->name);
strcpy(Msg.To, usr.sUserName);
strcpy(Msg.FromAddress, ascfnode(f,0x1f));
strcpy(Msg.ToAddress, ascfnode(t,0x1f));
strcpy(Msg.Subject, Subj);
Msg.Written = mdate;
Msg.Arrived = time(NULL) - (gmt_offset((time_t)0) * 60);
Msg.Netmail = TRUE;
/*
* Set flags for the message base.
*/
if (bad) {
Msg.Private = (((flags & M_PVT) ? TRUE:FALSE) || flag_on((char *)"PVT", flagstr));
} else if ((msgs.MsgKinds == BOTH) || (msgs.MsgKinds == PRIVATE)) {
Msg.Private = (((flags & M_PVT) ? TRUE:FALSE) || flag_on((char *)"PVT", flagstr));
} else {
Msg.Private = TRUE; /* Allways */
}
Msg.Crash = ((flags & M_CRASH) || flag_on((char *)"CRA", flagstr));
Msg.FileAttach = ((flags & M_FILE) || flag_on((char *)"FIL", flagstr));
Msg.Intransit = ((flags & M_TRANSIT));
Msg.FileRequest = ((flags & M_REQ) || flag_on((char *)"FRQ", flagstr));
Msg.ReceiptRequest = ((flags & M_RRQ) || flag_on((char *)"RRQ", flagstr));
Msg.Immediate = flag_on((char *)"IMM", flagstr);
Msg.Direct = flag_on((char *)"DIR", flagstr);
Msg.Gate = flag_on((char *)"ZON", flagstr);
Msg.ConfirmRequest = ((flags & M_AUDIT) || flag_on((char *)"CFM", flagstr));
Msg.Orphan = ((flags & M_ORPHAN));
if (Msg.ReceiptRequest) {
Syslog('+', "Netmail has ReceiptRequest flag, no message created");
}
/*
* Set MSGID and REPLY crc.
*/
if (msgid != NULL) {
crc2 = -1;
Msg.MsgIdCRC = upd_crc32(msgid, crc2, strlen(msgid));
}
if (reply != NULL) {
crc2 = -1;
Msg.ReplyCRC = upd_crc32(reply, crc2, strlen(reply));
}
/*
* Check if this is an empty netmail
*/
rewind(fp);
Buf = calloc(2049, sizeof(char));
while ((fgets(Buf, 2048, fp)) != NULL) {
for (i = 0; i < strlen(Buf); i++) {
if (*(Buf + i) == '\0')
break;
if (*(Buf + i) == '\n')
*(Buf + i) = '\0';
if (*(Buf + i) == '\r')
*(Buf + i) = '\0';
}
if (*(Buf) != '\0') {
if ((*(Buf) != '\001') && (strcmp(Buf, (char *)"--- ")))
empty = FALSE;
}
}
free(Buf);
if (!empty) {
if (bad)
Syslog('+', "Import netmail to %s in badmail board", usr.sUserName);
else
Syslog('+', "Import netmail to %s", usr.sUserName);
rewind(fp);
Msg_Write(fp);
Msg_AddMsg();
if (bad)
net_bad++; net_bad++;
return 2; else
} /* if SearchNetBoard() */ net_imp++;
} else {
Syslog('+', "Empty netmail for %s dropped", usr.sUserName);
}
Msg_UnLock();
Msg_Close();
return 0;
} else {
WriteError("Can't lock msgbase %s, netmail is lost", msgs.Base);
Msg_Close();
return 1;
}
} }