diff --git a/src/sbbs3/js_system.c b/src/sbbs3/js_system.c index 937bc42942fe55213f32edaa86d3c65803767138..583172f39bf81ebad9ea69e58a4f160b875698c1 100644 --- a/src/sbbs3/js_system.c +++ b/src/sbbs3/js_system.c @@ -176,7 +176,7 @@ static JSBool js_system_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) *vp = INT_TO_JSVAL(cfg->sys_pwdays); break; case SYS_PROP_MINPWLEN: - *vp = INT_TO_JSVAL(MIN_PASS_LEN); + *vp = INT_TO_JSVAL(cfg->min_pwlen); break; case SYS_PROP_MAXPWLEN: *vp = INT_TO_JSVAL(LEN_PASS); diff --git a/src/sbbs3/logon.cpp b/src/sbbs3/logon.cpp index 997e309bdfb3713818a226a334a016c08bf62d8c..afe1fc5a4c4f0775df32a23bd931bfe2bc975461 100644 --- a/src/sbbs3/logon.cpp +++ b/src/sbbs3/logon.cpp @@ -248,7 +248,7 @@ bool sbbs_t::logon() if(cfg.sys_misc&SM_PWEDIT && yesno(text[NewPasswordQ])) while(online) { - bprintf(text[NewPasswordPromptFmt], MIN_PASS_LEN, LEN_PASS); + bprintf(text[NewPasswordPromptFmt], cfg->min_pwlen, LEN_PASS); getstr(str,LEN_PASS,K_UPPER|K_LINE|K_TRIM); truncsp(str); if(chkpass(str,&useron,true)) diff --git a/src/sbbs3/newuser.cpp b/src/sbbs3/newuser.cpp index da773b4116cdb985993ccb86c2acb0a75faed934..985d93a3e8ca53af7d0bdaeb0fff88da2d42fc3a 100644 --- a/src/sbbs3/newuser.cpp +++ b/src/sbbs3/newuser.cpp @@ -386,7 +386,7 @@ BOOL sbbs_t::newuser() if(cfg.sys_misc&SM_PWEDIT && text[NewPasswordQ][0] && yesno(text[NewPasswordQ])) while(online) { - bprintf(text[NewPasswordPromptFmt], MIN_PASS_LEN, LEN_PASS); + bprintf(text[NewPasswordPromptFmt], cfg->min_pwlen, LEN_PASS); getstr(str,LEN_PASS,K_UPPER|K_LINE|K_TRIM); truncsp(str); if(chkpass(str,&useron,true)) { diff --git a/src/sbbs3/scfg/scfgsys.c b/src/sbbs3/scfg/scfgsys.c index f2e009333ccb8a7feeb2f175186e9fd11c84e3ae..53c526cf2d9801c5f2ee6a65a4fd4cc4ddddf2cc 100644 --- a/src/sbbs3/scfg/scfgsys.c +++ b/src/sbbs3/scfg/scfgsys.c @@ -99,15 +99,17 @@ void sys_cfg(void) sprintf(opt[i++],"%-33.33s%s","Operator",cfg.sys_op); sprintf(opt[i++],"%-33.33s%s","Password","**********"); - sprintf(str,"%s Password" + SAFEPRINTF(str,"%s Password" ,cfg.sys_misc&SM_PWEDIT && cfg.sys_pwdays ? "Users Must Change" : cfg.sys_pwdays ? "Users Get New Random" : "Users Can Change"); if(cfg.sys_pwdays) - sprintf(tmp,"Every %u Days",cfg.sys_pwdays); + SAFEPRINTF(tmp,"Every %u Days",cfg.sys_pwdays); else if(cfg.sys_misc&SM_PWEDIT) - strcpy(tmp,"Yes"); + SAFECOPY(tmp,"Yes"); else - strcpy(tmp,"No"); + SAFECOPY(tmp,"No"); + if(cfg.sys_misc&SM_PWEDIT) + sprintf(tmp + strlen(tmp), ", %u chars minimum", cfg.min_pwlen); sprintf(opt[i++],"%-33.33s%s",str,tmp); sprintf(opt[i++],"%-33.33s%u","Days to Preserve Deleted Users" @@ -427,6 +429,20 @@ void sys_cfg(void) else if(i==1 && cfg.sys_misc&SM_PWEDIT) { cfg.sys_misc&=~SM_PWEDIT; uifc.changes=1; + } else if(i == -1) + break; + + if(cfg.sys_misc&SM_PWEDIT) { + SAFEPRINTF(tmp, "%u", cfg.min_pwlen); + SAFEPRINTF2(str, "Minimum Password Length (between %u and %u)", MIN_PASS_LEN, LEN_PASS); + if(uifc.input(WIN_MID|WIN_SAV,0,0, str + ,tmp, 2, K_NUMBER|K_EDIT) < 1) + break; + cfg.min_pwlen=atoi(tmp); + if(cfg.min_pwlen < MIN_PASS_LEN) + cfg.min_pwlen = MIN_PASS_LEN; + if(cfg.min_pwlen > LEN_PASS) + cfg.min_pwlen = LEN_PASS; } i = cfg.sys_pwdays ? 0 : 1; uifc.helpbuf= diff --git a/src/sbbs3/scfgdefs.h b/src/sbbs3/scfgdefs.h index b5481b31444d10299aba541f0258a71a506eaf21..84d28f8a83df032c7764104ac140d567115905b3 100644 --- a/src/sbbs3/scfgdefs.h +++ b/src/sbbs3/scfgdefs.h @@ -456,6 +456,7 @@ typedef struct char sys_daily[LEN_CMD+1]; /* Daily event */ char sys_logon[LEN_CMD+1]; /* Logon event */ char sys_logout[LEN_CMD+1]; /* Logoff event */ + uint8_t min_pwlen; uint16_t sys_pwdays; /* Max days between password change */ uint16_t sys_deldays; /* Days to keep deleted users */ uint16_t sys_autodel; /* Autodeletion after x days inactive */ diff --git a/src/sbbs3/scfglib1.c b/src/sbbs3/scfglib1.c index 1f27f294f2e1be732d0a85977d5e9c90a8d5fc54..2b8e2210a647c550ede4a9fc0c8615727378c127 100644 --- a/src/sbbs3/scfglib1.c +++ b/src/sbbs3/scfglib1.c @@ -233,7 +233,13 @@ BOOL read_main_cfg(scfg_t* cfg, char* error) get_int(cfg->new_install,instream); get_int(cfg->new_msgscan_init,instream); get_int(cfg->guest_msgscan_init,instream); - for(i=0;i<5;i++) + get_int(cfg->min_pwlen, instream); + if(cfg->min_pwlen < MIN_PASS_LEN) + cfg->min_pwlen = MIN_PASS_LEN; + if(cfg->min_pwlen > LEN_PASS) + cfg->min_pwlen = LEN_PASS; + get_int(c, instream); + for(i=0;i<4;i++) get_int(n,instream); /*************************/ diff --git a/src/sbbs3/scfgsave.c b/src/sbbs3/scfgsave.c index f86bde4a974fdf42b1177fdb27e6b3a3a29747e0..27c29b6020e037050369ab981d3bac1b0d91cffd 100644 --- a/src/sbbs3/scfgsave.c +++ b/src/sbbs3/scfgsave.c @@ -220,8 +220,10 @@ BOOL DLLCALL write_main_cfg(scfg_t* cfg, int backup_level) put_int(cfg->new_install,stream); put_int(cfg->new_msgscan_init, stream); put_int(cfg->guest_msgscan_init, stream); + put_int(cfg->min_pwlen, stream); + put_int(c, stream); n=0; - for(i=0;i<5;i++) + for(i=0;i<4;i++) put_int(n,stream); put_int(cfg->expired_level,stream); diff --git a/src/sbbs3/str.cpp b/src/sbbs3/str.cpp index 6607442ebfc2450f19716e9a4dcb02bfc543bf40..827cc2f003ca95e19a63bab00a0bc8318df68919 100644 --- a/src/sbbs3/str.cpp +++ b/src/sbbs3/str.cpp @@ -702,7 +702,7 @@ bool sbbs_t::chkpass(char *passwd, user_t* user, bool unique) SAFECOPY(pass,passwd); strupr(pass); - if(strlen(pass) < MIN_PASS_LEN) { + if(strlen(pass) < cfg->min_pwlen) { bputs(text[PasswordTooShort]); return(false); } diff --git a/src/sbbs3/useredit.cpp b/src/sbbs3/useredit.cpp index ee055e4cf6f5588737967f92e36d89d6b3ac45f8..5fbc07653e237936780a6f7a301753f0845bf13f 100644 --- a/src/sbbs3/useredit.cpp +++ b/src/sbbs3/useredit.cpp @@ -1112,7 +1112,7 @@ void sbbs_t::maindflts(user_t* user) pause(); break; } - bprintf(text[NewPasswordPromptFmt], MIN_PASS_LEN, LEN_PASS); + bprintf(text[NewPasswordPromptFmt], cfg->min_pwlen, LEN_PASS); if(!getstr(str,LEN_PASS,K_UPPER|K_LINE|K_TRIM)) break; truncsp(str);