[SCM] Samba Shared Repository - branch master updated - tevent-0-9-8-166-g8bd730f

Günther Deschner gd at samba.org
Thu Sep 10 16:26:59 MDT 2009


The branch, master has been updated
       via  8bd730f5ad19d5f4f6cfe65c95db66768b33845f (commit)
       via  c17789fa1c3abafd70e07a5f350f6f16ebe1ed7e (commit)
       via  393a1f594d5f03a51448cdc465f92c599a93904c (commit)
      from  bda70613347c96d328c1d8899ae38057709e4151 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 8bd730f5ad19d5f4f6cfe65c95db66768b33845f
Author: Günther Deschner <gd at samba.org>
Date:   Thu Sep 10 23:33:37 2009 +0200

    s3-rpcclient: add lookupnames4 command.
    
    Guenther

commit c17789fa1c3abafd70e07a5f350f6f16ebe1ed7e
Author: Günther Deschner <gd at samba.org>
Date:   Thu Sep 10 21:14:29 2009 +0200

    s3-rpcclient: add ncacn transport handling for rpcclient.
    
    Guenther

commit 393a1f594d5f03a51448cdc465f92c599a93904c
Author: Günther Deschner <gd at samba.org>
Date:   Thu Sep 10 19:59:37 2009 +0200

    s3-rpc_client: add enum dcerpc_transport_t to rpc_cli_transport struct.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 source3/include/client.h       |    2 +
 source3/rpc_client/cli_pipe.c  |    8 +++
 source3/rpcclient/cmd_lsarpc.c |   52 ++++++++++++++++++++++
 source3/rpcclient/rpcclient.c  |   93 +++++++++++++++++++++++++++++++++++++--
 4 files changed, 150 insertions(+), 5 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/client.h b/source3/include/client.h
index 203198f..5b64b9b 100644
--- a/source3/include/client.h
+++ b/source3/include/client.h
@@ -68,6 +68,8 @@ struct cli_pipe_auth_data {
 
 struct rpc_cli_transport {
 
+	enum dcerpc_transport_t transport;
+
 	/**
 	 * Trigger an async read from the server. May return a short read.
 	 */
diff --git a/source3/rpc_client/cli_pipe.c b/source3/rpc_client/cli_pipe.c
index 82f6b10..16fe9da 100644
--- a/source3/rpc_client/cli_pipe.c
+++ b/source3/rpc_client/cli_pipe.c
@@ -3207,6 +3207,8 @@ static NTSTATUS rpc_pipe_open_tcp_port(TALLOC_CTX *mem_ctx, const char *host,
 		goto fail;
 	}
 
+	result->transport->transport = NCACN_IP_TCP;
+
 	*presult = result;
 	return NT_STATUS_OK;
 
@@ -3427,6 +3429,8 @@ NTSTATUS rpc_pipe_open_ncalrpc(TALLOC_CTX *mem_ctx, const char *socket_path,
 		goto fail;
 	}
 
+	result->transport->transport = NCALRPC;
+
 	*presult = result;
 	return NT_STATUS_OK;
 
@@ -3501,6 +3505,8 @@ static NTSTATUS rpc_pipe_open_np(struct cli_state *cli,
 		return status;
 	}
 
+	result->transport->transport = NCACN_NP;
+
 	DLIST_ADD(cli->pipe_list, result);
 	talloc_set_destructor(result, rpc_pipe_client_np_destructor);
 
@@ -3561,6 +3567,8 @@ NTSTATUS rpc_pipe_open_local(TALLOC_CTX *mem_ctx,
 		return status;
 	}
 
+	result->transport->transport = NCACN_INTERNAL;
+
 	*presult = result;
 	return NT_STATUS_OK;
 }
diff --git a/source3/rpcclient/cmd_lsarpc.c b/source3/rpcclient/cmd_lsarpc.c
index d7f8041..623cd5e 100644
--- a/source3/rpcclient/cmd_lsarpc.c
+++ b/source3/rpcclient/cmd_lsarpc.c
@@ -300,6 +300,57 @@ static NTSTATUS cmd_lsa_lookup_names_level(struct rpc_pipe_client *cli,
 	return result;
 }
 
+static NTSTATUS cmd_lsa_lookup_names4(struct rpc_pipe_client *cli,
+				      TALLOC_CTX *mem_ctx, int argc,
+				      const char **argv)
+{
+	NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
+
+	uint32_t num_names;
+	struct lsa_String *names;
+	struct lsa_RefDomainList *domains;
+	struct lsa_TransSidArray3 sids;
+	uint32_t count = 0;
+	int i;
+
+	if (argc == 1) {
+		printf("Usage: %s [name1 [name2 [...]]]\n", argv[0]);
+		return NT_STATUS_OK;
+	}
+
+	ZERO_STRUCT(sids);
+
+	num_names = argc-1;
+	names = talloc_array(mem_ctx, struct lsa_String, num_names);
+	NT_STATUS_HAVE_NO_MEMORY(names);
+
+	for (i=0; i < num_names; i++) {
+		init_lsa_String(&names[i], argv[i+1]);
+	}
+
+	result = rpccli_lsa_LookupNames4(cli, mem_ctx,
+					 num_names,
+					 names,
+					 &domains,
+					 &sids,
+					 1,
+					 &count,
+					 0,
+					 0);
+	if (!NT_STATUS_IS_OK(result)) {
+		return result;
+	}
+
+	for (i = 0; i < sids.count; i++) {
+		fstring sid_str;
+		sid_to_fstring(sid_str, sids.sids[i].sid);
+		printf("%s %s (%s: %d)\n", argv[i+1], sid_str,
+		       sid_type_lookup(sids.sids[i].sid_type),
+		       sids.sids[i].sid_type);
+	}
+
+	return result;
+}
 
 /* Resolve a list of SIDs to a list of names */
 
@@ -1726,6 +1777,7 @@ struct cmd_set lsarpc_commands[] = {
 	{ "lsaquery", 	         RPC_RTYPE_NTSTATUS, cmd_lsa_query_info_policy,  NULL, &ndr_table_lsarpc.syntax_id, NULL, "Query info policy",                    "" },
 	{ "lookupsids",          RPC_RTYPE_NTSTATUS, cmd_lsa_lookup_sids,        NULL, &ndr_table_lsarpc.syntax_id, NULL, "Convert SIDs to names",                "" },
 	{ "lookupnames",         RPC_RTYPE_NTSTATUS, cmd_lsa_lookup_names,       NULL, &ndr_table_lsarpc.syntax_id, NULL, "Convert names to SIDs",                "" },
+	{ "lookupnames4",        RPC_RTYPE_NTSTATUS, cmd_lsa_lookup_names4,      NULL, &ndr_table_lsarpc.syntax_id, NULL, "Convert names to SIDs",                "" },
 	{ "lookupnames_level",   RPC_RTYPE_NTSTATUS, cmd_lsa_lookup_names_level, NULL, &ndr_table_lsarpc.syntax_id, NULL, "Convert names to SIDs",                "" },
 	{ "enumtrust", 	         RPC_RTYPE_NTSTATUS, cmd_lsa_enum_trust_dom,     NULL, &ndr_table_lsarpc.syntax_id, NULL, "Enumerate trusted domains",            "Usage: [preferred max number] [enum context (0)]" },
 	{ "enumprivs", 	         RPC_RTYPE_NTSTATUS, cmd_lsa_enum_privilege,     NULL, &ndr_table_lsarpc.syntax_id, NULL, "Enumerate privileges",                 "" },
diff --git a/source3/rpcclient/rpcclient.c b/source3/rpcclient/rpcclient.c
index ceeeae7..475dce5 100644
--- a/source3/rpcclient/rpcclient.c
+++ b/source3/rpcclient/rpcclient.c
@@ -28,6 +28,7 @@ DOM_SID domain_sid;
 static enum pipe_auth_type pipe_default_auth_type = PIPE_AUTH_TYPE_NONE;
 static enum pipe_auth_level pipe_default_auth_level = PIPE_AUTH_LEVEL_NONE;
 static unsigned int timeout = 0;
+static enum dcerpc_transport_t default_transport = NCACN_NP;
 
 struct user_auth_info *rpcclient_auth_info;
 
@@ -351,6 +352,29 @@ static NTSTATUS cmd_set_ss_level(void)
 	return NT_STATUS_OK;
 }
 
+static NTSTATUS cmd_set_transport(void)
+{
+	struct cmd_list *tmp;
+
+	/* Close any existing connections not at this level. */
+
+	for (tmp = cmd_list; tmp; tmp = tmp->next) {
+		struct cmd_set *tmp_set;
+
+		for (tmp_set = tmp->cmd_set; tmp_set->name; tmp_set++) {
+			if (tmp_set->rpc_pipe == NULL) {
+				continue;
+			}
+
+			if (tmp_set->rpc_pipe->transport->transport != default_transport) {
+				TALLOC_FREE(tmp_set->rpc_pipe);
+				tmp_set->rpc_pipe = NULL;
+			}
+		}
+	}
+	return NT_STATUS_OK;
+}
+
 static NTSTATUS cmd_sign(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                          int argc, const char **argv)
 {
@@ -477,6 +501,34 @@ static NTSTATUS cmd_schannel_sign(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c
 	return cmd_set_ss_level();
 }
 
+static NTSTATUS cmd_choose_transport(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
+				     int argc, const char **argv)
+{
+	NTSTATUS status;
+
+	if (argc != 2) {
+		printf("Usage: %s [NCACN_NP|NCACN_IP_TCP]\n", argv[0]);
+		return NT_STATUS_OK;
+	}
+
+	if (strequal(argv[1], "NCACN_NP")) {
+		default_transport = NCACN_NP;
+	} else if (strequal(argv[1], "NCACN_IP_TCP")) {
+		default_transport = NCACN_IP_TCP;
+	} else {
+		printf("transport type: %s unknown or not supported\n",	argv[1]);
+		return NT_STATUS_NOT_SUPPORTED;
+	}
+
+	status = cmd_set_transport();
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
+	}
+
+	printf("default transport is now: %s\n", argv[1]);
+
+	return NT_STATUS_OK;
+}
 
 /* Built in rpcclient commands */
 
@@ -496,6 +548,7 @@ static struct cmd_set rpcclient_commands[] = {
 	{ "schannel", RPC_RTYPE_NTSTATUS, cmd_schannel, NULL,	  NULL, NULL,	"Force RPC pipe connections to be sealed with 'schannel'.  Assumes valid machine account to this domain controller.", "" },
 	{ "schannelsign", RPC_RTYPE_NTSTATUS, cmd_schannel_sign, NULL,	  NULL, NULL, "Force RPC pipe connections to be signed (not sealed) with 'schannel'.  Assumes valid machine account to this domain controller.", "" },
 	{ "timeout", RPC_RTYPE_NTSTATUS, cmd_timeout, NULL,	  NULL, NULL, "Set timeout (in milliseonds) for RPC operations", "" },
+	{ "transport", RPC_RTYPE_NTSTATUS, cmd_choose_transport, NULL,	  NULL, NULL, "Choose ncacn transport for RPC operations", "" },
 	{ "none", RPC_RTYPE_NTSTATUS, cmd_none, NULL,	  NULL, NULL, "Force RPC pipe connections to have no special properties", "" },
 
 	{ NULL }
@@ -569,6 +622,7 @@ static void add_command_set(struct cmd_set *cmd_set)
 static NTSTATUS do_cmd(struct cli_state *cli,
 		       struct user_auth_info *auth_info,
 		       struct cmd_set *cmd_entry,
+		       struct dcerpc_binding *binding,
 		       int argc, char **argv)
 {
 	NTSTATUS ntresult;
@@ -693,7 +747,9 @@ static NTSTATUS do_cmd(struct cli_state *cli,
  * @returns The NTSTATUS from running the command.
  **/
 static NTSTATUS process_cmd(struct user_auth_info *auth_info,
-			    struct cli_state *cli, char *cmd)
+			    struct cli_state *cli,
+			    struct dcerpc_binding *binding,
+			    char *cmd)
 {
 	struct cmd_list *temp_list;
 	NTSTATUS result = NT_STATUS_OK;
@@ -720,7 +776,7 @@ static NTSTATUS process_cmd(struct user_auth_info *auth_info,
 				}
 
 				result = do_cmd(cli, auth_info, temp_set,
-						argc, argv);
+						binding, argc, argv);
 
 				goto out_free;
 			}
@@ -766,6 +822,8 @@ out_free:
 	int result = 0;
 	TALLOC_CTX *frame = talloc_stackframe();
 	uint32_t flags = 0;
+	struct dcerpc_binding *binding = NULL;
+	const char *binding_string = NULL;
 
 	/* make sure the vars that get altered (4th field) are in
 	   a fixed location or certain compilers complain */
@@ -876,13 +934,35 @@ out_free:
 		server += 2;
 	}
 
+	nt_status = dcerpc_parse_binding(frame, server, &binding);
+
+	if (!NT_STATUS_IS_OK(nt_status)) {
+
+		binding_string = talloc_asprintf(frame, "ncacn_np:%s",
+						 strip_hostname(server));
+		if (!binding_string) {
+			result = 1;
+			goto done;
+		}
+
+		nt_status = dcerpc_parse_binding(frame, binding_string, &binding);
+		if (!NT_STATUS_IS_OK(nt_status)) {
+			result = -1;
+			goto done;
+		}
+	}
+
+	if (binding->transport == NCA_UNKNOWN) {
+		binding->transport = NCACN_NP;
+	}
+
 	if (get_cmdline_auth_info_use_kerberos(rpcclient_auth_info)) {
 		flags |= CLI_FULL_CONNECTION_USE_KERBEROS |
 			 CLI_FULL_CONNECTION_FALLBACK_AFTER_KERBEROS;
 	}
 
 
-	nt_status = cli_full_connection(&cli, global_myname(), server,
+	nt_status = cli_full_connection(&cli, global_myname(), binding->host,
 					opt_ipaddr ? &server_ss : NULL, opt_port,
 					"IPC$", "IPC",
 					get_cmdline_auth_info_username(rpcclient_auth_info),
@@ -926,6 +1006,8 @@ out_free:
 		cmd_set++;
 	}
 
+	default_transport = binding->transport;
+
 	fetch_machine_sid(cli);
 
        /* Do anything specified with -c */
@@ -936,7 +1018,8 @@ out_free:
 		result = 0;
 
                 while((cmd=next_command(&p)) != NULL) {
-                        NTSTATUS cmd_result = process_cmd(rpcclient_auth_info, cli, cmd);
+                        NTSTATUS cmd_result = process_cmd(rpcclient_auth_info, cli,
+							  binding, cmd);
 			SAFE_FREE(cmd);
 			result = NT_STATUS_IS_ERR(cmd_result);
                 }
@@ -955,7 +1038,7 @@ out_free:
 			break;
 
 		if (line[0] != '\n')
-			process_cmd(rpcclient_auth_info, cli, line);
+			process_cmd(rpcclient_auth_info, cli, binding, line);
 		SAFE_FREE(line);
 	}
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list