#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]);
}
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 {
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')
{
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')
{
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);
}