|
|
1.1 root 1: /* scfgsys.c */
2:
3: /* $Id: scfgsys.c,v 1.26 2004/05/30 06:56:06 deuce Exp $ */
4:
5: /****************************************************************************
6: * @format.tab-size 4 (Plain Text/Source Code File Header) *
7: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
8: * *
9: * Copyright 2002 Rob Swindell - http://www.synchro.net/copyright.html *
10: * *
11: * This program is free software; you can redistribute it and/or *
12: * modify it under the terms of the GNU General Public License *
13: * as published by the Free Software Foundation; either version 2 *
14: * of the License, or (at your option) any later version. *
15: * See the GNU General Public License for more details: gpl.txt or *
16: * http://www.fsf.org/copyleft/gpl.html *
17: * *
18: * Anonymous FTP access to the most recent released source is available at *
19: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
20: * *
21: * Anonymous CVS access to the development source and modification history *
22: * is available at cvs.synchro.net:/cvsroot/sbbs, example: *
23: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login *
24: * (just hit return, no password is necessary) *
25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src *
26: * *
27: * For Synchronet coding style and modification guidelines, see *
28: * http://www.synchro.net/source.html *
29: * *
30: * You are encouraged to submit any modifications (preferably in Unix diff *
31: * format) via e-mail to [email protected] *
32: * *
33: * Note: If this box doesn't appear square, then you need to fix your tabs. *
34: ****************************************************************************/
35:
36: #include "scfg.h"
37:
38: void sys_cfg(void)
39: {
40: static int sys_dflt,adv_dflt,tog_dflt,new_dflt;
41: char str[81],done=0;
42: int i,j,k,dflt,bar;
43:
44: while(1) {
45: i=0;
46: sprintf(opt[i++],"%-33.33s%s","BBS Name",cfg.sys_name);
47: sprintf(opt[i++],"%-33.33s%s","Location",cfg.sys_location);
48: sprintf(opt[i++],"%-33.33s%s","Operator",cfg.sys_op);
49: sprintf(opt[i++],"%-33.33s%s","Password","**********");
50:
51: sprintf(str,"%s Password"
52: ,cfg.sys_misc&SM_PWEDIT && cfg.sys_pwdays ? "Users Must Change"
53: : cfg.sys_pwdays ? "Users Get New Random" : "Users Can Change");
54: if(cfg.sys_pwdays)
55: sprintf(tmp,"Every %u Days",cfg.sys_pwdays);
56: else if(cfg.sys_misc&SM_PWEDIT)
57: strcpy(tmp,"Yes");
58: else
59: strcpy(tmp,"No");
60: sprintf(opt[i++],"%-33.33s%s",str,tmp);
61:
62: sprintf(opt[i++],"%-33.33s%u","Days to Preserve Deleted Users"
63: ,cfg.sys_deldays);
64: sprintf(opt[i++],"%-33.33s%s","Maximum Days of Inactivity"
65: ,cfg.sys_autodel ? ultoa(cfg.sys_autodel,tmp,10) : "Unlimited");
66: sprintf(opt[i++],"%-33.33s%s","New User Password",cfg.new_pass);
67:
68: strcpy(opt[i++],"Toggle Options...");
69: strcpy(opt[i++],"New User Values...");
70: strcpy(opt[i++],"Advanced Options...");
71: strcpy(opt[i++],"Loadable Modules...");
72: strcpy(opt[i++],"Security Level Values...");
73: strcpy(opt[i++],"Expired Account Values...");
74: strcpy(opt[i++],"Quick-Validation Values...");
75: opt[i][0]=0;
76: SETHELP(WHERE);
77: /*
78: &System Configuration:&
79:
80: This menu contains options and sub-menus of options that affect the
81: entire system.
82: */
83: switch(uifc.list(WIN_ORG|WIN_ACT|WIN_CHE,0,0,72,&sys_dflt,0
84: ,"System Configuration",opt)) {
85: case -1:
86: i=save_changes(WIN_MID);
87: if(i==-1)
88: break;
89: if(!i) {
90: cfg.new_install=new_install;
91: write_main_cfg(&cfg,backup_level);
92: refresh_cfg(&cfg);
93: }
94: return;
95: case 0:
96: SETHELP(WHERE);
97: /*
98: &BBS Name:&
99:
100: This is the name of the BBS.
101: */
102: uifc.input(WIN_MID,0,0,"BBS Name",cfg.sys_name,sizeof(cfg.sys_name)-1,K_EDIT);
103: break;
104: case 1:
105: SETHELP(WHERE);
106: /*
107: &System Location:&
108:
109: This is the location of the BBS. The format is flexible, but it is
110: suggested you use the &City, State& format for clarity.
111: */
112: uifc.input(WIN_MID,0,0,"Location",cfg.sys_location,sizeof(cfg.sys_location)-1,K_EDIT);
113: break;
114: case 2:
115: SETHELP(WHERE);
116: /*
117: &System Operator:&
118:
119: This is the name or alias of the system operator. This does not have to
120: be the same as user #1. This field is used for documentary purposes
121: only.
122: */
123: uifc.input(WIN_MID,0,0,"System Operator",cfg.sys_op,sizeof(cfg.sys_op)-1,K_EDIT);
124: break;
125: case 3:
126: SETHELP(WHERE);
127: /*
128: &System Password:&
129:
130: This is an extra security password required for sysop logon and certain
131: sysop functions. This password should be something not easily guessed
132: and should be kept absolutely confidential. This password must be
133: entered at the &SY:& prompt.
134: */
135: uifc.input(WIN_MID,0,0,"System Password",cfg.sys_pass,sizeof(cfg.sys_pass)-1,K_EDIT|K_UPPER);
136: break;
137: case 4:
138: strcpy(opt[0],"Yes");
139: strcpy(opt[1],"No");
140: opt[2][0]=0;
141: i=1;
142: SETHELP(WHERE);
143: /*
144: &Allow Users to Change Their Password:&
145:
146: If you want the users of your system to have the option of changing
147: their password to a string of their choice, set this option to &Yes&.
148: For the highest level of security, set this option to &No.&
149: */
150: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
151: ,"Allow Users to Change Their Password",opt);
152: if(!i && !(cfg.sys_misc&SM_PWEDIT)) {
153: cfg.sys_misc|=SM_PWEDIT;
154: uifc.changes=1; }
155: else if(i==1 && cfg.sys_misc&SM_PWEDIT) {
156: cfg.sys_misc&=~SM_PWEDIT;
157: uifc.changes=1; }
158: i=0;
159: SETHELP(WHERE);
160: /*
161: &Force Periodic Password uifc.changes:&
162:
163: If you want your users to be forced to change their passwords
164: periodically, select &Yes&.
165: */
166: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
167: ,"Force Periodic Password Changes",opt);
168: if(!i) {
169: ultoa(cfg.sys_pwdays,str,10);
170: SETHELP(WHERE);
171: /*
172: &Maximum Days Between Password uifc.changes:&
173:
174: Enter the maximum number of days allowed between password uifc.changes.
175: If a user has not voluntarily changed his or her password in this
176: many days, he or she will be forced to change their password upon
177: logon.
178: */
179: uifc.input(WIN_MID,0,0,"Maximum Days Between Password Changes"
180: ,str,5,K_NUMBER|K_EDIT);
181: cfg.sys_pwdays=atoi(str); }
182: else if(i==1 && cfg.sys_pwdays) {
183: cfg.sys_pwdays=0;
184: uifc.changes=1; }
185:
186: break;
187: case 5:
188: sprintf(str,"%u",cfg.sys_deldays);
189: SETHELP(WHERE);
190: /*
191: &Days Since Last Logon to Preserve Deleted Users:&
192:
193: Deleted user slots can be &undeleted& until the slot is written over
194: by a new user. If you want deleted user slots to be preserved for period
195: of time since their last logon, set this value to the number of days to
196: keep new users from taking over a deleted user's slot.
197: */
198: uifc.input(WIN_MID,0,0,"Days Since Last Logon to Preserve Deleted Users"
199: ,str,5,K_EDIT|K_NUMBER);
200: cfg.sys_deldays=atoi(str);
201: break;
202: case 6:
203: sprintf(str,"%u",cfg.sys_autodel);
204: SETHELP(WHERE);
205: /*
206: &Maximum Days of Inactivity Before Auto-Deletion:&
207:
208: If you want users that haven't logged on in certain period of time to
209: be automatically deleted, set this value to the maximum number of days
210: of inactivity before the user is deleted. Setting this value to &0&
211: disables this feature.
212:
213: Users with the &P& exemption will not be deleted due to inactivity.
214: */
215: uifc.input(WIN_MID,0,0,"Maximum Days of Inactivity Before Auto-Deletion"
216: ,str,5,K_EDIT|K_NUMBER);
217: cfg.sys_autodel=atoi(str);
218: break;
219: case 7:
220: SETHELP(WHERE);
221: /*
222: &New User Password:&
223:
224: If you want callers to only be able to logon as &New& if they know a
225: certain password, enter that password here. If you want any caller to
226: be able to logon as New, leave this option blank.
227: */
228: uifc.input(WIN_MID,0,0,"New User Password",cfg.new_pass,sizeof(cfg.new_pass)-1
229: ,K_EDIT|K_UPPER);
230: break;
231: case 8: /* Toggle Options */
232: done=0;
233: while(!done) {
234: i=0;
235: sprintf(opt[i++],"%-33.33s%s","Allow Aliases"
236: ,cfg.uq&UQ_ALIASES ? "Yes" : "No");
237: sprintf(opt[i++],"%-33.33s%s","Allow Time Banking"
238: ,cfg.sys_misc&SM_TIMEBANK ? "Yes" : "No");
239: sprintf(opt[i++],"%-33.33s%s","Allow Credit Conversions"
240: ,cfg.sys_misc&SM_NOCDTCVT ? "No" : "Yes");
241: sprintf(opt[i++],"%-33.33s%s","Allow Sysop Logins"
242: ,cfg.sys_misc&SM_R_SYSOP ? "Yes" : "No");
243: sprintf(opt[i++],"%-33.33s%s","Echo Passwords Locally"
244: ,cfg.sys_misc&SM_ECHO_PW ? "Yes" : "No");
245: sprintf(opt[i++],"%-33.33s%s","Short Sysop Page"
246: ,cfg.sys_misc&SM_SHRTPAGE ? "Yes" : "No");
247: sprintf(opt[i++],"%-33.33s%s","Sound Alarm on Error"
248: ,cfg.sys_misc&SM_ERRALARM ? "Yes" : "No");
249: sprintf(opt[i++],"%-33.33s%s","Include Sysop in Statistics"
250: ,cfg.sys_misc&SM_SYSSTAT ? "Yes" : "No");
251: sprintf(opt[i++],"%-33.33s%s","Closed to New Users"
252: ,cfg.sys_misc&SM_CLOSED ? "Yes" : "No");
253: sprintf(opt[i++],"%-33.33s%s","Use Location in User Lists"
254: ,cfg.sys_misc&SM_LISTLOC ? "Yes" : "No");
255: sprintf(opt[i++],"%-33.33s%s","Use Local/System Time Zone"
256: ,cfg.sys_misc&SM_LOCAL_TZ ? "Yes" : "No");
257: sprintf(opt[i++],"%-33.33s%s","Automatic Daylight Savings Time"
258: ,cfg.sys_misc&SM_AUTO_DST ? "Yes" : "No");
259: sprintf(opt[i++],"%-33.33s%s","Military (24 hour) Time Format"
260: ,cfg.sys_misc&SM_MILITARY ? "Yes" : "No");
261: sprintf(opt[i++],"%-33.33s%s","European Date Format (DD/MM/YY)"
262: ,cfg.sys_misc&SM_EURODATE ? "Yes" : "No");
263: sprintf(opt[i++],"%-33.33s%s","User Expires When Out-of-time"
264: ,cfg.sys_misc&SM_TIME_EXP ? "Yes" : "No");
265: sprintf(opt[i++],"%-33.33s%s","Display Sys Info During Logon"
266: ,cfg.sys_misc&SM_NOSYSINFO ? "No" : "Yes");
267: sprintf(opt[i++],"%-33.33s%s","Display Node List During Logon"
268: ,cfg.sys_misc&SM_NONODELIST ? "No" : "Yes");
269: opt[i][0]=0;
270: uifc.savnum=0;
271: SETHELP(WHERE);
272: /*
273: &System Toggle Options:&
274:
275: This is a menu of system related options that can be toggled between
276: two or more states, such as &Yes& and &No&.
277: */
278: switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,41,&tog_dflt,0
279: ,"Toggle Options",opt)) {
280: case -1:
281: done=1;
282: break;
283: case 0:
284: strcpy(opt[0],"Yes");
285: strcpy(opt[1],"No");
286: opt[2][0]=0;
287: i=cfg.uq&UQ_ALIASES ? 0:1;
288: SETHELP(WHERE);
289: /*
290: &Allow Users to Use Aliases:&
291:
292: If you want the users of your system to be allowed to be known by a
293: false name, handle, or alias, set this option to &Yes&. If you want all
294: users on your system to be known only by their real names, select &No&.
295: */
296: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
297: ,"Allow Users to Use Aliases",opt);
298: if(!i && !(cfg.uq&UQ_ALIASES)) {
299: cfg.uq|=UQ_ALIASES;
300: uifc.changes=1; }
301: else if(i==1 && cfg.uq&UQ_ALIASES) {
302: cfg.uq&=~UQ_ALIASES;
303: uifc.changes=1; }
304: break;
305: case 1:
306: strcpy(opt[0],"Yes");
307: strcpy(opt[1],"No");
308: opt[2][0]=0;
309: i=cfg.sys_misc&SM_TIMEBANK ? 0:1;
310: SETHELP(WHERE);
311: /*
312: &Allow Time Banking:&
313:
314: If you want the users of your system to be allowed to be deposit
315: any extra time they may have left during a call into their minute bank,
316: set this option to &Yes&. If this option is set to &No&, then the only
317: way a user may get minutes in their minute bank is to purchase them
318: with credits.
319: */
320: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
321: ,"Allow Users to Depost Time in Minute Bank",opt);
322: if(!i && !(cfg.sys_misc&SM_TIMEBANK)) {
323: cfg.sys_misc|=SM_TIMEBANK;
324: uifc.changes=1; }
325: else if(i==1 && cfg.sys_misc&SM_TIMEBANK) {
326: cfg.sys_misc&=~SM_TIMEBANK;
327: uifc.changes=1; }
328: break;
329: case 2:
330: strcpy(opt[0],"Yes");
331: strcpy(opt[1],"No");
332: opt[2][0]=0;
333: i=cfg.sys_misc&SM_NOCDTCVT ? 1:0;
334: SETHELP(WHERE);
335: /*
336: &Allow Credits to be Converted into Minutes:&
337:
338: If you want the users of your system to be allowed to be convert
339: any credits they may have into minutes for their minute bank,
340: set this option to &Yes&.
341: */
342: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
343: ,"Allow Users to Convert Credits into Minutes"
344: ,opt);
345: if(!i && cfg.sys_misc&SM_NOCDTCVT) {
346: cfg.sys_misc&=~SM_NOCDTCVT;
347: uifc.changes=1; }
348: else if(i==1 && !(cfg.sys_misc&SM_NOCDTCVT)) {
349: cfg.sys_misc|=SM_NOCDTCVT;
350: uifc.changes=1; }
351: break;
352: case 3:
353: strcpy(opt[0],"Yes");
354: strcpy(opt[1],"No");
355: opt[2][0]=0;
356: i=cfg.sys_misc&SM_R_SYSOP ? 0:1;
357: SETHELP(WHERE);
358: /*
359: &Allow Sysop Logins:&
360:
361: If you want to be able to login with sysop access, set this option to &Yes&.
362: */
363: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
364: ,"Allow Sysop Logins",opt);
365: if(!i && !(cfg.sys_misc&SM_R_SYSOP)) {
366: cfg.sys_misc|=SM_R_SYSOP;
367: uifc.changes=1; }
368: else if(i==1 && cfg.sys_misc&SM_R_SYSOP) {
369: cfg.sys_misc&=~SM_R_SYSOP;
370: uifc.changes=1; }
371: break;
372: case 4:
373: strcpy(opt[0],"Yes");
374: strcpy(opt[1],"No");
375: opt[2][0]=0;
376: i=cfg.sys_misc&SM_ECHO_PW ? 0:1;
377: SETHELP(WHERE);
378: /*
379: &Echo Passwords Locally:&
380:
381: If you want to passwords to be displayed locally, set this option to
382: &Yes&.
383: */
384: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
385: ,"Echo Passwords Locally",opt);
386: if(!i && !(cfg.sys_misc&SM_ECHO_PW)) {
387: cfg.sys_misc|=SM_ECHO_PW;
388: uifc.changes=1; }
389: else if(i==1 && cfg.sys_misc&SM_ECHO_PW) {
390: cfg.sys_misc&=~SM_ECHO_PW;
391: uifc.changes=1; }
392: break;
393: case 5:
394: strcpy(opt[0],"Yes");
395: strcpy(opt[1],"No");
396: opt[2][0]=0;
397: i=cfg.sys_misc&SM_SHRTPAGE ? 0:1;
398: SETHELP(WHERE);
399: /*
400: &Short Sysop Page:&
401:
402: If you would like the sysop page to be a short series of beeps rather
403: than continuous random tones, set this option to &Yes&.
404: */
405: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"Short Sysop Page"
406: ,opt);
407: if(i==1 && cfg.sys_misc&SM_SHRTPAGE) {
408: cfg.sys_misc&=~SM_SHRTPAGE;
409: uifc.changes=1; }
410: else if(!i && !(cfg.sys_misc&SM_SHRTPAGE)) {
411: cfg.sys_misc|=SM_SHRTPAGE;
412: uifc.changes=1; }
413: break;
414: case 6:
415: strcpy(opt[0],"Yes");
416: strcpy(opt[1],"No");
417: opt[2][0]=0;
418: i=cfg.sys_misc&SM_ERRALARM ? 0:1;
419: SETHELP(WHERE);
420: /*
421: &Sound Alarm on Error:&
422:
423: If you would like to have an alarm sounded locally when a critical
424: system error has occured, set this option to &Yes&.
425: */
426: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
427: ,"Sound Alarm on Error",opt);
428: if(i==1 && cfg.sys_misc&SM_ERRALARM) {
429: cfg.sys_misc&=~SM_ERRALARM;
430: uifc.changes=1; }
431: else if(!i && !(cfg.sys_misc&SM_ERRALARM)) {
432: cfg.sys_misc|=SM_ERRALARM;
433: uifc.changes=1; }
434: break;
435: case 7:
436: strcpy(opt[0],"Yes");
437: strcpy(opt[1],"No");
438: opt[2][0]=0;
439: i=cfg.sys_misc&SM_SYSSTAT ? 0:1;
440: SETHELP(WHERE);
441: /*
442: &Include Sysop Activity in System Statistics:&
443:
444: If you want sysops to be included in the statistical data of the BBS,
445: set this option to &Yes&. The suggested setting for this option is
446: &No& so that statistical data will only reflect user usage and not
447: include sysop maintenance activity.
448: */
449: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
450: ,"Include Sysop Activity in System Statistics"
451: ,opt);
452: if(!i && !(cfg.sys_misc&SM_SYSSTAT)) {
453: cfg.sys_misc|=SM_SYSSTAT;
454: uifc.changes=1; }
455: else if(i==1 && cfg.sys_misc&SM_SYSSTAT) {
456: cfg.sys_misc&=~SM_SYSSTAT;
457: uifc.changes=1; }
458: break;
459: case 8:
460: strcpy(opt[0],"Yes");
461: strcpy(opt[1],"No");
462: opt[2][0]=0;
463: i=cfg.sys_misc&SM_CLOSED ? 0:1;
464: SETHELP(WHERE);
465: /*
466: &Closed to New Users:&
467:
468: If you want callers to be able to logon as &New&, set this option to &No&.
469: */
470: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
471: ,"Closed to New Users",opt);
472: if(!i && !(cfg.sys_misc&SM_CLOSED)) {
473: cfg.sys_misc|=SM_CLOSED;
474: uifc.changes=1; }
475: else if(i==1 && cfg.sys_misc&SM_CLOSED) {
476: cfg.sys_misc&=~SM_CLOSED;
477: uifc.changes=1; }
478: break;
479: case 9:
480: strcpy(opt[0],"Yes");
481: strcpy(opt[1],"No");
482: opt[2][0]=0;
483: i=cfg.sys_misc&SM_LISTLOC ? 0:1;
484: SETHELP(WHERE);
485: /*
486: &User Location in User Lists:&
487:
488: If you want user locations (city, state) displayed in the user lists,
489: set this option to &Yes&. If this option is set to &No&, the user notes
490: (if they exist) are displayed in the user lists.
491: */
492: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
493: ,"User Location (Instead of Note) in User Lists"
494: ,opt);
495: if(!i && !(cfg.sys_misc&SM_LISTLOC)) {
496: cfg.sys_misc|=SM_LISTLOC;
497: uifc.changes=1; }
498: else if(i==1 && cfg.sys_misc&SM_LISTLOC) {
499: cfg.sys_misc&=~SM_LISTLOC;
500: uifc.changes=1; }
501: break;
502: case 10:
503: strcpy(opt[0],"Yes");
504: strcpy(opt[1],"No");
505: opt[2][0]=0;
506: i=cfg.sys_misc&SM_LOCAL_TZ ? 0:1;
507: SETHELP(WHERE);
508: /*
509: &Use Local/System Time Zone:&
510:
511: If you would like the times to be displayed adjusting for the local
512: time zone, set this optiont to Yes. If this option is set to &Yes&, then
513: all times will be stored in GMT/UTC representation. If this option is
514: set to &No&, then all times will be stored in local representation.
515: */
516: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
517: ,"Use Local/System Time Zone",opt);
518: if(!i && !(cfg.sys_misc&SM_LOCAL_TZ)) {
519: cfg.sys_misc|=SM_LOCAL_TZ;
520: uifc.changes=1; }
521: else if(i==1 && cfg.sys_misc&SM_LOCAL_TZ) {
522: cfg.sys_misc&=~SM_LOCAL_TZ;
523: uifc.changes=1; }
524: break;
525: case 11:
526: strcpy(opt[0],"Yes");
527: strcpy(opt[1],"No");
528: opt[2][0]=0;
529: i=cfg.sys_misc&SM_AUTO_DST ? 0:1;
530: SETHELP(WHERE);
531: /*
532: `Automatic Daylight Savings Time:`
533:
534: If your system is using a U.S. standard timezone, and you would like
535: to have the daylight savings time `flag` automatically toggled for you,
536: set this option to ~Yes~. This `flag` is used for display purposes only
537: (e.g. to display "PDT" instead of "PST"), it doesn't actually change the
538: time on your system(s) for you.
539: */
540: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
541: ,"Automatically Toggle Daylight Savings Time Flag",opt);
542: if(!i && !(cfg.sys_misc&SM_AUTO_DST)) {
543: cfg.sys_misc|=SM_AUTO_DST;
544: uifc.changes=1;
545: }
546: else if(i==1 && cfg.sys_misc&SM_AUTO_DST) {
547: cfg.sys_misc&=~SM_AUTO_DST;
548: uifc.changes=1;
549: }
550: break;
551: case 12:
552: strcpy(opt[0],"Yes");
553: strcpy(opt[1],"No");
554: opt[2][0]=0;
555: i=cfg.sys_misc&SM_MILITARY ? 0:1;
556: SETHELP(WHERE);
557: /*
558: &Military:&
559:
560: If you would like the time-of-day to be displayed and entered in 24 hour
561: format always, set this option to &Yes&.
562: */
563: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
564: ,"Use Military Time Format",opt);
565: if(!i && !(cfg.sys_misc&SM_MILITARY)) {
566: cfg.sys_misc|=SM_MILITARY;
567: uifc.changes=1; }
568: else if(i==1 && cfg.sys_misc&SM_MILITARY) {
569: cfg.sys_misc&=~SM_MILITARY;
570: uifc.changes=1; }
571: break;
572: case 13:
573: strcpy(opt[0],"Yes");
574: strcpy(opt[1],"No");
575: opt[2][0]=0;
576: i=cfg.sys_misc&SM_EURODATE ? 0:1;
577: SETHELP(WHERE);
578: /*
579: &European Date Format:&
580:
581: If you would like dates to be displayed and entered in &DD/MM/YY& format
582: instead of &MM/DD/YY& format, set this option to &Yes&.
583: */
584: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
585: ,"European Date Format",opt);
586: if(!i && !(cfg.sys_misc&SM_EURODATE)) {
587: cfg.sys_misc|=SM_EURODATE;
588: uifc.changes=1; }
589: else if(i==1 && cfg.sys_misc&SM_EURODATE) {
590: cfg.sys_misc&=~SM_EURODATE;
591: uifc.changes=1; }
592: break;
593: case 14:
594: strcpy(opt[0],"Yes");
595: strcpy(opt[1],"No");
596: opt[2][0]=0;
597: i=cfg.sys_misc&SM_TIME_EXP ? 0:1;
598: SETHELP(WHERE);
599: /*
600: &User Expires When Out-of-time:&
601:
602: If you want users to be set to &Expired User Values& if they run out of
603: time online, then set this option to &Yes&.
604: */
605: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
606: ,"User Expires When Out-of-time",opt);
607: if(!i && !(cfg.sys_misc&SM_TIME_EXP)) {
608: cfg.sys_misc|=SM_TIME_EXP;
609: uifc.changes=1; }
610: else if(i==1 && cfg.sys_misc&SM_TIME_EXP) {
611: cfg.sys_misc&=~SM_TIME_EXP;
612: uifc.changes=1; }
613: break;
614: case 15:
615: strcpy(opt[0],"Yes");
616: strcpy(opt[1],"No");
617: opt[2][0]=0;
618: i=cfg.sys_misc&SM_NOSYSINFO ? 1:0;
619: SETHELP(WHERE);
620: /*
621: &Display System Information During Logon:&
622:
623: If you want system information displayed during logon, set this option
624: to &Yes&.
625: */
626: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
627: ,"Display System Information During Logon",opt);
628: if(!i && cfg.sys_misc&SM_NOSYSINFO) {
629: cfg.sys_misc&=~SM_NOSYSINFO;
630: uifc.changes=1; }
631: else if(i==1 && !(cfg.sys_misc&SM_NOSYSINFO)) {
632: cfg.sys_misc|=SM_NOSYSINFO;
633: uifc.changes=1; }
634: break;
635: case 16:
636: strcpy(opt[0],"Yes");
637: strcpy(opt[1],"No");
638: opt[2][0]=0;
639: i=cfg.sys_misc&SM_NONODELIST ? 1:0;
640: SETHELP(WHERE);
641: /*
642: &Display Active Node List During Logon:&
643:
644: If you want the active nodes displayed during logon, set this option
645: to &Yes&.
646: */
647: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
648: ,"Display Active Node List During Logon",opt);
649: if(!i && cfg.sys_misc&SM_NONODELIST) {
650: cfg.sys_misc&=~SM_NONODELIST;
651: uifc.changes=1; }
652: else if(i==1 && !(cfg.sys_misc&SM_NONODELIST)) {
653: cfg.sys_misc|=SM_NONODELIST;
654: uifc.changes=1; }
655: break;
656: } }
657: break;
658: case 9: /* New User Values */
659: done=0;
660: while(!done) {
661: i=0;
662: sprintf(opt[i++],"%-27.27s%u","Level",cfg.new_level);
663: sprintf(opt[i++],"%-27.27s%s","Flag Set #1"
664: ,ltoaf(cfg.new_flags1,str));
665: sprintf(opt[i++],"%-27.27s%s","Flag Set #2"
666: ,ltoaf(cfg.new_flags2,str));
667: sprintf(opt[i++],"%-27.27s%s","Flag Set #3"
668: ,ltoaf(cfg.new_flags3,str));
669: sprintf(opt[i++],"%-27.27s%s","Flag Set #4"
670: ,ltoaf(cfg.new_flags4,str));
671: sprintf(opt[i++],"%-27.27s%s","Exemptions"
672: ,ltoaf(cfg.new_exempt,str));
673: sprintf(opt[i++],"%-27.27s%s","Restrictions"
674: ,ltoaf(cfg.new_rest,str));
675: sprintf(opt[i++],"%-27.27s%s","Expiration Days"
676: ,ultoa(cfg.new_expire,str,10));
677:
678: ultoac(cfg.new_cdt,str);
679: sprintf(opt[i++],"%-27.27s%s","Credits",str);
680: ultoac(cfg.new_min,str);
681: sprintf(opt[i++],"%-27.27s%s","Minutes",str);
682: sprintf(opt[i++],"%-27.27s%s","Editor"
683: ,cfg.new_xedit);
684: sprintf(opt[i++],"%-27.27s%s","Command Shell"
685: ,cfg.shell[cfg.new_shell]->code);
686: if(cfg.new_prot!=' ')
687: sprintf(str,"%c",cfg.new_prot);
688: else
689: strcpy(str,"None");
690: sprintf(opt[i++],"%-27.27s%s","Download Protocol",str);
691: strcpy(opt[i++],"Default Toggles...");
692: strcpy(opt[i++],"Question Toggles...");
693: opt[i][0]=0;
694: SETHELP(WHERE);
695: /*
696: &New User Values:&
697:
698: This menu allows you to determine the default settings for new users.
699: */
700: switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&new_dflt,0
701: ,"New User Values",opt)) {
702: case -1:
703: done=1;
704: break;
705: case 0:
706: ultoa(cfg.new_level,str,10);
707: SETHELP(WHERE);
708: /*
709: &New User Security Level:&
710:
711: This is the security level automatically given to new users.
712: */
713: uifc.input(WIN_SAV|WIN_MID,0,0,"Security Level"
714: ,str,2,K_EDIT|K_NUMBER);
715: cfg.new_level=atoi(str);
716: break;
717: case 1:
718: truncsp(ltoaf(cfg.new_flags1,str));
719: SETHELP(WHERE);
720: /*
721: &New User Security Flags:&
722:
723: These are the security flags automatically given to new users.
724: */
725: uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #1"
726: ,str,26,K_EDIT|K_UPPER|K_ALPHA);
727: cfg.new_flags1=aftol(str);
728: break;
729: case 2:
730: truncsp(ltoaf(cfg.new_flags2,str));
731: SETHELP(WHERE);
732: /*
733: &New User Security Flags:&
734:
735: These are the security flags automatically given to new users.
736: */
737: uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #2"
738: ,str,26,K_EDIT|K_UPPER|K_ALPHA);
739: cfg.new_flags2=aftol(str);
740: break;
741: case 3:
742: truncsp(ltoaf(cfg.new_flags3,str));
743: SETHELP(WHERE);
744: /*
745: &New User Security Flags:&
746:
747: These are the security flags automatically given to new users.
748: */
749: uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #3"
750: ,str,26,K_EDIT|K_UPPER|K_ALPHA);
751: cfg.new_flags3=aftol(str);
752: break;
753: case 4:
754: truncsp(ltoaf(cfg.new_flags4,str));
755: SETHELP(WHERE);
756: /*
757: &New User Security Flags:&
758:
759: These are the security flags automatically given to new users.
760: */
761: uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #4"
762: ,str,26,K_EDIT|K_UPPER|K_ALPHA);
763: cfg.new_flags4=aftol(str);
764: break;
765: case 5:
766: truncsp(ltoaf(cfg.new_exempt,str));
767: SETHELP(WHERE);
768: /*
769: &New User Exemption Flags:&
770:
771: These are the exemptions that are automatically given to new users.
772: */
773: uifc.input(WIN_SAV|WIN_MID,0,0,"Exemption Flags",str,26
774: ,K_EDIT|K_UPPER|K_ALPHA);
775: cfg.new_exempt=aftol(str);
776: break;
777: case 6:
778: truncsp(ltoaf(cfg.new_rest,str));
779: SETHELP(WHERE);
780: /*
781: &New User Restriction Flags:&
782:
783: These are the restrictions that are automatically given to new users.
784: */
785: uifc.input(WIN_SAV|WIN_MID,0,0,"Restriction Flags",str,26
786: ,K_EDIT|K_UPPER|K_ALPHA);
787: cfg.new_rest=aftol(str);
788: break;
789: case 7:
790: ultoa(cfg.new_expire,str,10);
791: SETHELP(WHERE);
792: /*
793: &New User Expiration Days:&
794:
795: If you wish new users to have an automatic expiration date, set this
796: value to the number of days before the user will expire. To disable
797: New User expiration, set this value to &0&.
798: */
799: uifc.input(WIN_SAV|WIN_MID,0,0,"Expiration Days",str,4
800: ,K_EDIT|K_NUMBER);
801: cfg.new_expire=atoi(str);
802: break;
803: case 8:
804: ultoa(cfg.new_cdt,str,10);
805: SETHELP(WHERE);
806: /*
807: &New User Credits:&
808:
809: This is the amount of credits that are automatically given to new users.
810: */
811: uifc.input(WIN_SAV|WIN_MID,0,0,"Credits",str,10
812: ,K_EDIT|K_NUMBER);
813: cfg.new_cdt=atol(str);
814: break;
815: case 9:
816: ultoa(cfg.new_min,str,10);
817: SETHELP(WHERE);
818: /*
819: &New User Minutes:&
820:
821: This is the number of extra minutes automatically given to new users.
822: */
823: uifc.input(WIN_SAV|WIN_MID,0,0,"Minutes (Time Credit)"
824: ,str,10,K_EDIT|K_NUMBER);
825: cfg.new_min=atol(str);
826: break;
827: case 10:
828: if(!cfg.total_xedits) {
829: uifc.msg("No External Editors Configured");
830: break; }
831: strcpy(opt[0],"Internal");
832: for(i=1;i<=cfg.total_xedits;i++)
833: strcpy(opt[i],cfg.xedit[i-1]->code);
834: opt[i][0]=0;
835: i=0;
836: uifc.savnum=0;
837: SETHELP(WHERE);
838: /*
839: &New User Editor:&
840:
841: You can use this option to select the default editor for new users.
842: */
843: i=uifc.list(WIN_SAV|WIN_RHT,2,1,13,&i,0,"Editors",opt);
844: if(i==-1)
845: break;
846: uifc.changes=1;
847: if(i && i<=cfg.total_xedits)
848: sprintf(cfg.new_xedit,"%-.8s",cfg.xedit[i-1]->code);
849: else
850: cfg.new_xedit[0]=0;
851: break;
852: case 11:
853: for(i=0;i<cfg.total_shells && i<MAX_OPTS;i++)
854: sprintf(opt[i],"%-.8s",cfg.shell[i]->code);
855: opt[i][0]=0;
856: i=0;
857: uifc.savnum=0;
858: SETHELP(WHERE);
859: /*
860: &New User Command Shell:&
861:
862: You can use this option to select the default command shell for new
863: users.
864: */
865: i=uifc.list(WIN_SAV|WIN_RHT,2,1,13,&i,0
866: ,"Command Shells",opt);
867: if(i==-1)
868: break;
869: cfg.new_shell=i;
870: uifc.changes=1;
871: break;
872: case 12:
873: SETHELP(WHERE);
874: /*
875: &New User Default Download Protocol:&
876:
877: This option allows you to set the default download protocol of new users
878: (protocol command key or &BLANK& for no default).
879: */
880: sprintf(str,"%c",cfg.new_prot);
881: uifc.input(WIN_SAV|WIN_MID,0,0
882: ,"Default Download Protocol (SPACE=Disabled)"
883: ,str,1,K_EDIT|K_UPPER);
884: cfg.new_prot=str[0];
885: if(cfg.new_prot<' ')
886: cfg.new_prot=' ';
887: break;
888: case 13:
889: SETHELP(WHERE);
890: /*
891: &New User Default Toggle Options:&
892:
893: This menu contains the default state of new user toggle options. All new
894: users on your system will have their defaults set according to the
895: settings on this menu. The user can then change them to his or her
896: liking.
897:
898: See the Synchronet User Manual for more information on the individual
899: options available.
900: */
901: j=0;
902: while(1) {
903: i=0;
904: sprintf(opt[i++],"%-27.27s %-3.3s"
905: ,"Expert Menu Mode"
906: ,cfg.new_misc&EXPERT ? "Yes":"No");
907: sprintf(opt[i++],"%-27.27s %-3.3s"
908: ,"Screen Pause"
909: ,cfg.new_misc&UPAUSE ? "Yes":"No");
910: sprintf(opt[i++],"%-27.27s %-3.3s"
911: ,"Spinning Cursor"
912: ,cfg.new_misc&SPIN ? "Yes":"No");
913: sprintf(opt[i++],"%-27.27s %-3.3s"
914: ,"Clear Screen"
915: ,cfg.new_misc&CLRSCRN ? "Yes":"No");
916: sprintf(opt[i++],"%-27.27s %-3.3s"
917: ,"Ask For New Scan"
918: ,cfg.new_misc&ASK_NSCAN ? "Yes":"No");
919: sprintf(opt[i++],"%-27.27s %-3.3s"
920: ,"Ask For Your Msg Scan"
921: ,cfg.new_misc&ASK_SSCAN ? "Yes":"No");
922: sprintf(opt[i++],"%-27.27s %-3.3s"
923: ,"Automatic New File Scan"
924: ,cfg.new_misc&ANFSCAN ? "Yes":"No");
925: sprintf(opt[i++],"%-27.27s %-3.3s"
926: ,"Remember Current Sub-board"
927: ,cfg.new_misc&CURSUB ? "Yes":"No");
928: sprintf(opt[i++],"%-27.27s %-3.3s"
929: ,"Batch Download File Flag"
930: ,cfg.new_misc&BATCHFLAG ? "Yes":"No");
931: sprintf(opt[i++],"%-27.27s %-3.3s"
932: ,"Extended File Descriptions"
933: ,cfg.new_misc&EXTDESC ? "Yes":"No");
934: sprintf(opt[i++],"%-27.27s %-3.3s"
935: ,"Hot Keys"
936: ,cfg.new_misc&COLDKEYS ? "No":"Yes");
937: sprintf(opt[i++],"%-27.27s %-3.3s"
938: ,"Auto Hang-up After Xfer"
939: ,cfg.new_misc&AUTOHANG ? "Yes":"No");
940: opt[i][0]=0;
941: j=uifc.list(WIN_BOT|WIN_RHT,2,1,0,&j,0
942: ,"Default Toggle Options",opt);
943: if(j==-1)
944: break;
945: uifc.changes=1;
946: switch(j) {
947: case 0:
948: cfg.new_misc^=EXPERT;
949: break;
950: case 1:
951: cfg.new_misc^=UPAUSE;
952: break;
953: case 2:
954: cfg.new_misc^=SPIN;
955: break;
956: case 3:
957: cfg.new_misc^=CLRSCRN;
958: break;
959: case 4:
960: cfg.new_misc^=ASK_NSCAN;
961: break;
962: case 5:
963: cfg.new_misc^=ASK_SSCAN;
964: break;
965: case 6:
966: cfg.new_misc^=ANFSCAN;
967: break;
968: case 7:
969: cfg.new_misc^=CURSUB;
970: break;
971: case 8:
972: cfg.new_misc^=BATCHFLAG;
973: break;
974: case 9:
975: cfg.new_misc^=EXTDESC;
976: break;
977: case 10:
978: cfg.new_misc^=COLDKEYS;
979: break;
980: case 11:
981: cfg.new_misc^=AUTOHANG;
982: break;
983: } }
984: break;
985: case 14:
986: SETHELP(WHERE);
987: /*
988: &New User Question Toggle Options:&
989:
990: This menu allows you to decide which questions will be asked of a new
991: user.
992: */
993: j=0;
994: while(1) {
995: i=0;
996: sprintf(opt[i++],"%-27.27s %-3.3s"
997: ,"Real Name"
998: ,cfg.uq&UQ_REALNAME ? "Yes":"No");
999: sprintf(opt[i++],"%-27.27s %-3.3s"
1000: ,"Force Unique Real Name"
1001: ,cfg.uq&UQ_DUPREAL ? "Yes":"No");
1002: sprintf(opt[i++],"%-27.27s %-3.3s"
1003: ,"Force Upper/Lower Case"
1004: ,cfg.uq&UQ_NOUPRLWR ? "No":"Yes");
1005: sprintf(opt[i++],"%-27.27s %-3.3s"
1006: ,"Company Name"
1007: ,cfg.uq&UQ_COMPANY ? "Yes":"No");
1008: sprintf(opt[i++],"%-27.27s %-3.3s"
1009: ,"Multinode Chat Handle"
1010: ,cfg.uq&UQ_HANDLE ? "Yes":"No");
1011: sprintf(opt[i++],"%-27.27s %-3.3s"
1012: ,"Force Unique Chat Handle"
1013: ,cfg.uq&UQ_DUPHAND ? "Yes":"No");
1014: sprintf(opt[i++],"%-27.27s %-3.3s"
1015: ,"E-mail/NetMail Address"
1016: ,cfg.uq&UQ_NONETMAIL ? "No":"Yes");
1017: sprintf(opt[i++],"%-27.27s %-3.3s"
1018: ,"Sex (Gender)"
1019: ,cfg.uq&UQ_SEX ? "Yes":"No");
1020: sprintf(opt[i++],"%-27.27s %-3.3s"
1021: ,"Birthday"
1022: ,cfg.uq&UQ_BIRTH ? "Yes":"No");
1023: sprintf(opt[i++],"%-27.27s %-3.3s"
1024: ,"Address and Zip Code"
1025: ,cfg.uq&UQ_ADDRESS ? "Yes":"No");
1026: sprintf(opt[i++],"%-27.27s %-3.3s"
1027: ,"Location"
1028: ,cfg.uq&UQ_LOCATION ? "Yes":"No");
1029: sprintf(opt[i++],"%-27.27s %-3.3s"
1030: ,"Require Comma in Location"
1031: ,cfg.uq&UQ_NOCOMMAS ? "No":"Yes");
1032: sprintf(opt[i++],"%-27.27s %-3.3s"
1033: ,"Phone Number"
1034: ,cfg.uq&UQ_PHONE ? "Yes":"No");
1035: sprintf(opt[i++],"%-27.27s %-3.3s"
1036: ,"Allow EX-ASCII in Answers"
1037: ,cfg.uq&UQ_NOEXASC ? "No":"Yes");
1038: sprintf(opt[i++],"%-27.27s %-3.3s"
1039: ,"External Editor"
1040: ,cfg.uq&UQ_XEDIT ? "Yes":"No");
1041: sprintf(opt[i++],"%-27.27s %-3.3s"
1042: ,"Command Shell"
1043: ,cfg.uq&UQ_CMDSHELL ? "Yes":"No");
1044: sprintf(opt[i++],"%-27.27s %-3.3s"
1045: ,"Default Settings"
1046: ,cfg.uq&UQ_NODEF ? "No":"Yes");
1047: opt[i][0]=0;
1048: j=uifc.list(WIN_BOT|WIN_RHT|WIN_SAV,2,1,0,&j,0
1049: ,"New User Questions",opt);
1050: if(j==-1)
1051: break;
1052: uifc.changes=1;
1053: switch(j) {
1054: case 0:
1055: cfg.uq^=UQ_REALNAME;
1056: break;
1057: case 1:
1058: cfg.uq^=UQ_DUPREAL;
1059: break;
1060: case 2:
1061: cfg.uq^=UQ_NOUPRLWR;
1062: break;
1063: case 3:
1064: cfg.uq^=UQ_COMPANY;
1065: break;
1066: case 4:
1067: cfg.uq^=UQ_HANDLE;
1068: break;
1069: case 5:
1070: cfg.uq^=UQ_DUPHAND;
1071: break;
1072: case 6:
1073: cfg.uq^=UQ_NONETMAIL;
1074: break;
1075: case 7:
1076: cfg.uq^=UQ_SEX;
1077: break;
1078: case 8:
1079: cfg.uq^=UQ_BIRTH;
1080: break;
1081: case 9:
1082: cfg.uq^=UQ_ADDRESS;
1083: break;
1084: case 10:
1085: cfg.uq^=UQ_LOCATION;
1086: break;
1087: case 11:
1088: cfg.uq^=UQ_NOCOMMAS;
1089: break;
1090: case 12:
1091: cfg.uq^=UQ_PHONE;
1092: break;
1093: case 13:
1094: cfg.uq^=UQ_NOEXASC;
1095: break;
1096: case 14:
1097: cfg.uq^=UQ_XEDIT;
1098: break;
1099: case 15:
1100: cfg.uq^=UQ_CMDSHELL;
1101: break;
1102: case 16:
1103: cfg.uq^=UQ_NODEF;
1104: break;
1105: } }
1106: break; } }
1107: break;
1108: case 10: /* Advanced Options */
1109: done=0;
1110: while(!done) {
1111: i=0;
1112: sprintf(opt[i++],"%-27.27s%s","New User Magic Word",cfg.new_magic);
1113: sprintf(opt[i++],"%-27.27s%.40s","Data Directory"
1114: ,cfg.data_dir);
1115: sprintf(opt[i++],"%-27.27s%.40s","Logs Directory"
1116: ,cfg.logs_dir);
1117: sprintf(opt[i++],"%-27.27s%.40s","Exec Directory"
1118: ,cfg.exec_dir);
1119: sprintf(opt[i++],"%-27.27s%.40s","Mods Directory"
1120: ,cfg.mods_dir);
1121: sprintf(opt[i++],"%-27.27s%s","Input SIF Questionnaire"
1122: ,cfg.new_sif);
1123: sprintf(opt[i++],"%-27.27s%s","Output SIF Questionnaire"
1124: ,cfg.new_sof);
1125: ultoac(cfg.cdt_per_dollar,str);
1126: sprintf(opt[i++],"%-27.27s%s","Credits Per Dollar",str);
1127: sprintf(opt[i++],"%-27.27s%u","Minutes Per 100k Credits"
1128: ,cfg.cdt_min_value);
1129: sprintf(opt[i++],"%-27.27s%s","Maximum Number of Minutes"
1130: ,cfg.max_minutes ? ultoa(cfg.max_minutes,tmp,10) : "Unlimited");
1131: sprintf(opt[i++],"%-27.27s%u","Warning Days Till Expire"
1132: ,cfg.sys_exp_warn);
1133: sprintf(opt[i++],"%-27.27s%u","Last Displayable Node"
1134: ,cfg.sys_lastnode);
1135: sprintf(opt[i++],"%-27.27s%s","Phone Number Format"
1136: ,cfg.sys_phonefmt);
1137: sprintf(opt[i++],"%-27.27s%.40s","Sysop Chat Override"
1138: ,cfg.sys_chat_arstr);
1139: if(cfg.user_backup_level)
1140: sprintf(str,"%hu",cfg.user_backup_level);
1141: else
1142: strcpy(str,"None");
1143: sprintf(opt[i++],"%-27.27s%s","User Database Backups",str);
1144: if(cfg.mail_backup_level)
1145: sprintf(str,"%hu",cfg.mail_backup_level);
1146: else
1147: strcpy(str,"None");
1148: sprintf(opt[i++],"%-27.27s%s","Mail Database Backups",str);
1149: sprintf(opt[i++],"%-27.27s%lX","Control Key Pass-through"
1150: ,cfg.ctrlkey_passthru);
1151: opt[i][0]=0;
1152: uifc.savnum=0;
1153: SETHELP(WHERE);
1154: /*
1155: &System Advanced Options:&
1156:
1157: Care should be taken when modifying any of the options listed here.
1158: */
1159: switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&adv_dflt,0
1160: ,"Advanced Options",opt)) {
1161: case -1:
1162: done=1;
1163: break;
1164:
1165: case 0:
1166: SETHELP(WHERE);
1167: /*
1168: &New User Magic Word:&
1169:
1170: If this field has a value, it is assumed the sysop has placed some
1171: reference to this &magic word& in TEXT\NEWUSER.MSG and new users
1172: will be prompted for the magic word after they enter their password.
1173: If they do not enter it correctly, it is assumed they didn't read the
1174: new user information displayed to them and they are disconnected.
1175:
1176: Think of it as a password to guarantee that new users read the text
1177: displayed to them.
1178: */
1179: uifc.input(WIN_MID,0,0,"New User Magic Word",cfg.new_magic,sizeof(cfg.new_magic)-1
1180: ,K_EDIT|K_UPPER);
1181: break;
1182: case 1:
1183: SETHELP(WHERE);
1184: /*
1185: `Data File Directory:`
1186:
1187: The Synchronet data directory contains almost all the data for your BBS.
1188: This directory must be located where `ALL` nodes can access it and
1189: `MUST NOT` be placed on a RAM disk or other volatile media.
1190:
1191: This option allows you to change the location of your data directory.
1192: */
1193: strcpy(str,cfg.data_dir);
1194: if(uifc.input(WIN_MID|WIN_SAV,0,9,"Data Directory"
1195: ,str,sizeof(cfg.data_dir)-1,K_EDIT)>0) {
1196: backslash(str);
1197: SAFECOPY(cfg.data_dir,str);
1198: }
1199: break;
1200: case 2:
1201: SETHELP(WHERE);
1202: /*
1203: `Log File Directory:`
1204:
1205: Log files will be stored in this directory.
1206: */
1207: strcpy(str,cfg.logs_dir);
1208: if(uifc.input(WIN_MID|WIN_SAV,0,9,"Logs Directory"
1209: ,str,sizeof(cfg.logs_dir)-1,K_EDIT)>0) {
1210: backslash(str);
1211: SAFECOPY(cfg.logs_dir,str);
1212: }
1213: break;
1214: case 3:
1215: SETHELP(WHERE);
1216: /*
1217: `Executable/Module File Directory:`
1218:
1219: The Synchronet exec directory contains executable files that your BBS
1220: executes. This directory does `not` need to be in your DOS search path.
1221: If you place programs in this directory for the BBS to execute, you
1222: should place the `%!` abreviation for this exec directory at the
1223: beginning of the command line.
1224:
1225: This option allows you to change the location of your exec directory.
1226: */
1227: strcpy(str,cfg.exec_dir);
1228: if(uifc.input(WIN_MID|WIN_SAV,0,9,"Exec Directory"
1229: ,str,sizeof(cfg.exec_dir)-1,K_EDIT)>0) {
1230: backslash(str);
1231: SAFECOPY(cfg.exec_dir,str);
1232: }
1233: break;
1234: case 4:
1235: SETHELP(WHERE);
1236: /*
1237: `Modified Modules Directory:`
1238:
1239: This optional directory can be used to specify a location where modified
1240: module files are stored. These modified modules will take precedence over
1241: stock modules with the same filename (in the exec directory) and will
1242: not be overwritten by future updates/upgrades.
1243:
1244: If this directory is `blank`, then this feature is not used and all modules
1245: are assumed to be located in the `exec` directory.
1246: */
1247: strcpy(str,cfg.mods_dir);
1248: if(uifc.input(WIN_MID|WIN_SAV,0,9,"Mods Directory"
1249: ,str,sizeof(cfg.mods_dir)-1,K_EDIT)>0) {
1250: backslash(str);
1251: SAFECOPY(cfg.mods_dir,str);
1252: }
1253: break;
1254: case 5:
1255: strcpy(str,cfg.new_sif);
1256: SETHELP(WHERE);
1257: /*
1258: &SIF Questionnaire for User Input:&
1259:
1260: This is the name of a SIF questionnaire file that resides your text
1261: directory that all users will be prompted to answer.
1262: */
1263: uifc.input(WIN_MID|WIN_SAV,0,0
1264: ,"SIF Questionnaire for User Input"
1265: ,str,LEN_CODE,K_UPPER|K_EDIT);
1266: if(!str[0] || code_ok(str))
1267: strcpy(cfg.new_sif,str);
1268: else
1269: uifc.msg("Invalid SIF Name");
1270: break;
1271: case 6:
1272: strcpy(str,cfg.new_sof);
1273: SETHELP(WHERE);
1274: /*
1275: &SIF Questionnaire for Reviewing User Input:&
1276:
1277: This is the SIF file used to review the input of users from the user
1278: edit function.
1279: */
1280: uifc.input(WIN_MID|WIN_SAV,0,0
1281: ,"SIF Questionnaire for Reviewing User Input"
1282: ,str,LEN_CODE,K_EDIT);
1283: if(!str[0] || code_ok(str))
1284: strcpy(cfg.new_sof,str);
1285: else
1286: uifc.msg("Invalid SIF Name");
1287: break;
1288: case 7:
1289: SETHELP(WHERE);
1290: /*
1291: &Credits Per Dollar:&
1292:
1293: This is the monetary value of a credit (How many credits per dollar).
1294: This value should be a power of 2 (1, 2, 4, 8, 16, 32, 64, 128, etc.)
1295: since credits are usually converted by 100 kilobyte (102400) blocks.
1296: To make a dollar worth two megabytes of credits, set this value to
1297: 2,097,152 (a megabyte is 1024*1024 or 1048576).
1298: */
1299: ultoa(cfg.cdt_per_dollar,str,10);
1300: uifc.input(WIN_MID|WIN_SAV,0,0
1301: ,"Credits Per Dollar",str,10,K_NUMBER|K_EDIT);
1302: cfg.cdt_per_dollar=atol(str);
1303: break;
1304: case 8:
1305: SETHELP(WHERE);
1306: /*
1307: &Minutes Per 100K Credits:&
1308:
1309: This is the value of a minute of time online. This field is the number
1310: of minutes to give the user in exchange for each 100K credit block.
1311: */
1312: sprintf(str,"%u",cfg.cdt_min_value);
1313: uifc.input(WIN_MID|WIN_SAV,0,0
1314: ,"Minutes Per 100K Credits",str,5,K_NUMBER|K_EDIT);
1315: cfg.cdt_min_value=atoi(str);
1316: break;
1317: case 9:
1318: SETHELP(WHERE);
1319: /*
1320: &Maximum Number of Minutes User Can Have:&
1321:
1322: This value is the maximum total number of minutes a user can have. If a
1323: user has this number of minutes or more, they will not be allowed to
1324: convert credits into minutes. A sysop can add minutes to a user's
1325: account regardless of this maximum. If this value is set to &0&, users
1326: will have no limit on the total number of minutes they can have.
1327: */
1328: sprintf(str,"%lu",cfg.max_minutes);
1329: uifc.input(WIN_MID|WIN_SAV,0,0
1330: ,"Maximum Number of Minutes a User Can Have "
1331: "(0=No Limit)"
1332: ,str,10,K_NUMBER|K_EDIT);
1333: cfg.max_minutes=atol(str);
1334: break;
1335: case 10:
1336: SETHELP(WHERE);
1337: /*
1338: &Warning Days Till Expire:&
1339:
1340: If a user's account will expire in this many days or less, the user will
1341: be notified at logon. Setting this value to &0& disables the warning
1342: completely.
1343: */
1344: sprintf(str,"%u",cfg.sys_exp_warn);
1345: uifc.input(WIN_MID|WIN_SAV,0,0
1346: ,"Warning Days Till Expire",str,5,K_NUMBER|K_EDIT);
1347: cfg.sys_exp_warn=atoi(str);
1348: break;
1349: case 11:
1350: SETHELP(WHERE);
1351: /*
1352: &Last Displayed Node:&
1353:
1354: This is the number of the last node to display to users in node lists.
1355: This allows the sysop to define the higher numbered nodes as &invisible&
1356: to users.
1357: */
1358: sprintf(str,"%u",cfg.sys_lastnode);
1359: uifc.input(WIN_MID|WIN_SAV,0,0
1360: ,"Last Displayed Node",str,5,K_NUMBER|K_EDIT);
1361: cfg.sys_lastnode=atoi(str);
1362: break;
1363: case 12:
1364: SETHELP(WHERE);
1365: /*
1366: &Phone Number Format:&
1367:
1368: This is the format used for phone numbers in your local calling
1369: area. Use &N& for number positions, &A& for alphabetic, or &!& for any
1370: character. All other characters will be static in the phone number
1371: format. An example for North American phone numbers is &NNN-NNN-NNNN&.
1372: */
1373: uifc.input(WIN_MID|WIN_SAV,0,0
1374: ,"Phone Number Format",cfg.sys_phonefmt
1375: ,LEN_PHONE,K_UPPER|K_EDIT);
1376: break;
1377: case 13:
1378: getar("Sysop Chat Override",cfg.sys_chat_arstr);
1379: break;
1380: case 14:
1381: SETHELP(WHERE);
1382: /*
1383: `User Database Backups:`
1384:
1385: Setting this option to anything but 0 will enable automatic daily
1386: backups of the user database. This number determines how many backups
1387: to keep on disk.
1388: */
1389: sprintf(str,"%u",cfg.user_backup_level);
1390: uifc.input(WIN_MID|WIN_SAV,0,0
1391: ,"Number of Daily User Database Backups to Keep"
1392: ,str,4,K_NUMBER|K_EDIT);
1393: cfg.user_backup_level=atoi(str);
1394: break;
1395: case 15:
1396: SETHELP(WHERE);
1397: /*
1398: `Mail Database Backups:`
1399:
1400: Setting this option to anything but 0 will enable automatic daily
1401: backups of the mail database. This number determines how many backups
1402: to keep on disk.
1403: */
1404: sprintf(str,"%u",cfg.mail_backup_level);
1405: uifc.input(WIN_MID|WIN_SAV,0,0
1406: ,"Number of Daily Mail Database Backups to Keep"
1407: ,str,4,K_NUMBER|K_EDIT);
1408: cfg.mail_backup_level=atoi(str);
1409: break;
1410: case 16:
1411: SETHELP(WHERE);
1412: /*
1413: `Control Key Pass-through:`
1414:
1415: This value is a 32-bit hexadecimal number. Each set bit represents a
1416: control key combination that will `not` be handled internally by
1417: Synchronet or by a Global Hot Key Event.
1418:
1419: To disable internal handling of the `Ctrl-C` key combination (for example),
1420: set this value to `8`. The value is determined by taking 2 to the power of
1421: the ASCII value of the control character (Ctrl-A is 1, Ctrl-B is 2, etc).
1422: In the case of Ctrl-C, taking 2 to the power of 3 equals 8.
1423:
1424: To pass-through multiple control key combinations, multiple bits must be
1425: set (or'd together) which may require the use of a hexadecimal
1426: calculator.
1427:
1428: If unsure, leave this value set to `0`, the default.
1429: */
1430: sprintf(str,"%lX",cfg.ctrlkey_passthru);
1431: uifc.input(WIN_MID|WIN_SAV,0,0
1432: ,"Control Key Pass-through"
1433: ,str,8,K_UPPER|K_EDIT);
1434: cfg.ctrlkey_passthru=strtoul(str,NULL,16);
1435: break;
1436: } }
1437: break;
1438: case 11: /* Loadable Modules */
1439: done=0;
1440: k=0;
1441: while(!done) {
1442: i=0;
1443: sprintf(opt[i++],"%-16.16s%s","Login",cfg.login_mod);
1444: sprintf(opt[i++],"%-16.16s%s","Logon Event",cfg.logon_mod);
1445: sprintf(opt[i++],"%-16.16s%s","Sync Event",cfg.sync_mod);
1446: sprintf(opt[i++],"%-16.16s%s","Logoff Event",cfg.logoff_mod);
1447: sprintf(opt[i++],"%-16.16s%s","Logout Event",cfg.logout_mod);
1448: sprintf(opt[i++],"%-16.16s%s","New User Event",cfg.newuser_mod);
1449: sprintf(opt[i++],"%-16.16s%s","Expired User",cfg.expire_mod);
1450: opt[i][0]=0;
1451: uifc.savnum=0;
1452: SETHELP(WHERE);
1453: /*
1454: &Loadable Modules:&
1455:
1456: Baja modules (.BIN files) can be automatically loaded and executed
1457: during certain system functions. The name of the module can be specified
1458: for each of the available triggers listed here.
1459:
1460: &Login& Required module for remote and local logins (online)
1461: &Logon& Executed as an event during logon procedure (online)
1462: &Sync& Executed when nodes are periodically synchronized (online)
1463: &Logoff& Executed during logoff procedure (online)
1464: &Logout& Executed during logout procedure (offline)
1465: &New User& Executed at end of new user procedure (online)
1466: &Expired User& Executed during daily event when user expires (offline)
1467: */
1468: switch(uifc.list(WIN_ACT|WIN_T2B|WIN_RHT,0,0,32,&k,0
1469: ,"Loadable Modules",opt)) {
1470:
1471: case -1:
1472: done=1;
1473: break;
1474:
1475: case 0:
1476: uifc.input(WIN_MID|WIN_SAV,0,0,"Login Module"
1477: ,cfg.login_mod,sizeof(cfg.login_mod)-1,K_EDIT);
1478: break;
1479: case 1:
1480: uifc.input(WIN_MID|WIN_SAV,0,0,"Logon Module"
1481: ,cfg.logon_mod,sizeof(cfg.logon_mod)-1,K_EDIT);
1482: break;
1483: case 2:
1484: uifc.input(WIN_MID|WIN_SAV,0,0,"Synchronize Module"
1485: ,cfg.sync_mod,sizeof(cfg.sync_mod)-1,K_EDIT);
1486: break;
1487: case 3:
1488: uifc.input(WIN_MID|WIN_SAV,0,0,"Logoff Module"
1489: ,cfg.logoff_mod,sizeof(cfg.logoff_mod)-1,K_EDIT);
1490: break;
1491: case 4:
1492: uifc.input(WIN_MID|WIN_SAV,0,0,"Logout Module"
1493: ,cfg.logout_mod,sizeof(cfg.logout_mod)-1,K_EDIT);
1494: break;
1495: case 5:
1496: uifc.input(WIN_MID|WIN_SAV,0,0,"New User Module"
1497: ,cfg.newuser_mod,sizeof(cfg.newuser_mod)-1,K_EDIT);
1498: break;
1499: case 6:
1500: uifc.input(WIN_MID|WIN_SAV,0,0,"Expired User Module"
1501: ,cfg.expire_mod,sizeof(cfg.expire_mod)-1,K_EDIT);
1502: break;
1503:
1504: } }
1505: break;
1506:
1507: case 12: /* Security Levels */
1508: dflt=bar=0;
1509: k=0;
1510: while(1) {
1511: for(i=0;i<100;i++) {
1512: sprintf(tmp,"%luk",cfg.level_freecdtperday[i]/1024L);
1513: sprintf(opt[i],"%-2d %5d %5d "
1514: "%5d %5d %5d %5d %6s %7s %2u",i
1515: ,cfg.level_timeperday[i],cfg.level_timepercall[i]
1516: ,cfg.level_callsperday[i],cfg.level_emailperday[i]
1517: ,cfg.level_postsperday[i],cfg.level_linespermsg[i]
1518: ,tmp
1519: ,cfg.level_misc[i]&LEVEL_EXPTOVAL ? "Val Set" : "Level"
1520: ,cfg.level_misc[i]&(LEVEL_EXPTOVAL|LEVEL_EXPTOLVL) ?
1521: cfg.level_expireto[i] : cfg.expired_level); }
1522: opt[i][0]=0;
1523: i=0;
1524: SETHELP(WHERE);
1525: /*
1526: &Security Level Values:&
1527:
1528: This menu allows you to change the security options for every possible
1529: security level from 0 to 99. The available options for each level are:
1530:
1531: Time Per Day : Maximum online time per day
1532: Time Per Call : Maximum online time per call
1533: Calls Per Day : Maximum number of calls per day
1534: Email Per Day : Maximum number of email per day
1535: Posts Per Day : Maximum number of posts per day
1536: Lines Per Message : Maximum number of lines per message
1537: Free Credits Per Day : Number of free credits per day
1538: Expire To : Level or validation set to Expire to
1539: */
1540: i=uifc.list(WIN_RHT|WIN_ACT,0,3,0,&dflt,&bar
1541: ,"Level T/D T/C C/D E/D P/D L/M F/D "
1542: "Expire To",opt);
1543: if(i==-1)
1544: break;
1545: while(1) {
1546: sprintf(str,"Security Level %d Values",i);
1547: j=0;
1548: sprintf(opt[j++],"%-22.22s%-5u","Time Per Day"
1549: ,cfg.level_timeperday[i]);
1550: sprintf(opt[j++],"%-22.22s%-5u","Time Per Call"
1551: ,cfg.level_timepercall[i]);
1552: sprintf(opt[j++],"%-22.22s%-5u","Calls Per Day"
1553: ,cfg.level_callsperday[i]);
1554: sprintf(opt[j++],"%-22.22s%-5u","Email Per Day"
1555: ,cfg.level_emailperday[i]);
1556: sprintf(opt[j++],"%-22.22s%-5u","Posts Per Day"
1557: ,cfg.level_postsperday[i]);
1558: sprintf(opt[j++],"%-22.22s%-5u","Lines Per Message"
1559: ,cfg.level_linespermsg[i]);
1560: sprintf(tmp,"%luk",cfg.level_freecdtperday[i]/1024L);
1561: sprintf(opt[j++],"%-22.22s%-6s","Free Credits Per Day"
1562: ,tmp);
1563: sprintf(opt[j++],"%-22.22s%s %u","Expire To"
1564: ,cfg.level_misc[i]&LEVEL_EXPTOVAL ? "Validation Set"
1565: : "Level"
1566: ,cfg.level_misc[i]&(LEVEL_EXPTOVAL|LEVEL_EXPTOLVL) ?
1567: cfg.level_expireto[i] : cfg.expired_level);
1568: opt[j][0]=0;
1569: uifc.savnum=0;
1570: j=uifc.list(WIN_RHT|WIN_SAV|WIN_ACT,2,1,0,&k,0
1571: ,str,opt);
1572: if(j==-1)
1573: break;
1574: switch(j) {
1575: case 0:
1576: uifc.input(WIN_MID|WIN_SAV,0,0
1577: ,"Total Time Allowed Per Day"
1578: ,ultoa(cfg.level_timeperday[i],tmp,10),4
1579: ,K_NUMBER|K_EDIT);
1580: cfg.level_timeperday[i]=atoi(tmp);
1581: if(cfg.level_timeperday[i]>1440)
1582: cfg.level_timeperday[i]=1440;
1583: break;
1584: case 1:
1585: uifc.input(WIN_MID|WIN_SAV,0,0
1586: ,"Time Allowed Per Call"
1587: ,ultoa(cfg.level_timepercall[i],tmp,10),4
1588: ,K_NUMBER|K_EDIT);
1589: cfg.level_timepercall[i]=atoi(tmp);
1590: if(cfg.level_timepercall[i]>1440)
1591: cfg.level_timepercall[i]=1440;
1592: break;
1593: case 2:
1594: uifc.input(WIN_MID|WIN_SAV,0,0
1595: ,"Calls Allowed Per Day"
1596: ,ultoa(cfg.level_callsperday[i],tmp,10),4
1597: ,K_NUMBER|K_EDIT);
1598: cfg.level_callsperday[i]=atoi(tmp);
1599: break;
1600: case 3:
1601: uifc.input(WIN_MID|WIN_SAV,0,0
1602: ,"Email Allowed Per Day"
1603: ,ultoa(cfg.level_emailperday[i],tmp,10),4
1604: ,K_NUMBER|K_EDIT);
1605: cfg.level_emailperday[i]=atoi(tmp);
1606: break;
1607: case 4:
1608: uifc.input(WIN_MID|WIN_SAV,0,0
1609: ,"Posts Allowed Per Day"
1610: ,ultoa(cfg.level_postsperday[i],tmp,10),4
1611: ,K_NUMBER|K_EDIT);
1612: cfg.level_postsperday[i]=atoi(tmp);
1613: break;
1614: case 5:
1615: uifc.input(WIN_MID|WIN_SAV,0,0
1616: ,"Lines Allowed Per Message (Post/E-mail)"
1617: ,ultoa(cfg.level_linespermsg[i],tmp,10),5
1618: ,K_NUMBER|K_EDIT);
1619: cfg.level_linespermsg[i]=atoi(tmp);
1620: break;
1621: case 6:
1622: uifc.input(WIN_MID|WIN_SAV,0,0
1623: ,"Free Credits Per Day (in Kilobytes)"
1624: ,ultoa(cfg.level_freecdtperday[i]/1024L,tmp,10),8
1625: ,K_EDIT|K_UPPER);
1626: cfg.level_freecdtperday[i]=atol(tmp)*1024L;
1627: break;
1628: case 7:
1629: j=0;
1630: sprintf(opt[j++],"Default Expired Level "
1631: "(Currently %u)",cfg.expired_level);
1632: sprintf(opt[j++],"Specific Level");
1633: sprintf(opt[j++],"Quick-Validation Set");
1634: opt[j][0]=0;
1635: j=0;
1636: sprintf(str,"Level %u Expires To",i);
1637: uifc.savnum=1;
1638: j=uifc.list(WIN_SAV,2,1,0,&j,0
1639: ,str,opt);
1640: if(j==-1)
1641: break;
1642: if(j==0) {
1643: cfg.level_misc[i]&=
1644: ~(LEVEL_EXPTOLVL|LEVEL_EXPTOVAL);
1645: uifc.changes=1;
1646: break; }
1647: if(j==1) {
1648: cfg.level_misc[i]&=~LEVEL_EXPTOVAL;
1649: cfg.level_misc[i]|=LEVEL_EXPTOLVL;
1650: uifc.changes=1;
1651: uifc.input(WIN_MID|WIN_SAV,0,0
1652: ,"Expired Level"
1653: ,ultoa(cfg.level_expireto[i],tmp,10),2
1654: ,K_EDIT|K_NUMBER);
1655: cfg.level_expireto[i]=atoi(tmp);
1656: break; }
1657: cfg.level_misc[i]&=~LEVEL_EXPTOLVL;
1658: cfg.level_misc[i]|=LEVEL_EXPTOVAL;
1659: uifc.input(WIN_MID|WIN_SAV,0,0
1660: ,"Quick-Validation Set to Expire To"
1661: ,ultoa(cfg.level_expireto[i],tmp,10),1
1662: ,K_EDIT|K_NUMBER);
1663: cfg.level_expireto[i]=atoi(tmp);
1664: break;
1665: } } }
1666: break;
1667: case 13: /* Expired Acccount Values */
1668: dflt=0;
1669: done=0;
1670: while(!done) {
1671: i=0;
1672: sprintf(opt[i++],"%-27.27s%u","Level",cfg.expired_level);
1673: sprintf(opt[i++],"%-27.27s%s","Flag Set #1 to Remove"
1674: ,ltoaf(cfg.expired_flags1,str));
1675: sprintf(opt[i++],"%-27.27s%s","Flag Set #2 to Remove"
1676: ,ltoaf(cfg.expired_flags2,str));
1677: sprintf(opt[i++],"%-27.27s%s","Flag Set #3 to Remove"
1678: ,ltoaf(cfg.expired_flags3,str));
1679: sprintf(opt[i++],"%-27.27s%s","Flag Set #4 to Remove"
1680: ,ltoaf(cfg.expired_flags4,str));
1681: sprintf(opt[i++],"%-27.27s%s","Exemptions to Remove"
1682: ,ltoaf(cfg.expired_exempt,str));
1683: sprintf(opt[i++],"%-27.27s%s","Restrictions to Add"
1684: ,ltoaf(cfg.expired_rest,str));
1685: opt[i][0]=0;
1686: SETHELP(WHERE);
1687: /*
1688: &Expired Account Values:&
1689:
1690: If a user's account expires, the security levels for that account will
1691: be modified according to the settings of this menu. The &Main Level& and
1692: &Transfer Level& will be set to the values listed on this menu. The &Main
1693: Flags&, &Transfer Flags&, and &Exemptions& listed on this menu will be
1694: removed from the account if they are set. The &Restrictions& listed will
1695: be added to the account.
1696: */
1697: switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&dflt,0
1698: ,"Expired Account Values",opt)) {
1699: case -1:
1700: done=1;
1701: break;
1702: case 0:
1703: ultoa(cfg.expired_level,str,10);
1704: SETHELP(WHERE);
1705: /*
1706: &Expired Account Security Level:&
1707:
1708: This is the security level automatically given to expired user accounts.
1709: */
1710: uifc.input(WIN_SAV|WIN_MID,0,0,"Security Level"
1711: ,str,2,K_EDIT|K_NUMBER);
1712: cfg.expired_level=atoi(str);
1713: break;
1714: case 1:
1715: truncsp(ltoaf(cfg.expired_flags1,str));
1716: SETHELP(WHERE);
1717: /*
1718: &Expired Security Flags to Remove:&
1719:
1720: These are the security flags automatically removed when a user account
1721: has expired.
1722: */
1723: uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #1"
1724: ,str,26,K_EDIT|K_UPPER|K_ALPHA);
1725: cfg.expired_flags1=aftol(str);
1726: break;
1727: case 2:
1728: truncsp(ltoaf(cfg.expired_flags2,str));
1729: SETHELP(WHERE);
1730: /*
1731: &Expired Security Flags to Remove:&
1732:
1733: These are the security flags automatically removed when a user account
1734: has expired.
1735: */
1736: uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #2"
1737: ,str,26,K_EDIT|K_UPPER|K_ALPHA);
1738: cfg.expired_flags2=aftol(str);
1739: break;
1740: case 3:
1741: truncsp(ltoaf(cfg.expired_flags3,str));
1742: SETHELP(WHERE);
1743: /*
1744: &Expired Security Flags to Remove:&
1745:
1746: These are the security flags automatically removed when a user account
1747: has expired.
1748: */
1749: uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #3"
1750: ,str,26,K_EDIT|K_UPPER|K_ALPHA);
1751: cfg.expired_flags3=aftol(str);
1752: break;
1753: case 4:
1754: truncsp(ltoaf(cfg.expired_flags4,str));
1755: SETHELP(WHERE);
1756: /*
1757: &Expired Security Flags to Remove:&
1758:
1759: These are the security flags automatically removed when a user account
1760: has expired.
1761: */
1762: uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #4"
1763: ,str,26,K_EDIT|K_UPPER|K_ALPHA);
1764: cfg.expired_flags4=aftol(str);
1765: break;
1766: case 5:
1767: truncsp(ltoaf(cfg.expired_exempt,str));
1768: SETHELP(WHERE);
1769: /*
1770: &Expired Exemption Flags to Remove:&
1771:
1772: These are the exemptions that are automatically removed from a user
1773: account if it expires.
1774: */
1775: uifc.input(WIN_SAV|WIN_MID,0,0,"Exemption Flags",str,26
1776: ,K_EDIT|K_UPPER|K_ALPHA);
1777: cfg.expired_exempt=aftol(str);
1778: break;
1779: case 6:
1780: truncsp(ltoaf(cfg.expired_rest,str));
1781: SETHELP(WHERE);
1782: /*
1783: &Expired Restriction Flags to Add:&
1784:
1785: These are the restrictions that are automatically added to a user
1786: account if it expires.
1787: */
1788: uifc.input(WIN_SAV|WIN_MID,0,0,"Restriction Flags",str,26
1789: ,K_EDIT|K_UPPER|K_ALPHA);
1790: cfg.expired_rest=aftol(str);
1791: break;
1792: }
1793: }
1794: break;
1795: case 14: /* Quick-Validation Values */
1796: dflt=0;
1797: k=0;
1798: while(1) {
1799: for(i=0;i<10;i++)
1800: sprintf(opt[i],"%d SL: %-2d F1: %s"
1801: ,i,cfg.val_level[i],ltoaf(cfg.val_flags1[i],str));
1802: opt[i][0]=0;
1803: i=0;
1804: SETHELP(WHERE);
1805: /*
1806: &Quick-Validation Values:&
1807:
1808: This is a list of the ten quick-validation sets. These sets are used to
1809: quickly set a user's security values (Level, Flags, Exemptions,
1810: Restrictions, Expiration Date, and Credits) with one key stroke. The
1811: user's expiration date may be extended and additional credits may also
1812: be added using quick-validation sets.
1813:
1814: Holding down ALT and one of the number keys (&1-9&) while a user
1815: is online, automatically sets his or user security values to the
1816: quick-validation set for that number key.
1817:
1818: From within the &User Edit& function, a sysop can use the &V&alidate
1819: User command and select from this quick-validation list to change a
1820: user's security values with very few key-strokes.
1821: */
1822: uifc.savnum=0;
1823: i=uifc.list(WIN_RHT|WIN_BOT|WIN_ACT|WIN_SAV,0,0,0,&dflt,0
1824: ,"Quick-Validation Values",opt);
1825: if(i==-1)
1826: break;
1827: sprintf(str,"Quick-Validation Set %d",i);
1828: uifc.savnum=0;
1829: while(1) {
1830: j=0;
1831: sprintf(opt[j++],"%-22.22s%u","Level",cfg.val_level[i]);
1832: sprintf(opt[j++],"%-22.22s%s","Flag Set #1"
1833: ,ltoaf(cfg.val_flags1[i],tmp));
1834: sprintf(opt[j++],"%-22.22s%s","Flag Set #2"
1835: ,ltoaf(cfg.val_flags2[i],tmp));
1836: sprintf(opt[j++],"%-22.22s%s","Flag Set #3"
1837: ,ltoaf(cfg.val_flags3[i],tmp));
1838: sprintf(opt[j++],"%-22.22s%s","Flag Set #4"
1839: ,ltoaf(cfg.val_flags4[i],tmp));
1840: sprintf(opt[j++],"%-22.22s%s","Exemptions"
1841: ,ltoaf(cfg.val_exempt[i],tmp));
1842: sprintf(opt[j++],"%-22.22s%s","Restrictions"
1843: ,ltoaf(cfg.val_rest[i],tmp));
1844: sprintf(opt[j++],"%-22.22s%u days","Extend Expiration"
1845: ,cfg.val_expire[i]);
1846: sprintf(opt[j++],"%-22.22s%lu","Additional Credits"
1847: ,cfg.val_cdt[i]);
1848: opt[j][0]=0;
1849: uifc.savnum=1;
1850: j=uifc.list(WIN_RHT|WIN_SAV|WIN_ACT,2,1,0,&k,0
1851: ,str,opt);
1852: if(j==-1)
1853: break;
1854: switch(j) {
1855: case 0:
1856: uifc.input(WIN_MID|WIN_SAV,0,0
1857: ,"Level"
1858: ,ultoa(cfg.val_level[i],tmp,10),2
1859: ,K_NUMBER|K_EDIT);
1860: cfg.val_level[i]=atoi(tmp);
1861: break;
1862: case 1:
1863: uifc.input(WIN_MID|WIN_SAV,0,0
1864: ,"Flag Set #1"
1865: ,truncsp(ltoaf(cfg.val_flags1[i],tmp)),26
1866: ,K_UPPER|K_ALPHA|K_EDIT);
1867: cfg.val_flags1[i]=aftol(tmp);
1868: break;
1869: case 2:
1870: uifc.input(WIN_MID|WIN_SAV,0,0
1871: ,"Flag Set #2"
1872: ,truncsp(ltoaf(cfg.val_flags2[i],tmp)),26
1873: ,K_UPPER|K_ALPHA|K_EDIT);
1874: cfg.val_flags2[i]=aftol(tmp);
1875: break;
1876: case 3:
1877: uifc.input(WIN_MID|WIN_SAV,0,0
1878: ,"Flag Set #3"
1879: ,truncsp(ltoaf(cfg.val_flags3[i],tmp)),26
1880: ,K_UPPER|K_ALPHA|K_EDIT);
1881: cfg.val_flags3[i]=aftol(tmp);
1882: break;
1883: case 4:
1884: uifc.input(WIN_MID|WIN_SAV,0,0
1885: ,"Flag Set #4"
1886: ,truncsp(ltoaf(cfg.val_flags4[i],tmp)),26
1887: ,K_UPPER|K_ALPHA|K_EDIT);
1888: cfg.val_flags4[i]=aftol(tmp);
1889: break;
1890: case 5:
1891: uifc.input(WIN_MID|WIN_SAV,0,0
1892: ,"Exemption Flags"
1893: ,truncsp(ltoaf(cfg.val_exempt[i],tmp)),26
1894: ,K_UPPER|K_ALPHA|K_EDIT);
1895: cfg.val_exempt[i]=aftol(tmp);
1896: break;
1897: case 6:
1898: uifc.input(WIN_MID|WIN_SAV,0,0
1899: ,"Restriction Flags"
1900: ,truncsp(ltoaf(cfg.val_rest[i],tmp)),26
1901: ,K_UPPER|K_ALPHA|K_EDIT);
1902: cfg.val_rest[i]=aftol(tmp);
1903: break;
1904: case 7:
1905: uifc.input(WIN_MID|WIN_SAV,0,0
1906: ,"Days to Extend Expiration"
1907: ,ultoa(cfg.val_expire[i],tmp,10),4
1908: ,K_NUMBER|K_EDIT);
1909: cfg.val_expire[i]=atoi(tmp);
1910: break;
1911: case 8:
1912: uifc.input(WIN_MID|WIN_SAV,0,0
1913: ,"Additional Credits"
1914: ,ultoa(cfg.val_cdt[i],tmp,10),10
1915: ,K_NUMBER|K_EDIT);
1916: cfg.val_cdt[i]=atol(tmp);
1917: break; } } }
1918: break; } }
1919:
1920: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.