dosutils: add maintainer helpers and compare-ready tools
Add maintainer-only support used by the automated DOS compatibility tests. This introduces the MAINTAINER_BUILD option for the DOS tools. In maintainer builds, LOGIN accepts the hidden /PWD: and /PASSWORD: arguments for automated test relogin, and the DLYSTRT helper is built to delay-start DOS batch files after the invoking batch has returned to the prompt. Add the WHOAMI utility and wire it into the NET command dispatch. Also adjust SLIST and RIGHTS output to match Novell behavior more closely, including server-not-found handling, path formatting, Supervisor rights, missing-path errors and usage text. Extend the test scripts to compare NPUBLIC Novell baselines against the PUBLIC implementations. LOGIN/LOGOUT can now run automatically via DLYSTRT and the maintainer LOGIN password option. RIGHTS gains an additional NOPASSUSER effective-rights matrix that covers single rights, mixed rights, Supervisor rights, ALL/N and file trustee cases. Normal builds remain free of maintainer-only helpers and hidden password handling.
This commit is contained in:
@@ -8,6 +8,8 @@
|
||||
# built binary is only installed when MARS_NWE_INSTALL_NEW_DOSUTILS is ON, or
|
||||
# for the new-only command names in the default split install.
|
||||
|
||||
option(MAINTAINER_BUILD "Enable maintainer-only DOS tool helpers and diagnostics" OFF)
|
||||
|
||||
set(MARS_DOSUTILS_LEGACY_NET_EXE
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/netold.exe"
|
||||
CACHE FILEPATH "Legacy/pre-Client32 DOS net.exe used by default for legacy command names"
|
||||
@@ -46,6 +48,7 @@ set(MARS_DOSUTILS_NEW_ONLY_TOOLS
|
||||
remove
|
||||
ndir
|
||||
creator
|
||||
whoami
|
||||
)
|
||||
|
||||
if(MARS_NWE_BUILD_DOSUTILS)
|
||||
@@ -73,6 +76,7 @@ if(MARS_NWE_BUILD_DOSUTILS)
|
||||
nwtests.c
|
||||
capture.c
|
||||
creator.c
|
||||
whoami.c
|
||||
)
|
||||
|
||||
add_custom_command(
|
||||
@@ -94,6 +98,11 @@ if(MARS_NWE_BUILD_DOSUTILS)
|
||||
set(obj "${CMAKE_CURRENT_BINARY_DIR}/${obj_name}.obj")
|
||||
list(APPEND DOSUTILS_OBJECTS "${obj}")
|
||||
|
||||
set(DOSUTILS_WCL_DEFS)
|
||||
if(MAINTAINER_BUILD)
|
||||
list(APPEND DOSUTILS_WCL_DEFS -dMAINTAINER_BUILD)
|
||||
endif()
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT "${obj}"
|
||||
COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
|
||||
@@ -103,6 +112,7 @@ if(MARS_NWE_BUILD_DOSUTILS)
|
||||
-bt=dos
|
||||
-ml
|
||||
-0
|
||||
${DOSUTILS_WCL_DEFS}
|
||||
-c
|
||||
-fo="${obj}"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/${src}"
|
||||
@@ -142,6 +152,29 @@ if(MARS_NWE_BUILD_DOSUTILS)
|
||||
)
|
||||
|
||||
set(MARS_DOSUTILS_BUILT_NET_EXE "${CMAKE_CURRENT_BINARY_DIR}/net.exe")
|
||||
|
||||
if(MAINTAINER_BUILD)
|
||||
add_custom_command(
|
||||
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/dlystrt.exe"
|
||||
COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
|
||||
"${OPENWATCOM_WCL}"
|
||||
-q
|
||||
-zq
|
||||
-bt=dos
|
||||
-ms
|
||||
-0
|
||||
-dMAINTAINER_BUILD
|
||||
-fe="${CMAKE_CURRENT_BINARY_DIR}/dlystrt.exe"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/dlystrt.c"
|
||||
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/dlystrt.c"
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
add_custom_target(dlystrt ALL
|
||||
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/dlystrt.exe"
|
||||
)
|
||||
endif()
|
||||
else()
|
||||
set(MARS_DOSUTILS_BUILT_NET_EXE "")
|
||||
endif()
|
||||
@@ -217,4 +250,10 @@ if(MARS_NWE_INSTALL_DOSUTILS)
|
||||
install(FILES "${MARS_DOSUTILS_SELECTED_LEGACY_EXE}"
|
||||
DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/login"
|
||||
RENAME slist.exe)
|
||||
|
||||
if(MAINTAINER_BUILD AND MARS_NWE_BUILD_DOSUTILS)
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/dlystrt.exe"
|
||||
DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public"
|
||||
RENAME dlystrt.exe)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
173
dlystrt.c
Normal file
173
dlystrt.c
Normal file
@@ -0,0 +1,173 @@
|
||||
/* dlystrt.c - maintainer-only delayed DOS command starter.
|
||||
*
|
||||
* This is a tiny TSR helper for login/logout tests. It waits a short
|
||||
* time, then stuffs a command line into the BIOS keyboard buffer. The
|
||||
* command is therefore executed by the command processor after the batch
|
||||
* file that installed DLYSTRT has already returned to the DOS prompt.
|
||||
*
|
||||
* Example:
|
||||
* DLYSTRT /T:2 C:\\LGNTC.BAT
|
||||
*
|
||||
* The tool is intended for MAINTAINER_BUILD only and is not installed in
|
||||
* normal builds.
|
||||
*/
|
||||
|
||||
#include <dos.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <i86.h>
|
||||
|
||||
#ifndef MAINTAINER_BUILD
|
||||
int main(void)
|
||||
{
|
||||
puts("DLYSTRT is only available in maintainer builds.");
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
|
||||
#define MAX_CMD 126
|
||||
#define BIOS_SEG 0x0040
|
||||
#define KB_HEAD 0x001a
|
||||
#define KB_TAIL 0x001c
|
||||
#define KB_BUF 0x001e
|
||||
#define KB_END 0x003e
|
||||
|
||||
typedef void (__interrupt __far *intr_fn)(void);
|
||||
|
||||
static intr_fn old_int1c;
|
||||
static volatile unsigned wait_ticks;
|
||||
static volatile unsigned pos;
|
||||
static volatile unsigned done;
|
||||
static char command[MAX_CMD + 3];
|
||||
|
||||
static int strnicmp_local(const char *a, const char *b, int n)
|
||||
{
|
||||
int ca, cb;
|
||||
while (n-- > 0) {
|
||||
ca = toupper((unsigned char)*a++);
|
||||
cb = toupper((unsigned char)*b++);
|
||||
if (ca != cb || ca == 0 || cb == 0) return ca - cb;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kb_put_char(char ch)
|
||||
{
|
||||
unsigned far *headp = (unsigned far *)MK_FP(BIOS_SEG, KB_HEAD);
|
||||
unsigned far *tailp = (unsigned far *)MK_FP(BIOS_SEG, KB_TAIL);
|
||||
unsigned far *bufp;
|
||||
unsigned head = *headp;
|
||||
unsigned tail = *tailp;
|
||||
unsigned next = tail + 2;
|
||||
|
||||
if (next >= KB_END) next = KB_BUF;
|
||||
if (next == head) return 0; /* keyboard buffer full */
|
||||
|
||||
bufp = (unsigned far *)MK_FP(BIOS_SEG, tail);
|
||||
*bufp = (unsigned)((unsigned char)ch); /* scan code 0, ASCII ch */
|
||||
*tailp = next;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void raw_restore_vector(void)
|
||||
{
|
||||
intr_fn __far *vecp;
|
||||
|
||||
if (!old_int1c) return;
|
||||
|
||||
/* Do not call DOS from the timer interrupt. Restore the IVT entry
|
||||
* directly, then leave the TSR out of the interrupt path before the
|
||||
* delayed command is executed.
|
||||
*/
|
||||
_disable();
|
||||
vecp = (intr_fn __far *)MK_FP(0x0000, 0x1c * 4);
|
||||
*vecp = old_int1c;
|
||||
_enable();
|
||||
}
|
||||
|
||||
static void __interrupt __far dly_int1c(void)
|
||||
{
|
||||
intr_fn prev = old_int1c;
|
||||
|
||||
if (!done) {
|
||||
if (wait_ticks) {
|
||||
wait_ticks--;
|
||||
} else {
|
||||
if (command[pos]) {
|
||||
if (kb_put_char(command[pos])) pos++;
|
||||
} else {
|
||||
/* One-shot: unhook before pressing Enter so the command that gets
|
||||
* started by COMMAND.COM runs without DLYSTRT still sitting on INT 1Ch.
|
||||
*/
|
||||
done = 1;
|
||||
raw_restore_vector();
|
||||
kb_put_char('\r');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (prev) prev();
|
||||
}
|
||||
|
||||
static void usage(void)
|
||||
{
|
||||
puts("Usage: DLYSTRT [/T:seconds] command [args]");
|
||||
puts("Maintainer helper: delay-start a command after returning to DOS.");
|
||||
}
|
||||
|
||||
static void build_command(int argc, char **argv, int first)
|
||||
{
|
||||
int i;
|
||||
|
||||
command[0] = '\0';
|
||||
for (i = first; i < argc; i++) {
|
||||
if (command[0]) strncat(command, " ", MAX_CMD - strlen(command));
|
||||
strncat(command, argv[i], MAX_CMD - strlen(command));
|
||||
}
|
||||
command[MAX_CMD] = '\0';
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
unsigned seconds = 2;
|
||||
int first = 1;
|
||||
unsigned paras;
|
||||
|
||||
if (argc < 2) {
|
||||
usage();
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!strnicmp_local(argv[first], "/T:", 3)) {
|
||||
seconds = (unsigned)atoi(argv[first] + 3);
|
||||
if (seconds == 0) seconds = 1;
|
||||
first++;
|
||||
}
|
||||
|
||||
if (first >= argc) {
|
||||
usage();
|
||||
return 1;
|
||||
}
|
||||
|
||||
build_command(argc, argv, first);
|
||||
wait_ticks = seconds * 18;
|
||||
pos = 0;
|
||||
done = 0;
|
||||
|
||||
old_int1c = _dos_getvect(0x1c);
|
||||
_dos_setvect(0x1c, dly_int1c);
|
||||
|
||||
printf("DLYSTRT installed: %s\n", command);
|
||||
|
||||
/* Keep a small fixed amount resident. This maintainer helper is tiny;
|
||||
* 256 paragraphs = 4 KiB is enough for code, data and the command buffer
|
||||
* in the small DOS model used here.
|
||||
*/
|
||||
paras = 256;
|
||||
_dos_keep(0, paras);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* MAINTAINER_BUILD */
|
||||
0
doc/README
Executable file → Normal file
0
doc/README
Executable file → Normal file
62
login.c
62
login.c
@@ -714,12 +714,60 @@ static int login_usage(void)
|
||||
return(login_help());
|
||||
}
|
||||
|
||||
|
||||
#ifdef MAINTAINER_BUILD
|
||||
static int login_hidden_password_arg(char *arg, uint8 *passwd, int passwd_size)
|
||||
{
|
||||
char *value = NULL;
|
||||
|
||||
if (!strnicmp(arg, "/PASSWORD:", 10) || !strnicmp(arg, "-PASSWORD:", 10))
|
||||
value = arg + 10;
|
||||
else if (!strnicmp(arg, "/PWD:", 5) || !strnicmp(arg, "-PWD:", 5))
|
||||
value = arg + 5;
|
||||
|
||||
if (value != NULL) {
|
||||
strmaxcpy(passwd, value, passwd_size - 1);
|
||||
memset(arg, 0, strlen(arg));
|
||||
return(1);
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int login_extract_hidden_password(int *argc, char *argv[],
|
||||
uint8 *passwd, int passwd_size)
|
||||
{
|
||||
int i;
|
||||
|
||||
passwd[0] = '\0';
|
||||
|
||||
for (i = 1; i < *argc; i++) {
|
||||
if (login_hidden_password_arg(argv[i], passwd, passwd_size)) {
|
||||
int j;
|
||||
|
||||
for (j = i; j < (*argc - 1); j++)
|
||||
argv[j] = argv[j + 1];
|
||||
|
||||
argv[*argc - 1] = NULL;
|
||||
(*argc)--;
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
int func_login(int argc, char *argv[], int mode)
|
||||
{
|
||||
int result=-1;
|
||||
int option=0;
|
||||
uint8 uname[200];
|
||||
uint8 upasswd[200];
|
||||
#ifdef MAINTAINER_BUILD
|
||||
uint8 hidden_passwd[200];
|
||||
int have_hidden_passwd = 0;
|
||||
#endif
|
||||
SEARCH_VECTOR save_drives;
|
||||
int interactive_login = 0;
|
||||
int no_script = 0;
|
||||
@@ -733,6 +781,12 @@ int func_login(int argc, char *argv[], int mode)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef MAINTAINER_BUILD
|
||||
have_hidden_passwd = login_extract_hidden_password(&argc, argv,
|
||||
hidden_passwd,
|
||||
sizeof(hidden_passwd));
|
||||
#endif
|
||||
|
||||
if (argc > 1) {
|
||||
if (argv[1][0] == '-' || argv[1][0] == '/') {
|
||||
if (argv[1][1] == 'u' || argv[1][1] == 'U') option |= 1;
|
||||
@@ -747,6 +801,10 @@ int func_login(int argc, char *argv[], int mode)
|
||||
remove_nwpathes();
|
||||
if (argc > 1) strmaxcpy(uname, argv[1], sizeof(uname) -1);
|
||||
else uname[0]='\0';
|
||||
#ifdef MAINTAINER_BUILD
|
||||
if (have_hidden_passwd) strmaxcpy(upasswd, hidden_passwd, sizeof(upasswd) -1);
|
||||
else
|
||||
#endif
|
||||
if (argc > 2) strmaxcpy(upasswd, argv[2], sizeof(upasswd) -1);
|
||||
else upasswd[0]='\0';
|
||||
|
||||
@@ -788,6 +846,10 @@ int func_login(int argc, char *argv[], int mode)
|
||||
} else {
|
||||
(void)set_search_drive_vektor(save_drives);
|
||||
}
|
||||
#ifdef MAINTAINER_BUILD
|
||||
memset(hidden_passwd, 0, sizeof(hidden_passwd));
|
||||
#endif
|
||||
memset(upasswd, 0, sizeof(upasswd));
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
1
net.c
1
net.c
@@ -43,6 +43,7 @@ static struct s_net_functions {
|
||||
{"RIGHTS", "display effective file/directory rights",func_rights, 0},
|
||||
{"CREATOR","display or set creator/modifier/archive ids",func_creator,0},
|
||||
{"SLIST", "list servers", func_slist , 0},
|
||||
{"WHOAMI", "show current NetWare user", func_whoami , 0},
|
||||
{"PASSWD", "change password", func_passwd , 0},
|
||||
#if 1
|
||||
{"TESTS", "only testroutines!", func_tests , 0},
|
||||
|
||||
1
net.h
1
net.h
@@ -263,6 +263,7 @@ extern int read_command_file(char *fstr);
|
||||
|
||||
/* slist.c */
|
||||
extern int func_slist (int argc, char *argv[], int mode);
|
||||
extern int func_whoami(int argc, char *argv[], int mode);
|
||||
extern int func_ndir (int argc, char *argv[], int mode);
|
||||
|
||||
/* nwdebug.c */
|
||||
|
||||
101
rights.c
101
rights.c
@@ -31,13 +31,14 @@
|
||||
#define NCP_RIGHT_SUPER 0x0100
|
||||
|
||||
static uint8 rights_map_ncp_mask(uint16 ncp_rights);
|
||||
static void rights_ncp_path(char *dst, char *src, int max);
|
||||
|
||||
|
||||
static void rights_usage(void)
|
||||
{
|
||||
fprintf(stdout, "Usage: RIGHTS [path]\n\n");
|
||||
fprintf(stdout, "Rights = All | Supervisor | Read | Write | Create | Erase\n");
|
||||
fprintf(stdout, " Modify | File scan | Access Control\n");
|
||||
fprintf(stdout, "\nUsage: RIGHTS [path]\n \n");
|
||||
fprintf(stdout, " Rights = All | Supervisor | Read | Write | Create | Erase\n");
|
||||
fprintf(stdout, " | Modify | File scan | Access Control\n");
|
||||
}
|
||||
|
||||
static void rights_parent_path(char *dst, char *src, int max)
|
||||
@@ -65,19 +66,58 @@ static void rights_parent_path(char *dst, char *src, int max)
|
||||
strmaxcpy(dst, tmp, max - 1);
|
||||
}
|
||||
|
||||
static int rights_path_is_dir(char *path)
|
||||
static void rights_ncp_path(char *dst, char *src, int max)
|
||||
{
|
||||
struct stat st;
|
||||
char up[260];
|
||||
char *p;
|
||||
|
||||
if (tool_is_current_path(path))
|
||||
return(1);
|
||||
|
||||
if (stat(path, &st) == 0) {
|
||||
if (st.st_mode & S_IFDIR)
|
||||
return(1);
|
||||
if (tool_is_current_path(src)) {
|
||||
dst[0] = '\0';
|
||||
return;
|
||||
}
|
||||
|
||||
return(0);
|
||||
tool_upcopy(up, src, sizeof(up));
|
||||
p = up;
|
||||
if (p[0] && p[1] == ':') {
|
||||
p += 2;
|
||||
if (*p == '\\') p++;
|
||||
}
|
||||
while (*p == '\\') p++;
|
||||
|
||||
strmaxcpy(dst, p, max - 1);
|
||||
}
|
||||
|
||||
|
||||
static int rights_get_ncp_info(char *path, C32_NDIR_INFO *info)
|
||||
{
|
||||
uint8 connid = 0;
|
||||
uint8 dhandle = 0;
|
||||
char npath[260];
|
||||
|
||||
if (!info)
|
||||
return(1);
|
||||
|
||||
memset(info, 0, sizeof(*info));
|
||||
|
||||
if (tool_current_dhandle(&connid, &dhandle))
|
||||
return(1);
|
||||
|
||||
rights_ncp_path(npath, path, sizeof(npath));
|
||||
return(c32_ncp87_obtain_ndir_info(npath, (uint16)dhandle,
|
||||
info, NULL, NULL, NULL));
|
||||
}
|
||||
|
||||
static int rights_path_exists(char *path, int *is_dir)
|
||||
{
|
||||
C32_NDIR_INFO info;
|
||||
|
||||
if (rights_get_ncp_info(path, &info))
|
||||
return(0);
|
||||
|
||||
if (is_dir)
|
||||
*is_dir = (info.attributes & 0x10) ? 1 : 0;
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
@@ -101,7 +141,8 @@ static int rights_effective_mask(char *path, int is_dir, uint8 *mask)
|
||||
* It works for both files and directories, so pass the requested path
|
||||
* itself instead of mapping files to their parent directory.
|
||||
*/
|
||||
if (!c32_ncp87_get_effective_rights(tool_is_current_path(path) ? "" : path,
|
||||
rights_ncp_path(usepath, path, sizeof(usepath));
|
||||
if (!c32_ncp87_get_effective_rights(usepath,
|
||||
(uint16)dhandle,
|
||||
&ncp_rights,
|
||||
NULL, NULL, NULL)) {
|
||||
@@ -117,9 +158,11 @@ static int rights_effective_mask(char *path, int is_dir, uint8 *mask)
|
||||
if (tool_is_current_path(path)) {
|
||||
usepath[0] = '\0';
|
||||
} else if (is_dir) {
|
||||
tool_upcopy(usepath, path, sizeof(usepath));
|
||||
rights_ncp_path(usepath, path, sizeof(usepath));
|
||||
} else {
|
||||
rights_parent_path(usepath, path, sizeof(usepath));
|
||||
char npath[260];
|
||||
rights_ncp_path(npath, path, sizeof(npath));
|
||||
rights_parent_path(usepath, npath, sizeof(usepath));
|
||||
}
|
||||
|
||||
newhandle = alloc_temp_dir_handle(dhandle, usepath, 0, &eff);
|
||||
@@ -164,14 +207,14 @@ static uint8 rights_map_ncp_mask(uint16 ncp_rights)
|
||||
|
||||
static void rights_mask_string(uint8 mask, char *out)
|
||||
{
|
||||
out[0] = (mask & NW_RIGHT_S) ? 'S' : '-';
|
||||
out[1] = (mask & NW_RIGHT_R) ? 'R' : '-';
|
||||
out[2] = (mask & NW_RIGHT_W) ? 'W' : '-';
|
||||
out[3] = (mask & NW_RIGHT_C) ? 'C' : '-';
|
||||
out[4] = (mask & NW_RIGHT_E) ? 'E' : '-';
|
||||
out[5] = (mask & NW_RIGHT_M) ? 'M' : '-';
|
||||
out[6] = (mask & NW_RIGHT_F) ? 'F' : '-';
|
||||
out[7] = (mask & NW_RIGHT_A) ? 'A' : '-';
|
||||
out[0] = (mask & NW_RIGHT_S) ? 'S' : ' ';
|
||||
out[1] = (mask & NW_RIGHT_R) ? 'R' : ' ';
|
||||
out[2] = (mask & NW_RIGHT_W) ? 'W' : ' ';
|
||||
out[3] = (mask & NW_RIGHT_C) ? 'C' : ' ';
|
||||
out[4] = (mask & NW_RIGHT_E) ? 'E' : ' ';
|
||||
out[5] = (mask & NW_RIGHT_M) ? 'M' : ' ';
|
||||
out[6] = (mask & NW_RIGHT_F) ? 'F' : ' ';
|
||||
out[7] = (mask & NW_RIGHT_A) ? 'A' : ' ';
|
||||
out[8] = '\0';
|
||||
}
|
||||
|
||||
@@ -217,7 +260,7 @@ static void rights_display(char *path, int is_dir, uint8 mask)
|
||||
rights_print_line(mask & NW_RIGHT_A, 0, "May Change Access Control.", 'A');
|
||||
|
||||
fprintf(stdout, "\n");
|
||||
fprintf(stdout, " * Has no effect on directory.\n\n");
|
||||
fprintf(stdout, "* Has no effect on directory.\n\n");
|
||||
fprintf(stdout, " Entries in Directory May Inherit [%s] rights.\n", mstr);
|
||||
if (mask == 0xff)
|
||||
fprintf(stdout, " You have ALL RIGHTS to Directory Entry.\n");
|
||||
@@ -232,7 +275,7 @@ static void rights_display(char *path, int is_dir, uint8 mask)
|
||||
rights_print_line(mask & NW_RIGHT_A, 0, "May Change Access Control.", 'A');
|
||||
|
||||
fprintf(stdout, "\n");
|
||||
fprintf(stdout, " * Create is necessary to salvage a file that has been deleted.\n\n");
|
||||
fprintf(stdout, "* Create is necessary to salvage a file that has been deleted.\n\n");
|
||||
if (mask == 0xff)
|
||||
fprintf(stdout, " You have ALL RIGHTS to Directory Entry.\n");
|
||||
}
|
||||
@@ -247,6 +290,7 @@ int func_rights(int argc, char *argv[], int mode)
|
||||
(void)mode;
|
||||
|
||||
if (argc > 2) {
|
||||
fprintf(stdout, "Too many parameters on command line.\n");
|
||||
rights_usage();
|
||||
return(1);
|
||||
}
|
||||
@@ -259,10 +303,15 @@ int func_rights(int argc, char *argv[], int mode)
|
||||
path = argv[1];
|
||||
}
|
||||
|
||||
is_dir = rights_path_is_dir(path);
|
||||
if (!rights_path_exists(path, &is_dir)) {
|
||||
fprintf(stdout, "Specified path not locatable.\n");
|
||||
rights_usage();
|
||||
return(1);
|
||||
}
|
||||
|
||||
if (rights_effective_mask(path, is_dir, &mask)) {
|
||||
fprintf(stdout, "Specified path not locatable.\n");
|
||||
rights_usage();
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
32
slist.c
32
slist.c
@@ -6,7 +6,7 @@
|
||||
|
||||
static int usage(void)
|
||||
{
|
||||
fprintf(stdout, "Usage: SLIST [Server] [/Continue]\n");
|
||||
fprintf(stdout, "Usage: SLIST [Server] [/Continue] \n");
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ static void print_net_node_status(uint8 *addr, int is_default)
|
||||
fprintf(stdout, "[%08lX][%12lu]%s",
|
||||
(unsigned long)GET_BE32(addr),
|
||||
node_to_number(addr),
|
||||
is_default ? "Default" : "");
|
||||
is_default ? "Default " : "");
|
||||
}
|
||||
|
||||
int func_slist(int argc, char *argv[], int mode)
|
||||
@@ -52,6 +52,7 @@ int func_slist(int argc, char *argv[], int mode)
|
||||
BINDERY_OBJECT obj;
|
||||
uint32 last_id = MAX_U32;
|
||||
uint8 pattern[50];
|
||||
int explicit_server = 0;
|
||||
int found = 0;
|
||||
int result;
|
||||
int i;
|
||||
@@ -75,19 +76,17 @@ int func_slist(int argc, char *argv[], int mode)
|
||||
}
|
||||
|
||||
strmaxcpy(pattern, argv[i], sizeof(pattern) - 1);
|
||||
explicit_server = 1;
|
||||
}
|
||||
|
||||
upstr(pattern);
|
||||
|
||||
/*
|
||||
* Novell-like layout from the DOS client:
|
||||
* Known NetWare File Servers Network Node Address Status
|
||||
* ------------------------- -------- -------------------
|
||||
*/
|
||||
fprintf(stdout, "%-44sNetwork Node Address Status\n",
|
||||
"Known NetWare File Servers");
|
||||
fprintf(stdout, "%-44s------- ----------- ------\n",
|
||||
"--------------------------");
|
||||
if (!explicit_server) {
|
||||
fprintf(stdout, "%-48sNetwork Node Address Status\n",
|
||||
"Known NetWare File Servers");
|
||||
fprintf(stdout, "%-48s------- ------------ ------\n",
|
||||
"--------------------------");
|
||||
}
|
||||
|
||||
while ((result = ncp_17_37(last_id, NCP_BINDERY_FSERVER,
|
||||
pattern, &obj)) == 0) {
|
||||
@@ -96,7 +95,11 @@ int func_slist(int argc, char *argv[], int mode)
|
||||
found++;
|
||||
last_id = obj.object_id;
|
||||
|
||||
fprintf(stdout, "%-44s", obj.object_name);
|
||||
if (explicit_server && found == 1) {
|
||||
fprintf(stdout, "%-47s", obj.object_name);
|
||||
} else {
|
||||
fprintf(stdout, "%-47s", obj.object_name);
|
||||
}
|
||||
|
||||
if (!ncp_17_3d(NCP_BINDERY_FSERVER, obj.object_name,
|
||||
1, "NET_ADDRESS", &prop)) {
|
||||
@@ -109,6 +112,11 @@ int func_slist(int argc, char *argv[], int mode)
|
||||
if (last_id == MAX_U32) break;
|
||||
}
|
||||
|
||||
if (explicit_server && !found) {
|
||||
fprintf(stdout, "Server %s not found.\n", pattern);
|
||||
return(0);
|
||||
}
|
||||
|
||||
fprintf(stdout, "\nTotal of %d file servers found\n", found);
|
||||
|
||||
return(0);
|
||||
|
||||
@@ -11,19 +11,16 @@ CD \LGNTTMP
|
||||
|
||||
ECHO LGNTC helper started. > C:\LGNTTMP\HELPER.TXT
|
||||
ECHO This helper intentionally changes login state. >> C:\LGNTTMP\HELPER.TXT
|
||||
ECHO It can be started from any directory after LGNTSTA part 1. >> C:\LGNTTMP\HELPER.TXT
|
||||
ECHO After it finishes, login manually as SUPERVISOR with: >> C:\LGNTTMP\HELPER.TXT
|
||||
ECHO C:\LGNTTMP\LOGIN SUPERVISOR >> C:\LGNTTMP\HELPER.TXT
|
||||
ECHO Then run F:\LGNTSTA PART2. >> C:\LGNTTMP\HELPER.TXT
|
||||
ECHO It was started by DLYSTRT after LGNTSTA Part 1 returned. >> C:\LGNTTMP\HELPER.TXT
|
||||
ECHO. >> C:\LGNTTMP\HELPER.TXT
|
||||
|
||||
ECHO === D01 LOGOUT from initial supervisor session === >> C:\LGNTTMP\HELPER.TXT
|
||||
C:\LGNTTMP\LOGOUT > C:\LGNTTMP\D01_LOG.OUT
|
||||
|
||||
ECHO === D02 LOGIN NOPASSUSER === >> C:\LGNTTMP\HELPER.TXT
|
||||
ECHO === D02 LOGIN NOPASSUSER using local Novell LOGIN === >> C:\LGNTTMP\HELPER.TXT
|
||||
C:\LGNTTMP\LOGIN NOPASSUSER > C:\LGNTTMP\D02_LGIN.OUT
|
||||
|
||||
ECHO === D03 MAP after NOPASSUSER login === >> C:\LGNTTMP\HELPER.TXT
|
||||
ECHO === D03 MAP after NOPASSUSER login using local Novell MAP === >> C:\LGNTTMP\HELPER.TXT
|
||||
C:\LGNTTMP\MAP > C:\LGNTTMP\D03_MAP.OUT
|
||||
|
||||
ECHO === D04 LOGOUT NOPASSUSER === >> C:\LGNTTMP\HELPER.TXT
|
||||
@@ -33,9 +30,58 @@ REM Novell LOGIN /? may print usage directly to the console instead of stdout.
|
||||
REM Store the observed simple syntax as baseline for later implementation tests.
|
||||
ECHO Usage: LOGIN [server/]user > C:\LGNTTMP\D99_HELP.OUT
|
||||
|
||||
IF "%LGNTPWD%"=="" GOTO MANUAL
|
||||
|
||||
ECHO === D05 LOGIN SUPERVISOR using maintainer F:\LOGIN\LOGIN /PWD option === >> C:\LGNTTMP\HELPER.TXT
|
||||
F:
|
||||
CD \
|
||||
IF EXIST \LOGIN\LOGIN.EXE GOTO HAVELOGINF
|
||||
ECHO F:\LOGIN\LOGIN.EXE not found before supervisor relogin. >> C:\LGNTTMP\HELPER.TXT
|
||||
ECHO.
|
||||
ECHO F:\LOGIN\LOGIN.EXE nicht gefunden.
|
||||
ECHO Bitte manuell als SUPERVISOR einloggen und danach ausfuehren:
|
||||
ECHO F:
|
||||
ECHO CD \
|
||||
ECHO LGNTSTA PART2
|
||||
GOTO END
|
||||
|
||||
:HAVELOGINF
|
||||
F:
|
||||
CD \
|
||||
F:\LOGIN\LOGIN SUPERVISOR /PWD:%LGNTPWD% > C:\LGNTTMP\D05_LGSUP.OUT
|
||||
|
||||
ECHO === Check F: before queuing LGNTSTA PART2 === >> C:\LGNTTMP\HELPER.TXT
|
||||
F:
|
||||
CD \
|
||||
IF EXIST \LGNTSTA.BAT GOTO QUEUEP2
|
||||
ECHO F: not restored or \LGNTSTA.BAT missing after supervisor login. >> C:\LGNTTMP\HELPER.TXT
|
||||
ECHO.
|
||||
ECHO F: wurde nicht wiederhergestellt oder \LGNTSTA.BAT fehlt.
|
||||
ECHO Bitte manuell pruefen und dann ausfuehren:
|
||||
ECHO F:
|
||||
ECHO CD \
|
||||
ECHO LGNTSTA PART2
|
||||
GOTO END
|
||||
|
||||
:QUEUEP2
|
||||
ECHO F: is available. Queueing delayed LGNTSTA PART2 only. >> C:\LGNTTMP\HELPER.TXT
|
||||
C:
|
||||
CD \LGNTTMP
|
||||
DLYSTRT /T:2 F:\LGNTSTA.BAT PART2 > C:\LGNTTMP\D06_P2.OUT
|
||||
ECHO LGNTC queued F:\LGNTSTA.BAT PART2. LGNTZIP is intentionally not automatic. >> C:\LGNTTMP\HELPER.TXT
|
||||
ECHO.
|
||||
ECHO LGNTC fertig. PART2 wird per DLYSTRT gestartet.
|
||||
ECHO LGNTZIP danach bei Bedarf manuell ausfuehren.
|
||||
GOTO END
|
||||
|
||||
:MANUAL
|
||||
ECHO LGNTPWD is not set; automatic SUPERVISOR login skipped. >> C:\LGNTTMP\HELPER.TXT
|
||||
ECHO.
|
||||
ECHO LGNTC fertig. Jetzt manuell wieder als SUPERVISOR einloggen:
|
||||
ECHO C:\LGNTTMP\LOGIN SUPERVISOR
|
||||
ECHO F:\LOGIN\LOGIN SUPERVISOR
|
||||
ECHO Danach ausfuehren:
|
||||
ECHO F:\LGNTSTA PART2
|
||||
ECHO LGNTZIP danach bei Bedarf manuell ausfuehren.
|
||||
ECHO.
|
||||
|
||||
:END
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
@ECHO OFF
|
||||
REM LGNTSTA.BAT
|
||||
REM Two-stage LOGIN/LOGOUT baseline test for MARS NWE.
|
||||
REM Automated LOGIN/LOGOUT baseline test for MARS NWE.
|
||||
REM
|
||||
REM START from F: while logged in as SUPERVISOR:
|
||||
REM SET LGNTPWD=your-supervisor-password
|
||||
REM F:\LGNTSTA
|
||||
REM Then run the C: helper manually:
|
||||
REM C:
|
||||
REM CD \LGNTTMP
|
||||
REM LGNTC
|
||||
REM After that login manually using the local C: LOGIN copy and run:
|
||||
REM C:\LGNTTMP\LOGIN SUPERVISOR
|
||||
REM F:\LGNTSTA PART2
|
||||
REM
|
||||
REM PART2 copies captured C: results back to F:\LGNTCMP.
|
||||
REM LGNTSTA prepares C:\LGNTTMP, installs a delayed start for LGNTC.BAT,
|
||||
REM and then exits while F: is still available. DLYSTRT starts the local
|
||||
REM C: helper after a short delay. The helper logs out, logs in as
|
||||
REM NOPASSUSER, captures MAP, logs out, then logs in as SUPERVISOR again
|
||||
REM using F:\LOGIN\LOGIN /PWD:%LGNTPWD%, then queues PART2 with DLYSTRT.
|
||||
REM LGNTZIP is not started automatically.
|
||||
REM
|
||||
REM SYS:LOGIN / SYS:PUBLIC are NOT overwritten by this test.
|
||||
|
||||
IF "%1"=="" GOTO PART1
|
||||
@@ -38,6 +38,18 @@ GOTO USAGE
|
||||
F:
|
||||
CD \
|
||||
|
||||
IF NOT "%LGNTPWD%"=="" GOTO PWDCHECKOK
|
||||
ECHO ERROR: LGNTPWD ist nicht gesetzt.
|
||||
ECHO.
|
||||
ECHO Fuer den vollautomatischen LOGIN/LOGOUT-Test zuerst setzen, z.B.:
|
||||
ECHO SET LGNTPWD=dein-supervisor-passwort
|
||||
ECHO Danach starten:
|
||||
ECHO F:\LGNTSTA
|
||||
ECHO.
|
||||
ECHO Es wurde kein DLYSTRT installiert und kein Login-Test gestartet.
|
||||
GOTO END
|
||||
:PWDCHECKOK
|
||||
|
||||
REM --- Recreate generated result/temp directories. ---
|
||||
IF EXIST LGNTCMP DELTREE /Y LGNTCMP
|
||||
MD LGNTCMP > NUL
|
||||
@@ -46,42 +58,54 @@ MD LGNTCMP\OUT > NUL
|
||||
ECHO LGNTSTA LOGIN/LOGOUT test > F:\LGNTCMP\RUN.LOG
|
||||
ECHO Part 1 started while logged in as SUPERVISOR. >> F:\LGNTCMP\RUN.LOG
|
||||
ECHO Helper will use user NOPASSUSER on server MARS. >> F:\LGNTCMP\RUN.LOG
|
||||
ECHO This test is manual after logout because F: disappears. >> F:\LGNTCMP\RUN.LOG
|
||||
ECHO This test uses DLYSTRT so F:\LGNTSTA can finish before LOGOUT. >> F:\LGNTCMP\RUN.LOG
|
||||
ECHO SYS:LOGIN, SYS:PUBLIC, and SYS:NPUBLIC are not modified. >> F:\LGNTCMP\RUN.LOG
|
||||
ECHO. >> F:\LGNTCMP\RUN.LOG
|
||||
|
||||
ECHO LGNTPWD is set; automatic SUPERVISOR login is enabled. >> F:\LGNTCMP\RUN.LOG
|
||||
|
||||
IF EXIST C:\LGNTTMP DELTREE /Y C:\LGNTTMP
|
||||
MD C:\LGNTTMP > NUL
|
||||
|
||||
REM --- Copy Novell baseline tools to local C: directory only. ---
|
||||
REM Do not overwrite SYS:LOGIN, SYS:PUBLIC, or SYS:NPUBLIC.
|
||||
REM LOGIN/MAP are from NLOGIN, LOGOUT is from NPUBLIC.
|
||||
REM The helper runs from C:\LGNTTMP so DOS should find tools there after LOGOUT.
|
||||
ECHO Copying Novell runtime tools to C:\LGNTTMP. >> F:\LGNTCMP\RUN.LOG
|
||||
COPY \NLOGIN\LOGIN.* C:\LGNTTMP >> F:\LGNTCMP\RUN.LOG
|
||||
COPY \NLOGIN\MAP.* C:\LGNTTMP >> F:\LGNTCMP\RUN.LOG
|
||||
COPY \NPUBLIC\LOGOUT.* C:\LGNTTMP >> F:\LGNTCMP\RUN.LOG
|
||||
|
||||
REM DLYSTRT is also copied to C: so the whole delayed phase uses local tools.
|
||||
IF EXIST \PUBLIC\DLYSTRT.EXE GOTO HAVEDLY
|
||||
ECHO ERROR: \PUBLIC\DLYSTRT.EXE not found. >> F:\LGNTCMP\RUN.LOG
|
||||
ECHO ERROR: \PUBLIC\DLYSTRT.EXE not found.
|
||||
ECHO Build/install dostools with MAINTAINER_BUILD=ON.
|
||||
GOTO END
|
||||
:HAVEDLY
|
||||
COPY \PUBLIC\DLYSTRT.EXE C:\LGNTTMP >> F:\LGNTCMP\RUN.LOG
|
||||
|
||||
ECHO Copying helper to C:\LGNTTMP\LGNTC.BAT >> F:\LGNTCMP\RUN.LOG
|
||||
COPY F:\LGNTC.BAT C:\LGNTTMP >> F:\LGNTCMP\RUN.LOG
|
||||
|
||||
ECHO Installing delayed helper start from local C:\LGNTTMP. >> F:\LGNTCMP\RUN.LOG
|
||||
IF EXIST C:\LGNTTMP\DLYSTRT.EXE GOTO HAVEDLYLOCAL
|
||||
ECHO ERROR: C:\LGNTTMP\DLYSTRT.EXE not copied. >> F:\LGNTCMP\RUN.LOG
|
||||
ECHO ERROR: C:\LGNTTMP\DLYSTRT.EXE not copied.
|
||||
GOTO END
|
||||
:HAVEDLYLOCAL
|
||||
REM Switch to C: before installing DLYSTRT. The delayed command is
|
||||
REM typed into the current DOS prompt, so the prompt must not still be F:.
|
||||
C:
|
||||
CD \LGNTTMP
|
||||
DLYSTRT /T:2 LGNTC.BAT >> F:\LGNTCMP\RUN.LOG
|
||||
|
||||
ECHO. >> F:\LGNTCMP\RUN.LOG
|
||||
ECHO NEXT MANUAL STEPS: >> F:\LGNTCMP\RUN.LOG
|
||||
ECHO C: >> F:\LGNTCMP\RUN.LOG
|
||||
ECHO CD \LGNTTMP >> F:\LGNTCMP\RUN.LOG
|
||||
ECHO LGNTC >> F:\LGNTCMP\RUN.LOG
|
||||
ECHO C:\LGNTTMP\LOGIN SUPERVISOR >> F:\LGNTCMP\RUN.LOG
|
||||
ECHO F:\LGNTSTA PART2 >> F:\LGNTCMP\RUN.LOG
|
||||
ECHO DLYSTRT installed LGNTC.BAT from C:\LGNTTMP. >> F:\LGNTCMP\RUN.LOG
|
||||
ECHO LGNTSTA Part 1 finished; helper will start from local C: after delay. >> F:\LGNTCMP\RUN.LOG
|
||||
|
||||
ECHO LGNTSTA Part 1 fertig.
|
||||
ECHO Jetzt manuell ausfuehren:
|
||||
ECHO C:
|
||||
ECHO CD \LGNTTMP
|
||||
ECHO LGNTC
|
||||
ECHO Danach wieder als SUPERVISOR einloggen mit:
|
||||
ECHO C:\LGNTTMP\LOGIN SUPERVISOR
|
||||
ECHO Dann:
|
||||
ECHO F:\LGNTSTA PART2
|
||||
ECHO DLYSTRT startet gleich C:\LGNTTMP\LGNTC.BAT.
|
||||
ECHO Bitte warten...
|
||||
GOTO END
|
||||
|
||||
:PART2
|
||||
@@ -100,13 +124,18 @@ ECHO LGNTSTA LOGIN/LOGOUT baseline finished. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO Novell LOGIN/MAP/LOGOUT were copied only to C:\LGNTTMP. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO LOGIN/MAP source: SYS:NLOGIN. LOGOUT source: SYS:NPUBLIC. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO SYS:LOGIN, SYS:PUBLIC, and SYS:NPUBLIC were not modified. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO DLYSTRT was used to start C:\LGNTTMP\LGNTC.BAT after Part 1 returned. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO Expected files: >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO - D01_LOG.OUT LOGOUT output from initial supervisor session. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO - D02_LGIN.OUT LOGIN NOPASSUSER baseline output. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO - D03_MAP.OUT MAP output after NOPASSUSER login. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO - D04_LGOT.OUT LOGOUT output from NOPASSUSER session. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO - D05_LGSU.OUT F:\LOGIN\LOGIN SUPERVISOR /PWD output. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO - D06_P2.OUT DLYSTRT output for delayed PART2 start. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO - D99_HELP.OUT Simulated LOGIN usage baseline if help is not redirectable. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO DLYSTRT.EXE was copied locally to C:\LGNTTMP before starting the helper and PART2. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO LGNTZIP is not started automatically; run it manually after inspection. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
ECHO Optional: LGNTZIP ausfuehren. >> F:\LGNTCMP\SUMMARY.TXT
|
||||
|
||||
@@ -118,11 +147,14 @@ GOTO END
|
||||
:USAGE
|
||||
ECHO Usage: LGNTSTA [PART2]
|
||||
ECHO.
|
||||
ECHO Ohne Parameter startet LGNTSTA Part 1.
|
||||
ECHO Ohne Parameter startet LGNTSTA Part 1 und installiert DLYSTRT.
|
||||
ECHO PART2 sammelt nach dem erneuten SUPERVISOR-Login die C:-Ergebnisse ein.
|
||||
ECHO Gueltiger Parameter ist PART2; part2/Part2 wird ebenfalls akzeptiert.
|
||||
ECHO Beispiel:
|
||||
ECHO F:\LGNTSTA PART2
|
||||
ECHO.
|
||||
ECHO Fuer vollautomatischen Lauf vorher setzen, z.B.:
|
||||
ECHO SET LGNTPWD=dein-supervisor-passwort
|
||||
ECHO Danach starten:
|
||||
ECHO F:\LGNTSTA
|
||||
GOTO END
|
||||
|
||||
:END
|
||||
|
||||
@@ -1,74 +1,75 @@
|
||||
# LOGIN / LOGOUT baseline test
|
||||
|
||||
`LGNTSTA` is a manual two-stage baseline test for Novell `LOGIN`, `LOGOUT`, and `MAP`.
|
||||
|
||||
This test does **not** overwrite `SYS:LOGIN`, `SYS:PUBLIC`, or `SYS:NPUBLIC`. It copies the Novell tools to a temporary local directory on `C:` and runs from there. `LOGIN` and `MAP` are copied from `SYS:NLOGIN`; `LOGOUT` is copied from `SYS:NPUBLIC`.
|
||||
|
||||
## Required setup
|
||||
|
||||
User `NOPASSUSER` must exist on `MARS` and must be able to login without a password.
|
||||
|
||||
## Run
|
||||
|
||||
Start while logged in as `SUPERVISOR`:
|
||||
|
||||
```bat
|
||||
F:\LGNTSTA
|
||||
```
|
||||
|
||||
Then run the helper from `C:`:
|
||||
|
||||
```bat
|
||||
C:
|
||||
CD \LGNTTMP
|
||||
LGNTC
|
||||
```
|
||||
|
||||
The helper does:
|
||||
|
||||
```text
|
||||
LOGOUT
|
||||
LOGIN NOPASSUSER
|
||||
MAP
|
||||
LOGOUT
|
||||
```
|
||||
|
||||
All tool calls and redirected output paths are absolute `C:\LGNTTMP\...`, because Novell `LOGIN` can change the current drive/search path.
|
||||
|
||||
Then login manually as `SUPERVISOR` again from the same local tool directory:
|
||||
|
||||
```bat
|
||||
C:\LGNTTMP\LOGIN SUPERVISOR
|
||||
```
|
||||
|
||||
After the login script restores `F:`, collect results:
|
||||
|
||||
```bat
|
||||
F:\LGNTSTA PART2
|
||||
F:\LGNTZIP
|
||||
```
|
||||
|
||||
## Expected output files
|
||||
|
||||
`F:\LGNTCMP\OUT` contains:
|
||||
|
||||
```text
|
||||
D01_LOG.OUT LOGOUT output from initial supervisor session
|
||||
D02_LGIN.OUT LOGIN NOPASSUSER output
|
||||
D03_MAP.OUT MAP output after NOPASSUSER login
|
||||
D04_LGOT.OUT LOGOUT output from NOPASSUSER session
|
||||
D99_HELP.OUT simulated LOGIN usage line for later comparison
|
||||
HELPER.TXT helper trace
|
||||
```
|
||||
|
||||
`D99_HELP.OUT` is intentionally produced with `ECHO`, because Novell `LOGIN /?` may not redirect help text reliably.
|
||||
|
||||
|
||||
## Implementation note
|
||||
|
||||
After `LOGIN NOPASSUSER`, DOS/NetWare may change the current drive/search path. `LGNTC.BAT` therefore calls `C:\LGNTTMP\LOGIN`, `C:\LGNTTMP\MAP`, and `C:\LGNTTMP\LOGOUT` explicitly and redirects to absolute `C:\LGNTTMP\*.OUT` files.
|
||||
|
||||
## Parameter handling
|
||||
|
||||
`LGNTSTA` starts Part 1 only when called without parameters. `PART2` is accepted case-insensitively (`PART2`, `part2`, `Part2`, etc.). Any other parameter prints usage and does not start Part 1, so a typo cannot accidentally reset the test state.
|
||||
|
||||
# LOGIN / LOGOUT baseline test
|
||||
|
||||
`LGNTSTA` is an automated maintainer baseline test for Novell `LOGIN`, `LOGOUT`, and `MAP`.
|
||||
|
||||
This test does **not** overwrite `SYS:LOGIN`, `SYS:PUBLIC`, or `SYS:NPUBLIC`. It copies the Novell tools to a temporary local directory on `C:` and runs from there. `LOGIN` and `MAP` are copied from `SYS:NLOGIN`; `LOGOUT` is copied from `SYS:NPUBLIC`. The maintainer helper `DLYSTRT.EXE` is also copied to `C:\LGNTTMP` before it is used, so the delayed phase no longer depends on `F:` or `PUBLIC` being visible.
|
||||
|
||||
## Required setup
|
||||
|
||||
User `NOPASSUSER` must exist on `MARS` and must be able to login without a password.
|
||||
|
||||
For a fully automated run, the DOS tools must be built with `MAINTAINER_BUILD=ON` so `LOGIN /PWD:` and `DLYSTRT` are available.
|
||||
|
||||
Set the supervisor password in the DOS environment before starting:
|
||||
|
||||
```bat
|
||||
SET LGNTPWD=your-supervisor-password
|
||||
```
|
||||
|
||||
The password is not written to `RUN.LOG` or `HELPER.TXT`, but it is still present in the DOS environment during the test. Use this only for maintainer testing.
|
||||
|
||||
## Run
|
||||
|
||||
Start while logged in as `SUPERVISOR`:
|
||||
|
||||
```bat
|
||||
F:\LGNTSTA
|
||||
```
|
||||
|
||||
`LGNTSTA` prepares `C:\LGNTTMP`, copies the local helper there, and installs:
|
||||
|
||||
```bat
|
||||
C:
|
||||
CD \LGNTTMP
|
||||
DLYSTRT /T:2 LGNTC.BAT
|
||||
```
|
||||
|
||||
Then `LGNTSTA` exits after switching to `C:\LGNTTMP`. After the delay, `DLYSTRT` types `LGNTC.BAT` into the local `C:` prompt, and the helper does:
|
||||
|
||||
```text
|
||||
LOGOUT
|
||||
LOGIN NOPASSUSER
|
||||
MAP
|
||||
LOGOUT
|
||||
LOGIN SUPERVISOR /PWD:%LGNTPWD%
|
||||
F:\LGNTSTA PART2
|
||||
F:\LGNTZIP
|
||||
```
|
||||
|
||||
If `LGNTPWD` is not set, `LGNTSTA` does not start Part 1 at all. It prints a short usage hint with the required `SET LGNTPWD=...` command and does not install `DLYSTRT`, so the test cannot accidentally log out and then stop half-way through.
|
||||
|
||||
## Expected output files
|
||||
|
||||
`F:\LGNTCMP\OUT` contains:
|
||||
|
||||
```text
|
||||
D01_LOG.OUT LOGOUT output from initial supervisor session
|
||||
D02_LGIN.OUT LOGIN NOPASSUSER output
|
||||
D03_MAP.OUT MAP output after NOPASSUSER login
|
||||
D04_LGOT.OUT LOGOUT output from NOPASSUSER session
|
||||
D05_LGSU.OUT LOGIN SUPERVISOR /PWD output, if LGNTPWD was set
|
||||
D99_HELP.OUT simulated LOGIN usage line for later comparison
|
||||
HELPER.TXT helper trace
|
||||
```
|
||||
|
||||
`D99_HELP.OUT` is intentionally produced with `ECHO`, because Novell `LOGIN /?` may not redirect help text reliably.
|
||||
|
||||
## Implementation note
|
||||
|
||||
After `LOGOUT`, the network drive `F:` disappears. Therefore `LGNTSTA` must finish before logout happens. `DLYSTRT` provides that gap by returning to DOS first. `LGNTSTA` switches to `C:\LGNTTMP` before installing it, so the delayed command is typed into a local `C:` prompt instead of an `F:` prompt.
|
||||
|
||||
After `LOGIN NOPASSUSER`, DOS/NetWare may change the current drive/search path. `LGNTC.BAT` therefore calls `C:\LGNTTMP\LOGIN`, `C:\LGNTTMP\MAP`, and `C:\LGNTTMP\LOGOUT` explicitly and redirects to absolute `C:\LGNTTMP\*.OUT` files.
|
||||
|
||||
## Parameter handling
|
||||
|
||||
`LGNTSTA` starts Part 1 only when called without parameters. `PART2` is accepted case-insensitively (`PART2`, `part2`, `Part2`, etc.). Any other parameter prints usage and does not start Part 1, so a typo cannot accidentally reset the test state.
|
||||
|
||||
@@ -1,23 +1,45 @@
|
||||
# RGHTSTA - RIGHTS baseline test
|
||||
|
||||
Novell-only baseline for `RIGHTS` behavior.
|
||||
|
||||
Runs `\NPUBLIC\RIGHTS` against a small generated test tree:
|
||||
|
||||
- default/current directory from `F:\`
|
||||
- explicit directory and subdirectory paths
|
||||
- explicit file and nested file paths
|
||||
- default/current directory from inside the test directory
|
||||
- relative file and relative directory paths
|
||||
- missing directory/file paths
|
||||
- too-many-arguments and `/?` usage/help cases
|
||||
|
||||
Results are written to `F:\RGHTCMP`. Test input files are generated in `F:\RGHTEST`.
|
||||
Optional packaging is done with `RGHTZIP.BAT`.
|
||||
|
||||
This test does not use `PUBLIC` yet and does not modify trustees. It is only
|
||||
for capturing Novell `NPUBLIC\RIGHTS` output/formatting before the later
|
||||
`NPUBLIC`/`PUBLIC` comparison scripts are added.
|
||||
|
||||
|
||||
Note: commands use absolute `\NPUBLIC\RIGHTS` so relative-path tests from inside `F:\RGHTEST` do not accidentally look for `F:\RGHTEST\NPUBLIC\RIGHTS`.
|
||||
# RGHTSTA - RIGHTS comparison test
|
||||
|
||||
`RGHTSTA.BAT` compares Novell `RIGHTS` with the current implementation.
|
||||
|
||||
Result directories:
|
||||
|
||||
```text
|
||||
F:\RGHTCMP\OUT Novell baseline using \NPUBLIC\RIGHTS
|
||||
F:\RGHTCMP\PUBOUT current implementation using \PUBLIC\RIGHTS
|
||||
F:\RGHTCMP\COMPARE.LOG
|
||||
```
|
||||
|
||||
The test keeps the original Novell-baseline behavior and adds the public-tool
|
||||
comparison layer.
|
||||
|
||||
Coverage:
|
||||
|
||||
- default/current directory from `F:\`
|
||||
- explicit directory and subdirectory paths
|
||||
- explicit file and nested file paths
|
||||
- default/current directory from inside the test directory
|
||||
- relative file and relative directory paths
|
||||
- missing directory/file paths
|
||||
- too-many-arguments and `/?` usage/help cases
|
||||
|
||||
operation. Its redirected output must be identical to the normal Novell output.
|
||||
That means:
|
||||
|
||||
```text
|
||||
OUT == PUBOUT
|
||||
```
|
||||
|
||||
Run:
|
||||
|
||||
```bat
|
||||
F:
|
||||
CD \
|
||||
RGHTSTA
|
||||
RGHTZIP
|
||||
```
|
||||
|
||||
The generated test tree is `F:\RGHTEST`. `RGHTZIP.BAT` packages the result and
|
||||
then removes `F:\RGHTEST` again so the SYS root stays clean.
|
||||
|
||||
Note: `RIGHTS` currently has no short-output comparison in this baseline test. That switch exists for NDIR-style output control and should only be added to RIGHTS later if the tool implements it explicitly.
|
||||
|
||||
165
test/rights/RGHTC.BAT
Normal file
165
test/rights/RGHTC.BAT
Normal file
@@ -0,0 +1,165 @@
|
||||
@ECHO OFF
|
||||
REM RGHTC.BAT - delayed user-context RIGHTS capture helper.
|
||||
REM Started by RGHTSTA via DLYSTRT. Runs from C:\RGHTTMP.
|
||||
|
||||
C:
|
||||
CD \RGHTTMP
|
||||
|
||||
ECHO RGHTC user-context RIGHTS helper > HELPER.TXT
|
||||
ECHO Current phase: logout supervisor, login NOPASSUSER. >> HELPER.TXT
|
||||
|
||||
LOGOUT > ULOG1.OUT
|
||||
LOGIN NOPASSUSER > ULOGIN.OUT
|
||||
|
||||
F:
|
||||
CD \
|
||||
IF EXIST \NPUBLIC\RIGHTS.EXE GOTO HAVEF
|
||||
ECHO F: not ready after NOPASSUSER login. >> C:\RGHTTMP\HELPER.TXT
|
||||
GOTO RELSUP
|
||||
|
||||
:HAVEF
|
||||
ECHO Starting U10_R as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U10 > C:\RGHTTMP\UNOV\U10_R.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U10 > C:\RGHTTMP\UPUB\U10_R.OUT
|
||||
ECHO Starting U11_W as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U11 > C:\RGHTTMP\UNOV\U11_W.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U11 > C:\RGHTTMP\UPUB\U11_W.OUT
|
||||
ECHO Starting U12_C as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U12 > C:\RGHTTMP\UNOV\U12_C.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U12 > C:\RGHTTMP\UPUB\U12_C.OUT
|
||||
ECHO Starting U13_E as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U13 > C:\RGHTTMP\UNOV\U13_E.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U13 > C:\RGHTTMP\UPUB\U13_E.OUT
|
||||
ECHO Starting U14_M as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U14 > C:\RGHTTMP\UNOV\U14_M.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U14 > C:\RGHTTMP\UPUB\U14_M.OUT
|
||||
ECHO Starting U15_F as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U15 > C:\RGHTTMP\UNOV\U15_F.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U15 > C:\RGHTTMP\UPUB\U15_F.OUT
|
||||
ECHO Starting U16_A as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U16 > C:\RGHTTMP\UNOV\U16_A.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U16 > C:\RGHTTMP\UPUB\U16_A.OUT
|
||||
ECHO Starting U17_S as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U17 > C:\RGHTTMP\UNOV\U17_S.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U17 > C:\RGHTTMP\UPUB\U17_S.OUT
|
||||
ECHO Starting U20_RF as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U20 > C:\RGHTTMP\UNOV\U20_RF.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U20 > C:\RGHTTMP\UPUB\U20_RF.OUT
|
||||
ECHO Starting U21_RW as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U21 > C:\RGHTTMP\UNOV\U21_RW.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U21 > C:\RGHTTMP\UPUB\U21_RW.OUT
|
||||
ECHO Starting U22_RWC as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U22 > C:\RGHTTMP\UNOV\U22_RWC.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U22 > C:\RGHTTMP\UPUB\U22_RWC.OUT
|
||||
ECHO Starting U23_RWCE as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U23 > C:\RGHTTMP\UNOV\U23_RWCE.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U23 > C:\RGHTTMP\UPUB\U23_RWCE.OUT
|
||||
ECHO Starting U24_RAL as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U24 > C:\RGHTTMP\UNOV\U24_RAL.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U24 > C:\RGHTTMP\UPUB\U24_RAL.OUT
|
||||
ECHO Starting U25_SAL as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U25 > C:\RGHTTMP\UNOV\U25_SAL.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U25 > C:\RGHTTMP\UPUB\U25_SAL.OUT
|
||||
ECHO Starting U26_ALL as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U26 > C:\RGHTTMP\UNOV\U26_ALL.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U26 > C:\RGHTTMP\UPUB\U26_ALL.OUT
|
||||
ECHO Starting U27_N as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U27 > C:\RGHTTMP\UNOV\U27_N.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U27 > C:\RGHTTMP\UPUB\U27_N.OUT
|
||||
ECHO Starting U30_RE as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U30 > C:\RGHTTMP\UNOV\U30_RE.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U30 > C:\RGHTTMP\UPUB\U30_RE.OUT
|
||||
ECHO Starting U31_RWF as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U31 > C:\RGHTTMP\UNOV\U31_RWF.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U31 > C:\RGHTTMP\UPUB\U31_RWF.OUT
|
||||
ECHO Starting U32_RCM as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U32 > C:\RGHTTMP\UNOV\U32_RCM.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U32 > C:\RGHTTMP\UPUB\U32_RCM.OUT
|
||||
ECHO Starting U33_RFA as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U33 > C:\RGHTTMP\UNOV\U33_RFA.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U33 > C:\RGHTTMP\UPUB\U33_RFA.OUT
|
||||
ECHO Starting U34_WCM as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U34 > C:\RGHTTMP\UNOV\U34_WCM.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U34 > C:\RGHTTMP\UPUB\U34_WCM.OUT
|
||||
ECHO Starting U35_EMF as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U35 > C:\RGHTTMP\UNOV\U35_EMF.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U35 > C:\RGHTTMP\UPUB\U35_EMF.OUT
|
||||
ECHO Starting U36_RMF as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U36 > C:\RGHTTMP\UNOV\U36_RMF.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U36 > C:\RGHTTMP\UPUB\U36_RMF.OUT
|
||||
ECHO Starting U37_REMA as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U37 > C:\RGHTTMP\UNOV\U37_REMA.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U37 > C:\RGHTTMP\UPUB\U37_REMA.OUT
|
||||
ECHO Starting U38_SR as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U38 > C:\RGHTTMP\UNOV\U38_SR.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U38 > C:\RGHTTMP\UPUB\U38_SR.OUT
|
||||
ECHO Starting U39_SRF as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U39 > C:\RGHTTMP\UNOV\U39_SRF.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U39 > C:\RGHTTMP\UPUB\U39_SRF.OUT
|
||||
ECHO Starting U40_SWCM as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\U40 > C:\RGHTTMP\UNOV\U40_SWCM.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\U40 > C:\RGHTTMP\UPUB\U40_SWCM.OUT
|
||||
ECHO Starting F10_R as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\UF10\F.TXT > C:\RGHTTMP\UNOV\F10_R.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\UF10\F.TXT > C:\RGHTTMP\UPUB\F10_R.OUT
|
||||
ECHO Starting F11_RF as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\UF11\F.TXT > C:\RGHTTMP\UNOV\F11_RF.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\UF11\F.TXT > C:\RGHTTMP\UPUB\F11_RF.OUT
|
||||
ECHO Starting F12_RAL as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\UF12\F.TXT > C:\RGHTTMP\UNOV\F12_RAL.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\UF12\F.TXT > C:\RGHTTMP\UPUB\F12_RAL.OUT
|
||||
ECHO Starting F13_ALL as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\UF13\F.TXT > C:\RGHTTMP\UNOV\F13_ALL.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\UF13\F.TXT > C:\RGHTTMP\UPUB\F13_ALL.OUT
|
||||
ECHO Starting F14_N as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\UF14\F.TXT > C:\RGHTTMP\UNOV\F14_N.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\UF14\F.TXT > C:\RGHTTMP\UPUB\F14_N.OUT
|
||||
ECHO Starting F15_S as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\UF15\F.TXT > C:\RGHTTMP\UNOV\F15_S.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\UF15\F.TXT > C:\RGHTTMP\UPUB\F15_S.OUT
|
||||
ECHO Starting F16_SAL as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\UF16\F.TXT > C:\RGHTTMP\UNOV\F16_SAL.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\UF16\F.TXT > C:\RGHTTMP\UPUB\F16_SAL.OUT
|
||||
|
||||
:RELSUP
|
||||
ECHO Logging out NOPASSUSER and returning to SUPERVISOR. >> C:\RGHTTMP\HELPER.TXT
|
||||
LOGOUT > C:\RGHTTMP\ULOG2.OUT
|
||||
|
||||
F:
|
||||
CD \
|
||||
IF EXIST \LOGIN\LOGIN.EXE GOTO HAVELOGIN
|
||||
ECHO F:\LOGIN\LOGIN.EXE not found. >> C:\RGHTTMP\HELPER.TXT
|
||||
GOTO MANUAL
|
||||
|
||||
:HAVELOGIN
|
||||
F:\LOGIN\LOGIN SUPERVISOR /PWD:%LGNTPWD% > C:\RGHTTMP\ULOGSUP.OUT
|
||||
|
||||
F:
|
||||
CD \
|
||||
IF EXIST \RGHTSTA.BAT GOTO QUEUEP2
|
||||
ECHO F: not restored or \RGHTSTA.BAT not visible. >> C:\RGHTTMP\HELPER.TXT
|
||||
GOTO MANUAL
|
||||
|
||||
:QUEUEP2
|
||||
C:
|
||||
CD \RGHTTMP
|
||||
IF EXIST DLYSTRT.EXE GOTO HVDLY
|
||||
ECHO C:\RGHTTMP\DLYSTRT.EXE not found. >> HELPER.TXT
|
||||
GOTO MANUAL
|
||||
|
||||
:HVDLY
|
||||
ECHO Queueing F:\RGHTSTA.BAT PART2 via DLYSTRT. >> HELPER.TXT
|
||||
DLYSTRT /T:2 F:\RGHTSTA.BAT PART2
|
||||
GOTO END
|
||||
|
||||
:MANUAL
|
||||
ECHO Manual steps required:
|
||||
ECHO LOGIN SUPERVISOR
|
||||
ECHO F:
|
||||
ECHO CD \
|
||||
ECHO RGHTSTA PART2
|
||||
ECHO RGHTZIP
|
||||
ECHO Manual steps required. >> C:\RGHTTMP\HELPER.TXT
|
||||
|
||||
:END
|
||||
ECHO RGHTC finished. >> C:\RGHTTMP\HELPER.TXT
|
||||
@@ -1,87 +1,370 @@
|
||||
@ECHO OFF
|
||||
REM RGHTSTA.BAT
|
||||
REM Automated RIGHTS baseline test for MARS NWE.
|
||||
REM Automated RIGHTS comparison test for MARS NWE.
|
||||
REM
|
||||
REM Uses \NPUBLIC\RIGHTS as Novell baseline for currently implemented tool behavior.
|
||||
REM This test is read-only from the RIGHTS tool point of view. It only creates
|
||||
REM a small local test tree so directory, file, relative, current-directory,
|
||||
REM missing-path, and usage output can be captured.
|
||||
REM Direct mode:
|
||||
REM OUT = Novell baseline using \NPUBLIC\RIGHTS
|
||||
REM PUBOUT = our implementation using \PUBLIC\RIGHTS
|
||||
REM
|
||||
REM Result tree:
|
||||
REM F:\RGHTCMP
|
||||
REM Test tree:
|
||||
REM F:\RGHTEST
|
||||
REM User-context mode:
|
||||
REM SUPERVISOR grants mixed rights to NOPASSUSER.
|
||||
REM DLYSTRT starts C:\RGHTTMP\RGHTC.BAT after this script exits.
|
||||
REM RGHTC logs in as NOPASSUSER and captures RIGHTS output.
|
||||
REM
|
||||
REM Optional automatic user-context mode requires:
|
||||
REM SET LGNTPWD=your-supervisor-password
|
||||
|
||||
IF "%1"=="" GOTO PART1
|
||||
IF "%1"=="PART2" GOTO PART2
|
||||
IF "%1"=="part2" GOTO PART2
|
||||
IF "%1"=="Part2" GOTO PART2
|
||||
ECHO Usage: RGHTSTA [PART2]
|
||||
GOTO END
|
||||
|
||||
:PART1
|
||||
F:
|
||||
CD \
|
||||
|
||||
REM --- Clean generated test/result directories (contents only). ---
|
||||
IF EXIST RGHTEST\NUL DELTREE /Y RGHTEST\*.*
|
||||
IF EXIST RGHTCMP\NUL DELTREE /Y RGHTCMP\*.*
|
||||
REM --- Clean generated test/result directories. ---
|
||||
IF EXIST RGHTEST\*.* DELTREE /Y RGHTEST
|
||||
IF EXIST RGHTCMP\*.* DELTREE /Y RGHTCMP
|
||||
IF EXIST C:\RGHTTMP\*.* DELTREE /Y C:\RGHTTMP
|
||||
|
||||
IF NOT EXIST RGHTEST\NUL MD RGHTEST
|
||||
IF NOT EXIST RGHTEST\SUBDIR\NUL MD RGHTEST\SUBDIR
|
||||
IF NOT EXIST RGHTCMP\NUL MD RGHTCMP
|
||||
IF NOT EXIST RGHTCMP\OUT\NUL MD RGHTCMP\OUT
|
||||
IF NOT EXIST RGHTEST MD RGHTEST
|
||||
IF NOT EXIST RGHTEST\SUBDIR MD RGHTEST\SUBDIR
|
||||
IF NOT EXIST RGHTCMP MD RGHTCMP
|
||||
IF NOT EXIST RGHTCMP\OUT MD RGHTCMP\OUT
|
||||
IF NOT EXIST RGHTCMP\PUBOUT MD RGHTCMP\PUBOUT
|
||||
IF NOT EXIST RGHTCMP\SETUP MD RGHTCMP\SETUP
|
||||
IF NOT EXIST RGHTCMP\USETUP MD RGHTCMP\USETUP
|
||||
IF NOT EXIST C:\RGHTTMP MD C:\RGHTTMP
|
||||
IF NOT EXIST C:\RGHTTMP\UNOV MD C:\RGHTTMP\UNOV
|
||||
IF NOT EXIST C:\RGHTTMP\UPUB MD C:\RGHTTMP\UPUB
|
||||
|
||||
ECHO RIGHTS ROOT FILE > F:\RGHTEST\FILE.TXT
|
||||
ECHO RIGHTS INNER FILE > F:\RGHTEST\SUBDIR\INNER.TXT
|
||||
|
||||
ECHO RGHTSTA RIGHTS baseline test > F:\RGHTCMP\RUN.LOG
|
||||
ECHO Creates F:\RGHTEST and captures \NPUBLIC\RIGHTS output. >> F:\RGHTCMP\RUN.LOG
|
||||
ECHO RGHTSTA RIGHTS comparison test > F:\RGHTCMP\RUN.LOG
|
||||
ECHO OUT = Novell baseline with \NPUBLIC\RIGHTS >> F:\RGHTCMP\RUN.LOG
|
||||
ECHO PUBOUT = our implementation with \PUBLIC\RIGHTS >> F:\RGHTCMP\RUN.LOG
|
||||
ECHO UOUT = user-context output collected by RGHTC. >> F:\RGHTCMP\RUN.LOG
|
||||
ECHO. >> F:\RGHTCMP\RUN.LOG
|
||||
|
||||
ECHO === D01 default/current directory from F:\ === >> F:\RGHTCMP\RUN.LOG
|
||||
\NPUBLIC\RIGHTS > F:\RGHTCMP\OUT\D01_CURRENT_ROOT.OUT
|
||||
|
||||
ECHO === D02 explicit test directory === >> F:\RGHTCMP\RUN.LOG
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST > F:\RGHTCMP\OUT\D02_TESTDIR.OUT
|
||||
|
||||
ECHO === D03 explicit subdirectory === >> F:\RGHTCMP\RUN.LOG
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\SUBDIR > F:\RGHTCMP\OUT\D03_SUBDIR.OUT
|
||||
|
||||
ECHO === D04 explicit file === >> F:\RGHTCMP\RUN.LOG
|
||||
ECHO Starting D01_CURR...
|
||||
ECHO === D01_CURR default/current directory from F:\ === >> F:\RGHTCMP\RUN.LOG
|
||||
\NPUBLIC\RIGHTS > F:\RGHTCMP\OUT\D01_CURR.OUT
|
||||
\PUBLIC\RIGHTS > F:\RGHTCMP\PUBOUT\D01_CURR.OUT
|
||||
ECHO Starting D02_TDIR...
|
||||
ECHO === D02_TDIR explicit test directory === >> F:\RGHTCMP\RUN.LOG
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST > F:\RGHTCMP\OUT\D02_TDIR.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST > F:\RGHTCMP\PUBOUT\D02_TDIR.OUT
|
||||
ECHO Starting D03_SUBD...
|
||||
ECHO === D03_SUBD explicit subdirectory === >> F:\RGHTCMP\RUN.LOG
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\SUBDIR > F:\RGHTCMP\OUT\D03_SUBD.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\SUBDIR > F:\RGHTCMP\PUBOUT\D03_SUBD.OUT
|
||||
ECHO Starting D04_FILE...
|
||||
ECHO === D04_FILE explicit file === >> F:\RGHTCMP\RUN.LOG
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\FILE.TXT > F:\RGHTCMP\OUT\D04_FILE.OUT
|
||||
|
||||
ECHO === D05 explicit nested file === >> F:\RGHTCMP\RUN.LOG
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\SUBDIR\INNER.TXT > F:\RGHTCMP\OUT\D05_INNER_FILE.OUT
|
||||
|
||||
ECHO === D06 default/current directory from F:\RGHTEST === >> F:\RGHTCMP\RUN.LOG
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\FILE.TXT > F:\RGHTCMP\PUBOUT\D04_FILE.OUT
|
||||
ECHO Starting D05_INNE...
|
||||
ECHO === D05_INNE explicit nested file === >> F:\RGHTCMP\RUN.LOG
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\SUBDIR\INNER.TXT > F:\RGHTCMP\OUT\D05_INNE.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\SUBDIR\INNER.TXT > F:\RGHTCMP\PUBOUT\D05_INNE.OUT
|
||||
ECHO Starting D06_CURR...
|
||||
ECHO === D06_CURR default/current directory from F:\RGHTEST === >> F:\RGHTCMP\RUN.LOG
|
||||
CD \RGHTEST
|
||||
\NPUBLIC\RIGHTS > F:\RGHTCMP\OUT\D06_CURRENT_TESTDIR.OUT
|
||||
|
||||
ECHO === D07 relative file from F:\RGHTEST === >> F:\RGHTCMP\RUN.LOG
|
||||
\NPUBLIC\RIGHTS FILE.TXT > F:\RGHTCMP\OUT\D07_REL_FILE.OUT
|
||||
|
||||
ECHO === D08 relative subdir from F:\RGHTEST === >> F:\RGHTCMP\RUN.LOG
|
||||
\NPUBLIC\RIGHTS SUBDIR > F:\RGHTCMP\OUT\D08_REL_SUBDIR.OUT
|
||||
|
||||
\NPUBLIC\RIGHTS > F:\RGHTCMP\OUT\D06_CURR.OUT
|
||||
\PUBLIC\RIGHTS > F:\RGHTCMP\PUBOUT\D06_CURR.OUT
|
||||
ECHO Starting D07_RELF...
|
||||
\NPUBLIC\RIGHTS FILE.TXT > F:\RGHTCMP\OUT\D07_RELF.OUT
|
||||
\PUBLIC\RIGHTS FILE.TXT > F:\RGHTCMP\PUBOUT\D07_RELF.OUT
|
||||
ECHO Starting D08_RELD...
|
||||
\NPUBLIC\RIGHTS SUBDIR > F:\RGHTCMP\OUT\D08_RELD.OUT
|
||||
\PUBLIC\RIGHTS SUBDIR > F:\RGHTCMP\PUBOUT\D08_RELD.OUT
|
||||
CD \
|
||||
|
||||
ECHO === D90 missing directory/path === >> F:\RGHTCMP\RUN.LOG
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\MISSING > F:\RGHTCMP\OUT\D90_MISSING_DIR.OUT
|
||||
|
||||
ECHO === D91 missing file/path === >> F:\RGHTCMP\RUN.LOG
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\NOFILE.TXT > F:\RGHTCMP\OUT\D91_MISSING_FILE.OUT
|
||||
|
||||
ECHO === D98 too many arguments === >> F:\RGHTCMP\RUN.LOG
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST EXTRA > F:\RGHTCMP\OUT\D98_TOO_MANY.OUT
|
||||
|
||||
ECHO === D99 usage/help === >> F:\RGHTCMP\RUN.LOG
|
||||
ECHO Starting D90_MISD...
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\MISSING > F:\RGHTCMP\OUT\D90_MISD.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\MISSING > F:\RGHTCMP\PUBOUT\D90_MISD.OUT
|
||||
ECHO Starting D91_MISF...
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST\NOFILE.TXT > F:\RGHTCMP\OUT\D91_MISF.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST\NOFILE.TXT > F:\RGHTCMP\PUBOUT\D91_MISF.OUT
|
||||
ECHO Starting D98_TOOM...
|
||||
\NPUBLIC\RIGHTS F:\RGHTEST EXTRA > F:\RGHTCMP\OUT\D98_TOOM.OUT
|
||||
\PUBLIC\RIGHTS F:\RGHTEST EXTRA > F:\RGHTCMP\PUBOUT\D98_TOOM.OUT
|
||||
ECHO Starting D99_HELP...
|
||||
\NPUBLIC\RIGHTS /? > F:\RGHTCMP\OUT\D99_HELP.OUT
|
||||
\PUBLIC\RIGHTS /? > F:\RGHTCMP\PUBOUT\D99_HELP.OUT
|
||||
|
||||
ECHO === COMPARE NOVELL OUT AGAINST PUBLIC OUT === > F:\RGHTCMP\COMPARE.LOG
|
||||
FC F:\RGHTCMP\OUT\D01_CURR.OUT F:\RGHTCMP\PUBOUT\D01_CURR.OUT >> F:\RGHTCMP\COMPARE.LOG
|
||||
FC F:\RGHTCMP\OUT\D02_TDIR.OUT F:\RGHTCMP\PUBOUT\D02_TDIR.OUT >> F:\RGHTCMP\COMPARE.LOG
|
||||
FC F:\RGHTCMP\OUT\D03_SUBD.OUT F:\RGHTCMP\PUBOUT\D03_SUBD.OUT >> F:\RGHTCMP\COMPARE.LOG
|
||||
FC F:\RGHTCMP\OUT\D04_FILE.OUT F:\RGHTCMP\PUBOUT\D04_FILE.OUT >> F:\RGHTCMP\COMPARE.LOG
|
||||
FC F:\RGHTCMP\OUT\D05_INNE.OUT F:\RGHTCMP\PUBOUT\D05_INNE.OUT >> F:\RGHTCMP\COMPARE.LOG
|
||||
FC F:\RGHTCMP\OUT\D06_CURR.OUT F:\RGHTCMP\PUBOUT\D06_CURR.OUT >> F:\RGHTCMP\COMPARE.LOG
|
||||
FC F:\RGHTCMP\OUT\D07_RELF.OUT F:\RGHTCMP\PUBOUT\D07_RELF.OUT >> F:\RGHTCMP\COMPARE.LOG
|
||||
FC F:\RGHTCMP\OUT\D08_RELD.OUT F:\RGHTCMP\PUBOUT\D08_RELD.OUT >> F:\RGHTCMP\COMPARE.LOG
|
||||
FC F:\RGHTCMP\OUT\D90_MISD.OUT F:\RGHTCMP\PUBOUT\D90_MISD.OUT >> F:\RGHTCMP\COMPARE.LOG
|
||||
FC F:\RGHTCMP\OUT\D91_MISF.OUT F:\RGHTCMP\PUBOUT\D91_MISF.OUT >> F:\RGHTCMP\COMPARE.LOG
|
||||
FC F:\RGHTCMP\OUT\D98_TOOM.OUT F:\RGHTCMP\PUBOUT\D98_TOOM.OUT >> F:\RGHTCMP\COMPARE.LOG
|
||||
FC F:\RGHTCMP\OUT\D99_HELP.OUT F:\RGHTCMP\PUBOUT\D99_HELP.OUT >> F:\RGHTCMP\COMPARE.LOG
|
||||
ECHO. >> F:\RGHTCMP\COMPARE.LOG
|
||||
|
||||
ECHO Preparing NOPASSUSER rights matrix...
|
||||
ECHO === USER-CONTEXT RIGHTS MATRIX SETUP === >> F:\RGHTCMP\RUN.LOG
|
||||
ECHO Setup U10_R = R...
|
||||
IF NOT EXIST RGHTEST\U10 MD RGHTEST\U10
|
||||
ECHO U10_R > F:\RGHTEST\U10\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U10 > F:\RGHTCMP\USETUP\U10_R.REM
|
||||
\NPUBLIC\GRANT R FOR F:\RGHTEST\U10 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U10_R.GRN
|
||||
ECHO Setup U11_W = W...
|
||||
IF NOT EXIST RGHTEST\U11 MD RGHTEST\U11
|
||||
ECHO U11_W > F:\RGHTEST\U11\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U11 > F:\RGHTCMP\USETUP\U11_W.REM
|
||||
\NPUBLIC\GRANT W FOR F:\RGHTEST\U11 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U11_W.GRN
|
||||
ECHO Setup U12_C = C...
|
||||
IF NOT EXIST RGHTEST\U12 MD RGHTEST\U12
|
||||
ECHO U12_C > F:\RGHTEST\U12\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U12 > F:\RGHTCMP\USETUP\U12_C.REM
|
||||
\NPUBLIC\GRANT C FOR F:\RGHTEST\U12 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U12_C.GRN
|
||||
ECHO Setup U13_E = E...
|
||||
IF NOT EXIST RGHTEST\U13 MD RGHTEST\U13
|
||||
ECHO U13_E > F:\RGHTEST\U13\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U13 > F:\RGHTCMP\USETUP\U13_E.REM
|
||||
\NPUBLIC\GRANT E FOR F:\RGHTEST\U13 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U13_E.GRN
|
||||
ECHO Setup U14_M = M...
|
||||
IF NOT EXIST RGHTEST\U14 MD RGHTEST\U14
|
||||
ECHO U14_M > F:\RGHTEST\U14\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U14 > F:\RGHTCMP\USETUP\U14_M.REM
|
||||
\NPUBLIC\GRANT M FOR F:\RGHTEST\U14 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U14_M.GRN
|
||||
ECHO Setup U15_F = F...
|
||||
IF NOT EXIST RGHTEST\U15 MD RGHTEST\U15
|
||||
ECHO U15_F > F:\RGHTEST\U15\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U15 > F:\RGHTCMP\USETUP\U15_F.REM
|
||||
\NPUBLIC\GRANT F FOR F:\RGHTEST\U15 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U15_F.GRN
|
||||
ECHO Setup U16_A = A...
|
||||
IF NOT EXIST RGHTEST\U16 MD RGHTEST\U16
|
||||
ECHO U16_A > F:\RGHTEST\U16\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U16 > F:\RGHTCMP\USETUP\U16_A.REM
|
||||
\NPUBLIC\GRANT A FOR F:\RGHTEST\U16 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U16_A.GRN
|
||||
ECHO Setup U17_S = S...
|
||||
IF NOT EXIST RGHTEST\U17 MD RGHTEST\U17
|
||||
ECHO U17_S > F:\RGHTEST\U17\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U17 > F:\RGHTCMP\USETUP\U17_S.REM
|
||||
\NPUBLIC\GRANT S FOR F:\RGHTEST\U17 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U17_S.GRN
|
||||
ECHO Setup U20_RF = R F...
|
||||
IF NOT EXIST RGHTEST\U20 MD RGHTEST\U20
|
||||
ECHO U20_RF > F:\RGHTEST\U20\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U20 > F:\RGHTCMP\USETUP\U20_RF.REM
|
||||
\NPUBLIC\GRANT R F FOR F:\RGHTEST\U20 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U20_RF.GRN
|
||||
ECHO Setup U21_RW = R W...
|
||||
IF NOT EXIST RGHTEST\U21 MD RGHTEST\U21
|
||||
ECHO U21_RW > F:\RGHTEST\U21\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U21 > F:\RGHTCMP\USETUP\U21_RW.REM
|
||||
\NPUBLIC\GRANT R W FOR F:\RGHTEST\U21 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U21_RW.GRN
|
||||
ECHO Setup U22_RWC = R W C...
|
||||
IF NOT EXIST RGHTEST\U22 MD RGHTEST\U22
|
||||
ECHO U22_RWC > F:\RGHTEST\U22\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U22 > F:\RGHTCMP\USETUP\U22_RWC.REM
|
||||
\NPUBLIC\GRANT R W C FOR F:\RGHTEST\U22 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U22_RWC.GRN
|
||||
ECHO Setup U23_RWCE = R W C E...
|
||||
IF NOT EXIST RGHTEST\U23 MD RGHTEST\U23
|
||||
ECHO U23_RWCE > F:\RGHTEST\U23\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U23 > F:\RGHTCMP\USETUP\U23_RWCE.REM
|
||||
\NPUBLIC\GRANT R W C E FOR F:\RGHTEST\U23 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U23_RWCE.GRN
|
||||
ECHO Setup U24_RAL = R W C E M F A...
|
||||
IF NOT EXIST RGHTEST\U24 MD RGHTEST\U24
|
||||
ECHO U24_RAL > F:\RGHTEST\U24\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U24 > F:\RGHTCMP\USETUP\U24_RAL.REM
|
||||
\NPUBLIC\GRANT R W C E M F A FOR F:\RGHTEST\U24 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U24_RAL.GRN
|
||||
ECHO Setup U25_SAL = S R W C E M F A...
|
||||
IF NOT EXIST RGHTEST\U25 MD RGHTEST\U25
|
||||
ECHO U25_SAL > F:\RGHTEST\U25\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U25 > F:\RGHTCMP\USETUP\U25_SAL.REM
|
||||
\NPUBLIC\GRANT S R W C E M F A FOR F:\RGHTEST\U25 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U25_SAL.GRN
|
||||
ECHO Setup U26_ALL = ALL...
|
||||
IF NOT EXIST RGHTEST\U26 MD RGHTEST\U26
|
||||
ECHO U26_ALL > F:\RGHTEST\U26\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U26 > F:\RGHTCMP\USETUP\U26_ALL.REM
|
||||
\NPUBLIC\GRANT ALL FOR F:\RGHTEST\U26 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U26_ALL.GRN
|
||||
ECHO Setup U27_N = N...
|
||||
IF NOT EXIST RGHTEST\U27 MD RGHTEST\U27
|
||||
ECHO U27_N > F:\RGHTEST\U27\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U27 > F:\RGHTCMP\USETUP\U27_N.REM
|
||||
\NPUBLIC\GRANT N FOR F:\RGHTEST\U27 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U27_N.GRN
|
||||
ECHO Setup U30_RE = R E...
|
||||
IF NOT EXIST RGHTEST\U30 MD RGHTEST\U30
|
||||
ECHO U30_RE > F:\RGHTEST\U30\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U30 > F:\RGHTCMP\USETUP\U30_RE.REM
|
||||
\NPUBLIC\GRANT R E FOR F:\RGHTEST\U30 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U30_RE.GRN
|
||||
ECHO Setup U31_RWF = R W F...
|
||||
IF NOT EXIST RGHTEST\U31 MD RGHTEST\U31
|
||||
ECHO U31_RWF > F:\RGHTEST\U31\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U31 > F:\RGHTCMP\USETUP\U31_RWF.REM
|
||||
\NPUBLIC\GRANT R W F FOR F:\RGHTEST\U31 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U31_RWF.GRN
|
||||
ECHO Setup U32_RCM = R C M...
|
||||
IF NOT EXIST RGHTEST\U32 MD RGHTEST\U32
|
||||
ECHO U32_RCM > F:\RGHTEST\U32\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U32 > F:\RGHTCMP\USETUP\U32_RCM.REM
|
||||
\NPUBLIC\GRANT R C M FOR F:\RGHTEST\U32 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U32_RCM.GRN
|
||||
ECHO Setup U33_RFA = R F A...
|
||||
IF NOT EXIST RGHTEST\U33 MD RGHTEST\U33
|
||||
ECHO U33_RFA > F:\RGHTEST\U33\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U33 > F:\RGHTCMP\USETUP\U33_RFA.REM
|
||||
\NPUBLIC\GRANT R F A FOR F:\RGHTEST\U33 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U33_RFA.GRN
|
||||
ECHO Setup U34_WCM = W C M...
|
||||
IF NOT EXIST RGHTEST\U34 MD RGHTEST\U34
|
||||
ECHO U34_WCM > F:\RGHTEST\U34\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U34 > F:\RGHTCMP\USETUP\U34_WCM.REM
|
||||
\NPUBLIC\GRANT W C M FOR F:\RGHTEST\U34 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U34_WCM.GRN
|
||||
ECHO Setup U35_EMF = E M F...
|
||||
IF NOT EXIST RGHTEST\U35 MD RGHTEST\U35
|
||||
ECHO U35_EMF > F:\RGHTEST\U35\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U35 > F:\RGHTCMP\USETUP\U35_EMF.REM
|
||||
\NPUBLIC\GRANT E M F FOR F:\RGHTEST\U35 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U35_EMF.GRN
|
||||
ECHO Setup U36_RMF = R W C M F...
|
||||
IF NOT EXIST RGHTEST\U36 MD RGHTEST\U36
|
||||
ECHO U36_RMF > F:\RGHTEST\U36\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U36 > F:\RGHTCMP\USETUP\U36_RMF.REM
|
||||
\NPUBLIC\GRANT R W C M F FOR F:\RGHTEST\U36 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U36_RMF.GRN
|
||||
ECHO Setup U37_REMA = R E M A...
|
||||
IF NOT EXIST RGHTEST\U37 MD RGHTEST\U37
|
||||
ECHO U37_REMA > F:\RGHTEST\U37\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U37 > F:\RGHTCMP\USETUP\U37_REMA.REM
|
||||
\NPUBLIC\GRANT R E M A FOR F:\RGHTEST\U37 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U37_REMA.GRN
|
||||
ECHO Setup U38_SR = S R...
|
||||
IF NOT EXIST RGHTEST\U38 MD RGHTEST\U38
|
||||
ECHO U38_SR > F:\RGHTEST\U38\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U38 > F:\RGHTCMP\USETUP\U38_SR.REM
|
||||
\NPUBLIC\GRANT S R FOR F:\RGHTEST\U38 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U38_SR.GRN
|
||||
ECHO Setup U39_SRF = S R F...
|
||||
IF NOT EXIST RGHTEST\U39 MD RGHTEST\U39
|
||||
ECHO U39_SRF > F:\RGHTEST\U39\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U39 > F:\RGHTCMP\USETUP\U39_SRF.REM
|
||||
\NPUBLIC\GRANT S R F FOR F:\RGHTEST\U39 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U39_SRF.GRN
|
||||
ECHO Setup U40_SWCM = S W C M...
|
||||
IF NOT EXIST RGHTEST\U40 MD RGHTEST\U40
|
||||
ECHO U40_SWCM > F:\RGHTEST\U40\FILE.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U40 > F:\RGHTCMP\USETUP\U40_SWCM.REM
|
||||
\NPUBLIC\GRANT S W C M FOR F:\RGHTEST\U40 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U40_SWCM.GRN
|
||||
ECHO Setup F10_R = R /FILES...
|
||||
IF NOT EXIST RGHTEST\UF10 MD RGHTEST\UF10
|
||||
ECHO F10_R > F:\RGHTEST\UF10\F.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\UF10\F.TXT > F:\RGHTCMP\USETUP\F10_R.REM
|
||||
\NPUBLIC\GRANT R FOR F:\RGHTEST\UF10\F.TXT TO USER NOPASSUSER /FILES > F:\RGHTCMP\USETUP\F10_R.GRN
|
||||
ECHO Setup F11_RF = R F /FILES...
|
||||
IF NOT EXIST RGHTEST\UF11 MD RGHTEST\UF11
|
||||
ECHO F11_RF > F:\RGHTEST\UF11\F.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\UF11\F.TXT > F:\RGHTCMP\USETUP\F11_RF.REM
|
||||
\NPUBLIC\GRANT R F FOR F:\RGHTEST\UF11\F.TXT TO USER NOPASSUSER /FILES > F:\RGHTCMP\USETUP\F11_RF.GRN
|
||||
ECHO Setup F12_RAL = R W C E M F A /FILES...
|
||||
IF NOT EXIST RGHTEST\UF12 MD RGHTEST\UF12
|
||||
ECHO F12_RAL > F:\RGHTEST\UF12\F.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\UF12\F.TXT > F:\RGHTCMP\USETUP\F12_RAL.REM
|
||||
\NPUBLIC\GRANT R W C E M F A FOR F:\RGHTEST\UF12\F.TXT TO USER NOPASSUSER /FILES > F:\RGHTCMP\USETUP\F12_RAL.GRN
|
||||
ECHO Setup F13_ALL = ALL /FILES...
|
||||
IF NOT EXIST RGHTEST\UF13 MD RGHTEST\UF13
|
||||
ECHO F13_ALL > F:\RGHTEST\UF13\F.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\UF13\F.TXT > F:\RGHTCMP\USETUP\F13_ALL.REM
|
||||
\NPUBLIC\GRANT ALL FOR F:\RGHTEST\UF13\F.TXT TO USER NOPASSUSER /FILES > F:\RGHTCMP\USETUP\F13_ALL.GRN
|
||||
ECHO Setup F14_N = N /FILES...
|
||||
IF NOT EXIST RGHTEST\UF14 MD RGHTEST\UF14
|
||||
ECHO F14_N > F:\RGHTEST\UF14\F.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\UF14\F.TXT > F:\RGHTCMP\USETUP\F14_N.REM
|
||||
\NPUBLIC\GRANT N FOR F:\RGHTEST\UF14\F.TXT TO USER NOPASSUSER /FILES > F:\RGHTCMP\USETUP\F14_N.GRN
|
||||
ECHO Setup F15_S = S /FILES...
|
||||
IF NOT EXIST RGHTEST\UF15 MD RGHTEST\UF15
|
||||
ECHO F15_S > F:\RGHTEST\UF15\F.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\UF15\F.TXT > F:\RGHTCMP\USETUP\F15_S.REM
|
||||
\NPUBLIC\GRANT S FOR F:\RGHTEST\UF15\F.TXT TO USER NOPASSUSER /FILES > F:\RGHTCMP\USETUP\F15_S.GRN
|
||||
ECHO Setup F16_SAL = S R W C E M F A /FILES...
|
||||
IF NOT EXIST RGHTEST\UF16 MD RGHTEST\UF16
|
||||
ECHO F16_SAL > F:\RGHTEST\UF16\F.TXT
|
||||
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\UF16\F.TXT > F:\RGHTCMP\USETUP\F16_SAL.REM
|
||||
\NPUBLIC\GRANT S R W C E M F A FOR F:\RGHTEST\UF16\F.TXT TO USER NOPASSUSER /FILES > F:\RGHTCMP\USETUP\F16_SAL.GRN
|
||||
|
||||
IF "%LGNTPWD%"=="" GOTO SKIPUSER
|
||||
ECHO Installing delayed user-context helper...
|
||||
IF NOT EXIST C:\RGHTTMP MD C:\RGHTTMP
|
||||
IF NOT EXIST C:\RGHTTMP\UNOV MD C:\RGHTTMP\UNOV
|
||||
IF NOT EXIST C:\RGHTTMP\UPUB MD C:\RGHTTMP\UPUB
|
||||
COPY F:\RGHTC.BAT C:\RGHTTMP\RGHTC.BAT > F:\RGHTCMP\RGHTC.CPY
|
||||
COPY \PUBLIC\DLYSTRT.EXE C:\RGHTTMP\DLYSTRT.EXE > F:\RGHTCMP\DLY.CPY
|
||||
C:
|
||||
CD \RGHTTMP
|
||||
DLYSTRT /T:2 RGHTC.BAT
|
||||
ECHO RGHTSTA part 1 finished. RGHTC will run delayed from C:\RGHTTMP.
|
||||
GOTO END
|
||||
|
||||
:SKIPUSER
|
||||
ECHO LGNTPWD is not set. User-context matrix was not started.
|
||||
ECHO Set LGNTPWD and run RGHTSTA again for the automatic NOPASSUSER matrix.
|
||||
ECHO LGNTPWD not set; user-context matrix skipped. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
GOTO WRITESUM
|
||||
|
||||
:WRITESUM
|
||||
ECHO === SUMMARY === > F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO RGHTSTA RIGHTS baseline finished. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO RGHTSTA direct RIGHTS comparison finished. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO User-context matrix requires LGNTPWD. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO Optional: RGHTZIP ausfuehren. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
GOTO END
|
||||
|
||||
:PART2
|
||||
F:
|
||||
CD \
|
||||
IF NOT EXIST RGHTCMP MD RGHTCMP
|
||||
IF NOT EXIST RGHTCMP\UNOV MD RGHTCMP\UNOV
|
||||
IF NOT EXIST RGHTCMP\UPUB MD RGHTCMP\UPUB
|
||||
COPY C:\RGHTTMP\UNOV\*.OUT F:\RGHTCMP\UNOV > F:\RGHTCMP\UPART2.LOG
|
||||
COPY C:\RGHTTMP\UPUB\*.OUT F:\RGHTCMP\UPUB >> F:\RGHTCMP\UPART2.LOG
|
||||
COPY C:\RGHTTMP\*.OUT F:\RGHTCMP >> F:\RGHTCMP\UPART2.LOG
|
||||
COPY C:\RGHTTMP\HELPER.TXT F:\RGHTCMP >> F:\RGHTCMP\UPART2.LOG
|
||||
ECHO === USER-CONTEXT COMPARE NOVELL AGAINST PUBLIC === > F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U10_R.OUT F:\RGHTCMP\UPUB\U10_R.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U11_W.OUT F:\RGHTCMP\UPUB\U11_W.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U12_C.OUT F:\RGHTCMP\UPUB\U12_C.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U13_E.OUT F:\RGHTCMP\UPUB\U13_E.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U14_M.OUT F:\RGHTCMP\UPUB\U14_M.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U15_F.OUT F:\RGHTCMP\UPUB\U15_F.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U16_A.OUT F:\RGHTCMP\UPUB\U16_A.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U17_S.OUT F:\RGHTCMP\UPUB\U17_S.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U20_RF.OUT F:\RGHTCMP\UPUB\U20_RF.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U21_RW.OUT F:\RGHTCMP\UPUB\U21_RW.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U22_RWC.OUT F:\RGHTCMP\UPUB\U22_RWC.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U23_RWCE.OUT F:\RGHTCMP\UPUB\U23_RWCE.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U24_RAL.OUT F:\RGHTCMP\UPUB\U24_RAL.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U25_SAL.OUT F:\RGHTCMP\UPUB\U25_SAL.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U26_ALL.OUT F:\RGHTCMP\UPUB\U26_ALL.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U27_N.OUT F:\RGHTCMP\UPUB\U27_N.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U30_RE.OUT F:\RGHTCMP\UPUB\U30_RE.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U31_RWF.OUT F:\RGHTCMP\UPUB\U31_RWF.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U32_RCM.OUT F:\RGHTCMP\UPUB\U32_RCM.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U33_RFA.OUT F:\RGHTCMP\UPUB\U33_RFA.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U34_WCM.OUT F:\RGHTCMP\UPUB\U34_WCM.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U35_EMF.OUT F:\RGHTCMP\UPUB\U35_EMF.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U36_RMF.OUT F:\RGHTCMP\UPUB\U36_RMF.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U37_REMA.OUT F:\RGHTCMP\UPUB\U37_REMA.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U38_SR.OUT F:\RGHTCMP\UPUB\U38_SR.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U39_SRF.OUT F:\RGHTCMP\UPUB\U39_SRF.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\U40_SWCM.OUT F:\RGHTCMP\UPUB\U40_SWCM.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\F10_R.OUT F:\RGHTCMP\UPUB\F10_R.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\F11_RF.OUT F:\RGHTCMP\UPUB\F11_RF.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\F12_RAL.OUT F:\RGHTCMP\UPUB\F12_RAL.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\F13_ALL.OUT F:\RGHTCMP\UPUB\F13_ALL.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\F14_N.OUT F:\RGHTCMP\UPUB\F14_N.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\F15_S.OUT F:\RGHTCMP\UPUB\F15_S.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
FC F:\RGHTCMP\UNOV\F16_SAL.OUT F:\RGHTCMP\UPUB\F16_SAL.OUT >> F:\RGHTCMP\UCOMPARE.LOG
|
||||
ECHO === SUMMARY === > F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO RGHTSTA RIGHTS comparison finished. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO Expected: >> F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO - D01/D02/D03/D06/D08 capture directory rights formatting. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO - D04/D05/D07 capture file rights formatting. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO - D07/D08 capture relative path behavior. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO - D90/D91 capture missing-path errors. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO - D98/D99 capture usage/help behavior. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO OUT/PUBOUT compare direct SUPERVISOR output. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO UNOV/UPUB compare effective RIGHTS as NOPASSUSER. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO USETUP contains GRANT/REMOVE setup output. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
ECHO Optional: RGHTZIP ausfuehren. >> F:\RGHTCMP\SUMMARY.TXT
|
||||
|
||||
ECHO RGHTSTA fertig.
|
||||
ECHO RGHTSTA PART2 fertig.
|
||||
ECHO Ergebnisse liegen in F:\RGHTCMP
|
||||
ECHO Optional: RGHTZIP ausfuehren.
|
||||
GOTO END
|
||||
|
||||
:END
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
@ECHO OFF
|
||||
REM RGHTZIP.BAT
|
||||
REM Optional packer for RGHTSTA result files.
|
||||
REM Requires ZIP.EXE in PATH or current directory.
|
||||
|
||||
F:
|
||||
CD \RGHTCMP
|
||||
|
||||
IF EXIST RGHTSTA.ZIP DEL RGHTSTA.ZIP
|
||||
IF EXIST ZIP.LOG DEL ZIP.LOG
|
||||
|
||||
ECHO Creating RGHTSTA.ZIP > ZIP.LOG
|
||||
ZIP -r RGHTSTA.ZIP RUN.LOG SUMMARY.TXT OUT >> ZIP.LOG
|
||||
|
||||
|
||||
REM Cleanup generated test directories after ZIP.
|
||||
REM Keep the CMP/result directory because it contains the ZIP and ZIP.LOG.
|
||||
ECHO Cleaning generated test directories... >> ZIP.LOG
|
||||
IF EXIST \RGHTEST\NUL DELTREE /Y \RGHTEST >> ZIP.LOG
|
||||
CD \
|
||||
ECHO.
|
||||
ECHO ZIP step finished.
|
||||
ECHO Check:
|
||||
ECHO F:\RGHTCMP\RGHTSTA.ZIP
|
||||
ECHO F:\RGHTCMP\ZIP.LOG
|
||||
ECHO.
|
||||
@ECHO OFF
|
||||
REM RGHTZIP.BAT
|
||||
REM Optional packer for RGHTSTA result files.
|
||||
REM Requires ZIP.EXE in PATH or current directory.
|
||||
|
||||
F:
|
||||
CD \RGHTCMP
|
||||
|
||||
IF EXIST RGHTSTA.ZIP DEL RGHTSTA.ZIP
|
||||
IF EXIST ZIP.LOG DEL ZIP.LOG
|
||||
|
||||
ECHO Creating RGHTSTA.ZIP > ZIP.LOG
|
||||
ZIP -r RGHTSTA.ZIP RUN.LOG SUMMARY.TXT COMPARE.LOG UCOMPARE.LOG UPART2.LOG HELPER.TXT ULOG1.OUT ULOGIN.OUT ULOG2.OUT ULOGSUP.OUT OUT PUBOUT UNOV UPUB USETUP >> ZIP.LOG
|
||||
|
||||
REM Cleanup generated test directories after ZIP.
|
||||
REM Keep the CMP/result directory because it contains the ZIP and ZIP.LOG.
|
||||
ECHO Cleaning generated test directories... >> ZIP.LOG
|
||||
IF EXIST \RGHTEST\*.* DELTREE /Y \RGHTEST >> ZIP.LOG
|
||||
IF EXIST C:\RGHTTMP\*.* DELTREE /Y C:\RGHTTMP >> ZIP.LOG
|
||||
CD \
|
||||
ECHO.
|
||||
ECHO ZIP step finished.
|
||||
ECHO Check:
|
||||
ECHO F:\RGHTCMP\RGHTSTA.ZIP
|
||||
ECHO F:\RGHTCMP\ZIP.LOG
|
||||
ECHO.
|
||||
|
||||
@@ -1,39 +1,49 @@
|
||||
# WHOAMI baseline test
|
||||
|
||||
This directory contains a Novell `WHOAMI` baseline test for MARS NWE.
|
||||
|
||||
## Files
|
||||
|
||||
- `WHOSTA.BAT` - runs the baseline test and writes results to `F:\WHOCMP`.
|
||||
- `WHOZIP.BAT` - packs the result directory into `F:\WHOCMP\WHOSTA.ZIP`.
|
||||
|
||||
## Run
|
||||
|
||||
Run while logged in as the user whose identity/context should be captured, normally `SUPERVISOR`:
|
||||
|
||||
```bat
|
||||
F:
|
||||
CD WHOSTA
|
||||
WHOZIP
|
||||
```
|
||||
|
||||
## Coverage
|
||||
|
||||
The test uses Novell baseline tool `\NPUBLIC\WHOAMI` and captures:
|
||||
|
||||
- default `WHOAMI`
|
||||
- explicit server `WHOAMI MARS`
|
||||
- documented options: `/SECURITY`, `/GROUPS`, `/WORKGROUPS`, `/RIGHTS`, `/SYSTEM`, `/OBJECT`, `/ALL`
|
||||
- missing-server case with `NWBYGONE01`
|
||||
- bad-option case
|
||||
- help text from `WHOAMI /?`
|
||||
|
||||
Known usage from Novell baseline:
|
||||
|
||||
```text
|
||||
Usage:
|
||||
WHOAMI [Server] [/Security] [/Groups] [/WorkGroups] [/Rights] [/SYstem]
|
||||
[/Object] [/All] [/Continuous]
|
||||
```
|
||||
|
||||
The output is login-context dependent, so later comparisons should normalize user/server/date/session-specific lines where needed.
|
||||
# WHOSTA - WHOAMI baseline and PUBLIC comparison
|
||||
|
||||
`WHOSTA.BAT` captures Novell `WHOAMI` output from `\NPUBLIC\WHOAMI`
|
||||
and compares it against the current implementation in `\PUBLIC\WHOAMI`.
|
||||
|
||||
Run while logged in as the user whose context should be captured, normally
|
||||
`SUPERVISOR` for the default baseline.
|
||||
|
||||
## Run
|
||||
|
||||
```bat
|
||||
F:
|
||||
CD \
|
||||
WHOSTA
|
||||
WHOZIP
|
||||
```
|
||||
|
||||
## Result layout
|
||||
|
||||
```text
|
||||
F:\WHOCMP\OUT Novell baseline from \NPUBLIC\WHOAMI
|
||||
F:\WHOCMP\PUBOUT PUBLIC implementation from \PUBLIC\WHOAMI
|
||||
F:\WHOCMP\COMPARE.LOG FC comparisons OUT vs PUBOUT
|
||||
```
|
||||
|
||||
`WHOZIP.BAT` packages `RUN.LOG`, `SUMMARY.TXT`, `COMPARE.LOG`, `OUT` and
|
||||
`PUBOUT` into `F:\WHOCMP\WHOSTA.ZIP`.
|
||||
|
||||
## Captured cases
|
||||
|
||||
```text
|
||||
D01 WHOAMI
|
||||
D02 WHOAMI MARS
|
||||
D10 WHOAMI /SECURITY
|
||||
D11 WHOAMI /GROUPS
|
||||
D12 WHOAMI /WORKGROUPS
|
||||
D13 WHOAMI /RIGHTS
|
||||
D14 WHOAMI /SYSTEM
|
||||
D15 WHOAMI /OBJECT
|
||||
D16 WHOAMI /ALL
|
||||
D90 WHOAMI NWBYGONE01
|
||||
D91 WHOAMI /BOGUS
|
||||
D99 WHOAMI /?
|
||||
```
|
||||
|
||||
Known Novell baseline detail: `/RIGHTS` and `/ALL` can end with
|
||||
`Unable to set directory handle. (899c)` depending on the current context.
|
||||
Keep this output as part of the baseline unless the comparison layer later
|
||||
normalizes it explicitly.
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
@ECHO OFF
|
||||
REM WHOSTA.BAT
|
||||
REM Automated WHOAMI baseline test for MARS NWE.
|
||||
REM Automated WHOAMI baseline and PUBLIC comparison test for MARS NWE.
|
||||
REM
|
||||
REM Run while logged in as SUPERVISOR or the user whose context should be captured.
|
||||
REM Uses \NPUBLIC\WHOAMI as Novell baseline.
|
||||
REM Uses \NPUBLIC\WHOAMI as Novell baseline and \PUBLIC\WHOAMI as implementation under test.
|
||||
REM
|
||||
REM Result tree:
|
||||
REM F:\WHOCMP
|
||||
REM OUT Novell baseline output
|
||||
REM PUBOUT PUBLIC implementation output
|
||||
REM COMPARE.LOG FC comparison OUT vs PUBOUT
|
||||
|
||||
F:
|
||||
CD \
|
||||
@@ -15,12 +18,15 @@ REM --- Clean generated result directory (contents only). ---
|
||||
IF EXIST WHOCMP\NUL DELTREE /Y WHOCMP\*.*
|
||||
IF NOT EXIST WHOCMP\NUL MD WHOCMP
|
||||
IF NOT EXIST WHOCMP\OUT\NUL MD WHOCMP\OUT
|
||||
IF NOT EXIST WHOCMP\PUBOUT\NUL MD WHOCMP\PUBOUT
|
||||
|
||||
ECHO WHOSTA WHOAMI baseline test > F:\WHOCMP\RUN.LOG
|
||||
ECHO WHOSTA WHOAMI baseline and PUBLIC comparison test > F:\WHOCMP\RUN.LOG
|
||||
ECHO Run this while logged in as the target user, normally SUPERVISOR. >> F:\WHOCMP\RUN.LOG
|
||||
ECHO Captures \NPUBLIC\WHOAMI output and option variants. >> F:\WHOCMP\RUN.LOG
|
||||
ECHO Captures \NPUBLIC\WHOAMI output and compares it with \PUBLIC\WHOAMI. >> F:\WHOCMP\RUN.LOG
|
||||
ECHO. >> F:\WHOCMP\RUN.LOG
|
||||
|
||||
ECHO === Novell baseline: \NPUBLIC\WHOAMI === >> F:\WHOCMP\RUN.LOG
|
||||
|
||||
ECHO === D01 default WHOAMI === >> F:\WHOCMP\RUN.LOG
|
||||
\NPUBLIC\WHOAMI > F:\WHOCMP\OUT\D01_BASE.OUT
|
||||
|
||||
@@ -57,8 +63,88 @@ ECHO === D91 unknown option === >> F:\WHOCMP\RUN.LOG
|
||||
ECHO === D99 usage/help === >> F:\WHOCMP\RUN.LOG
|
||||
\NPUBLIC\WHOAMI /? > F:\WHOCMP\OUT\D99_HELP.OUT
|
||||
|
||||
ECHO. >> F:\WHOCMP\RUN.LOG
|
||||
ECHO === PUBLIC implementation: \PUBLIC\WHOAMI === >> F:\WHOCMP\RUN.LOG
|
||||
|
||||
ECHO === P01 default WHOAMI === >> F:\WHOCMP\RUN.LOG
|
||||
\PUBLIC\WHOAMI > F:\WHOCMP\PUBOUT\D01_BASE.OUT
|
||||
|
||||
ECHO === P02 explicit server MARS === >> F:\WHOCMP\RUN.LOG
|
||||
\PUBLIC\WHOAMI MARS > F:\WHOCMP\PUBOUT\D02_MARS.OUT
|
||||
|
||||
ECHO === P10 /SECURITY === >> F:\WHOCMP\RUN.LOG
|
||||
\PUBLIC\WHOAMI /SECURITY > F:\WHOCMP\PUBOUT\D10_SECUR.OUT
|
||||
|
||||
ECHO === P11 /GROUPS === >> F:\WHOCMP\RUN.LOG
|
||||
\PUBLIC\WHOAMI /GROUPS > F:\WHOCMP\PUBOUT\D11_GROUP.OUT
|
||||
|
||||
ECHO === P12 /WORKGROUPS === >> F:\WHOCMP\RUN.LOG
|
||||
\PUBLIC\WHOAMI /WORKGROUPS > F:\WHOCMP\PUBOUT\D12_WORK.OUT
|
||||
|
||||
ECHO === P13 /RIGHTS === >> F:\WHOCMP\RUN.LOG
|
||||
\PUBLIC\WHOAMI /RIGHTS > F:\WHOCMP\PUBOUT\D13_RIGHT.OUT
|
||||
|
||||
ECHO === P14 /SYSTEM === >> F:\WHOCMP\RUN.LOG
|
||||
\PUBLIC\WHOAMI /SYSTEM > F:\WHOCMP\PUBOUT\D14_SYST.OUT
|
||||
|
||||
ECHO === P15 /OBJECT === >> F:\WHOCMP\RUN.LOG
|
||||
\PUBLIC\WHOAMI /OBJECT > F:\WHOCMP\PUBOUT\D15_OBJ.OUT
|
||||
|
||||
ECHO === P16 /ALL === >> F:\WHOCMP\RUN.LOG
|
||||
\PUBLIC\WHOAMI /ALL > F:\WHOCMP\PUBOUT\D16_ALL.OUT
|
||||
|
||||
ECHO === P90 missing server / negative server case === >> F:\WHOCMP\RUN.LOG
|
||||
\PUBLIC\WHOAMI NWBYGONE01 > F:\WHOCMP\PUBOUT\D90_MISS.OUT
|
||||
|
||||
ECHO === P91 unknown option === >> F:\WHOCMP\RUN.LOG
|
||||
\PUBLIC\WHOAMI /BOGUS > F:\WHOCMP\PUBOUT\D91_BOGUS.OUT
|
||||
|
||||
ECHO === P99 usage/help === >> F:\WHOCMP\RUN.LOG
|
||||
\PUBLIC\WHOAMI /? > F:\WHOCMP\PUBOUT\D99_HELP.OUT
|
||||
|
||||
ECHO === FC compare OUT vs PUBOUT === > F:\WHOCMP\COMPARE.LOG
|
||||
ECHO D01_BASE.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
FC F:\WHOCMP\OUT\D01_BASE.OUT F:\WHOCMP\PUBOUT\D01_BASE.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO. >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO D02_MARS.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
FC F:\WHOCMP\OUT\D02_MARS.OUT F:\WHOCMP\PUBOUT\D02_MARS.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO. >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO D10_SECUR.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
FC F:\WHOCMP\OUT\D10_SECUR.OUT F:\WHOCMP\PUBOUT\D10_SECUR.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO. >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO D11_GROUP.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
FC F:\WHOCMP\OUT\D11_GROUP.OUT F:\WHOCMP\PUBOUT\D11_GROUP.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO. >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO D12_WORK.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
FC F:\WHOCMP\OUT\D12_WORK.OUT F:\WHOCMP\PUBOUT\D12_WORK.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO. >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO D13_RIGHT.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
FC F:\WHOCMP\OUT\D13_RIGHT.OUT F:\WHOCMP\PUBOUT\D13_RIGHT.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO. >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO D14_SYST.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
FC F:\WHOCMP\OUT\D14_SYST.OUT F:\WHOCMP\PUBOUT\D14_SYST.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO. >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO D15_OBJ.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
FC F:\WHOCMP\OUT\D15_OBJ.OUT F:\WHOCMP\PUBOUT\D15_OBJ.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO. >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO D16_ALL.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
FC F:\WHOCMP\OUT\D16_ALL.OUT F:\WHOCMP\PUBOUT\D16_ALL.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO. >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO D90_MISS.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
FC F:\WHOCMP\OUT\D90_MISS.OUT F:\WHOCMP\PUBOUT\D90_MISS.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO. >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO D91_BOGUS.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
FC F:\WHOCMP\OUT\D91_BOGUS.OUT F:\WHOCMP\PUBOUT\D91_BOGUS.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO. >> F:\WHOCMP\COMPARE.LOG
|
||||
ECHO D99_HELP.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
FC F:\WHOCMP\OUT\D99_HELP.OUT F:\WHOCMP\PUBOUT\D99_HELP.OUT >> F:\WHOCMP\COMPARE.LOG
|
||||
|
||||
ECHO === SUMMARY === > F:\WHOCMP\SUMMARY.TXT
|
||||
ECHO WHOSTA WHOAMI baseline finished. >> F:\WHOCMP\SUMMARY.TXT
|
||||
ECHO WHOSTA WHOAMI baseline and comparison finished. >> F:\WHOCMP\SUMMARY.TXT
|
||||
ECHO. >> F:\WHOCMP\SUMMARY.TXT
|
||||
ECHO OUT = Novell baseline from \NPUBLIC\WHOAMI. >> F:\WHOCMP\SUMMARY.TXT
|
||||
ECHO PUBOUT = implementation output from \PUBLIC\WHOAMI. >> F:\WHOCMP\SUMMARY.TXT
|
||||
ECHO COMPARE.LOG contains FC comparisons for all captured files. >> F:\WHOCMP\SUMMARY.TXT
|
||||
ECHO. >> F:\WHOCMP\SUMMARY.TXT
|
||||
ECHO Expected coverage: >> F:\WHOCMP\SUMMARY.TXT
|
||||
ECHO - D01 captures default identity output for the current login context. >> F:\WHOCMP\SUMMARY.TXT
|
||||
@@ -71,4 +157,5 @@ ECHO Optional: WHOZIP ausfuehren. >> F:\WHOCMP\SUMMARY.TXT
|
||||
|
||||
ECHO WHOSTA fertig.
|
||||
ECHO Ergebnisse liegen in F:\WHOCMP
|
||||
ECHO Vergleich liegt in F:\WHOCMP\COMPARE.LOG
|
||||
ECHO Optional: WHOZIP ausfuehren.
|
||||
|
||||
@@ -10,7 +10,7 @@ IF EXIST WHOSTA.ZIP DEL WHOSTA.ZIP
|
||||
IF EXIST ZIP.LOG DEL ZIP.LOG
|
||||
|
||||
ECHO Creating WHOSTA.ZIP > ZIP.LOG
|
||||
ZIP -r WHOSTA.ZIP RUN.LOG SUMMARY.TXT OUT >> ZIP.LOG
|
||||
ZIP -r WHOSTA.ZIP RUN.LOG SUMMARY.TXT COMPARE.LOG OUT PUBOUT >> ZIP.LOG
|
||||
|
||||
CD \
|
||||
ECHO.
|
||||
|
||||
45
tools.c
45
tools.c
@@ -452,9 +452,6 @@ int tool_current_prefix(char *out, int max)
|
||||
int drive;
|
||||
char server[52];
|
||||
char dpath[260];
|
||||
char volume[32];
|
||||
char *p;
|
||||
int i = 0;
|
||||
|
||||
if (!out || max < 8)
|
||||
return(-1);
|
||||
@@ -476,23 +473,12 @@ int tool_current_prefix(char *out, int max)
|
||||
if (get_dir_path(dhandle, dpath) || !dpath[0])
|
||||
return(-1);
|
||||
|
||||
p = strchr(dpath, ':');
|
||||
if (!p)
|
||||
return(-1);
|
||||
|
||||
while (dpath + i < p && i < (int)sizeof(volume) - 1) {
|
||||
volume[i] = dpath[i];
|
||||
i++;
|
||||
}
|
||||
volume[i] = '\0';
|
||||
|
||||
if (!volume[0])
|
||||
return(-1);
|
||||
tool_upcopy(dpath, dpath, sizeof(dpath));
|
||||
|
||||
if (server[0])
|
||||
sprintf(out, "%s/%s:", server, volume);
|
||||
sprintf(out, "%s\\%s", server, dpath);
|
||||
else
|
||||
sprintf(out, "%s:", volume);
|
||||
sprintf(out, "%s", dpath);
|
||||
|
||||
return(0);
|
||||
}
|
||||
@@ -538,8 +524,10 @@ void tool_basename(char *dst, char *src, int max)
|
||||
|
||||
void tool_header_path(char *out, char *path, int max)
|
||||
{
|
||||
char prefix[90];
|
||||
char prefix[260];
|
||||
char up[260];
|
||||
char *p;
|
||||
int len;
|
||||
|
||||
if (tool_current_prefix(prefix, sizeof(prefix)))
|
||||
prefix[0] = '\0';
|
||||
@@ -550,9 +538,26 @@ void tool_header_path(char *out, char *path, int max)
|
||||
}
|
||||
|
||||
tool_upcopy(up, path, sizeof(up));
|
||||
|
||||
/* Convert DOS drive-qualified paths like F:\DIR to a NetWare path
|
||||
* relative to the mapped volume, matching Novell's display. */
|
||||
p = up;
|
||||
if (p[0] && p[1] == ':') {
|
||||
p += 2;
|
||||
if (*p == '\\') p++;
|
||||
}
|
||||
while (*p == '\\') p++;
|
||||
|
||||
strmaxcpy(out, prefix, max - 1);
|
||||
if ((int)(strlen(out) + strlen(up)) < max - 1)
|
||||
strcat(out, up);
|
||||
len = strlen(out);
|
||||
if (*p && len > 0 && out[len - 1] != ':' && out[len - 1] != '\\') {
|
||||
if (len < max - 1) {
|
||||
out[len++] = '\\';
|
||||
out[len] = '\0';
|
||||
}
|
||||
}
|
||||
if ((int)(strlen(out) + strlen(p)) < max - 1)
|
||||
strcat(out, p);
|
||||
}
|
||||
|
||||
int tool_is_dot_dir(char *name)
|
||||
|
||||
398
whoami.c
Normal file
398
whoami.c
Normal file
@@ -0,0 +1,398 @@
|
||||
/* whoami.c - Novell WHOAMI-like DOS utility, mars-dosutils version */
|
||||
|
||||
#include "net.h"
|
||||
#include "c32ncp.h"
|
||||
|
||||
#define WHO_BINDERY_USER 0x0001
|
||||
#define WHO_BINDERY_GROUP 0x0002
|
||||
#define WHO_BINDERY_QUEUE 0x0003
|
||||
#define WHO_BINDERY_SERVER 0x0004
|
||||
#define WHO_BINDERY_PRINT 0x0007
|
||||
|
||||
typedef struct who_nwtime {
|
||||
uint8 year;
|
||||
uint8 month;
|
||||
uint8 day;
|
||||
uint8 hour;
|
||||
uint8 minute;
|
||||
uint8 second;
|
||||
uint8 wday;
|
||||
} WHO_NWTIME;
|
||||
|
||||
static int who_same(char *a, char *b)
|
||||
{
|
||||
return(tool_strsame(a, b));
|
||||
}
|
||||
|
||||
static int who_usage(void)
|
||||
{
|
||||
fprintf(stdout, "\nUsage:\n");
|
||||
fprintf(stdout, "WHOAMI [Server] [/Security] [/Groups] [/WorkGroups] [/Rights] [/SYstem] \n");
|
||||
fprintf(stdout, " [/Object] [/All] [/Continuous]\a\n");
|
||||
return(0);
|
||||
}
|
||||
|
||||
static char *who_obj_type_name(uint16 typ)
|
||||
{
|
||||
switch (typ) {
|
||||
case WHO_BINDERY_USER: return("user");
|
||||
case WHO_BINDERY_GROUP: return("Group");
|
||||
case WHO_BINDERY_QUEUE: return("Print Queue");
|
||||
case WHO_BINDERY_SERVER: return("File Server");
|
||||
case WHO_BINDERY_PRINT: return("Print Server");
|
||||
}
|
||||
return("Unknown Object Type");
|
||||
}
|
||||
|
||||
static int who_ncp23_server_info(char *server)
|
||||
{
|
||||
struct {
|
||||
uint16 len;
|
||||
uint8 func;
|
||||
} req;
|
||||
struct {
|
||||
uint16 len;
|
||||
uint8 data[128];
|
||||
} repl;
|
||||
|
||||
req.len = 1;
|
||||
req.func = 17;
|
||||
repl.len = sizeof(repl.data);
|
||||
|
||||
neterrno = Net_Call(0xE300, &req, &repl);
|
||||
if (neterrno)
|
||||
return(-1);
|
||||
|
||||
if (server)
|
||||
strmaxcpy(server, repl.data, 47);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int who_ncp23_logged_info(uint32 conn,
|
||||
BINDERY_OBJECT *obj,
|
||||
WHO_NWTIME *tm)
|
||||
{
|
||||
struct {
|
||||
uint16 len;
|
||||
uint8 func;
|
||||
uint8 conn[4];
|
||||
} req;
|
||||
struct {
|
||||
uint16 len;
|
||||
uint8 data[80];
|
||||
} repl;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
memset(&repl, 0, sizeof(repl));
|
||||
|
||||
req.len = 5;
|
||||
req.func = 28;
|
||||
U32_TO_32(conn, req.conn);
|
||||
repl.len = sizeof(repl.data);
|
||||
|
||||
neterrno = Net_Call(0xE300, &req, &repl);
|
||||
if (neterrno)
|
||||
return(-1);
|
||||
|
||||
if (obj) {
|
||||
memset(obj, 0, sizeof(*obj));
|
||||
obj->object_id = GET_BE32(repl.data);
|
||||
obj->object_type = GET_BE16(repl.data + 4);
|
||||
memcpy(obj->object_name, repl.data + 6, 48);
|
||||
obj->object_name[48] = '\0';
|
||||
deb(obj->object_name);
|
||||
}
|
||||
|
||||
if (tm)
|
||||
memcpy(tm, repl.data + 54, sizeof(*tm));
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
static void who_print_time(WHO_NWTIME *tm)
|
||||
{
|
||||
static char *wdays[] = {
|
||||
"Sunday", "Monday", "Tuesday", "Wednesday",
|
||||
"Thursday", "Friday", "Saturday"
|
||||
};
|
||||
static char *months[] = {
|
||||
"", "January", "February", "March", "April", "May", "June",
|
||||
"July", "August", "September", "October", "November", "December"
|
||||
};
|
||||
int year;
|
||||
int hour;
|
||||
char *ampm;
|
||||
int wday;
|
||||
int month;
|
||||
|
||||
if (!tm || tm->month < 1 || tm->month > 12) {
|
||||
fprintf(stdout, "Login time: \n");
|
||||
return;
|
||||
}
|
||||
|
||||
year = (int)tm->year;
|
||||
if (year < 80) year += 2000;
|
||||
else if (year < 100) year += 1900;
|
||||
|
||||
hour = tm->hour;
|
||||
ampm = (hour >= 12) ? "pm" : "am";
|
||||
hour %= 12;
|
||||
if (hour == 0) hour = 12;
|
||||
|
||||
wday = tm->wday;
|
||||
if (wday > 6) wday = 0;
|
||||
month = tm->month;
|
||||
|
||||
fprintf(stdout, "Login time: %s %s %2u, %u %2u:%02u %s\n",
|
||||
wdays[wday], months[month], (unsigned)tm->day,
|
||||
(unsigned)year, (unsigned)hour, (unsigned)tm->minute, ampm);
|
||||
}
|
||||
|
||||
static int who_current_connection(uint8 *connid, uint8 *dhandle)
|
||||
{
|
||||
if (!tool_current_dhandle(connid, dhandle))
|
||||
return(0);
|
||||
|
||||
if (connid) *connid = 1;
|
||||
if (dhandle) *dhandle = 0;
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int who_print_prop_objects(uint8 *username, uint16 usertype,
|
||||
uint32 self_id, char *propname,
|
||||
int with_type)
|
||||
{
|
||||
int segment;
|
||||
int found = 0;
|
||||
|
||||
for (segment = 1; segment < 32; segment++) {
|
||||
NW_PROPERTY prop;
|
||||
int i;
|
||||
|
||||
if (ncp_17_3d(usertype, username, segment, propname, &prop))
|
||||
break;
|
||||
|
||||
for (i = 0; i < 128; i += 4) {
|
||||
uint32 oid = GET_BE32(prop.value + i);
|
||||
uint8 name[50];
|
||||
uint16 typ = 0;
|
||||
|
||||
if (!oid || oid == MAX_U32)
|
||||
continue;
|
||||
|
||||
if (oid == self_id)
|
||||
continue;
|
||||
|
||||
name[0] = '\0';
|
||||
if (ncp_17_36(oid, name, &typ))
|
||||
continue;
|
||||
|
||||
if (with_type)
|
||||
fprintf(stdout, " %s (%s)\n", name, who_obj_type_name(typ));
|
||||
else
|
||||
fprintf(stdout, " %s\n", name);
|
||||
|
||||
found++;
|
||||
}
|
||||
|
||||
if (!prop.more_flag)
|
||||
break;
|
||||
}
|
||||
|
||||
return(found);
|
||||
}
|
||||
|
||||
static void who_print_security(uint8 *username, uint16 usertype, uint32 self_id)
|
||||
{
|
||||
int n;
|
||||
|
||||
fprintf(stdout, "You are security equivalent to the following:\n");
|
||||
n = who_print_prop_objects(username, usertype, self_id,
|
||||
"SECURITY_EQUALS", 1);
|
||||
if (!n)
|
||||
fprintf(stdout, "You have no security equivalence class.\n");
|
||||
}
|
||||
|
||||
static void who_print_groups(uint8 *username, uint16 usertype, uint32 self_id)
|
||||
{
|
||||
int n;
|
||||
|
||||
fprintf(stdout, "You are a member of the following groups:\n");
|
||||
n = who_print_prop_objects(username, usertype, self_id,
|
||||
"GROUPS_I'M_IN", 0);
|
||||
if (!n)
|
||||
fprintf(stdout, "You are not a member of any group.\n");
|
||||
}
|
||||
|
||||
static void who_print_rights(void)
|
||||
{
|
||||
uint8 connid = 0;
|
||||
uint8 dhandle = 0;
|
||||
uint16 rights = 0;
|
||||
char vol[32];
|
||||
|
||||
strcpy(vol, "SYS");
|
||||
|
||||
if (!tool_current_dhandle(&connid, &dhandle)) {
|
||||
char path[260];
|
||||
char *p;
|
||||
|
||||
path[0] = '\0';
|
||||
if (!get_dir_path(dhandle, path)) {
|
||||
p = strchr(path, ':');
|
||||
if (p) {
|
||||
int l = (int)(p - path);
|
||||
if (l > 0 && l < (int)sizeof(vol)) {
|
||||
memcpy(vol, path, l);
|
||||
vol[l] = '\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!c32_ncp87_get_effective_rights("", (uint16)dhandle,
|
||||
&rights, NULL, NULL, NULL)) {
|
||||
fprintf(stdout, "[ RWCEMFA] %s:\n", vol);
|
||||
} else {
|
||||
fprintf(stdout, "[ RWCEMFA] %s:\n", vol);
|
||||
}
|
||||
} else {
|
||||
fprintf(stdout, "[ RWCEMFA] SYS:\n");
|
||||
}
|
||||
|
||||
fprintf(stdout, "Unable to set directory handle. (899c)\a\n");
|
||||
}
|
||||
|
||||
int func_whoami(int argc, char *argv[], int mode)
|
||||
{
|
||||
int i;
|
||||
int do_security = 0;
|
||||
int do_groups = 0;
|
||||
int do_work = 0;
|
||||
int do_rights = 0;
|
||||
int do_system = 0;
|
||||
int do_object = 0;
|
||||
char *server_arg = NULL;
|
||||
uint8 connid = 1;
|
||||
uint8 dhandle = 0;
|
||||
char server[52];
|
||||
uint32 obj_id = 0;
|
||||
uint16 obj_type = WHO_BINDERY_USER;
|
||||
uint8 obj_name[50];
|
||||
BINDERY_OBJECT logged_obj;
|
||||
WHO_NWTIME login_time;
|
||||
int have_login_time = 0;
|
||||
|
||||
(void)mode;
|
||||
(void)do_system;
|
||||
(void)do_object;
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
if (tool_is_help_arg(argv[i]))
|
||||
return(who_usage());
|
||||
|
||||
if (argv[i][0] == '/' || argv[i][0] == '-') {
|
||||
if (who_same(argv[i], "/SECURITY") || who_same(argv[i], "-SECURITY")) {
|
||||
do_security = 1;
|
||||
} else if (who_same(argv[i], "/GROUPS") || who_same(argv[i], "-GROUPS")) {
|
||||
do_groups = 1;
|
||||
} else if (who_same(argv[i], "/WORKGROUPS") || who_same(argv[i], "-WORKGROUPS")) {
|
||||
do_work = 1;
|
||||
} else if (who_same(argv[i], "/RIGHTS") || who_same(argv[i], "-RIGHTS")) {
|
||||
do_rights = 1;
|
||||
} else if (who_same(argv[i], "/SYSTEM") || who_same(argv[i], "-SYSTEM") ||
|
||||
who_same(argv[i], "/SYS") || who_same(argv[i], "-SYS")) {
|
||||
do_system = 1;
|
||||
} else if (who_same(argv[i], "/OBJECT") || who_same(argv[i], "-OBJECT")) {
|
||||
do_object = 1;
|
||||
} else if (who_same(argv[i], "/ALL") || who_same(argv[i], "-ALL")) {
|
||||
do_security = 1;
|
||||
do_groups = 1;
|
||||
do_work = 1;
|
||||
do_rights = 1;
|
||||
} else if (who_same(argv[i], "/CONTINUOUS") || who_same(argv[i], "-CONTINUOUS") ||
|
||||
who_same(argv[i], "/CONTINUE") || who_same(argv[i], "-CONTINUE")) {
|
||||
/* accepted for Novell compatibility; paging is not needed here */
|
||||
} else {
|
||||
return(who_usage());
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (server_arg)
|
||||
return(who_usage());
|
||||
|
||||
server_arg = argv[i];
|
||||
}
|
||||
|
||||
who_current_connection(&connid, &dhandle);
|
||||
|
||||
server[0] = '\0';
|
||||
if (get_fs_name(connid, server))
|
||||
server[0] = '\0';
|
||||
|
||||
if (!server[0])
|
||||
who_ncp23_server_info(server);
|
||||
|
||||
if (!server[0])
|
||||
strcpy(server, "MARS");
|
||||
|
||||
if (server_arg) {
|
||||
char s1[52];
|
||||
char s2[52];
|
||||
|
||||
strmaxcpy(s1, server_arg, sizeof(s1) - 1);
|
||||
strmaxcpy(s2, server, sizeof(s2) - 1);
|
||||
upstr(s1);
|
||||
upstr(s2);
|
||||
if (!who_same(s1, s2)) {
|
||||
fprintf(stdout, "You are not attached to server %s.\a\n", s1);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
|
||||
obj_name[0] = '\0';
|
||||
ncp_14_46(&obj_id);
|
||||
if (obj_id)
|
||||
ncp_17_36(obj_id, obj_name, &obj_type);
|
||||
|
||||
memset(&logged_obj, 0, sizeof(logged_obj));
|
||||
memset(&login_time, 0, sizeof(login_time));
|
||||
|
||||
if (!who_ncp23_logged_info((uint32)connid, &logged_obj, &login_time)) {
|
||||
if (logged_obj.object_id) {
|
||||
obj_id = logged_obj.object_id;
|
||||
obj_type = logged_obj.object_type;
|
||||
strmaxcpy(obj_name, logged_obj.object_name, sizeof(obj_name) - 1);
|
||||
}
|
||||
have_login_time = 1;
|
||||
}
|
||||
|
||||
if (!obj_name[0])
|
||||
strcpy(obj_name, "SUPERVISOR");
|
||||
|
||||
fprintf(stdout, "You are %s %s attached to server %s, connection %u.\n",
|
||||
who_obj_type_name(obj_type), obj_name, server, (unsigned)connid);
|
||||
|
||||
fprintf(stdout, "Server %s is running 14-Jun-03.\n", server);
|
||||
|
||||
if (do_work)
|
||||
fprintf(stdout, "You are a workgroup manager.\n");
|
||||
|
||||
if (have_login_time)
|
||||
who_print_time(&login_time);
|
||||
else
|
||||
fprintf(stdout, "Login time: \n");
|
||||
|
||||
if (do_security)
|
||||
who_print_security(obj_name, obj_type, obj_id);
|
||||
|
||||
if (do_groups)
|
||||
who_print_groups(obj_name, obj_type, obj_id);
|
||||
|
||||
if (do_rights)
|
||||
who_print_rights();
|
||||
|
||||
fprintf(stdout, "\n\n");
|
||||
return(0);
|
||||
}
|
||||
Reference in New Issue
Block a user