X-Git-Url: http://git.samba.org/samba.git/?a=blobdiff_plain;f=source%2Futils%2Fnet.c;h=a2a9ac6a3918869eadffe26dafb38b515a44f906;hb=f650e3bdafc4c6bcd7eb4bcf8b6b885b979919eb;hp=42966b4f830887e22c2018dbf0121952f6c05d4d;hpb=4a3f7a9356cd5068d9ed4fd6e2336d9bf7923fbd;p=kai%2Fsamba-autobuild%2F.git diff --git a/source/utils/net.c b/source/utils/net.c index 42966b4f830..a2a9ac6a391 100644 --- a/source/utils/net.c +++ b/source/utils/net.c @@ -38,7 +38,7 @@ /*****************************************************/ #include "includes.h" -#include "../utils/net.h" +#include "utils/net.h" /***********************************************************************/ /* Beginning of internationalization section. Translatable constants */ @@ -66,17 +66,28 @@ int opt_long_list_entries = 0; int opt_reboot = 0; int opt_force = 0; int opt_port = 0; +int opt_verbose = 0; int opt_maxusers = -1; const char *opt_comment = ""; -const char *opt_container = "cn=Users"; +const char *opt_container = NULL; int opt_flags = -1; int opt_timeout = 0; const char *opt_target_workgroup = NULL; -static int opt_machine_pass = 0; +int opt_machine_pass = 0; +BOOL opt_localgroup = False; +BOOL opt_domaingroup = False; +const char *opt_newntname = ""; +int opt_rid = 0; +int opt_acls = 0; +int opt_attrs = 0; +int opt_timestamps = 0; +const char *opt_exclude = NULL; +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) @@ -84,14 +95,14 @@ uint32 get_sec_channel_type(const char *param) if (!(param && *param)) { return get_default_sec_channel(); } else { - if (strcasecmp(param, "PDC")==0) { + if (strequal(param, "PDC")) { return SEC_CHAN_BDC; - } else if (strcasecmp(param, "BDC")==0) { + } else if (strequal(param, "BDC")) { return SEC_CHAN_BDC; - } else if (strcasecmp(param, "MEMBER")==0) { + } else if (strequal(param, "MEMBER")) { return SEC_CHAN_WKSTA; #if 0 - } else if (strcasecmp(param, "DOMAIN")==0) { + } else if (strequal(param, "DOMAIN")) { return SEC_CHAN_DOMAIN; #endif } else { @@ -117,48 +128,66 @@ 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); } - /**************************************************************************** -connect to \\server\ipc$ +connect to \\server\service ****************************************************************************/ -NTSTATUS connect_to_ipc(struct cli_state **c, struct in_addr *server_ip, - const char *server_name) +NTSTATUS connect_to_service(struct cli_state **c, struct in_addr *server_ip, + const char *server_name, + const char *service_name, + const char *service_type) { NTSTATUS nt_status; - if (!opt_password) { + if (!opt_password && !opt_machine_pass) { char *pass = getpass("Password:"); if (pass) { - opt_password = strdup(pass); + opt_password = SMB_STRDUP(pass); } } - nt_status = cli_full_connection(c, opt_requester_name, server_name, + nt_status = cli_full_connection(c, NULL, server_name, server_ip, opt_port, - "IPC$", "IPC", + service_name, service_type, opt_user_name, opt_workgroup, opt_password, 0, Undefined, NULL); if (NT_STATUS_IS_OK(nt_status)) { return nt_status; } else { - DEBUG(1,("Cannot connect to server. Error was %s\n", - nt_errstr(nt_status))); + 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_fprintf(stderr, "The account was locked out.\n"); + + if (NT_STATUS_V(nt_status) == + NT_STATUS_V(NT_STATUS_ACCOUNT_DISABLED)) + d_fprintf(stderr, "The account was disabled.\n"); return nt_status; } } + +/**************************************************************************** +connect to \\server\ipc$ +****************************************************************************/ +NTSTATUS connect_to_ipc(struct cli_state **c, struct in_addr *server_ip, + const char *server_name) +{ + return connect_to_service(c, server_ip, server_name, "IPC$", "IPC"); +} + /**************************************************************************** connect to \\server\ipc$ anonymously ****************************************************************************/ @@ -181,15 +210,54 @@ NTSTATUS connect_to_ipc_anonymous(struct cli_state **c, } } +/** + * Connect a server and open a given pipe + * + * @param cli_dst A cli_state + * @param pipe The pipe to open + * @param got_pipe boolean that stores if we got a pipe + * + * @return Normal NTSTATUS return. + **/ +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 = SMB_STRDUP("127.0.0.1"); + struct cli_state *cli_tmp = NULL; + struct rpc_pipe_client *pipe_hnd = NULL; + + if (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)) { + return nt_status; + } + + 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; + } + + *cli_dst = cli_tmp; + *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); } @@ -206,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 */ @@ -232,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; } @@ -245,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)) { @@ -255,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) { @@ -295,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; } @@ -342,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); } @@ -364,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 { @@ -410,8 +477,24 @@ static int net_getlocalsid(int argc, const char **argv) name = global_myname(); } + if(!initialize_password_db(False)) { + DEBUG(0, ("WARNING: Could not open passdb - local sid may not reflect passdb\n" + "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); @@ -444,15 +527,23 @@ static int net_getdomainsid(int argc, const char **argv) DOM_SID domain_sid; fstring sid_str; + if(!initialize_password_db(False)) { + DEBUG(0, ("WARNING: Could not open passdb - domain sid may not reflect passdb\n" + "backend knowlege (such as the sid stored in LDAP)\n")); + } + + /* Generate one, if it doesn't exist */ + 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; } @@ -464,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 \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 cell'\n"); + d_printf("usage: 'net afs key 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 \n"); + exit(1); } - for (; (NT_STATUS_IS_OK(pdb_init_sam(&pwd))) - && pdb_getsampwent(pwd) == True; pwd=NULL) { - uint32 rid; - - 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; - } + token = afs_createtoken_str(argv[0], argv[1]); - 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