From 85b727c92cd730de0fc3ed108b1ef46e7d770345 Mon Sep 17 00:00:00 2001 From: Michael Meyer Date: Fri, 20 Oct 2023 13:48:15 -0400 Subject: [PATCH] Apply sysconf EXPLORERS restriction on startup The sysconf EXPLORERS list restricting access to explore mode was being evaluated and used when a player used the #exploremode command in-game, or when specifying -X or OPTIONS=playmode:explore on the command line when resuming a normal game, but not when starting an entirely new game. When SYSCF is avilable, check for authorization early, similar to debug mode authorization, to restrict access to explore mode to EXPLORERS under (hopefully) all circumstances. --- include/extern.h | 3 +++ src/cmd.c | 7 +------ src/options.c | 7 +++++-- src/restore.c | 4 ++-- sys/libnh/libnhmain.c | 30 +++++++++++++++++++++++++++--- sys/share/pcmain.c | 7 +++++++ sys/unix/unixmain.c | 30 +++++++++++++++++++++++++++--- sys/vms/vmsmain.c | 7 +++++++ sys/windows/windmain.c | 7 +++++++ 9 files changed, 86 insertions(+), 16 deletions(-) diff --git a/include/extern.h b/include/extern.h index 02d7f3b31..604b341c9 100644 --- a/include/extern.h +++ b/include/extern.h @@ -2123,6 +2123,7 @@ extern int dohistory(void); extern void chdirx(char *, boolean); #endif /* CHDIR */ extern boolean authorize_wizard_mode(void); +extern boolean authorize_explore_mode(void); #endif #if defined(WIN32) extern int getlock(void); @@ -3100,6 +3101,7 @@ extern void port_help(void); #endif extern void sethanguphandler(void(*)(int)); extern boolean authorize_wizard_mode(void); +extern boolean authorize_explore_mode(void); extern void append_slash(char *); extern boolean check_user_string(const char *); extern char *get_login_name(void); @@ -3264,6 +3266,7 @@ extern void chdirx(const char *, boolean); #endif /* CHDIR */ extern void sethanguphandler(void(*)(int)); extern boolean authorize_wizard_mode(void); +extern boolean authorize_explore_mode(void); /* ### vmsmisc.c ### */ diff --git a/src/cmd.c b/src/cmd.c index a823b7486..941d71822 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -965,10 +965,7 @@ enter_explore_mode(void) } else { const char *oldmode = !wizard ? "normal game" : "debug mode"; -#ifdef SYSCF -#if defined(UNIX) - if (!sysopt.explorers || !sysopt.explorers[0] - || !check_user_string(sysopt.explorers)) { + if (!authorize_explore_mode()) { if (!wizard) { You("cannot access explore mode."); return ECMD_OK; @@ -978,8 +975,6 @@ enter_explore_mode(void) /* keep going */ } } -#endif -#endif pline("Beware! From explore mode there will be no return to %s,", oldmode); if (paranoid_query(ParanoidQuit, diff --git a/src/options.c b/src/options.c index 7354481f3..e8ffe174b 100644 --- a/src/options.c +++ b/src/options.c @@ -10257,11 +10257,14 @@ set_playmode(void) gp.plnamelen = (int) strlen(strcpy(gp.plname, "wizard")); else wizard = FALSE; /* not allowed or not available */ - /* force explore mode if we didn't make it into wizard mode */ + /* try explore mode if we didn't make it into wizard mode */ discover = !wizard; iflags.deferred_X = FALSE; } - /* don't need to do anything special for explore mode or normal play */ + if (discover && !authorize_explore_mode()) { + discover = iflags.deferred_X = FALSE; + } + /* don't need to do anything special for normal play */ } static void diff --git a/src/restore.c b/src/restore.c index fc475f9d3..d154a99b6 100644 --- a/src/restore.c +++ b/src/restore.c @@ -560,8 +560,8 @@ restgamestate(NHFILE *nhfp) if (newgameflags.debug) { /* authorized by startup code; wizard mode exists and is allowed */ wizard = TRUE, discover = iflags.deferred_X = FALSE; - } else if (wizard) { - /* specified by save file; check authorization now */ + } else if (wizard || discover) { + /* specified by save file; check authorization now. */ set_playmode(); } role_init(); /* Reset the initial role, race, gender, and alignment */ diff --git a/sys/libnh/libnhmain.c b/sys/libnh/libnhmain.c index 41669033b..5770c5c4e 100644 --- a/sys/libnh/libnhmain.c +++ b/sys/libnh/libnhmain.c @@ -50,7 +50,7 @@ extern void init_linux_cons(void); #endif static void wd_message(void); -static boolean wiz_error_flag = FALSE; +static boolean wiz_error_flag = FALSE, explore_error_flag = FALSE; static struct passwd *get_unix_pw(void); #ifdef __EMSCRIPTEN__ @@ -605,6 +605,22 @@ authorize_wizard_mode(void) return FALSE; } +/* similar to above, validate explore mode access */ +boolean +authorize_explore_mode(void) +{ +#ifdef SYSCF + if (sysopt.explorers && sysopt.explorers[0]) { + if (check_user_string(sysopt.explorers)) + return TRUE; + } + explore_error_flag = TRUE; /* not being allowed into explore mode */ + return FALSE; +#else + return TRUE; /* if sysconf disabled, no restrictions on explore mode */ +#endif +} + static void wd_message(void) { @@ -614,9 +630,17 @@ wd_message(void) pline("Only user%s %s may access debug (wizard) mode.", strchr(sysopt.wizards, ' ') ? "s" : "", tmp); free(tmp); - } else + } else { + You("cannot access debug (wizard) mode."); + } + wizard = 0; /* (paranoia) */ + if (!explore_error_flag) { pline("Entering explore/discovery mode instead."); - wizard = 0, discover = 1; /* (paranoia) */ + discover = 1; + } + } else if (explore_error_flag) { + You("cannot access explore mode."); /* same as enter_explore_mode */ + discover = 0; /* (more paranoia) */ } else if (discover) You("are in non-scoring explore/discovery mode."); } diff --git a/sys/share/pcmain.c b/sys/share/pcmain.c index 5706651be..3744ee490 100644 --- a/sys/share/pcmain.c +++ b/sys/share/pcmain.c @@ -720,6 +720,13 @@ authorize_wizard_mode(void) return FALSE; } +/* similar to above, validate explore mode access */ +boolean +authorize_explore_mode(void) +{ + return TRUE; /* no restrictions on explore mode */ +} + #ifdef EXEPATH #ifdef __DJGPP__ #define PATH_SEPARATOR '/' diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index 56f567a46..2da764cae 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -53,7 +53,7 @@ extern void init_linux_cons(void); #endif static void wd_message(void); -static boolean wiz_error_flag = FALSE; +static boolean wiz_error_flag = FALSE, explore_error_flag = FALSE; static struct passwd *get_unix_pw(void); int @@ -964,6 +964,22 @@ authorize_wizard_mode(void) return FALSE; } +/* similar to above, validate explore mode access */ +boolean +authorize_explore_mode(void) +{ +#ifdef SYSCF + if (sysopt.explorers && sysopt.explorers[0]) { + if (check_user_string(sysopt.explorers)) + return TRUE; + } + explore_error_flag = TRUE; /* not being allowed into explore mode */ + return FALSE; +#else + return TRUE; /* if sysconf disabled, no restrictions on explore mode */ +#endif +} + static void wd_message(void) { @@ -973,9 +989,17 @@ wd_message(void) pline("Only user%s %s may access debug (wizard) mode.", strchr(sysopt.wizards, ' ') ? "s" : "", tmp); free(tmp); - } else + } else { + You("cannot access debug (wizard) mode."); + } + wizard = 0; /* (paranoia) */ + if (!explore_error_flag) { pline("Entering explore/discovery mode instead."); - wizard = 0, discover = 1; /* (paranoia) */ + discover = 1; + } + } else if (explore_error_flag) { + You("cannot access explore mode."); /* same as enter_explore_mode */ + discover = 0; /* (more paranoia) */ } else if (discover) You("are in non-scoring explore/discovery mode."); } diff --git a/sys/vms/vmsmain.c b/sys/vms/vmsmain.c index 7dd2536f9..4e7c6ab89 100644 --- a/sys/vms/vmsmain.c +++ b/sys/vms/vmsmain.c @@ -484,6 +484,13 @@ authorize_wizard_mode(void) return FALSE; } +/* similar to above, validate explore mode access */ +boolean +authorize_explore_mode(void) +{ + return TRUE; /* no restrictions on explore mode */ +} + static void wd_message(void) { diff --git a/sys/windows/windmain.c b/sys/windows/windmain.c index 5966615b4..0be7ef9cd 100644 --- a/sys/windows/windmain.c +++ b/sys/windows/windmain.c @@ -1021,6 +1021,13 @@ authorize_wizard_mode(void) return FALSE; } +/* similar to above, validate explore mode access */ +boolean +authorize_explore_mode(void) +{ + return TRUE; /* no restrictions on explore mode */ +} + #define PATH_SEPARATOR '\\' #if defined(WIN32) && !defined(WIN32CON)