r12986: Use d_fprintf(stderr, ...) for any error message in net.
[kai/samba-autobuild/.git] / source / utils / net.c
index 2fe15c2b8ef6a518a42e872f91fb5a0a451ecbe0..a2a9ac6a3918869eadffe26dafb38b515a44f906 100644 (file)
@@ -87,6 +87,7 @@ const char *opt_destination = NULL;
 BOOL opt_have_ip = False;
 struct in_addr opt_dest_ip;
 
+extern struct in_addr loopback_ip;
 extern BOOL AllowDebugChange;
 
 uint32 get_sec_channel_type(const char *param) 
@@ -127,7 +128,7 @@ int net_run_function(int argc, const char **argv, struct functable *table,
                if (StrCaseCmp(argv[0], table[i].funcname) == 0)
                        return table[i].fn(argc-1, argv+1);
        }
-       d_printf("No command: %s\n", argv[0]);
+       d_fprintf(stderr, "No command: %s\n", argv[0]);
        return usage_fn(argc, argv);
 }
 
@@ -144,7 +145,7 @@ NTSTATUS connect_to_service(struct cli_state **c, struct in_addr *server_ip,
        if (!opt_password && !opt_machine_pass) {
                char *pass = getpass("Password:");
                if (pass) {
-                       opt_password = strdup(pass);
+                       opt_password = SMB_STRDUP(pass);
                }
        }
        
@@ -157,21 +158,21 @@ NTSTATUS connect_to_service(struct cli_state **c, struct in_addr *server_ip,
        if (NT_STATUS_IS_OK(nt_status)) {
                return nt_status;
        } else {
-               d_printf("Could not connect to server %s\n", server_name);
+               d_fprintf(stderr, "Could not connect to server %s\n", server_name);
 
                /* Display a nicer message depending on the result */
 
                if (NT_STATUS_V(nt_status) == 
                    NT_STATUS_V(NT_STATUS_LOGON_FAILURE))
-                       d_printf("The username or password was not correct.\n");
+                       d_fprintf(stderr, "The username or password was not correct.\n");
 
                if (NT_STATUS_V(nt_status) == 
                    NT_STATUS_V(NT_STATUS_ACCOUNT_LOCKED_OUT))
-                       d_printf("The account was locked out.\n");
+                       d_fprintf(stderr, "The account was locked out.\n");
 
                if (NT_STATUS_V(nt_status) == 
                    NT_STATUS_V(NT_STATUS_ACCOUNT_DISABLED))
-                       d_printf("The account was disabled.\n");
+                       d_fprintf(stderr, "The account was disabled.\n");
 
                return nt_status;
        }
@@ -218,42 +219,45 @@ NTSTATUS connect_to_ipc_anonymous(struct cli_state **c,
  *
  * @return Normal NTSTATUS return.
  **/
-NTSTATUS connect_pipe(struct cli_state **cli_dst, int pipe_num, BOOL *got_pipe)
+NTSTATUS connect_dst_pipe(struct cli_state **cli_dst, struct rpc_pipe_client **pp_pipe_hnd, int pipe_num)
 {
        NTSTATUS nt_status;
-       char *server_name = strdup("127.0.0.1");
+       char *server_name = SMB_STRDUP("127.0.0.1");
        struct cli_state *cli_tmp = NULL;
+       struct rpc_pipe_client *pipe_hnd = NULL;
 
        if (opt_destination)
-               server_name = strdup(opt_destination);
+               server_name = SMB_STRDUP(opt_destination);
 
        /* make a connection to a named pipe */
        nt_status = connect_to_ipc(&cli_tmp, NULL, server_name);
-       if (!NT_STATUS_IS_OK(nt_status)) 
+       if (!NT_STATUS_IS_OK(nt_status)) {
                return nt_status;
+       }
 
-       if (!cli_nt_session_open(cli_tmp, pipe_num)) {
+       pipe_hnd = cli_rpc_pipe_open_noauth(cli_tmp, pipe_num, &nt_status);
+       if (!pipe_hnd) {
                DEBUG(0, ("couldn't not initialize pipe\n"));
                cli_shutdown(cli_tmp);
-               return NT_STATUS_UNSUCCESSFUL;
+               return nt_status;
        }
 
        *cli_dst = cli_tmp;
-       *got_pipe = True;
+       *pp_pipe_hnd = pipe_hnd;
 
        return nt_status;
 }
 
-
 /****************************************************************************
- Use the local machine's password for this session
+ Use the local machine's password for this session.
 ****************************************************************************/
+
 int net_use_machine_password(void) 
 {
        char *user_name = NULL;
 
        if (!secrets_init()) {
-               d_printf("ERROR: Unable to open secrets database\n");
+               d_fprintf(stderr, "ERROR: Unable to open secrets database\n");
                exit(1);
        }
 
@@ -270,13 +274,13 @@ BOOL net_find_server(unsigned flags, struct in_addr *server_ip, char **server_na
 {
 
        if (opt_host) {
-               *server_name = strdup(opt_host);
+               *server_name = SMB_STRDUP(opt_host);
        }               
 
        if (opt_have_ip) {
                *server_ip = opt_dest_ip;
                if (!*server_name) {
-                       *server_name = strdup(inet_ntoa(opt_dest_ip));
+                       *server_name = SMB_STRDUP(inet_ntoa(opt_dest_ip));
                }
        } else if (*server_name) {
                /* resolve the IP address */
@@ -296,7 +300,7 @@ BOOL net_find_server(unsigned flags, struct in_addr *server_ip, char **server_na
                        if ( !name_status_find(opt_target_workgroup, 0x1b, 0x20, pdc_ip, dc_name) )
                                return False;
                                
-                       *server_name = strdup(dc_name);
+                       *server_name = SMB_STRDUP(dc_name);
                        *server_ip = pdc_ip;
                }
                
@@ -309,7 +313,7 @@ BOOL net_find_server(unsigned flags, struct in_addr *server_ip, char **server_na
                } else {
                        *server_ip = msbrow_ip;
                }
-               *server_name = strdup(inet_ntoa(opt_dest_ip));
+               *server_name = SMB_STRDUP(inet_ntoa(opt_dest_ip));
        } else if (flags & NET_FLAGS_MASTER) {
                struct in_addr brow_ips;
                if (!resolve_name(opt_target_workgroup, &brow_ips, 0x1D))  {
@@ -319,11 +323,10 @@ BOOL net_find_server(unsigned flags, struct in_addr *server_ip, char **server_na
                } else {
                        *server_ip = brow_ips;
                }
-               *server_name = strdup(inet_ntoa(opt_dest_ip));
+               *server_name = SMB_STRDUP(inet_ntoa(opt_dest_ip));
        } else if (!(flags & NET_FLAGS_LOCALHOST_DEFAULT_INSANE)) {
-               extern struct in_addr loopback_ip;
                *server_ip = loopback_ip;
-               *server_name = strdup("127.0.0.1");
+               *server_name = SMB_STRDUP("127.0.0.1");
        }
 
        if (!server_name || !*server_name) {
@@ -359,7 +362,7 @@ struct cli_state *net_make_ipc_connection(unsigned flags)
        NTSTATUS nt_status;
 
        if (!net_find_server(flags, &server_ip, &server_name)) {
-               d_printf("\nUnable to find a suitable server\n");
+               d_fprintf(stderr, "\nUnable to find a suitable server\n");
                return NULL;
        }
 
@@ -406,7 +409,7 @@ static int net_join(int argc, const char **argv)
                if (net_ads_join(argc, argv) == 0)
                        return 0;
                else
-                       d_printf("ADS join did not work, falling back to RPC...\n");
+                       d_fprintf(stderr, "ADS join did not work, falling back to RPC...\n");
        }
        return net_rpc_join(argc, argv);
 }
@@ -428,7 +431,7 @@ static int net_changesecretpw(int argc, const char **argv)
                trust_pw = getpass("Enter machine password: ");
 
                if (!secrets_store_machine_password(trust_pw, lp_workgroup(), sec_channel_type)) {
-                           d_printf("Unable to write the machine account password in the secrets database");
+                           d_fprintf(stderr, "Unable to write the machine account password in the secrets database");
                            return 1;
                }
                else {
@@ -479,11 +482,19 @@ static int net_getlocalsid(int argc, const char **argv)
                          "backend knowlege (such as the sid stored in LDAP)\n"));
        }
 
+       /* first check to see if we can even access secrets, so we don't
+          panic when we can't. */
+
+       if (!secrets_init()) {
+               d_fprintf(stderr, "Unable to open secrets.tdb.  Can't fetch domain SID for name: %s\n", name);
+               return 1;
+       }
+
        /* Generate one, if it doesn't exist */
        get_global_sam_sid();
 
        if (!secrets_fetch_domain_sid(name, &sid)) {
-               DEBUG(0, ("Can't fetch domain SID for name: %s\n", name));      
+               DEBUG(0, ("Can't fetch domain SID for name: %s\n", name));
                return 1;
        }
        sid_to_string(sid_str, &sid);
@@ -525,14 +536,14 @@ static int net_getdomainsid(int argc, const char **argv)
        get_global_sam_sid();
 
        if (!secrets_fetch_domain_sid(global_myname(), &domain_sid)) {
-               d_printf("Could not fetch local SID\n");
+               d_fprintf(stderr, "Could not fetch local SID\n");
                return 1;
        }
        sid_to_string(sid_str, &domain_sid);
        d_printf("SID for domain %s is: %s\n", global_myname(), sid_str);
 
        if (!secrets_fetch_domain_sid(opt_workgroup, &domain_sid)) {
-               d_printf("Could not fetch domain SID\n");
+               d_fprintf(stderr, "Could not fetch domain SID\n");
                return 1;
        }
 
@@ -544,104 +555,118 @@ static int net_getdomainsid(int argc, const char **argv)
 
 #ifdef WITH_FAKE_KASERVER
 
-int net_afskey_usage(int argc, const char **argv)
+int net_help_afs(int argc, const char **argv)
 {
-       d_printf("  net afskey filename\n"
+       d_printf("  net afs key filename\n"
                 "\tImports a OpenAFS KeyFile into our secrets.tdb\n\n");
+       d_printf("  net afs impersonate <user> <cell>\n"
+                "\tCreates a token for user@cell\n\n");
        return -1;
 }
 
-static int net_afskey(int argc, const char **argv)
+static int net_afs_key(int argc, const char **argv)
 {
        int fd;
        struct afs_keyfile keyfile;
 
        if (argc != 2) {
-               d_printf("usage: 'net afskey <keyfile> cell'\n");
+               d_printf("usage: 'net afs key <keyfile> cell'\n");
                return -1;
        }
 
        if (!secrets_init()) {
-               d_printf("Could not open secrets.tdb\n");
+               d_fprintf(stderr, "Could not open secrets.tdb\n");
                return -1;
        }
 
        if ((fd = open(argv[0], O_RDONLY, 0)) < 0) {
-               d_printf("Could not open %s\n", argv[0]);
+               d_fprintf(stderr, "Could not open %s\n", argv[0]);
                return -1;
        }
 
        if (read(fd, &keyfile, sizeof(keyfile)) != sizeof(keyfile)) {
-               d_printf("Could not read keyfile\n");
+               d_fprintf(stderr, "Could not read keyfile\n");
                return -1;
        }
 
        if (!secrets_store_afs_keyfile(argv[1], &keyfile)) {
-               d_printf("Could not write keyfile to secrets.tdb\n");
+               d_fprintf(stderr, "Could not write keyfile to secrets.tdb\n");
                return -1;
        }
 
        return 0;
 }
 
-#endif /* WITH_FAKE_KASERVER */
-
-static uint32 get_maxrid(void)
+static int net_afs_impersonate(int argc, const char **argv)
 {
-       SAM_ACCOUNT *pwd = NULL;
-       uint32 max_rid = 0;
-       GROUP_MAP *map = NULL;
-       int num_entries = 0;
-       int i;
+       char *token;
 
-       if (!pdb_setsampwent(False)) {
-               DEBUG(0, ("load_sampwd_entries: Unable to open passdb.\n"));
-               return 0;
+       if (argc != 2) {
+               fprintf(stderr, "Usage: net afs impersonate <user> <cell>\n");
+               exit(1);
        }
 
-       for (; (NT_STATUS_IS_OK(pdb_init_sam(&pwd))) 
-                    && pdb_getsampwent(pwd) == True; pwd=NULL) {
-               uint32 rid;
+       token = afs_createtoken_str(argv[0], argv[1]);
 
-               if (!sid_peek_rid(pdb_get_user_sid(pwd), &rid)) {
-                       DEBUG(0, ("can't get RID for user '%s'\n",
-                                 pdb_get_username(pwd)));
-                       pdb_free_sam(&pwd);
-                       continue;
-               }
-
-               if (rid > max_rid)
-                       max_rid = rid;
+       if (token == NULL) {
+               fprintf(stderr, "Could not create token\n");
+               exit(1);
+       }
 
-               DEBUG(1,("%d is user '%s'\n", rid, pdb_get_username(pwd)));
-               pdb_free_sam(&pwd);
+       if (!afs_settoken_str(token)) {
+               fprintf(stderr, "Could not set token into kernel\n");
+               exit(1);
        }
 
-       pdb_endsampwent();
-       pdb_free_sam(&pwd);
+       printf("Success: %s@%s\n", argv[0], argv[1]);
+       return 0;
+}
 
-       if (!pdb_enum_group_mapping(SID_NAME_UNKNOWN, &map, &num_entries,
-                                   ENUM_ONLY_MAPPED))
-               return max_rid;
+static int net_afs(int argc, const char **argv)
+{
+       struct functable func[] = {
+               {"key", net_afs_key},
+               {"impersonate", net_afs_impersonate},
+               {"help", net_help_afs},
+               {NULL, NULL}
+       };
+       return net_run_function(argc, argv, func, net_help_afs);
+}
 
-       for (i = 0; i < num_entries; i++) {
-               uint32 rid;
+#endif /* WITH_FAKE_KASERVER */
 
-               if (!sid_peek_check_rid(get_global_sam_sid(), &map[i].sid,
-                                       &rid)) {
-                       DEBUG(3, ("skipping map for group '%s', SID %s\n",
-                                 map[i].nt_name,
-                                 sid_string_static(&map[i].sid)));
-                       continue;
-               }
-               DEBUG(1,("%d is group '%s'\n", rid, map[i].nt_name));
+static BOOL search_maxrid(struct pdb_search *search, const char *type,
+                         uint32 *max_rid)
+{
+       struct samr_displayentry *entries;
+       uint32 i, num_entries;
 
-               if (rid > max_rid)
-                       max_rid = rid;
+       if (search == NULL) {
+               d_fprintf(stderr, "get_maxrid: Could not search %s\n", type);
+               return False;
        }
 
-       SAFE_FREE(map);
+       num_entries = pdb_search_entries(search, 0, 0xffffffff, &entries);
+       for (i=0; i<num_entries; i++)
+               *max_rid = MAX(*max_rid, entries[i].rid);
+       pdb_search_destroy(search);
+       return True;
+}
+
+static uint32 get_maxrid(void)
+{
+       uint32 max_rid = 0;
+
+       if (!search_maxrid(pdb_search_users(0), "users", &max_rid))
+               return 0;
 
+       if (!search_maxrid(pdb_search_groups(), "groups", &max_rid))
+               return 0;
+
+       if (!search_maxrid(pdb_search_aliases(get_global_sam_sid()),
+                          "aliases", &max_rid))
+               return 0;
+       
        return max_rid;
 }
 
@@ -699,7 +724,7 @@ static struct functable net_func[] = {
        {"STATUS", net_status},
        {"USERSIDLIST", net_usersidlist},
 #ifdef WITH_FAKE_KASERVER
-       {"AFSKEY", net_afskey},
+       {"AFS", net_afs},
 #endif
 
        {"HELP", net_help},
@@ -756,6 +781,8 @@ static struct functable net_func[] = {
 
        zero_ip(&opt_dest_ip);
 
+       load_case_tables();
+
        /* set default debug level to 0 regardless of what smb.conf sets */
        DEBUGLEVEL_CLASS[DBGC_ALL] = 0;
        dbf = x_stderr;
@@ -772,13 +799,13 @@ static struct functable net_func[] = {
                case 'I':
                        opt_dest_ip = *interpret_addr2(poptGetOptArg(pc));
                        if (is_zero_ip(opt_dest_ip))
-                               d_printf("\nInvalid ip address specified\n");
+                               d_fprintf(stderr, "\nInvalid ip address specified\n");
                        else
                                opt_have_ip = True;
                        break;
                case 'U':
                        opt_user_specified = True;
-                       opt_user_name = strdup(opt_user_name);
+                       opt_user_name = SMB_STRDUP(opt_user_name);
                        p = strchr(opt_user_name,'%');
                        if (p) {
                                *p = 0;
@@ -786,7 +813,7 @@ static struct functable net_func[] = {
                        }
                        break;
                default:
-                       d_printf("\nInvalid option %s: %s\n", 
+                       d_fprintf(stderr, "\nInvalid option %s: %s\n", 
                                 poptBadOption(pc, 0), poptStrerror(opt));
                        net_help(argc, argv);
                        exit(1);