diff --git a/ChangeLog b/ChangeLog index c9e36a16..75202404 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21,6 +21,8 @@ v0.35.03 06-Jul-2002 mbfido: Rollover now only sets IsDoing when it really does a date rollover. + When a new tic area was created the first file received for + that area was refused. newuser: Check for Unix accounts is now case sensitive. @@ -43,6 +45,9 @@ v0.35.03 06-Jul-2002 mbsetup: Enabled setting of nodelist override settings in menu 7.x.3 After nodes setup edit the semafore scanout is set. + When a JAM messagebase path is changed in one of the message + area, filefind and newfiles records are automatic updated if + they were connected to that area. script: The bbsdoor.sh and rundoor.sh scripts are now only installed @@ -55,8 +60,9 @@ v0.35.02 22-Jun-2002 - 06-Jul-2002 upgrade: Delete ~/etc/lastcall.data Delete ~/etc/archiver.data + Delete ~/etc/virscan.data Start mbsetup and enter the Edit Archiver Programs. The new - values should now be set. + values should now be set. Do the same for Virus scanners. general: Added checks for GoldED in external program checks. @@ -96,7 +102,7 @@ v0.35.02 22-Jun-2002 - 06-Jul-2002 tag, mbfido would crash. Filefind netmail replies now set the private flag. Removed debugging messages displaying the incoming tic files. - The mbfid test command now needs a extra parameter, the final + The mbfido test command now needs a extra parameter, the final destination to test. It doesn't use the internal fixed table anymore. diff --git a/TODO b/TODO index 0dab9a02..5197b905 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,6 @@ $Id$ - MBSE BBS V0.35.02 TODO list. + MBSE BBS V0.35.03 TODO list. ---------------------------- These are a list of things that must be implemented one way or @@ -60,13 +60,8 @@ mbfido: N: Process To: and Cc: lines in messages gated from Fido to Internet. - N: Must be able to use more nodelist override's from the setup. - U: Add routing table to override standard routing. - N: The first file received in a not yet created tic area is refused - after the area is created: node xxx not connected to area xxx. - N: Add traffic to html.nodes N: Add stats for posts made by external programs. @@ -117,14 +112,10 @@ mbsetup: main aka with zone's is listed first. Having zone's mixed gives too high outbound stats and the outbound is scanned multiple times. - U: When moving an JAM messagebase, check filefind records. - N: Put ZMH fields in the network setup for each zone. N: Add switch for file area to skip checking and indexing. - N: Add more nodelist override settings for nodes. - L: Generate crossreference document: File Areas <=> BBS groups File Areas <=> Newfiles groups diff --git a/mbfido/ptic.c b/mbfido/ptic.c index c2ae32e7..0f0139fe 100644 --- a/mbfido/ptic.c +++ b/mbfido/ptic.c @@ -169,6 +169,14 @@ int ProcessTic(fa_list *sbl) return 1; } tidy_faddr(p_from); + /* + * Try to load the .TIC area again. + */ + if (!SearchTic(TIC.TicIn.Area)) { + Bad((char *)"Reload of new created file area %s failed", TIC.TicIn.Area); + free(Temp); + return 1; + } } if ((tic.Secure) && (!TIC.TicIn.Hatch)) { diff --git a/mbsetup/m_marea.c b/mbsetup/m_marea.c index c15eb83b..5fcbf1f2 100644 --- a/mbsetup/m_marea.c +++ b/mbsetup/m_marea.c @@ -993,250 +993,295 @@ void MsgGlobal(void) int EditMsgRec(int); int EditMsgRec(int Area) { - unsigned long crc1; - int tmp, i, connections = 0, changed = FALSE, Active, Forced = FALSE; - sysconnect System; - char *temp; + unsigned long crc1; + int tmp, i, connections = 0, changed = FALSE, Active, Forced = FALSE; + sysconnect System; + char *temp, oldpath[81]; + FILE *fil; - clr_index(); - IsDoing("Edit Msg Area"); + clr_index(); + IsDoing("Edit Msg Area"); - if (LoadMsgRec(Area, TRUE) == -1) - return -1; + if (LoadMsgRec(Area, TRUE) == -1) + return -1; - SetScreen(); + SetScreen(); - for (;;) { - set_color(WHITE, BLACK); - show_str( 6,16,40, msgs.Name); - show_str( 7,16,50, msgs.Tag); - show_str( 8,16,12, msgs.Group); - show_str( 9,16,64, msgs.Newsgroup); - show_str(10,16,64, msgs.Base); - show_str(11,16,64, msgs.Origin); - show_aka(12,16, msgs.Aka); - show_str(13,16,13, msgs.QWKname); - show_str(14,16,16, msgs.Distribution); - show_msgtype(15,16, msgs.Type); - show_msgkinds(16,16, msgs.MsgKinds); - show_str(17,16,16, printable(getchrs(msgs.Ftncode), 0)); - show_str(18,16,16, printable(getchrs(msgs.Rfccode), 0)); - show_bool(19,16, msgs.Active); + for (;;) { + set_color(WHITE, BLACK); + show_str( 6,16,40, msgs.Name); + show_str( 7,16,50, msgs.Tag); + show_str( 8,16,12, msgs.Group); + show_str( 9,16,64, msgs.Newsgroup); + show_str(10,16,64, msgs.Base); + show_str(11,16,64, msgs.Origin); + show_aka(12,16, msgs.Aka); + show_str(13,16,13, msgs.QWKname); + show_str(14,16,16, msgs.Distribution); + show_msgtype(15,16, msgs.Type); + show_msgkinds(16,16, msgs.MsgKinds); + show_str(17,16,16, printable(getchrs(msgs.Ftncode), 0)); + show_str(18,16,16, printable(getchrs(msgs.Rfccode), 0)); + show_bool(19,16, msgs.Active); - show_int( 13,52, msgs.DaysOld); - show_int( 14,52, msgs.MaxMsgs); - switch (msgs.Type) { - case ECHOMAIL: show_int( 15,52, msgs.NetReply); - break; - case NEWS: show_int( 15,52, msgs.MaxArticles); - break; - } - show_int( 16,52, msgs.RDSec.level); - show_int( 17,52, msgs.WRSec.level); - show_int( 18,52, msgs.SYSec.level); - show_bool(19,52, msgs.UsrDelete); + show_int( 13,52, msgs.DaysOld); + show_int( 14,52, msgs.MaxMsgs); + switch (msgs.Type) { + case ECHOMAIL: show_int( 15,52, msgs.NetReply); + break; + case NEWS: show_int( 15,52, msgs.MaxArticles); + break; + } + show_int( 16,52, msgs.RDSec.level); + show_int( 17,52, msgs.WRSec.level); + show_int( 18,52, msgs.SYSec.level); + show_bool(19,52, msgs.UsrDelete); - show_bool(13,76, msgs.Aliases); - show_bool(14,76, msgs.Quotes); - show_bool(15,76, msgs.Mandatory); - show_bool(16,76, msgs.UnSecure); - show_bool(17,76, msgs.OLR_Default); - show_bool(18,76, msgs.OLR_Forced); - connections = 0; - switch (msgs.Type) { - case ECHOMAIL: - case NEWS: - case LIST: fseek(tfil, 0, SEEK_SET); - while (fread(&System, sizeof(System), 1, tfil) == 1) - if (System.aka.zone) - connections++; - show_int(19,76, connections); - break; - } - - switch (select_menu(28)) { - case 0: - crc1 = 0xffffffff; - crc1 = upd_crc32((char *)&msgs, crc1, msgshdr.recsize); - fseek(tfil, 0, 0); - for (i = 0; i < (msgshdr.syssize / sizeof(sysconnect)); i++) { - fread(&System, sizeof(sysconnect), 1, tfil); - crc1 = upd_crc32((char *)&System, crc1, sizeof(sysconnect)); - } - if (msgs.Active) - test_jam(msgs.Base); - if ((MsgCrc != crc1) || (changed)) { - if (msgs.Active && !strlen(msgs.Base)) { - errmsg((char *)"JAM message base is not set"); - break; - } else if (msgs.Active && !strlen(msgs.Group) && - (msgs.Type == ECHOMAIL || msgs.Type == NEWS || msgs.Type == LIST)) { - errmsg((char *)"Message area has no group assigned"); - break; - } else if (Forced || yes_no((char *)"Record is changed, save") == 1) { - if (SaveMsgRec(Area, TRUE) == -1) - return -1; - MsgUpdated = 1; - Syslog('+', "Saved message area record %d", Area); - } - } - IsDoing("Browsing Menu"); - return 0; - case 1: E_STR( 6,16,40,msgs.Name, "The ^Name^ of this area") - case 2: strcpy(msgs.Tag, edit_ups(7,16,50, msgs.Tag, (char *)"The ^Area Tag^ for Echomail")); - if (!strlen(msgs.QWKname)) { - memset(&msgs.QWKname, '\0', strlen(msgs.QWKname)); - strncpy(msgs.QWKname, msgs.Tag, 13); - } + show_bool(13,76, msgs.Aliases); + show_bool(14,76, msgs.Quotes); + show_bool(15,76, msgs.Mandatory); + show_bool(16,76, msgs.UnSecure); + show_bool(17,76, msgs.OLR_Default); + show_bool(18,76, msgs.OLR_Forced); + connections = 0; + switch (msgs.Type) { + case ECHOMAIL: + case NEWS: + case LIST: fseek(tfil, 0, SEEK_SET); + while (fread(&System, sizeof(System), 1, tfil) == 1) + if (System.aka.zone) + connections++; + show_int(19,76, connections); break; - case 3: tmp = strlen(msgs.Group); - strcpy(msgs.Group, PickMGroup((char *)"9.2.3")); - if (strlen(msgs.Group) && !tmp) { - /* - * If set for the first time, set some defaults - */ - msgs.Aka = mgroup.UseAka; - msgs.Active = TRUE; - msgs.MsgKinds = PUBLIC; - msgs.Type = ECHOMAIL; - msgs.DaysOld = CFG.defdays; - msgs.MaxMsgs = CFG.defmsgs; - msgs.UsrDelete = mgroup.UsrDelete; - msgs.RDSec = mgroup.RDSec; - msgs.WRSec = mgroup.WRSec; - msgs.SYSec = mgroup.SYSec; - msgs.Aliases = mgroup.Aliases; - msgs.NetReply = mgroup.NetReply; - msgs.Quotes = mgroup.Quotes; - msgs.MaxArticles = CFG.maxarticles; - msgs.Rfccode = CHRS_DEFAULT_RFC; - msgs.Ftncode = CHRS_DEFAULT_FTN; - strncpy(msgs.Origin, CFG.origin, 50); + } + + switch (select_menu(28)) { + case 0: crc1 = 0xffffffff; + crc1 = upd_crc32((char *)&msgs, crc1, msgshdr.recsize); + fseek(tfil, 0, 0); + for (i = 0; i < (msgshdr.syssize / sizeof(sysconnect)); i++) { + fread(&System, sizeof(sysconnect), 1, tfil); + crc1 = upd_crc32((char *)&System, crc1, sizeof(sysconnect)); + } + if (msgs.Active) + test_jam(msgs.Base); + if ((MsgCrc != crc1) || (changed)) { + if (msgs.Active && !strlen(msgs.Base)) { + errmsg((char *)"JAM message base is not set"); + break; + } else if (msgs.Active && !strlen(msgs.Group) && + (msgs.Type == ECHOMAIL || msgs.Type == NEWS || msgs.Type == LIST)) { + errmsg((char *)"Message area has no group assigned"); + break; + } else if (Forced || yes_no((char *)"Record is changed, save") == 1) { + if (SaveMsgRec(Area, TRUE) == -1) + return -1; + MsgUpdated = 1; + Syslog('+', "Saved message area record %d", Area); + } + } + IsDoing("Browsing Menu"); + return 0; + case 1: E_STR( 6,16,40,msgs.Name, "The ^Name^ of this area") + case 2: strcpy(msgs.Tag, edit_ups(7,16,50, msgs.Tag, (char *)"The ^Area Tag^ for Echomail")); + if (!strlen(msgs.QWKname)) { + memset(&msgs.QWKname, '\0', strlen(msgs.QWKname)); + strncpy(msgs.QWKname, msgs.Tag, 13); + } + break; + case 3: tmp = strlen(msgs.Group); + strcpy(msgs.Group, PickMGroup((char *)"9.2.3")); + if (strlen(msgs.Group) && !tmp) { + /* + * If set for the first time, set some defaults + */ + msgs.Aka = mgroup.UseAka; + msgs.Active = TRUE; + msgs.MsgKinds = PUBLIC; + msgs.Type = ECHOMAIL; + msgs.DaysOld = CFG.defdays; + msgs.MaxMsgs = CFG.defmsgs; + msgs.UsrDelete = mgroup.UsrDelete; + msgs.RDSec = mgroup.RDSec; + msgs.WRSec = mgroup.WRSec; + msgs.SYSec = mgroup.SYSec; + msgs.Aliases = mgroup.Aliases; + msgs.NetReply = mgroup.NetReply; + msgs.Quotes = mgroup.Quotes; + msgs.MaxArticles = CFG.maxarticles; + msgs.Rfccode = CHRS_DEFAULT_RFC; + msgs.Ftncode = CHRS_DEFAULT_FTN; + strncpy(msgs.Origin, CFG.origin, 50); - /* - * If there is an uplink defined in the group, - * and the first connected system is empty, - * copy the uplink as default connection. - */ - if (mgroup.UpLink.zone) { + /* + * If there is an uplink defined in the group, + * and the first connected system is empty, + * copy the uplink as default connection. + */ + if (mgroup.UpLink.zone) { + fseek(tfil, 0, SEEK_SET); + fread(&System, sizeof(sysconnect), 1, tfil); + if (!System.aka.zone) { + memset(&System, 0, sizeof(sysconnect)); + System.aka = mgroup.UpLink; + System.sendto = TRUE; + System.receivefrom = TRUE; fseek(tfil, 0, SEEK_SET); - fread(&System, sizeof(sysconnect), 1, tfil); - if (!System.aka.zone) { - memset(&System, 0, sizeof(sysconnect)); - System.aka = mgroup.UpLink; - System.sendto = TRUE; - System.receivefrom = TRUE; - fseek(tfil, 0, SEEK_SET); - fwrite(&System, sizeof(sysconnect), 1, tfil); - } - } - if (!strlen(msgs.Base) && strlen(msgs.Tag)) { - /* - * Invent the place for the JAM message base. - */ - temp = calloc(PATH_MAX, sizeof(char)); - sprintf(temp, "%s/%s", msgs.Group, msgs.Tag); - for (i = 0; i < strlen(temp); i++) { - if (isupper(temp[i])) - temp[i] = tolower(temp[i]); - /* - * If dots in the group or area tag, replace them - * with directory slashes to create a group tree. - */ - if (temp[i] == '.') - temp[i] = '/'; - } - sprintf(msgs.Base, "%s/var/mail/%s", getenv("MBSE_ROOT"), temp); - free(temp); + fwrite(&System, sizeof(sysconnect), 1, tfil); } } - SetScreen(); - break; - case 4: E_STR( 9,16,64,msgs.Newsgroup, "The ^Newsgroup^ name of this area") - case 5: strcpy(msgs.Base, edit_jam(10,16,64,msgs.Base ,(char *)"The path to the ^JAM Message Base^")); + if (!strlen(msgs.Base) && strlen(msgs.Tag)) { + /* + * Invent the place for the JAM message base. + */ + temp = calloc(PATH_MAX, sizeof(char)); + sprintf(temp, "%s/%s", msgs.Group, msgs.Tag); + for (i = 0; i < strlen(temp); i++) { + if (isupper(temp[i])) + temp[i] = tolower(temp[i]); + /* + * If dots in the group or area tag, replace them + * with directory slashes to create a group tree. + */ + if (temp[i] == '.') + temp[i] = '/'; + } + sprintf(msgs.Base, "%s/var/mail/%s", getenv("MBSE_ROOT"), temp); + free(temp); + } + } + SetScreen(); + break; + case 4: E_STR( 9,16,64,msgs.Newsgroup, "The ^Newsgroup^ name of this area") + case 5: sprintf(oldpath, "%s", msgs.Base); + strcpy(msgs.Base, edit_jam(10,16,64,msgs.Base ,(char *)"The path to the ^JAM Message Base^")); + if (strcmp(oldpath, msgs.Base)) { + Syslog('+', "JAM path changed"); + i = 0; + temp = calloc(PATH_MAX, sizeof(char)); + sprintf(temp, "%s/etc/scanmgr.data", getenv("MBSE_ROOT")); + if ((fil = fopen(temp, "r+")) != NULL) { + fread(&scanmgrhdr, sizeof(scanmgrhdr), 1, fil); + while (fread(&scanmgr, scanmgrhdr.recsize, 1, fil) == 1) { + if (strcmp(oldpath, scanmgr.ScanBoard) == 0) { + i++; + sprintf(scanmgr.ScanBoard, "%s", msgs.Base); + fseek(fil, - scanmgrhdr.recsize, SEEK_CUR); + fwrite(&scanmgr, scanmgrhdr.recsize, 1, fil); + } + if (strcmp(oldpath, scanmgr.ReplBoard) == 0) { + i++; + sprintf(scanmgr.ReplBoard, "%s", msgs.Base); + fseek(fil, - scanmgrhdr.recsize, SEEK_CUR); + fwrite(&scanmgr, scanmgrhdr.recsize, 1, fil); + } + } + fclose(fil); + Syslog('+', "Updated %d paths in %s", i, temp); + } + + i = 0; + sprintf(temp, "%s/etc/newfiles.data", getenv("MBSE_ROOT")); + if ((fil = fopen(temp, "r+")) != NULL) { + fread(&newfileshdr, sizeof(newfileshdr), 1, fil); + while (fread(&newfiles, newfileshdr.recsize, 1, fil) == 1) { + if (strcmp(oldpath, newfiles.Area) == 0) { + i++; + sprintf(newfiles.Area, "%s", msgs.Base); + fseek(fil, - newfileshdr.recsize, SEEK_CUR); + fwrite(&newfiles, newfileshdr.recsize, 1, fil); + } + fseek(fil, newfileshdr.grpsize, SEEK_CUR); + } + fclose(fil); + Syslog('+', "Updated %d paths in %s", i, temp); + } + free(temp); Forced = TRUE; MailForced = TRUE; - break; - case 6: E_STR( 11,16,64,msgs.Origin, "The ^Origin line^ to append to Echomail messages") - case 7: tmp = PickAka((char *)"9.2.7", TRUE); - if (tmp != -1) - msgs.Aka = CFG.aka[tmp]; - SetScreen(); break; - case 8: E_UPS( 13,16,13,msgs.QWKname, "The name for ^QWK or Bluewave^ message packets") - case 9: E_STR( 14,16,16,msgs.Distribution, "The ^Distribution^ name if this is a newsgroup") - case 10:msgs.Type = edit_msgtype(15,16, msgs.Type); - SetScreen(); - break; - case 11:msgs.MsgKinds = edit_msgkinds(16,16, msgs.MsgKinds); break; - case 14:Active = edit_bool(19,16, msgs.Active, (char *)"Is this area ^Active^"); - if (msgs.Active && !Active) { - /* - * Attempt to deactivate area, do some checks. - */ - if (connections) { - if (yes_no((char *)"There are nodes connected, disconnect them") == 0) + } + break; + case 6: E_STR( 11,16,64,msgs.Origin, "The ^Origin line^ to append to Echomail messages") + case 7: tmp = PickAka((char *)"9.2.7", TRUE); + if (tmp != -1) + msgs.Aka = CFG.aka[tmp]; + SetScreen(); + break; + case 8: E_UPS( 13,16,13,msgs.QWKname, "The name for ^QWK or Bluewave^ message packets") + case 9: E_STR( 14,16,16,msgs.Distribution, "The ^Distribution^ name if this is a newsgroup") + case 10:msgs.Type = edit_msgtype(15,16, msgs.Type); + SetScreen(); + break; + case 11:msgs.MsgKinds = edit_msgkinds(16,16, msgs.MsgKinds); break; + case 14:Active = edit_bool(19,16, msgs.Active, (char *)"Is this area ^Active^"); + if (msgs.Active && !Active) { + /* + * Attempt to deactivate area, do some checks. + */ + if (connections) { + if (yes_no((char *)"There are nodes connected, disconnect them") == 0) + Active = TRUE; + } + if (!Active) { + temp = calloc(PATH_MAX, sizeof(char)); + sprintf(temp, "%s.jhr", msgs.Base); + if (strlen(msgs.Base) && (file_size(temp) != 1024)) { + if (yes_no((char *)"There are messages in this area, delete them") == 0) Active = TRUE; } - if (!Active) { - temp = calloc(PATH_MAX, sizeof(char)); - sprintf(temp, "%s.jhr", msgs.Base); - if (strlen(msgs.Base) && (file_size(temp) != 1024)) { - if (yes_no((char *)"There are messages in this area, delete them") == 0) - Active = TRUE; - } - free(temp); - } - if (!Active) { - /* - * Make it so - */ - Msg_DeleteMsgBase(msgs.Base); - memset(&System, 0, sizeof(System)); - fseek(tfil, 0, SEEK_SET); - for (i = 0; i < (msgshdr.syssize / sizeof(sysconnect)); i++) - fwrite(&System, sizeof(System), 1, tfil); - InitMsgRec(); - Syslog('+', "Deleted message area %d", Area); - changed = TRUE; - } + free(temp); } - if (!msgs.Active && Active) - msgs.Active = TRUE; - SetScreen(); - break; - case 15:E_INT( 13,52, msgs.DaysOld, "Maximum ^days^ to keep mail in this area") - case 16:E_INT( 14,52, msgs.MaxMsgs, "The ^maximum^ amount of messages in this area") - case 17:switch (msgs.Type) { - case ECHOMAIL: msgs.NetReply = edit_int(15,52,msgs.NetReply, + if (!Active) { + /* + * Make it so + */ + Msg_DeleteMsgBase(msgs.Base); + memset(&System, 0, sizeof(System)); + fseek(tfil, 0, SEEK_SET); + for (i = 0; i < (msgshdr.syssize / sizeof(sysconnect)); i++) + fwrite(&System, sizeof(System), 1, tfil); + InitMsgRec(); + Syslog('+', "Deleted message area %d", Area); + changed = TRUE; + } + } + if (!msgs.Active && Active) + msgs.Active = TRUE; + SetScreen(); + break; + case 15:E_INT( 13,52, msgs.DaysOld, "Maximum ^days^ to keep mail in this area") + case 16:E_INT( 14,52, msgs.MaxMsgs, "The ^maximum^ amount of messages in this area") + case 17:switch (msgs.Type) { + case ECHOMAIL: msgs.NetReply = edit_int(15,52,msgs.NetReply, (char *)"The ^Area Number^ for netmail replies"); - break; - case NEWS: msgs.MaxArticles = edit_int(15,52,msgs.MaxArticles, - (char *)"The ^maximum news articles^ to fetch"); - break; - } - break; - case 18:E_SEC( 16,52, msgs.RDSec, "9.2 EDIT READ SECURITY", SetScreen) - case 19:E_SEC( 17,52, msgs.WRSec, "9.2 EDIT WRITE SECURITY", SetScreen) - case 20:E_SEC( 18,52, msgs.SYSec, "9.2 EDIT SYSOP SECURITY", SetScreen) - case 21:E_BOOL(19,52, msgs.UsrDelete, "Allow users to ^Delete^ their messages") - - case 22:E_BOOL(13,76, msgs.Aliases, "Allow ^aliases^ or real names only") - case 23:E_BOOL(14,76, msgs.Quotes, "Add random ^quotes^ to new messages") - case 24:E_BOOL(15,76, msgs.Mandatory, "Is this area ^mandatory^ for nodes") - case 25:E_BOOL(16,76, msgs.UnSecure, "Toss messages ^UnSecure^, ie: no originating check") - case 26:E_BOOL(17,76, msgs.OLR_Default, "Area is ^default^ for ^offline^ users.") - case 27:E_BOOL(18,76, msgs.OLR_Forced, "Area is ^always on^ for ^offline^ users.") - case 28:switch (msgs.Type) { - case ECHOMAIL: - case NEWS: - case LIST: if (EditConnections(tfil)) - changed = TRUE; - SetScreen(); break; - } - break; - } + case NEWS: msgs.MaxArticles = edit_int(15,52,msgs.MaxArticles, + (char *)"The ^maximum news articles^ to fetch"); + break; + } + break; + case 18:E_SEC( 16,52, msgs.RDSec, "9.2 EDIT READ SECURITY", SetScreen) + case 19:E_SEC( 17,52, msgs.WRSec, "9.2 EDIT WRITE SECURITY", SetScreen) + case 20:E_SEC( 18,52, msgs.SYSec, "9.2 EDIT SYSOP SECURITY", SetScreen) + case 21:E_BOOL(19,52, msgs.UsrDelete, "Allow users to ^Delete^ their messages") + + case 22:E_BOOL(13,76, msgs.Aliases, "Allow ^aliases^ or real names only") + case 23:E_BOOL(14,76, msgs.Quotes, "Add random ^quotes^ to new messages") + case 24:E_BOOL(15,76, msgs.Mandatory, "Is this area ^mandatory^ for nodes") + case 25:E_BOOL(16,76, msgs.UnSecure, "Toss messages ^UnSecure^, ie: no originating check") + case 26:E_BOOL(17,76, msgs.OLR_Default, "Area is ^default^ for ^offline^ users.") + case 27:E_BOOL(18,76, msgs.OLR_Forced, "Area is ^always on^ for ^offline^ users.") + case 28:switch (msgs.Type) { + case ECHOMAIL: + case NEWS: + case LIST: if (EditConnections(tfil)) + changed = TRUE; + SetScreen(); + break; + } + break; } + } }