s3: Give name_to_sid the chance to return names
authorVolker Lendecke <vl@samba.org>
Tue, 6 Sep 2011 15:32:50 +0000 (17:32 +0200)
committerMichael Adam <obnox@samba.org>
Tue, 11 Oct 2011 13:21:08 +0000 (15:21 +0200)
source3/librpc/idl/wbint.idl
source3/winbindd/wb_lookupname.c
source3/winbindd/winbindd.h
source3/winbindd/winbindd_ads.c
source3/winbindd/winbindd_cache.c
source3/winbindd/winbindd_dual_srv.c
source3/winbindd/winbindd_msrpc.c
source3/winbindd/winbindd_reconnect.c
source3/winbindd/winbindd_rpc.c
source3/winbindd/winbindd_rpc.h
source3/winbindd/winbindd_samr.c

index cb8a4e42a358a61404d43bc3da5674773b2c4234..92d69c7afd7efc9730e5e3128bf9cd166dc11c74 100644 (file)
@@ -33,6 +33,7 @@ interface wbint
        [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
        );
index 2ebaba03d3fb5447263ea2e5c6337d95c8fb99ca..926e6e3bc666790acb5a61aa7cc2a2dad4d2cdbe 100644 (file)
@@ -27,6 +27,7 @@ struct wb_lookupname_state {
        const char *dom_name;
        const char *name;
        uint32_t flags;
+       const char *out_domain;
        struct dom_sid sid;
        enum lsa_SidType type;
 };
@@ -72,7 +73,8 @@ struct tevent_req *wb_lookupname_send(TALLOC_CTX *mem_ctx,
        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);
        }
@@ -113,7 +115,8 @@ static void wb_lookupname_done(struct tevent_req *subreq)
        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;
        }
index 3f1c7f558e2eb9e41bd61834410c1c0fee137922..097a216bb90a339fb8914145353b112ba2c37605 100644 (file)
@@ -255,8 +255,8 @@ struct winbindd_methods {
        /* 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);
index dde8e3f53d204eb8c40db350d9774c0e17efde26..e778876a8c4f2d99a62e0d1ac400bb7b9dafe363 100644 (file)
@@ -419,8 +419,8 @@ static NTSTATUS enum_local_groups(struct winbindd_domain *domain,
 /* 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)
index 4f902b5291a6b62d26f2d39f4500b5b57b979896..e0fec1e7f27d5be09370ab441e1b6c6bb20fa179 100644 (file)
@@ -1800,8 +1800,8 @@ NTSTATUS wcache_name_to_sid(struct winbindd_domain *domain,
 /* 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)
@@ -1811,7 +1811,7 @@ static NTSTATUS name_to_sid(struct winbindd_domain *domain,
 
        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;
        }
@@ -1844,7 +1844,8 @@ static NTSTATUS name_to_sid(struct winbindd_domain *domain,
                        !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;
                }
        }
@@ -1853,13 +1854,15 @@ static NTSTATUS name_to_sid(struct winbindd_domain *domain,
 
        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);
                }
        }
 
index 70bee1802f54b1c45be01eb4962fb856fb9afed3..f649bb2727c64d49fb7aff88194048b357dc77d7 100644 (file)
@@ -95,15 +95,32 @@ NTSTATUS _wbint_LookupSids(struct pipes_struct *p, struct wbint_LookupSids *r)
 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;
 }
index 921cdb5a8bc3cd36076df396e8765a36d2f0bb0b..05daf2400bde5c690efd477e021da9e699a2bd48 100644 (file)
@@ -217,8 +217,8 @@ done:
 /* 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)
@@ -230,12 +230,13 @@ static NTSTATUS msrpc_name_to_sid(struct winbindd_domain *domain,
        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"));
@@ -256,7 +257,7 @@ static NTSTATUS msrpc_name_to_sid(struct winbindd_domain *domain,
        }
 
        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,
index 62bf57ea4add35b04eb2e51f9eb9ea9b77662698..b0e33b9cac547185d147865ebdbf9ab225f6e8b3 100644 (file)
@@ -128,8 +128,8 @@ static NTSTATUS enum_local_groups(struct winbindd_domain *domain,
 /* 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)
index bf438a6d5cd6ac07f04cbe8245cf1e7da5c29078..7dfdc85d547bfabb35119c6ac01f1082fdcdb56c 100644 (file)
@@ -268,8 +268,8 @@ NTSTATUS rpc_enum_local_groups(TALLOC_CTX *mem_ctx,
 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)
@@ -280,12 +280,13 @@ NTSTATUS rpc_name_to_sid(TALLOC_CTX *mem_ctx,
        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) {
@@ -300,7 +301,7 @@ NTSTATUS rpc_name_to_sid(TALLOC_CTX *mem_ctx,
        }
 
        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
index 5513788ec8dd215c6679818a7e72e4af8ae1087d..f9a3f1181f387b4b72c3623f9ca739b1f227527a 100644 (file)
@@ -51,8 +51,8 @@ NTSTATUS rpc_enum_local_groups(TALLOC_CTX *mem_ctx,
 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);
index ee5ff087bdca12e85161a4c4c335d971ebb78569..b0fc53aa62d65b002c1a9607e4a315c10ec9b1eb 100644 (file)
@@ -605,8 +605,8 @@ done:
 /* 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)