Initial import
[samba] / examples / libmsrpc / test / test_util.c
diff --git a/examples/libmsrpc/test/test_util.c b/examples/libmsrpc/test/test_util.c
new file mode 100644 (file)
index 0000000..81a9c92
--- /dev/null
@@ -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);
+}