diff --git a/src/sbbs3/con_hi.cpp b/src/sbbs3/con_hi.cpp index 0ed2d05d1c66783318b96f7701c3757d61d2be99..c06775a08100716bed6f61cb31a5d59f7a23c769 100644 --- a/src/sbbs3/con_hi.cpp +++ b/src/sbbs3/con_hi.cpp @@ -165,7 +165,7 @@ bool sbbs_t::chksyspass(const char* sys_pw) logline(LOG_NOTICE,"S!","Remote sysop access disabled"); return(false); } - if(time(NULL) - last_sysop_auth < 15*60) + if(time(NULL) - last_sysop_auth < cfg.sys_pass_timeout * 60) return true; if(sys_pw != NULL) SAFECOPY(str, sys_pw); diff --git a/src/sbbs3/scfg/scfgsys.c b/src/sbbs3/scfg/scfgsys.c index 50a15ac183f11560dc80091a2a06e3077eef826d..c4f784e92fa94fcd822d7baa1cced044700d8644 100644 --- a/src/sbbs3/scfg/scfgsys.c +++ b/src/sbbs3/scfg/scfgsys.c @@ -74,12 +74,15 @@ void security_cfg(void) i = 0; sprintf(opt[i++],"%-33.33s%s","System Password", "*******"); if(cfg.sys_misc & SM_R_SYSOP) { - SAFECOPY(str, "Yes"); + *str = '\0'; if(cfg.sys_misc & SM_SYSPASSLOGIN) - SAFECAT(str, ", SYSPASS required at login"); + SAFECOPY(str, "At Login and "); + sprintf(str + strlen(str), "After %u minutes", cfg.sys_pass_timeout); } else - SAFECOPY(str, "No"); - sprintf(opt[i++],"%-33.33s%s","Allow Sysop Access", str); + SAFECOPY(str, "N/A"); + sprintf(opt[i++],"%-33.33s%s","Prompt for System Password", str); + sprintf(opt[i++],"%-33.33s%s","Allow Sysop Access" + ,(cfg.sys_misc & SM_R_SYSOP) ? "Yes" : "No"); sprintf(opt[i++],"%-33.33s%s","Allow Login by Real Name" ,(!(cfg.uq&UQ_ALIASES) || cfg.sys_login & LOGIN_REALNAME) ? "Yes" : "No"); sprintf(opt[i++],"%-33.33s%s","Allow Login by User Number" @@ -152,6 +155,36 @@ void security_cfg(void) ; uifc.input(WIN_MID|WIN_SAV,0,0,"System Password",cfg.sys_pass,sizeof(cfg.sys_pass)-1,K_EDIT|K_UPPER); break; + case __COUNTER__: + if(!(cfg.sys_misc&SM_R_SYSOP)) + break; + i=cfg.sys_misc&SM_SYSPASSLOGIN ? 0:1; + uifc.helpbuf= + "`Require System Password for Sysop Login:`\n" + "\n" + "If you want to require the correct system password to be provided during\n" + "system operator logins (in addition to the sysop's personal user account\n" + "password), set this option to `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Require System Password for Sysop Login",uifcYesNoOpts); + if(i == 1) + cfg.sys_misc &= ~SM_SYSPASSLOGIN; + else if(i == 0) + cfg.sys_misc |= SM_SYSPASSLOGIN; + else + break; + sprintf(str, "%u", cfg.sys_pass_timeout); + uifc.helpbuf= + "`System Password Timeout:`\n" + "\n" + "Set this value to the number of minutes after which the system password\n" + "will again have to be successfully entered to engage in system operator\n" + "activities.\n" + ; + if(uifc.input(WIN_MID|WIN_SAV,0,0,"System Password Timeout (minutes)", str, 5, K_EDIT | K_NUMBER) > 0) + cfg.sys_pass_timeout = atoi(str); + break; case __COUNTER__: i=cfg.sys_misc&SM_R_SYSOP ? 0:1; uifc.helpbuf= @@ -162,26 +195,10 @@ void security_cfg(void) ; i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 ,"Allow Sysop Access",uifcYesNoOpts); - if(i == 0) { - cfg.sys_misc|=SM_R_SYSOP; - i=cfg.sys_misc&SM_SYSPASSLOGIN ? 0:1; - uifc.helpbuf= - "`Require System Password for Sysop Login:`\n" - "\n" - "If you want to require the correct system password to be provided during\n" - "system operator logins (in addition to the sysop's personal user account\n" - "password), set this option to `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Require System Password for Sysop Login",uifcYesNoOpts); - if(i==1) - cfg.sys_misc &= ~SM_SYSPASSLOGIN; - else if(i==0) - cfg.sys_misc |= SM_SYSPASSLOGIN; - } - else if(i == 1) { + if(i == 0) + cfg.sys_misc |= SM_R_SYSOP; + else if(i == 1) cfg.sys_misc &= ~SM_R_SYSOP; - } break; case __COUNTER__: if(!(cfg.uq&UQ_ALIASES)) diff --git a/src/sbbs3/scfgdefs.h b/src/sbbs3/scfgdefs.h index f11c56cf8140df315a1535a639ce6e367928ecab..712d27f882e04fa57aca3043e011e3ee9cbde20e 100644 --- a/src/sbbs3/scfgdefs.h +++ b/src/sbbs3/scfgdefs.h @@ -473,6 +473,7 @@ typedef struct uint32_t sys_login; // Login Settings (Bit-flags) uint32_t sys_misc; /* System Misc Settings */ + uint32_t sys_pass_timeout; // Minutes between required SYSPASS entry char sys_pass[41]; /* System Pass Word */ char sys_name[41]; /* System Name */ char sys_id[LEN_QWKID+1];/* System ID for QWK Packets */ diff --git a/src/sbbs3/scfglib1.c b/src/sbbs3/scfglib1.c index 679e0cf8fee12eb5e1ce329f93422a866af2befa..9fbfd3047a5a8afea819efe93bab5f26a87235fb 100644 --- a/src/sbbs3/scfglib1.c +++ b/src/sbbs3/scfglib1.c @@ -101,6 +101,7 @@ BOOL read_main_cfg(scfg_t* cfg, char* error, size_t maxerrlen) SAFECOPY(cfg->sys_name, iniGetString(ini, ROOT_SECTION, "name", "", value)); SAFECOPY(cfg->sys_op, iniGetString(ini, ROOT_SECTION, "operator", "", value)); SAFECOPY(cfg->sys_pass, iniGetString(ini, ROOT_SECTION, "password", "", value)); + cfg->sys_pass_timeout = iniGetUInt32(ini, ROOT_SECTION, "password_timeout", 15 /* minutes */); SAFECOPY(cfg->sys_id, iniGetString(ini, ROOT_SECTION, "qwk_id", "", value)); SAFECOPY(cfg->sys_guru, iniGetString(ini, ROOT_SECTION, "guru", "", value)); SAFECOPY(cfg->sys_location, iniGetString(ini, ROOT_SECTION, "location", "", value)); diff --git a/src/sbbs3/scfgsave.c b/src/sbbs3/scfgsave.c index 89f40dd79155dbefe6e5721d5c011ff147b5ea81..2fb3fccac4984b904709516f146e0d48b9719cce 100644 --- a/src/sbbs3/scfgsave.c +++ b/src/sbbs3/scfgsave.c @@ -126,6 +126,7 @@ BOOL write_main_cfg(scfg_t* cfg, int backup_level) iniSetString(&ini, ROOT_SECTION, "operator", cfg->sys_op, NULL); iniSetString(&ini, ROOT_SECTION, "guru", cfg->sys_guru, NULL); iniSetString(&ini, ROOT_SECTION, "password", cfg->sys_pass, NULL); + iniSetUInt32(&ini, ROOT_SECTION, "password_timeout", cfg->sys_pass_timeout, NULL); iniSetShortInt(&ini, ROOT_SECTION, "timezone", cfg->sys_timezone, NULL); iniSetHexInt(&ini, ROOT_SECTION, "settings", cfg->sys_misc, NULL); iniSetHexInt(&ini, ROOT_SECTION, "login", cfg->sys_login, NULL);