[in,string,charset(UTF8)] char *domain,
[in,string,charset(UTF8)] char *name,
[in] uint32 flags,
+ [out,string,charset(UTF8)] char **out_domain,
[out] lsa_SidType *type,
[out] dom_sid *sid
);
const char *dom_name;
const char *name;
uint32_t flags;
+ const char *out_domain;
struct dom_sid sid;
enum lsa_SidType type;
};
subreq = dcerpc_wbint_LookupName_send(
state, ev, dom_child_handle(domain),
state->dom_name, state->name,
- flags, &state->type, &state->sid);
+ flags,
+ &state->out_domain, &state->type, &state->sid);
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
}
subreq = dcerpc_wbint_LookupName_send(
state, state->ev, dom_child_handle(root_domain),
state->dom_name,
- state->name, state->flags, &state->type, &state->sid);
+ state->name, state->flags,
+ &state->out_domain, &state->type, &state->sid);
if (tevent_req_nomem(subreq, req)) {
return;
}
/* convert one user or group name to a sid */
NTSTATUS (*name_to_sid)(struct winbindd_domain *domain,
TALLOC_CTX *mem_ctx,
- const char *domain_name,
- const char *name,
+ char **domain_name,
+ char **name,
uint32_t flags,
struct dom_sid *sid,
enum lsa_SidType *type);
/* convert a single name to a sid in a domain - use rpc methods */
static NTSTATUS name_to_sid(struct winbindd_domain *domain,
TALLOC_CTX *mem_ctx,
- const char *domain_name,
- const char *name,
+ char **domain_name,
+ char **name,
uint32_t flags,
struct dom_sid *sid,
enum lsa_SidType *type)
/* convert a single name to a sid in a domain */
static NTSTATUS name_to_sid(struct winbindd_domain *domain,
TALLOC_CTX *mem_ctx,
- const char *domain_name,
- const char *name,
+ char **domain_name,
+ char **name,
uint32_t flags,
struct dom_sid *sid,
enum lsa_SidType *type)
old_status = domain->online;
- status = wcache_name_to_sid(domain, domain_name, name, sid, type);
+ status = wcache_name_to_sid(domain, *domain_name, *name, sid, type);
if (!NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) {
return status;
}
!domain->online &&
old_status) {
NTSTATUS cache_status;
- cache_status = wcache_name_to_sid(domain, domain_name, name, sid, type);
+ cache_status = wcache_name_to_sid(
+ domain, *domain_name, *name, sid, type);
return cache_status;
}
}
if (domain->online &&
(NT_STATUS_IS_OK(status) || NT_STATUS_EQUAL(status, NT_STATUS_NONE_MAPPED))) {
- wcache_save_name_to_sid(domain, status, domain_name, name, sid, *type);
+ wcache_save_name_to_sid(domain, status, *domain_name, *name,
+ sid, *type);
/* Only save the reverse mapping if this was not a UPN */
- if (!strchr(name, '@')) {
- strupper_m(CONST_DISCARD(char *,domain_name));
- strlower_m(CONST_DISCARD(char *,name));
- wcache_save_sid_to_name(domain, status, sid, domain_name, name, *type);
+ if (!strchr(*name, '@')) {
+ strupper_m(CONST_DISCARD(char *, *domain_name));
+ strlower_m(CONST_DISCARD(char *, *name));
+ wcache_save_sid_to_name(domain, status, sid,
+ *domain_name, *name, *type);
}
}
NTSTATUS _wbint_LookupName(struct pipes_struct *p, struct wbint_LookupName *r)
{
struct winbindd_domain *domain = wb_child_domain();
+ char *domain_name, *name;
NTSTATUS status;
if (domain == NULL) {
return NT_STATUS_REQUEST_NOT_ACCEPTED;
}
+ domain_name = talloc_strdup(p->mem_ctx, r->in.domain);
+ if (domain_name == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ name = talloc_strdup(p->mem_ctx, r->in.name);
+ if (name == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
status = domain->methods->name_to_sid(
- domain, p->mem_ctx, r->in.domain, r->in.name, r->in.flags,
+ domain, p->mem_ctx, &domain_name, &name, r->in.flags,
r->out.sid, r->out.type);
+
+ *r->out.out_domain = "";
+
+ if (NT_STATUS_IS_OK(status)) {
+ *r->out.out_domain = domain_name;
+ }
+
reset_cm_connection_on_error(domain, status);
return status;
}
/* convert a single name to a sid in a domain */
static NTSTATUS msrpc_name_to_sid(struct winbindd_domain *domain,
TALLOC_CTX *mem_ctx,
- const char *domain_name,
- const char *name,
+ char **domain_name,
+ char **name,
uint32_t flags,
struct dom_sid *sid,
enum lsa_SidType *type)
NTSTATUS name_map_status = NT_STATUS_UNSUCCESSFUL;
char *mapped_name = NULL;
- if (name == NULL || *name=='\0') {
- full_name = talloc_asprintf(mem_ctx, "%s", domain_name);
- } else if (domain_name == NULL || *domain_name == '\0') {
- full_name = talloc_asprintf(mem_ctx, "%s", name);
+ if (*name == NULL || **name=='\0') {
+ full_name = talloc_asprintf(mem_ctx, "%s", *domain_name);
+ } else if (*domain_name == NULL || **domain_name == '\0') {
+ full_name = talloc_asprintf(mem_ctx, "%s", *name);
} else {
- full_name = talloc_asprintf(mem_ctx, "%s\\%s", domain_name, name);
+ full_name = talloc_asprintf(mem_ctx, "%s\\%s", *domain_name,
+ *name);
}
if (!full_name) {
DEBUG(0, ("talloc_asprintf failed!\n"));
}
DEBUG(3,("name_to_sid [rpc] %s for domain %s\n",
- full_name?full_name:"", domain_name ));
+ full_name?full_name:"", *domain_name ));
result = winbindd_lookup_names(mem_ctx, domain, 1,
(const char **)&full_name, NULL,
/* convert a single name to a sid in a domain */
static NTSTATUS name_to_sid(struct winbindd_domain *domain,
TALLOC_CTX *mem_ctx,
- const char *domain_name,
- const char *name,
+ char **domain_name,
+ char **name,
uint32_t flags,
struct dom_sid *sid,
enum lsa_SidType *type)
NTSTATUS rpc_name_to_sid(TALLOC_CTX *mem_ctx,
struct rpc_pipe_client *lsa_pipe,
struct policy_handle *lsa_policy,
- const char *domain_name,
- const char *name,
+ char **domain_name,
+ char **name,
uint32_t flags,
struct dom_sid *sid,
enum lsa_SidType *type)
char *mapped_name = NULL;
NTSTATUS status;
- if (name == NULL || name[0] == '\0') {
- full_name = talloc_asprintf(mem_ctx, "%s", domain_name);
- } else if (domain_name == NULL || domain_name[0] == '\0') {
- full_name = talloc_asprintf(mem_ctx, "%s", name);
+ if (*name == NULL || *name[0] == '\0') {
+ full_name = talloc_asprintf(mem_ctx, "%s", *domain_name);
+ } else if (*domain_name == NULL || *domain_name[0] == '\0') {
+ full_name = talloc_asprintf(mem_ctx, "%s", *name);
} else {
- full_name = talloc_asprintf(mem_ctx, "%s\\%s", domain_name, name);
+ full_name = talloc_asprintf(mem_ctx, "%s\\%s", *domain_name,
+ *name);
}
if (full_name == NULL) {
}
DEBUG(3,("name_to_sid: %s for domain %s\n",
- full_name ? full_name : "", domain_name ));
+ full_name ? full_name : "", *domain_name ));
/*
* We don't run into deadlocks here, cause winbind_off() is
NTSTATUS rpc_name_to_sid(TALLOC_CTX *mem_ctx,
struct rpc_pipe_client *lsa_pipe,
struct policy_handle *lsa_policy,
- const char *domain_name,
- const char *name,
+ char **domain_name,
+ char **name,
uint32_t flags,
struct dom_sid *psid,
enum lsa_SidType *ptype);
/* convert a single name to a sid in a domain */
static NTSTATUS sam_name_to_sid(struct winbindd_domain *domain,
TALLOC_CTX *mem_ctx,
- const char *domain_name,
- const char *name,
+ char **domain_name,
+ char **name,
uint32_t flags,
struct dom_sid *psid,
enum lsa_SidType *ptype)