diff --git a/src/sbbs3/js_msg_area.c b/src/sbbs3/js_msg_area.c index cbc540ebd4b9d7319b9499cf10b0c3354e6f8435..46875bbcd6efa65eceda7a1f17e79b61f0d761a4 100644 --- a/src/sbbs3/js_msg_area.c +++ b/src/sbbs3/js_msg_area.c @@ -500,7 +500,7 @@ JSBool js_msg_area_resolve(JSContext* cx, JSObject* areaobj, jsid id) val = OBJECT_TO_JSVAL(grpobj); grp_index = -1; - if (p->user == NULL || chk_ar(p->cfg, p->cfg->grp[l]->ar, p->user, p->client)) { + if (p->user == NULL || user_can_access_grp(p->cfg, l, p->user, p->client)) { if (!JS_GetArrayLength(cx, grp_list, (jsuint*)&grp_index)) return JS_FALSE; diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c index c52e5083c710a747ceca887dd267c0266b168bed..662ac7634be3841b78836c47c5b2f982f961983b 100644 --- a/src/sbbs3/userdat.c +++ b/src/sbbs3/userdat.c @@ -3591,6 +3591,22 @@ size_t user_field_len(enum user_field fnum) } } +/****************************************************************************/ +// Determine if the specified user can access one or more sub-boards of group +/****************************************************************************/ +bool user_can_access_grp(scfg_t* cfg, int grpnum, user_t* user, client_t* client) +{ + uint count = 0; + + for (int subnum = 0; subnum < cfg->total_subs; ++subnum) { + if (cfg->sub[subnum]->grp != grpnum) + continue; + if (user_can_access_sub(cfg, subnum, user, client)) // checks grp's AR already + count++; + } + return count >= 1; // User has access to one or more sub-boards of group +} + /****************************************************************************/ /* Determine if the specified user can or cannot access the specified sub */ /****************************************************************************/ diff --git a/src/sbbs3/userdat.h b/src/sbbs3/userdat.h index 622d8174e05f8f95d00231d482e36fa5d0145032..a04744540e50333375ceeed9a6ce69028850b3cb 100644 --- a/src/sbbs3/userdat.h +++ b/src/sbbs3/userdat.h @@ -156,6 +156,7 @@ DLLEXPORT bool user_can_access_all_libs(scfg_t*, user_t*, client_t*); DLLEXPORT bool user_can_access_all_dirs(scfg_t*, int libnum, user_t*, client_t*); DLLEXPORT bool user_can_access_lib(scfg_t*, int libnum, user_t*, client_t*); DLLEXPORT bool user_can_access_dir(scfg_t*, int dirnum, user_t*, client_t* client); +DLLEXPORT bool user_can_access_grp(scfg_t*, int subnum, user_t*, client_t* client); DLLEXPORT bool user_can_access_sub(scfg_t*, int subnum, user_t*, client_t* client); DLLEXPORT bool user_can_read_sub(scfg_t*, int subnum, user_t*, client_t* client); DLLEXPORT bool user_can_post(scfg_t*, int subnum, user_t*, client_t* client, uint* reason);