1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-02 00:22:11 +03:00

s3-rpc_client: add rpccli_lsa_lookup_names4 wrapper.

Guenther
This commit is contained in:
Günther Deschner
2009-09-11 19:35:14 +02:00
parent fde8c46855
commit ff968712ba
2 changed files with 84 additions and 23 deletions

View File

@ -342,23 +342,26 @@ fail:
/** Lookup a list of names */
NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
struct policy_handle *pol, int num_names,
const char **names,
const char ***dom_names,
int level,
DOM_SID **sids,
enum lsa_SidType **types)
static NTSTATUS rpccli_lsa_lookup_names_generic(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
struct policy_handle *pol, int num_names,
const char **names,
const char ***dom_names,
int level,
DOM_SID **sids,
enum lsa_SidType **types,
bool use_lookupnames4)
{
NTSTATUS result;
int i;
struct lsa_String *lsa_names = NULL;
struct lsa_RefDomainList *domains = NULL;
struct lsa_TransSidArray sid_array;
struct lsa_TransSidArray3 sid_array3;
uint32_t count = 0;
ZERO_STRUCT(sid_array);
ZERO_STRUCT(sid_array3);
lsa_names = TALLOC_ARRAY(mem_ctx, struct lsa_String, num_names);
if (!lsa_names) {
@ -369,14 +372,26 @@ NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
init_lsa_String(&lsa_names[i], names[i]);
}
result = rpccli_lsa_LookupNames(cli, mem_ctx,
pol,
num_names,
lsa_names,
&domains,
&sid_array,
level,
&count);
if (use_lookupnames4) {
result = rpccli_lsa_LookupNames4(cli, mem_ctx,
num_names,
lsa_names,
&domains,
&sid_array3,
level,
&count,
0,
0);
} else {
result = rpccli_lsa_LookupNames(cli, mem_ctx,
pol,
num_names,
lsa_names,
&domains,
&sid_array,
level,
&count);
}
if (!NT_STATUS_IS_OK(result) && NT_STATUS_V(result) !=
NT_STATUS_V(STATUS_SOME_UNMAPPED)) {
@ -423,10 +438,17 @@ NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
}
for (i = 0; i < num_names; i++) {
uint32_t dom_idx = sid_array.sids[i].sid_index;
uint32_t dom_rid = sid_array.sids[i].rid;
uint32_t dom_idx;
DOM_SID *sid = &(*sids)[i];
if (use_lookupnames4) {
dom_idx = sid_array3.sids[i].sid_index;
(*types)[i] = sid_array3.sids[i].sid_type;
} else {
dom_idx = sid_array.sids[i].sid_index;
(*types)[i] = sid_array.sids[i].sid_type;
}
/* Translate optimised sid through domain index array */
if (dom_idx == 0xffffffff) {
@ -436,14 +458,16 @@ NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
continue;
}
sid_copy(sid, domains->domains[dom_idx].sid);
if (use_lookupnames4) {
sid_copy(sid, sid_array3.sids[i].sid);
} else {
sid_copy(sid, domains->domains[dom_idx].sid);
if (dom_rid != 0xffffffff) {
sid_append_rid(sid, dom_rid);
if (sid_array.sids[i].rid != 0xffffffff) {
sid_append_rid(sid, sid_array.sids[i].rid);
}
}
(*types)[i] = sid_array.sids[i].sid_type;
if (dom_names == NULL) {
continue;
}
@ -455,3 +479,31 @@ NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
return result;
}
NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
struct policy_handle *pol, int num_names,
const char **names,
const char ***dom_names,
int level,
DOM_SID **sids,
enum lsa_SidType **types)
{
return rpccli_lsa_lookup_names_generic(cli, mem_ctx, pol, num_names,
names, dom_names, level, sids,
types, false);
}
NTSTATUS rpccli_lsa_lookup_names4(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
struct policy_handle *pol, int num_names,
const char **names,
const char ***dom_names,
int level,
DOM_SID **sids,
enum lsa_SidType **types)
{
return rpccli_lsa_lookup_names_generic(cli, mem_ctx, pol, num_names,
names, dom_names, level, sids,
types, true);
}