diff options
Diffstat (limited to 'examples/libmsrpc/test/test_util.c')
-rw-r--r-- | examples/libmsrpc/test/test_util.c | 408 |
1 files changed, 408 insertions, 0 deletions
diff --git a/examples/libmsrpc/test/test_util.c b/examples/libmsrpc/test/test_util.c new file mode 100644 index 0000000000..81a9c9203d --- /dev/null +++ b/examples/libmsrpc/test/test_util.c @@ -0,0 +1,408 @@ +/*some utility functions for the registry tests*/ + +#include "libmsrpc.h" +#include "test_util.h" + + +void cactest_print_usage(char **argv) { + printf("Usage:\n"); + printf(" %s server [-U username] [-W domain] [-P passwprd] [-N netbios_name]\n", argv[0]); +} + +/*allocates memory for auth info and parses domain/user/server out of command line*/ +void cac_parse_cmd_line(int argc, char **argv, CacServerHandle *hnd) { + int i = 0; + + ZERO_STRUCTP(hnd->username); + ZERO_STRUCTP(hnd->domain); + ZERO_STRUCTP(hnd->netbios_name); + ZERO_STRUCTP(hnd->password); + + for(i = 1; i < argc; i++) { + if( strncmp(argv[i], "-U", sizeof(fstring)) == 0) { + strncpy(hnd->username, argv[i+1], sizeof(fstring)); + i++; + } + + else if(strncmp(argv[i], "-W", sizeof(fstring)) == 0) { + strncpy(hnd->domain, argv[i+1], sizeof(fstring)); + i++; + + } + + else if(strncmp(argv[i], "-P", sizeof(fstring)) == 0) { + strncpy(hnd->password, argv[i+1], sizeof(fstring)); + i++; + + } + + else if(strncmp(argv[i], "-N", sizeof(fstring)) == 0) { + strncpy(hnd->netbios_name, argv[i+1], sizeof(fstring)); + i++; + } + + else if(strncmp(argv[i], "-d", sizeof(fstring)) == 0) { + sscanf(argv[i+1], "%d", &hnd->debug); + i++; + } + + else { /*assume this is the server name*/ + strncpy(hnd->server, argv[i], sizeof(fstring)); + } + } + + if(!hnd->server) { + cactest_print_usage(argv); + cac_FreeHandle(hnd); + exit(-1); + } + +} + +void print_value(uint32 type, REG_VALUE_DATA *data) { + int i = 0; + + switch(type) { + case REG_SZ: + printf(" Type: REG_SZ\n"); + printf(" Value: %s\n", data->reg_sz); + break; + case REG_EXPAND_SZ: + printf(" Type: REG_EXPAND_SZ\n"); + printf(" Value: %s\n", data->reg_expand_sz); + break; + case REG_MULTI_SZ: + printf(" Type: REG_MULTI_SZ\n"); + printf(" Values: "); + + for(i = 0; i < data->reg_multi_sz.num_strings; i++) { + printf(" %d: %s\n", i, data->reg_multi_sz.strings[i]); + } + break; + case REG_DWORD: + printf(" Type: REG_DWORD\n"); + printf(" Value: %d\n", data->reg_dword); + break; + case REG_DWORD_BE: + printf(" Type: REG_DWORD_BE\n"); + printf(" Value: 0x%x\n", data->reg_dword_be); + break; + case REG_BINARY: + printf(" Type: REG_BINARY\n"); + break; + default: + printf(" Invalid type: %d\n", type); + + } + + printf("\n"); + +} + +void cactest_readline(FILE *in, fstring line) { + + int c; + + c = fgetc(in); + if(c != '\n') + ungetc(c, in); + + fgets(line, sizeof(fstring), in); + + if(line[strlen(line) - 1] == '\n') + line[strlen(line) - 1] = '\0'; + +} + +void cactest_GetAuthDataFn(const char * pServer, + const char * pShare, + char * pWorkgroup, + int maxLenWorkgroup, + char * pUsername, + int maxLenUsername, + char * pPassword, + int maxLenPassword) + +{ + char temp[sizeof(fstring)]; + + static char authUsername[sizeof(fstring)]; + static char authWorkgroup[sizeof(fstring)]; + static char authPassword[sizeof(fstring)]; + static char authSet = 0; + + char *pass = NULL; + + if (authSet) + { + strncpy(pWorkgroup, authWorkgroup, maxLenWorkgroup - 1); + strncpy(pUsername, authUsername, maxLenUsername - 1); + strncpy(pPassword, authPassword, maxLenPassword - 1); + } + else + { + if(pWorkgroup[0] != '\0') { + strncpy(authWorkgroup, pWorkgroup, maxLenWorkgroup - 1); + } + else { + d_printf("Domain: [%s] ", pWorkgroup); + fscanf(stdin, "%s", temp); + + if (temp[0] != '\0') + { + strncpy(pWorkgroup, temp, maxLenWorkgroup - 1); + strncpy(authWorkgroup, temp, maxLenWorkgroup - 1); + } + } + + + if(pUsername[0] != '\0') { + strncpy(authUsername, pUsername, maxLenUsername - 1); + } + else { + d_printf("Username: [%s] ", pUsername); + fscanf(stdin, "%s", temp); + + if (temp[strlen(temp) - 1] == '\n') /* A new line? */ + { + temp[strlen(temp) - 1] = '\0'; + } + + if (temp[0] != '\0') + { + strncpy(pUsername, temp, maxLenUsername - 1); + strncpy(authUsername, pUsername, maxLenUsername - 1); + } + } + if(pPassword[0] != '\0') { + strncpy(authPassword, pPassword, maxLenPassword - 1); + } + else { + pass = getpass("Password: "); + if (pass) + fstrcpy(temp, pass); + if (temp[strlen(temp) - 1] == '\n') /* A new line? */ + { + temp[strlen(temp) - 1] = '\0'; + } + if (temp[0] != '\0') + { + strncpy(pPassword, temp, maxLenPassword - 1); + strncpy(authPassword, pPassword, maxLenPassword - 1); + } + } + authSet = 1; + } +} + +void cactest_reg_input_val(TALLOC_CTX *mem_ctx, int *type, char **name, REG_VALUE_DATA *data) { + fstring tmp; + int i; + + printf("Enter value name: \n"); + cactest_readline(stdin, tmp); + *name = talloc_strdup(mem_ctx, tmp); + + do { + printf("Enter type. %d = REG_SZ, %d = REG_DWORD, %d = REG_MULTI_SZ: ", REG_SZ, REG_DWORD, REG_MULTI_SZ); + scanf("%d", type); + } while(*type != REG_SZ && *type != REG_DWORD && *type != REG_MULTI_SZ); + + switch(*type) { + case REG_SZ: + printf("Enter string:\n"); + cactest_readline(stdin, tmp); + + data->reg_sz = talloc_strdup(mem_ctx, tmp); + break; + + case REG_DWORD: + printf("Enter dword: "); + scanf("%d", &data->reg_dword); + break; + + case REG_MULTI_SZ: + printf("Enter number of strings: "); + scanf("%d", &data->reg_multi_sz.num_strings); + + data->reg_multi_sz.strings = talloc_array(mem_ctx, char *, data->reg_multi_sz.num_strings); + + for(i = 0; i < data->reg_multi_sz.num_strings; i++) { + printf("String %d: ", i+1); + cactest_readline(stdin, tmp); + + data->reg_multi_sz.strings[i] = talloc_strdup(mem_ctx, tmp); + } + break; + } +} + +void print_cac_user_info(CacUserInfo *info) { + printf(" User Name : %s\n", info->username); + printf(" Full Name : %s\n", info->full_name); + printf(" Home Dir : %s\n", info->home_dir); + printf(" Home Drive : %s\n", info->home_drive); + printf(" Profile Path : %s\n", info->profile_path); + printf(" Logon Script : %s\n", info->logon_script); + printf(" Description : %s\n", info->description); + printf(" Workstations : %s\n", info->workstations); + printf(" Remote Dial : %s\n", info->dial); + + printf(" Logon Time : %s\n", http_timestring(info->logon_time)); + printf(" Logoff Time : %s\n", http_timestring(info->logoff_time)); + printf(" Kickoff Time : %s\n", http_timestring(info->kickoff_time)); + printf(" Pass last set: %s\n", http_timestring(info->pass_last_set_time)); + printf(" Pass can set : %s\n", http_timestring(info->pass_can_change_time)); + printf(" Pass must set: %s\n", http_timestring(info->pass_must_change_time)); + + printf(" User RID : 0x%x\n", info->rid); + printf(" Group RID : 0x%x\n", info->group_rid); + printf(" ACB Mask : 0x%x\n", info->acb_mask); + + printf(" Bad pwd count: %d\n", info->bad_passwd_count); + printf(" Logon Cuont : %d\n", info->logon_count); + + printf(" NT Password : %s\n", info->nt_password); + printf(" LM Password : %s\n", info->lm_password); + +} + +void edit_readline(fstring line) { + fgets(line, sizeof(fstring), stdin); + + if(line[strlen(line)-1] == '\n') + line[strlen(line)-1] = '\0'; +} +void edit_cac_user_info(TALLOC_CTX *mem_ctx, CacUserInfo *info) { + fstring tmp; + + printf(" User Name [%s]: ", info->username); + edit_readline(tmp); + + if(tmp[0] != '\0') + info->username = talloc_strdup(mem_ctx, tmp); + + printf(" Full Name [%s]: ", info->full_name); + + edit_readline(tmp); + if(tmp[0] != '\0') + info->full_name = talloc_strdup(mem_ctx, tmp); + + printf(" Description [%s]: ", info->description); + edit_readline(tmp); + if(tmp[0] != '\0') + info->description = talloc_strdup(mem_ctx, tmp); + + printf(" Remote Dial [%s]: ", info->dial); + edit_readline(tmp); + if(tmp[0] != '\0') + info->dial = talloc_strdup(mem_ctx, tmp); + + printf(" ACB Mask [0x%x]: ", info->acb_mask); + edit_readline(tmp); + if(tmp[0] != '\0') + sscanf(tmp, "%x", &info->acb_mask); + + printf(" Must change pass at next logon? [y/N]: "); + edit_readline(tmp); + + if(tmp[0] == 'y' || tmp[0] == 'Y') + info->pass_must_change= True; + +} + +void print_cac_group_info(CacGroupInfo *info) { + printf(" Group Name : %s\n", info->name); + printf(" Description : %s\n", info->description); + printf(" Num Members : %d\n", info->num_members); +} + +void edit_cac_group_info(TALLOC_CTX *mem_ctx, CacGroupInfo *info) { + fstring tmp; + + printf("Group Name [%s]: ", info->name); + edit_readline(tmp); + if(tmp[0] != '\0') + info->name = talloc_strdup(mem_ctx, tmp); + + printf("Description [%s]: ", info->description); + edit_readline(tmp); + if(tmp[0] != '\0') + info->description = talloc_strdup(mem_ctx, tmp); +} + +char *srv_role_str(uint32 role) { + switch(role) { + case ROLE_STANDALONE: + return "STANDALONE"; + break; + case ROLE_DOMAIN_MEMBER: + return "DOMAIN_MEMBER"; + break; + case ROLE_DOMAIN_BDC: + return "DOMAIN_BDC"; + break; + case ROLE_DOMAIN_PDC: + return "DOMAIN_PDC"; + break; + } + + return "Invalid role!\n"; +} + +char *cactime_str(CacTime ctime, fstring tmp) { + + snprintf(tmp, sizeof(fstring), "%u Days, %u Hours, %u Minutes, %u Seconds", ctime.days, ctime.hours, ctime.minutes, ctime.seconds); + + return tmp; +} + +void print_cac_domain_info(CacDomainInfo *info) { + fstring tmp; + + printf(" Server Role : %s\n", srv_role_str(info->server_role)); + printf(" Num Users : %d\n", info->num_users); + printf(" Num Domain Groups: %d\n", info->num_domain_groups); + printf(" Num Local Groups : %d\n", info->num_local_groups); + printf(" Comment : %s\n", info->comment); + printf(" Domain Name : %s\n", info->domain_name); + printf(" Server Name : %s\n", info->server_name); + printf(" Min. Pass. Length: %d\n", info->min_pass_length); + printf(" Password History : %d\n", info->pass_history); + printf("\n"); + printf(" Passwords Expire In : %s\n", cactime_str(info->expire, tmp)); + printf(" Passwords Can Change in: %s\n", cactime_str(info->min_pass_age, tmp)); + printf(" Lockouts last : %s\n", cactime_str(info->lockout_duration, tmp)); + printf(" Allowed Bad Attempts : %d\n", info->num_bad_attempts); +} + +void print_cac_service(CacService svc) { + printf("\tService Name: %s\n", svc.service_name); + printf("\tDisplay Name: %s\n", svc.display_name); + print_service_status(svc.status); +} + +void print_service_status(SERVICE_STATUS status) { + printf("\tStatus:\n"); + printf("\t Type: 0x%x\n", status.type); + printf("\t State: 0x%x\n", status.state); + printf("\t Controls: 0x%x\n", status.controls_accepted); + printf("\t W32 Exit Code: 0x%x\n", status.win32_exit_code); + printf("\t SVC Exit Code: 0x%x\n", status.service_exit_code); + printf("\t Checkpoint: 0x%x\n", status.check_point); + printf("\t Wait Hint: 0x%x\n", status.wait_hint); + printf("\n"); +} + +void print_service_config(CacServiceConfig *config) { + printf("\tConfig:\n"); + printf("\tType: 0x%x\n", config->type); + printf("\tStart Type: 0x%x\n", config->start_type); + printf("\tError config: 0x%x\n", config->error_control); + printf("\tExecutable Path: %s\n", config->exe_path); + printf("\tLoad Order Group: %s\n", config->load_order_group); + printf("\tTag ID: 0x%x\n", config->tag_id); + printf("\tDependencies: %s\n", config->dependencies); + printf("\tStart Name: %s\n", config->start_name); + printf("\tDisplay Name: %s\n", config->display_name); +} |