Updates for new structures
This commit is contained in:
parent
44494e6e17
commit
8593ada2f0
5
Makefile
5
Makefile
@ -162,6 +162,11 @@ install:
|
|||||||
fi
|
fi
|
||||||
@chmod 0770 ${PREFIX}/var
|
@chmod 0770 ${PREFIX}/var
|
||||||
@chmod 0770 ${PREFIX}/var/mail
|
@chmod 0770 ${PREFIX}/var/mail
|
||||||
|
@if [ ! -d ${PREFIX}/var/arealists ] ; then \
|
||||||
|
mkdir ${PREFIX}/var/arealists ; \
|
||||||
|
${CHOWN} ${OWNER}.${GROUP} ${PREFIX}/var/arealists ; \
|
||||||
|
chmod 0750 ${PREFIX}/var/arealists ; \
|
||||||
|
fi
|
||||||
@if [ -x ${BINDIR}/mbfbgen ]; then \
|
@if [ -x ${BINDIR}/mbfbgen ]; then \
|
||||||
rm ${BINDIR}/mbfbgen; \
|
rm ${BINDIR}/mbfbgen; \
|
||||||
echo "removed ${BINDIR}/mbfbgen"; \
|
echo "removed ${BINDIR}/mbfbgen"; \
|
||||||
|
@ -13,10 +13,10 @@
|
|||||||
<BODY>
|
<BODY>
|
||||||
<BLOCKQUOTE>
|
<BLOCKQUOTE>
|
||||||
<center><img SRC="images/mbse.jpg" BORDER=0></center>
|
<center><img SRC="images/mbse.jpg" BORDER=0></center>
|
||||||
<h1>MBSE BBS System Guide v0.33.19</h1>
|
<h1>MBSE BBS System Guide v0.33.20</h1>
|
||||||
<HR>
|
<HR>
|
||||||
|
|
||||||
<h5>Last update 21-Jan-2002</h5><BR><P>
|
<h5>Last update 10-Feb-2002</h5><BR><P>
|
||||||
|
|
||||||
|
|
||||||
<h3><a NAME="top"></a>Introduction</h3>
|
<h3><a NAME="top"></a>Introduction</h3>
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
</HEAD>
|
</HEAD>
|
||||||
<BODY>
|
<BODY>
|
||||||
<BLOCKQUOTE>
|
<BLOCKQUOTE>
|
||||||
<h5>Last update 21-Jan-2002</h5>
|
<h5>Last update 10-Feb-2002</h5>
|
||||||
<P> <P>
|
<P> <P>
|
||||||
|
|
||||||
<H1>MBSE BBS Setup - Global Setup</H1>
|
<H1>MBSE BBS Setup - Global Setup</H1>
|
||||||
@ -74,6 +74,8 @@ Here you can enter 40 fidonet addresses. These are 5d addresses.
|
|||||||
<strong>DOS path </strong>The DOS drive and path
|
<strong>DOS path </strong>The DOS drive and path
|
||||||
<strong>Unix path </strong>The Translated DOS path in real
|
<strong>Unix path </strong>The Translated DOS path in real
|
||||||
<strong>LeaveCase </strong>Leave outbound .flo filenames as is, No forces to uppercase
|
<strong>LeaveCase </strong>Leave outbound .flo filenames as is, No forces to uppercase
|
||||||
|
<strong>FTP base </strong>The FTP base path, ie. /opt/mbse/ftp/pub
|
||||||
|
<strong>Arealists </strong>The path where area lists and filebone lists are stored
|
||||||
</pre>
|
</pre>
|
||||||
If you fill in the DOS path then the DOS path and Unix path are translated
|
If you fill in the DOS path then the DOS path and Unix path are translated
|
||||||
to DOS paths in the flo files for outbound mail sessions. You only need this if
|
to DOS paths in the flo files for outbound mail sessions. You only need this if
|
||||||
@ -365,7 +367,6 @@ In UUCP mode the NNTP entries are replaced by:
|
|||||||
<p>
|
<p>
|
||||||
These are the settings that affect the generation of newfiles and allfiles reports.
|
These are the settings that affect the generation of newfiles and allfiles reports.
|
||||||
<pre>
|
<pre>
|
||||||
<strong>Ftp base </strong>The root of the public download area (.../ftp)
|
|
||||||
<strong>New days </strong>The number of days old files are "newfiles"
|
<strong>New days </strong>The number of days old files are "newfiles"
|
||||||
<strong>Security </strong>The highest security level to include files in the reports
|
<strong>Security </strong>The highest security level to include files in the reports
|
||||||
<strong>Groups </strong>The number of newfile groups the newfiles database can hold
|
<strong>Groups </strong>The number of newfile groups the newfiles database can hold
|
||||||
@ -406,8 +407,7 @@ A new program is <strong>mbftpd</strong>. This is a replacement for the normal
|
|||||||
ftp server for Linux with special futures for MBSE BBS. This is not working
|
ftp server for Linux with special futures for MBSE BBS. This is not working
|
||||||
yet and is not included in the distribution. Setting it up is adviced.
|
yet and is not included in the distribution. Setting it up is adviced.
|
||||||
<pre>
|
<pre>
|
||||||
<strong>Base path </strong>The ftp base directory (ie. /SYS/usr/ftp).
|
<strong>Upload pth </strong>Incoming files (ie. /opt/mbse/ftp/incoming).
|
||||||
<strong>Upload pth </strong>Incoming files (ie. /SYS/usr/ftp/incoming).
|
|
||||||
<strong>Banner msg </strong>The banner file to display before login.
|
<strong>Banner msg </strong>The banner file to display before login.
|
||||||
<strong>Path filter </strong>The legal character in upload filenames.
|
<strong>Path filter </strong>The legal character in upload filenames.
|
||||||
<strong>Path msg </strong>Message to display if illegal characters in upload.
|
<strong>Path msg </strong>Message to display if illegal characters in upload.
|
||||||
|
@ -1308,6 +1308,7 @@ struct _mgroup {
|
|||||||
unsigned xRes6 : 1;
|
unsigned xRes6 : 1;
|
||||||
unsigned xRes7 : 1;
|
unsigned xRes7 : 1;
|
||||||
unsigned xRes8 : 1;
|
unsigned xRes8 : 1;
|
||||||
|
unsigned StartArea : 1; /* Start at area number */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ int OpenFGroup(void);
|
|||||||
int OpenFGroup(void)
|
int OpenFGroup(void)
|
||||||
{
|
{
|
||||||
FILE *fin, *fout;
|
FILE *fin, *fout;
|
||||||
char fnin[PATH_MAX], fnout[PATH_MAX];
|
char fnin[PATH_MAX], fnout[PATH_MAX], temp[13];
|
||||||
long oldsize;
|
long oldsize;
|
||||||
|
|
||||||
sprintf(fnin, "%s/etc/fgroups.data", getenv("MBSE_ROOT"));
|
sprintf(fnin, "%s/etc/fgroups.data", getenv("MBSE_ROOT"));
|
||||||
@ -142,7 +142,9 @@ int OpenFGroup(void)
|
|||||||
fgroup.Announce = TRUE;
|
fgroup.Announce = TRUE;
|
||||||
fgroup.UpdMagic = TRUE;
|
fgroup.UpdMagic = TRUE;
|
||||||
fgroup.FileId = TRUE;
|
fgroup.FileId = TRUE;
|
||||||
sprintf(fgroup.BasePath, "%s/ftp/pub/%s", getenv("MBSE_ROOT"), tl(fgroup.Name));
|
memset(&temp, 0, sizeof(temp));
|
||||||
|
strcpy(temp, fgroup.Name);
|
||||||
|
sprintf(fgroup.BasePath, "%s/ftp/pub/%s", getenv("MBSE_ROOT"), tl(temp));
|
||||||
}
|
}
|
||||||
|
|
||||||
fwrite(&fgroup, sizeof(fgroup), 1, fout);
|
fwrite(&fgroup, sizeof(fgroup), 1, fout);
|
||||||
|
@ -214,7 +214,43 @@ void e_filenames(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void e_global(void)
|
void e_global2(void)
|
||||||
|
{
|
||||||
|
clr_index();
|
||||||
|
set_color(WHITE, BLACK);
|
||||||
|
mvprintw( 4, 6, "1.4 EDIT GLOBAL PATHS - 2");
|
||||||
|
set_color(CYAN, BLACK);
|
||||||
|
mvprintw( 6, 2, "1. Magic's");
|
||||||
|
mvprintw( 7, 2, "2. DOS path");
|
||||||
|
mvprintw( 8, 2, "3. Unix path");
|
||||||
|
mvprintw( 9, 2, "4. LeaveCase");
|
||||||
|
mvprintw(10, 2, "5. Ftp base");
|
||||||
|
mvprintw(11, 2, "6. Arealists");
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
set_color(WHITE, BLACK);
|
||||||
|
show_str( 6,16,64, CFG.req_magic);
|
||||||
|
show_str( 7,16,64, CFG.dospath);
|
||||||
|
show_str( 8,16,64, CFG.uxpath);
|
||||||
|
show_bool(9,16, CFG.leavecase);
|
||||||
|
show_str(10,16,64, CFG.ftp_base);
|
||||||
|
show_str(11,16,64, CFG.alists_path);
|
||||||
|
|
||||||
|
switch(select_menu(6)) {
|
||||||
|
case 0: return;
|
||||||
|
case 1: E_PTH(16,16,64, CFG.req_magic, "The path to the ^magic filerequest^ files.")
|
||||||
|
case 2: E_STR(17,16,64, CFG.dospath, "The translated ^DOS^ drive and path, empty disables translation")
|
||||||
|
case 3: E_PTH(18,16,64, CFG.uxpath, "The translated ^Unix^ path.")
|
||||||
|
case 4: E_BOOL(19,16, CFG.leavecase, "^Leave^ outbound flo filenames as is, ^No^ forces uppercase.")
|
||||||
|
case 5: E_PTH(10,16,64, CFG.ftp_base, "The ^FTP home^ directory to strip of the real directory")
|
||||||
|
case 6: E_PTH(11,16,64, CFG.alists_path, "The path where ^area lists^ and ^filebone lists^ are stored.")
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void s_global(void)
|
||||||
{
|
{
|
||||||
clr_index();
|
clr_index();
|
||||||
set_color(WHITE, BLACK);
|
set_color(WHITE, BLACK);
|
||||||
@ -230,10 +266,14 @@ void e_global(void)
|
|||||||
mvprintw(13, 2, "8. *.msgs");
|
mvprintw(13, 2, "8. *.msgs");
|
||||||
mvprintw(14, 2, "9. Bad TIC's");
|
mvprintw(14, 2, "9. Bad TIC's");
|
||||||
mvprintw(15, 2, "10. TIC queue");
|
mvprintw(15, 2, "10. TIC queue");
|
||||||
mvprintw(16, 2, "11. Magic's");
|
mvprintw(16, 2, "11. Next Screen");
|
||||||
mvprintw(17, 2, "12. DOS path");
|
}
|
||||||
mvprintw(18, 2, "13. Unix path");
|
|
||||||
mvprintw(19, 2, "14. LeaveCase");
|
|
||||||
|
|
||||||
|
void e_global(void)
|
||||||
|
{
|
||||||
|
s_global();
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
set_color(WHITE, BLACK);
|
set_color(WHITE, BLACK);
|
||||||
@ -247,12 +287,8 @@ void e_global(void)
|
|||||||
show_str(13,16,64, CFG.msgs_path);
|
show_str(13,16,64, CFG.msgs_path);
|
||||||
show_str(14,16,64, CFG.badtic);
|
show_str(14,16,64, CFG.badtic);
|
||||||
show_str(15,16,64, CFG.ticout);
|
show_str(15,16,64, CFG.ticout);
|
||||||
show_str(16,16,64, CFG.req_magic);
|
|
||||||
show_str(17,16,64, CFG.dospath);
|
|
||||||
show_str(18,16,64, CFG.uxpath);
|
|
||||||
show_bool(19,16, CFG.leavecase);
|
|
||||||
|
|
||||||
switch(select_menu(14)) {
|
switch(select_menu(11)) {
|
||||||
case 0: return;
|
case 0: return;
|
||||||
case 1: E_PTH( 6,16,64, CFG.bbs_menus, "The path to the ^default menus^.")
|
case 1: E_PTH( 6,16,64, CFG.bbs_menus, "The path to the ^default menus^.")
|
||||||
case 2: E_PTH( 7,16,64, CFG.bbs_txtfiles, "The path to the ^default textfiles^.")
|
case 2: E_PTH( 7,16,64, CFG.bbs_txtfiles, "The path to the ^default textfiles^.")
|
||||||
@ -264,10 +300,9 @@ void e_global(void)
|
|||||||
case 8: E_PTH(13,16,64, CFG.msgs_path, "The path to the ^*.msgs^ directory.")
|
case 8: E_PTH(13,16,64, CFG.msgs_path, "The path to the ^*.msgs^ directory.")
|
||||||
case 9: E_PTH(14,16,64, CFG.badtic, "The path to the ^bad tic files^.")
|
case 9: E_PTH(14,16,64, CFG.badtic, "The path to the ^bad tic files^.")
|
||||||
case 10:E_PTH(15,16,64, CFG.ticout, "The path to the ^outgoing TIC^ files.")
|
case 10:E_PTH(15,16,64, CFG.ticout, "The path to the ^outgoing TIC^ files.")
|
||||||
case 11:E_PTH(16,16,64, CFG.req_magic, "The path to the ^magic filerequest^ files.")
|
case 11:e_global2();
|
||||||
case 12:E_STR(17,16,64, CFG.dospath, "The translated ^DOS^ drive and path, empty disables translation")
|
s_global();
|
||||||
case 13:E_PTH(18,16,64, CFG.uxpath, "The translated ^Unix^ path.")
|
break;
|
||||||
case 14:E_BOOL(19,16, CFG.leavecase, "^Leave^ outbound flo filenames as is, ^No^ forces uppercase.")
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -288,20 +323,19 @@ void b_screen(void)
|
|||||||
mvprintw(12, 2, "6. Passwd Character");
|
mvprintw(12, 2, "6. Passwd Character");
|
||||||
mvprintw(13, 2, "7. Idle timeout");
|
mvprintw(13, 2, "7. Idle timeout");
|
||||||
mvprintw(14, 2, "8. Login Enters");
|
mvprintw(14, 2, "8. Login Enters");
|
||||||
mvprintw(15, 2, "9. Login Attempts");
|
mvprintw(15, 2, "9. Homedir Quota");
|
||||||
mvprintw(16, 2, "10. Homedir Quota");
|
mvprintw(16, 2, "10. Location length");
|
||||||
mvprintw(17, 2, "11. Location length");
|
|
||||||
|
|
||||||
mvprintw( 7,37, "12. Show new msgarea");
|
mvprintw( 7,37, "11. Show new msgarea");
|
||||||
mvprintw( 8,37, "13. OLR Max. msgs.");
|
mvprintw( 8,37, "12. OLR Max. msgs.");
|
||||||
mvprintw( 9,37, "14. OLR Newfile days");
|
mvprintw( 9,37, "13. OLR Newfile days");
|
||||||
mvprintw(10,37, "15. OLR Max Filereq");
|
mvprintw(10,37, "14. OLR Max Filereq");
|
||||||
mvprintw(11,37, "16. BBS Log Level");
|
mvprintw(11,37, "15. BBS Log Level");
|
||||||
mvprintw(12,37, "17. Utils loglevel");
|
mvprintw(12,37, "16. Utils loglevel");
|
||||||
mvprintw(13,37, "18. Utils slowly");
|
mvprintw(13,37, "17. Utils slowly");
|
||||||
mvprintw(14,37, "19. CrashMail level");
|
mvprintw(14,37, "18. CrashMail level");
|
||||||
mvprintw(15,37, "20. FileAttach level");
|
mvprintw(15,37, "19. FileAttach level");
|
||||||
mvprintw(16,37, "21. Min diskspace MB");
|
mvprintw(16,37, "20. Min diskspace MB");
|
||||||
|
|
||||||
set_color(WHITE, BLACK);
|
set_color(WHITE, BLACK);
|
||||||
show_bool( 7,24, CFG.exclude_sysop);
|
show_bool( 7,24, CFG.exclude_sysop);
|
||||||
@ -334,7 +368,7 @@ void e_bbsglob(void)
|
|||||||
b_screen();
|
b_screen();
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
switch(select_menu(21)) {
|
switch(select_menu(20)) {
|
||||||
case 0: return;
|
case 0: return;
|
||||||
case 1: E_BOOL( 7,24, CFG.exclude_sysop, "^Exclude^ sysop from lists.")
|
case 1: E_BOOL( 7,24, CFG.exclude_sysop, "^Exclude^ sysop from lists.")
|
||||||
case 2: E_BOOL( 8,24, CFG.iConnectString, "Show ^connect string^ at logon")
|
case 2: E_BOOL( 8,24, CFG.iConnectString, "Show ^connect string^ at logon")
|
||||||
@ -347,16 +381,16 @@ void e_bbsglob(void)
|
|||||||
case 9: E_INT( 15,24, CFG.iQuota, "Maximum ^Quota^ in MBytes in users homedirectory");
|
case 9: E_INT( 15,24, CFG.iQuota, "Maximum ^Quota^ in MBytes in users homedirectory");
|
||||||
case 10:E_INT( 16,24, CFG.CityLen, "Minimum ^Location name^ length (3..6)")
|
case 10:E_INT( 16,24, CFG.CityLen, "Minimum ^Location name^ length (3..6)")
|
||||||
|
|
||||||
case 12:E_BOOL( 7,59, CFG.NewAreas, "Show ^new^ or ^deleted^ message areas to the user at login.")
|
case 11:E_BOOL( 7,59, CFG.NewAreas, "Show ^new^ or ^deleted^ message areas to the user at login.")
|
||||||
case 13:E_INT( 8,59, CFG.OLR_MaxMsgs, "^Maximum messages^ to pack for download (0=unlimited)")
|
case 12:E_INT( 8,59, CFG.OLR_MaxMsgs, "^Maximum messages^ to pack for download (0=unlimited)")
|
||||||
case 14:E_INT( 9,59, CFG.OLR_NewFileLimit, "^Limit Newfiles^ listing for maximum days")
|
case 13:E_INT( 9,59, CFG.OLR_NewFileLimit, "^Limit Newfiles^ listing for maximum days")
|
||||||
case 15:E_INT( 10,59, CFG.OLR_MaxReq, "Maximum ^Filerequests^ to honor")
|
case 14:E_INT( 10,59, CFG.OLR_MaxReq, "Maximum ^Filerequests^ to honor")
|
||||||
case 16:E_LOGL(CFG.bbs_loglevel, "1.5.16", b_screen)
|
case 15:E_LOGL(CFG.bbs_loglevel, "1.5.15", b_screen)
|
||||||
case 17:E_LOGL(CFG.util_loglevel, "1.5.17", b_screen)
|
case 16:E_LOGL(CFG.util_loglevel, "1.5.16", b_screen)
|
||||||
case 18:E_BOOL(13,59, CFG.slow_util, "Let background utilities run ^slowly^")
|
case 17:E_BOOL(13,59, CFG.slow_util, "Let background utilities run ^slowly^")
|
||||||
case 19:E_INT( 14,59, CFG.iCrashLevel, "The user level to allow sending ^CrashMail^")
|
case 18:E_INT( 14,59, CFG.iCrashLevel, "The user level to allow sending ^CrashMail^")
|
||||||
case 20:E_INT( 15,59, CFG.iAttachLevel, "The user level to allow sending ^File Attaches^")
|
case 19:E_INT( 15,59, CFG.iAttachLevel, "The user level to allow sending ^File Attaches^")
|
||||||
case 21:E_INT( 16,59, CFG.freespace, "Minimum ^free diskspace^ in MBytes on filesystems")
|
case 20:E_INT( 16,59, CFG.freespace, "Minimum ^free diskspace^ in MBytes on filesystems")
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -1070,10 +1104,9 @@ void s_newfiles(void)
|
|||||||
set_color(WHITE, BLACK);
|
set_color(WHITE, BLACK);
|
||||||
mvprintw( 5, 2, "1.16 ALLFILES & NEWFILES LISTINGS");
|
mvprintw( 5, 2, "1.16 ALLFILES & NEWFILES LISTINGS");
|
||||||
set_color(CYAN, BLACK);
|
set_color(CYAN, BLACK);
|
||||||
mvprintw( 7, 2, "1. Ftp base");
|
mvprintw( 7, 2, "1. New days");
|
||||||
mvprintw( 8, 2, "2. New days");
|
mvprintw( 8, 2, "2. Security");
|
||||||
mvprintw( 9, 2, "3. Security");
|
mvprintw( 9, 2, "3. Groups");
|
||||||
mvprintw(10, 2, "4. Groups");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1083,17 +1116,15 @@ void e_newfiles(void)
|
|||||||
s_newfiles();
|
s_newfiles();
|
||||||
for (;;) {
|
for (;;) {
|
||||||
set_color(WHITE, BLACK);
|
set_color(WHITE, BLACK);
|
||||||
show_str( 7,16,64, CFG.ftp_base);
|
show_int( 7,16, CFG.newdays);
|
||||||
show_int( 8,16, CFG.newdays);
|
show_sec( 8,16, CFG.security);
|
||||||
show_sec( 9,16, CFG.security);
|
show_int( 9,16, CFG.new_groups);
|
||||||
show_int(10,16, CFG.new_groups);
|
|
||||||
|
|
||||||
switch(select_menu(4)) {
|
switch(select_menu(3)) {
|
||||||
case 0: return;
|
case 0: return;
|
||||||
case 1: E_PTH(7,16,64, CFG.ftp_base, "The ^FTP home^ directory to strip of the real directory")
|
case 1: E_INT(7,16, CFG.newdays, "Add files younger than this in newfiles report.")
|
||||||
case 2: E_INT(8,16, CFG.newdays, "Add files younger than this in newfiles report.")
|
case 2: E_SEC(8,16, CFG.security, "1.14 NEWFILES REPORTS SECURITY", s_newfiles)
|
||||||
case 3: E_SEC(9,16, CFG.security, "1.14 NEWFILES REPORTS SECURITY", s_newfiles)
|
case 3: CFG.new_groups = edit_int( 9, 16, CFG.new_groups,
|
||||||
case 4: CFG.new_groups = edit_int(10, 16, CFG.new_groups,
|
|
||||||
(char *)"The maximum of ^newfiles^ groups in the newfiles database");
|
(char *)"The maximum of ^newfiles^ groups in the newfiles database");
|
||||||
if (OpenNewfiles() == 0)
|
if (OpenNewfiles() == 0)
|
||||||
CloseNewfiles(TRUE);
|
CloseNewfiles(TRUE);
|
||||||
@ -1339,73 +1370,70 @@ void e_ftpd(void)
|
|||||||
set_color(WHITE, BLACK);
|
set_color(WHITE, BLACK);
|
||||||
mvprintw( 5, 2, "1.18 EDIT FTPD SETTINGS");
|
mvprintw( 5, 2, "1.18 EDIT FTPD SETTINGS");
|
||||||
set_color(CYAN, BLACK);
|
set_color(CYAN, BLACK);
|
||||||
mvprintw( 7, 2, "1. Base path");
|
mvprintw( 7, 2, "1. Upload pth");
|
||||||
mvprintw( 8, 2, "2. Upload pth");
|
mvprintw( 8, 2, "2. Banner msg");
|
||||||
mvprintw( 9, 2, "3. Banner msg");
|
mvprintw( 9, 2, "3. Pth filter");
|
||||||
mvprintw(10, 2, "4. Pth filter");
|
mvprintw(10, 2, "4. Pth msg");
|
||||||
mvprintw(11, 2, "5. Pth msg");
|
mvprintw(11, 2, "5. Email addr");
|
||||||
mvprintw(12, 2, "6. Email addr");
|
mvprintw(12, 2, "6. Shutdown");
|
||||||
mvprintw(13, 2, "7. Shutdown");
|
mvprintw(13, 2, "7. Rdm login");
|
||||||
mvprintw(14, 2, "8. Rdm login");
|
mvprintw(14, 2, "8. Rdm cwd*");
|
||||||
mvprintw(15, 2, "9. Rdm cwd*");
|
mvprintw(15, 2, "9. Msg login");
|
||||||
mvprintw(16, 1,"10. Msg login");
|
mvprintw(16, 1,"10. Msg cwd*");
|
||||||
mvprintw(17, 1,"11. Msg cwd*");
|
mvprintw(17, 1,"11. Userslimit");
|
||||||
mvprintw(18, 1,"12. Userslimit");
|
mvprintw(18, 1,"12. Loginfails");
|
||||||
mvprintw(19, 1,"13. Loginfails");
|
|
||||||
|
|
||||||
mvprintw(14,60,"14. Compress");
|
mvprintw(13,60,"13. Compress");
|
||||||
mvprintw(15,60,"15. Tar");
|
mvprintw(14,60,"14. Tar");
|
||||||
mvprintw(16,60,"16. Mkdir ok");
|
mvprintw(15,60,"15. Mkdir ok");
|
||||||
mvprintw(17,60,"17. Log cmds");
|
mvprintw(16,60,"16. Log cmds");
|
||||||
mvprintw(18,60,"18. Anonymous");
|
mvprintw(17,60,"17. Anonymous");
|
||||||
mvprintw(19,60,"19. User mbse");
|
mvprintw(18,60,"18. User mbse");
|
||||||
|
|
||||||
set_color(WHITE, BLACK);
|
set_color(WHITE, BLACK);
|
||||||
show_str( 7,18,59, CFG.ftp_base);
|
show_str( 7,18,59, CFG.ftp_upl_path);
|
||||||
show_str( 8,18,59, CFG.ftp_upl_path);
|
show_str( 8,18,59, CFG.ftp_banner);
|
||||||
show_str( 9,18,59, CFG.ftp_banner);
|
show_str( 9,18,40, CFG.ftp_pth_filter);
|
||||||
show_str(10,18,40, CFG.ftp_pth_filter);
|
show_str(10,18,59, CFG.ftp_pth_message);
|
||||||
show_str(11,18,59, CFG.ftp_pth_message);
|
show_str(11,18,40, CFG.ftp_email);
|
||||||
show_str(12,18,40, CFG.ftp_email);
|
show_str(12,18,40, CFG.ftp_msg_shutmsg);
|
||||||
show_str(13,18,40, CFG.ftp_msg_shutmsg);
|
show_str(13,18,20, CFG.ftp_readme_login);
|
||||||
show_str(14,18,20, CFG.ftp_readme_login);
|
show_str(14,18,20, CFG.ftp_readme_cwd);
|
||||||
show_str(15,18,20, CFG.ftp_readme_cwd);
|
show_str(15,18,20, CFG.ftp_msg_login);
|
||||||
show_str(16,18,20, CFG.ftp_msg_login);
|
show_str(16,18,20, CFG.ftp_msg_cwd);
|
||||||
show_str(17,18,20, CFG.ftp_msg_cwd);
|
show_int(17,18, CFG.ftp_limit);
|
||||||
show_int(18,18, CFG.ftp_limit);
|
show_int(18,18, CFG.ftp_loginfails);
|
||||||
show_int(19,18, CFG.ftp_loginfails);
|
|
||||||
|
|
||||||
show_bool(14,75, CFG.ftp_compress);
|
show_bool(13,75, CFG.ftp_compress);
|
||||||
show_bool(15,75, CFG.ftp_tar);
|
show_bool(14,75, CFG.ftp_tar);
|
||||||
show_bool(16,75, CFG.ftp_upl_mkdir);
|
show_bool(15,75, CFG.ftp_upl_mkdir);
|
||||||
show_bool(17,75, CFG.ftp_log_cmds);
|
show_bool(16,75, CFG.ftp_log_cmds);
|
||||||
show_bool(18,75, CFG.ftp_anonymousok);
|
show_bool(17,75, CFG.ftp_anonymousok);
|
||||||
show_bool(19,75, CFG.ftp_mbseok);
|
show_bool(18,75, CFG.ftp_mbseok);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
set_color(WHITE, BLACK);
|
set_color(WHITE, BLACK);
|
||||||
|
|
||||||
switch(select_menu(19)) {
|
switch(select_menu(18)) {
|
||||||
case 0: return;
|
case 0: return;
|
||||||
case 1: E_STR( 7,18,59, CFG.ftp_base, "Public ^base path^ to the files")
|
case 1: E_STR( 7,18,59, CFG.ftp_upl_path, "Public ^upload^ path, must be in the base path")
|
||||||
case 2: E_STR( 8,18,59, CFG.ftp_upl_path, "Public ^upload^ path, must be in the base path")
|
case 2: E_STR( 8,18,59, CFG.ftp_banner, "^Banner^ file to show before login")
|
||||||
case 3: E_STR( 9,18,59, CFG.ftp_banner, "^Banner^ file to show before login")
|
case 3: E_STR( 9,18,40, CFG.ftp_pth_filter, "^Filter^ with allowed characters in upload filename")
|
||||||
case 4: E_STR(10,18,40, CFG.ftp_pth_filter, "^Filter^ with allowed characters in upload filename")
|
case 4: E_STR(10,18,59, CFG.ftp_pth_message, "^Message^ to display if illegal characters in filename")
|
||||||
case 5: E_STR(11,18,59, CFG.ftp_pth_message, "^Message^ to display if illegal characters in filename")
|
case 5: E_STR(11,18,40, CFG.ftp_email, "^Email^ address of the ftp server administrator")
|
||||||
case 6: E_STR(12,18,40, CFG.ftp_email, "^Email^ address of the ftp server administrator")
|
case 6: E_STR(12,18,40, CFG.ftp_msg_shutmsg, "^Shutdown message^, if this file is present, login if forbidden")
|
||||||
case 7: E_STR(13,18,40, CFG.ftp_msg_shutmsg, "^Shutdown message^, if this file is present, login if forbidden")
|
case 7: E_STR(13,18,20, CFG.ftp_readme_login,"^README^ file to display at login")
|
||||||
case 8: E_STR(14,18,20, CFG.ftp_readme_login,"^README^ file to display at login")
|
case 8: E_STR(14,18,20, CFG.ftp_readme_cwd, "^README^ file to display when entering a new directory")
|
||||||
case 9: E_STR(15,18,20, CFG.ftp_readme_cwd, "^README^ file to display when entering a new directory")
|
case 9: E_STR(15,18,20, CFG.ftp_msg_login, "^Message^ file to display at login")
|
||||||
case 10:E_STR(16,18,20, CFG.ftp_msg_login, "^Message^ file to display at login")
|
case 10:E_STR(16,18,20, CFG.ftp_msg_cwd, "^Message^ file to display when entering a new directory")
|
||||||
case 11:E_STR(17,18,20, CFG.ftp_msg_cwd, "^Message^ file to display when entering a new directory")
|
case 11:E_INT(17,18, CFG.ftp_limit, "^Limit^ the number of concurent ftp users")
|
||||||
case 12:E_INT(18,18, CFG.ftp_limit, "^Limit^ the number of concurent ftp users")
|
case 12:E_INT(18,18, CFG.ftp_loginfails, "Maximum ^login fails^ before a user is disconnected")
|
||||||
case 13:E_INT(19,18, CFG.ftp_loginfails, "Maximum ^login fails^ before a user is disconnected")
|
case 13:E_BOOL(13,75, CFG.ftp_compress, "Allow the use of the ^compress^ command")
|
||||||
case 14:E_BOOL(14,75, CFG.ftp_compress, "Allow the use of the ^compress^ command")
|
case 14:E_BOOL(14,75, CFG.ftp_tar, "Allow the use if the ^tar^ command")
|
||||||
case 15:E_BOOL(15,75, CFG.ftp_tar, "Allow the use if the ^tar^ command")
|
case 15:E_BOOL(15,75, CFG.ftp_upl_mkdir, "Allow ^mkdir^ in the upload directory")
|
||||||
case 16:E_BOOL(16,75, CFG.ftp_upl_mkdir, "Allow ^mkdir^ in the upload directory")
|
case 16:E_BOOL(16,75, CFG.ftp_log_cmds, "^Log^ all user ^commands^")
|
||||||
case 17:E_BOOL(17,75, CFG.ftp_log_cmds, "^Log^ all user ^commands^")
|
case 17:E_BOOL(17,75, CFG.ftp_anonymousok, "Allow ^anonymous^ users to login")
|
||||||
case 18:E_BOOL(18,75, CFG.ftp_anonymousok, "Allow ^anonymous^ users to login")
|
case 18:E_BOOL(18,75, CFG.ftp_mbseok, "Allow the ^mbse^ user to login")
|
||||||
case 19:E_BOOL(19,75, CFG.ftp_mbseok, "Allow the ^mbse^ user to login")
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -1494,6 +1522,27 @@ void global_menu(void)
|
|||||||
crc = 0xffffffff;
|
crc = 0xffffffff;
|
||||||
crc = upd_crc32((char *)&CFG, crc, sizeof(CFG));
|
crc = upd_crc32((char *)&CFG, crc, sizeof(CFG));
|
||||||
|
|
||||||
|
if (CFG.xmax_login) {
|
||||||
|
/*
|
||||||
|
* Do automatic upgrade for unused fields, erase them.
|
||||||
|
*/
|
||||||
|
Syslog('+', "Main config, clearing unused fields");
|
||||||
|
memset(&CFG.alists_path, 0, sizeof(CFG.alists_path));
|
||||||
|
memset(&CFG.xsequencer, 0, sizeof(CFG.xsequencer));
|
||||||
|
CFG.xmax_login = 0;
|
||||||
|
CFG.xUseSysDomain = FALSE;
|
||||||
|
CFG.xChkMail = FALSE;
|
||||||
|
memset(&CFG.xquotestr, 0, sizeof(CFG.xquotestr));
|
||||||
|
CFG.xNewBytes = FALSE;
|
||||||
|
memset(&CFG.extra4, 0, sizeof(CFG.extra4));
|
||||||
|
memset(&CFG.xmgrname, 0, sizeof(CFG.xmgrname));
|
||||||
|
memset(&CFG.xtoss_log, 0, sizeof(CFG.xtoss_log));
|
||||||
|
memset(&CFG.xareamgr, 0, sizeof(CFG.xareamgr));
|
||||||
|
CFG.xNoJanus = FALSE;
|
||||||
|
memset(&CFG.extra5, 0, sizeof(CFG.extra5));
|
||||||
|
sprintf(CFG.alists_path, "%s/var/arealists", getenv("MBSE_ROOT"));
|
||||||
|
}
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
||||||
clr_index();
|
clr_index();
|
||||||
@ -1726,6 +1775,8 @@ int global_doc(FILE *fp, FILE *toc, int page)
|
|||||||
fprintf(fp, " DOS path %s\n", CFG.dospath);
|
fprintf(fp, " DOS path %s\n", CFG.dospath);
|
||||||
fprintf(fp, " Unix path %s\n", CFG.uxpath);
|
fprintf(fp, " Unix path %s\n", CFG.uxpath);
|
||||||
fprintf(fp, " Leave case as is %s\n", getboolean(CFG.leavecase));
|
fprintf(fp, " Leave case as is %s\n", getboolean(CFG.leavecase));
|
||||||
|
fprintf(fp, " FTP base path %s\n", CFG.ftp_base);
|
||||||
|
fprintf(fp, " Area lists %s\n", CFG.alists_path);
|
||||||
|
|
||||||
page = newpage(fp, page);
|
page = newpage(fp, page);
|
||||||
addtoc(fp, toc, 1, 6, page, (char *)"Global settings");
|
addtoc(fp, toc, 1, 6, page, (char *)"Global settings");
|
||||||
@ -1920,7 +1971,6 @@ int global_doc(FILE *fp, FILE *toc, int page)
|
|||||||
|
|
||||||
addtoc(fp, toc, 1, 17, page, (char *)"Newfile reports");
|
addtoc(fp, toc, 1, 17, page, (char *)"Newfile reports");
|
||||||
|
|
||||||
fprintf(fp, " FTP base path %s\n", CFG.ftp_base);
|
|
||||||
fprintf(fp, " New files days %d\n", CFG.newdays);
|
fprintf(fp, " New files days %d\n", CFG.newdays);
|
||||||
fprintf(fp, " Highest sec. level %s\n", get_secstr(CFG.security));
|
fprintf(fp, " Highest sec. level %s\n", get_secstr(CFG.security));
|
||||||
fprintf(fp, " Max. newfile grps %ld\n", CFG.new_groups);
|
fprintf(fp, " Max. newfile grps %ld\n", CFG.new_groups);
|
||||||
@ -1965,7 +2015,6 @@ int global_doc(FILE *fp, FILE *toc, int page)
|
|||||||
fprintf(fp, " Log commands %s\n", getboolean(CFG.ftp_log_cmds));
|
fprintf(fp, " Log commands %s\n", getboolean(CFG.ftp_log_cmds));
|
||||||
fprintf(fp, " Anonymous login %s\n", getboolean(CFG.ftp_anonymousok));
|
fprintf(fp, " Anonymous login %s\n", getboolean(CFG.ftp_anonymousok));
|
||||||
fprintf(fp, " User mbse login %s\n", getboolean(CFG.ftp_mbseok));
|
fprintf(fp, " User mbse login %s\n", getboolean(CFG.ftp_mbseok));
|
||||||
fprintf(fp, " Base path %s\n", CFG.ftp_base);
|
|
||||||
fprintf(fp, " Shutdown message %s\n", CFG.ftp_msg_shutmsg);
|
fprintf(fp, " Shutdown message %s\n", CFG.ftp_msg_shutmsg);
|
||||||
fprintf(fp, " Upload path %s\n", CFG.ftp_upl_path);
|
fprintf(fp, " Upload path %s\n", CFG.ftp_upl_path);
|
||||||
fprintf(fp, " README login %s\n", CFG.ftp_readme_login);
|
fprintf(fp, " README login %s\n", CFG.ftp_readme_login);
|
||||||
|
@ -103,7 +103,7 @@ int OpenMGroup(void);
|
|||||||
int OpenMGroup(void)
|
int OpenMGroup(void)
|
||||||
{
|
{
|
||||||
FILE *fin, *fout;
|
FILE *fin, *fout;
|
||||||
char fnin[PATH_MAX], fnout[PATH_MAX];
|
char fnin[PATH_MAX], fnout[PATH_MAX], temp[13];
|
||||||
long oldsize;
|
long oldsize;
|
||||||
|
|
||||||
sprintf(fnin, "%s/etc/mgroups.data", getenv("MBSE_ROOT"));
|
sprintf(fnin, "%s/etc/mgroups.data", getenv("MBSE_ROOT"));
|
||||||
@ -143,7 +143,9 @@ int OpenMGroup(void)
|
|||||||
memset(&mgroup, 0, sizeof(mgroup));
|
memset(&mgroup, 0, sizeof(mgroup));
|
||||||
while (fread(&mgroup, oldsize, 1, fin) == 1) {
|
while (fread(&mgroup, oldsize, 1, fin) == 1) {
|
||||||
if (MGrpUpdated) {
|
if (MGrpUpdated) {
|
||||||
sprintf(mgroup.BasePath, "%s/var/mail/%s", getenv("MBSE_ROOT"), tl(mgroup.Name));
|
memset(&temp, 0, sizeof(temp));
|
||||||
|
strcpy(temp, mgroup.Name);
|
||||||
|
sprintf(mgroup.BasePath, "%s/var/mail/%s", getenv("MBSE_ROOT"), tl(temp));
|
||||||
}
|
}
|
||||||
fwrite(&mgroup, sizeof(mgroup), 1, fout);
|
fwrite(&mgroup, sizeof(mgroup), 1, fout);
|
||||||
memset(&mgroup, 0, sizeof(mgroup));
|
memset(&mgroup, 0, sizeof(mgroup));
|
||||||
@ -228,15 +230,26 @@ void MgScreen(void)
|
|||||||
{
|
{
|
||||||
clr_index();
|
clr_index();
|
||||||
set_color(WHITE, BLACK);
|
set_color(WHITE, BLACK);
|
||||||
mvprintw( 5, 6, "9.1 EDIT MESSAGE GROUP");
|
mvprintw( 5, 1, "9.1 EDIT MESSAGE GROUP");
|
||||||
set_color(CYAN, BLACK);
|
set_color(CYAN, BLACK);
|
||||||
mvprintw( 7, 6, "1. Name");
|
mvprintw( 7, 1, "1. Name");
|
||||||
mvprintw( 8, 6, "2. Comment");
|
mvprintw( 8, 1, "2. Comment");
|
||||||
mvprintw( 9, 6, "3. Active");
|
mvprintw( 9, 1, "3. Base path");
|
||||||
mvprintw(10, 6, "4. Use Aka");
|
mvprintw(10, 1, "4. Read sec");
|
||||||
mvprintw(11, 6, "5. Uplink");
|
mvprintw(11, 1, "5. Write sec");
|
||||||
mvprintw(12, 6, "6. Areas");
|
mvprintw(12, 1, "6. Sysop sec");
|
||||||
mvprintw(13, 6, "7. Deleted");
|
mvprintw(13, 1, "7. Net reply");
|
||||||
|
mvprintw(14, 1, "8. Users del");
|
||||||
|
mvprintw(15, 1, "9. Aliases");
|
||||||
|
mvprintw(16, 1, "10. Quotes");
|
||||||
|
|
||||||
|
mvprintw(10,41, "11. Auto change");
|
||||||
|
mvprintw(11,41, "12. User change");
|
||||||
|
mvprintw(12,41, "13. Active");
|
||||||
|
mvprintw(13,41, "14. Use Aka");
|
||||||
|
mvprintw(14,41, "15. Uplink");
|
||||||
|
mvprintw(15,41, "16. Areas");
|
||||||
|
mvprintw(16,41, "17. Deleted");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -268,7 +281,7 @@ int CheckMgroup(void)
|
|||||||
int EditMGrpRec(int Area)
|
int EditMGrpRec(int Area)
|
||||||
{
|
{
|
||||||
FILE *fil;
|
FILE *fil;
|
||||||
static char mfile[PATH_MAX];
|
static char mfile[PATH_MAX], temp[13];
|
||||||
static long offset;
|
static long offset;
|
||||||
static int j, tmp;
|
static int j, tmp;
|
||||||
unsigned long crc, crc1;
|
unsigned long crc, crc1;
|
||||||
@ -298,15 +311,26 @@ int EditMGrpRec(int Area)
|
|||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
set_color(WHITE, BLACK);
|
set_color(WHITE, BLACK);
|
||||||
show_str( 7,18,12, mgroup.Name);
|
show_str( 7,15,12, mgroup.Name);
|
||||||
show_str( 8,18,55, mgroup.Comment);
|
show_str( 8,15,55, mgroup.Comment);
|
||||||
show_bool( 9,18, mgroup.Active);
|
show_str( 9,15,64, mgroup.BasePath);
|
||||||
show_aka( 10,18, mgroup.UseAka);
|
show_int( 10,15, mgroup.RDSec.level);
|
||||||
show_aka( 11,18, mgroup.UpLink);
|
show_int( 11,15, mgroup.WRSec.level);
|
||||||
show_str( 12,18,12, mgroup.AreaFile);
|
show_int( 12,15, mgroup.SYSec.level);
|
||||||
show_bool(13,18, mgroup.Deleted);
|
show_int( 13,15, mgroup.NetReply);
|
||||||
|
show_bool(14,15, mgroup.UsrDelete);
|
||||||
|
show_bool(15,15, mgroup.Aliases);
|
||||||
|
show_bool(16,15, mgroup.Quotes);
|
||||||
|
|
||||||
j = select_menu(7);
|
show_bool(10,57, mgroup.AutoChange);
|
||||||
|
show_bool(11,57, mgroup.UserChange);
|
||||||
|
show_bool(12,57, mgroup.Active);
|
||||||
|
show_aka( 13,57, mgroup.UseAka);
|
||||||
|
show_aka( 14,57, mgroup.UpLink);
|
||||||
|
show_str( 15,57,12, mgroup.AreaFile);
|
||||||
|
show_bool(16,57, mgroup.Deleted);
|
||||||
|
|
||||||
|
j = select_menu(17);
|
||||||
switch(j) {
|
switch(j) {
|
||||||
case 0:
|
case 0:
|
||||||
crc1 = 0xffffffff;
|
crc1 = 0xffffffff;
|
||||||
@ -331,23 +355,39 @@ int EditMGrpRec(int Area)
|
|||||||
return 0;
|
return 0;
|
||||||
case 1: if (CheckMgroup())
|
case 1: if (CheckMgroup())
|
||||||
break;
|
break;
|
||||||
E_UPS( 7,18,12,mgroup.Name,"The ^name^ for this message group")
|
strcpy(mgroup.Name, edit_str(7,15,12, mgroup.Name, (char *)"The ^name^ for this message group"));
|
||||||
case 2: E_STR( 8,18,55,mgroup.Comment,"The ^desription^ for this message group")
|
if (strlen(mgroup.BasePath) == 0) {
|
||||||
case 3: if (CheckMgroup())
|
memset(&temp, 0, sizeof(temp));
|
||||||
|
strcpy(temp, mgroup.Name);
|
||||||
|
sprintf(mgroup.BasePath, "%s/var/mail/%s", getenv("MBSE_ROOT"), tl(temp));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
E_BOOL(9,18, mgroup.Active, "Is this message group ^active^")
|
case 2: E_STR( 8,15,55, mgroup.Comment,"The ^desription^ for this message group")
|
||||||
case 4: tmp = PickAka((char *)"9.1.4", TRUE);
|
case 3: E_PTH( 9,15,64, mgroup.BasePath, "The ^Base path^ where new JAM areas are created")
|
||||||
|
case 4: E_SEC(10,15, mgroup.RDSec, "9.1.4 MESSAGE GROUP READ SECURITY", MgScreen)
|
||||||
|
case 5: E_SEC(11,15, mgroup.WRSec, "9.1.5 MESSAGE GROUP WRITE SECURITY", MgScreen)
|
||||||
|
case 6: E_SEC(12,15, mgroup.SYSec, "9.1.6 MESSAGE GROUP SYSOP SECURITY", MgScreen)
|
||||||
|
case 7: E_INT(13,15, mgroup.NetReply, "The ^Area Number^ for netmail replies")
|
||||||
|
case 8: E_BOOL(14,15, mgroup.UsrDelete, "Allow users to ^Delete^ their messages")
|
||||||
|
case 9: E_BOOL(15,15, mgroup.Aliases, "Allow ^Aliases^ or real names only")
|
||||||
|
case 10:E_BOOL(16,15, mgroup.Quotes, "Allow random ^quotes^ to new messages")
|
||||||
|
case 11:E_BOOL(10,57, mgroup.AutoChange, "^Auto change^ areas from new areas lists")
|
||||||
|
case 12:E_BOOL(11,57, mgroup.UserChange, "^Auto add/delete^ areas from downlinks requests")
|
||||||
|
case 13:if (CheckMgroup())
|
||||||
|
break;
|
||||||
|
E_BOOL(9,15, mgroup.Active, "Is this message group ^active^")
|
||||||
|
case 14:tmp = PickAka((char *)"9.1.14", TRUE);
|
||||||
if (tmp != -1)
|
if (tmp != -1)
|
||||||
memcpy(&mgroup.UseAka, &CFG.aka[tmp], sizeof(fidoaddr));
|
memcpy(&mgroup.UseAka, &CFG.aka[tmp], sizeof(fidoaddr));
|
||||||
MgScreen();
|
MgScreen();
|
||||||
break;
|
break;
|
||||||
case 5: mgroup.UpLink = PullUplink((char *)"9.1.5");
|
case 15:mgroup.UpLink = PullUplink((char *)"9.1.15");
|
||||||
MgScreen();
|
MgScreen();
|
||||||
break;
|
break;
|
||||||
case 6: E_STR(12,18,12,mgroup.AreaFile,"The name of the ^Areas File^ from the uplink")
|
case 16:E_STR(15,57,12,mgroup.AreaFile,"The name of the ^Areas File^ from the uplink")
|
||||||
case 7: if (CheckMgroup())
|
case 17:if (CheckMgroup())
|
||||||
break;
|
break;
|
||||||
E_BOOL(13,18, mgroup.Deleted, "Is this group ^Deleted^")
|
E_BOOL(16,57, mgroup.Deleted, "Is this group ^Deleted^")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user