winbind: Return queried domain name from name_to_sid
authorChristof Schmitt <cs@samba.org>
Mon, 11 Mar 2019 23:11:01 +0000 (16:11 -0700)
committerChristof Schmitt <cs@samba.org>
Thu, 18 Apr 2019 17:21:18 +0000 (17:21 +0000)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=13831

Signed-off-by: Christof Schmitt <cs@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
source3/winbindd/winbindd.h
source3/winbindd/winbindd_ads.c
source3/winbindd/winbindd_cache.c
source3/winbindd/winbindd_msrpc.c
source3/winbindd/winbindd_reconnect.c
source3/winbindd/winbindd_reconnect_ads.c
source3/winbindd/winbindd_rpc.c
source3/winbindd/winbindd_rpc.h
source3/winbindd/winbindd_samr.c

index 7490d62a7051b36c984fc8791e99b4377d195cf7..a72d6aa7830a738d76f63442fb6a7b86ecd79c0e 100644 (file)
@@ -225,6 +225,7 @@ struct winbindd_methods {
                                const char *domain_name,
                                const char *name,
                                uint32_t flags,
                                const char *domain_name,
                                const char *name,
                                uint32_t flags,
+                               const char **pdom_name,
                                struct dom_sid *sid,
                                enum lsa_SidType *type);
 
                                struct dom_sid *sid,
                                enum lsa_SidType *type);
 
index 4b5966dc237c95f3eeaba30d99cb25ecffe23270..5f20cfb7f7695e3b0d6321bea8ac9e23024cb127 100644 (file)
@@ -558,11 +558,12 @@ static NTSTATUS name_to_sid(struct winbindd_domain *domain,
                            const char *domain_name,
                            const char *name,
                            uint32_t flags,
                            const char *domain_name,
                            const char *name,
                            uint32_t flags,
+                           const char **pdom_name,
                            struct dom_sid *sid,
                            enum lsa_SidType *type)
 {
        return msrpc_methods.name_to_sid(domain, mem_ctx, domain_name, name,
                            struct dom_sid *sid,
                            enum lsa_SidType *type)
 {
        return msrpc_methods.name_to_sid(domain, mem_ctx, domain_name, name,
-                                        flags, sid, type);
+                                        flags, pdom_name, sid, type);
 }
 
 /* convert a domain SID to a user or group name - use rpc methods */
 }
 
 /* convert a domain SID to a user or group name - use rpc methods */
index c686089d5175b9ed0171b181eb91af3419dfe916..92a5e1d333b1fbdac029c50b4e426c194bba2a3f 100644 (file)
@@ -1820,7 +1820,7 @@ NTSTATUS wb_cache_name_to_sid(struct winbindd_domain *domain,
 
        winbindd_domain_init_backend(domain);
        status = domain->backend->name_to_sid(domain, mem_ctx, domain_name,
 
        winbindd_domain_init_backend(domain);
        status = domain->backend->name_to_sid(domain, mem_ctx, domain_name,
-                                             name, flags, sid, type);
+                                             name, flags, NULL, sid, type);
 
        if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT) ||
                NT_STATUS_EQUAL(status, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND)) {
 
        if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT) ||
                NT_STATUS_EQUAL(status, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND)) {
index 69a049556ddd0dbcd9906a60988710dac98de6a1..342f22cfde31bd120b34d8873a98785bc99b4287 100644 (file)
@@ -218,6 +218,7 @@ static NTSTATUS msrpc_name_to_sid(struct winbindd_domain *domain,
                                  const char *domain_name,
                                  const char *name,
                                  uint32_t flags,
                                  const char *domain_name,
                                  const char *name,
                                  uint32_t flags,
+                                 const char **pdom_name,
                                  struct dom_sid *sid,
                                  enum lsa_SidType *type)
 {
                                  struct dom_sid *sid,
                                  enum lsa_SidType *type)
 {
@@ -268,6 +269,17 @@ static NTSTATUS msrpc_name_to_sid(struct winbindd_domain *domain,
 
        /* Return rid and type if lookup successful */
 
 
        /* Return rid and type if lookup successful */
 
+       if (pdom_name != NULL) {
+               const char *dom_name;
+
+               dom_name = talloc_strdup(mem_ctx, domains[0]);
+               if (dom_name == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+
+               *pdom_name = dom_name;
+       }
+
        sid_copy(sid, &sids[0]);
        *type = types[0];
 
        sid_copy(sid, &sids[0]);
        *type = types[0];
 
index 1d0e8e6d472aa72377acc7340c3f9752409b2bdf..56741d4670e57b07d01834d331bdbebb02092aca 100644 (file)
@@ -131,18 +131,19 @@ static NTSTATUS name_to_sid(struct winbindd_domain *domain,
                            const char *domain_name,
                            const char *name,
                            uint32_t flags,
                            const char *domain_name,
                            const char *name,
                            uint32_t flags,
+                           const char **pdom_name,
                            struct dom_sid *sid,
                            enum lsa_SidType *type)
 {
        NTSTATUS result;
 
        result = msrpc_methods.name_to_sid(domain, mem_ctx, domain_name, name,
                            struct dom_sid *sid,
                            enum lsa_SidType *type)
 {
        NTSTATUS result;
 
        result = msrpc_methods.name_to_sid(domain, mem_ctx, domain_name, name,
-                                          flags, sid, type);
+                                          flags, pdom_name, sid, type);
 
        if (reconnect_need_retry(result, domain))
                result = msrpc_methods.name_to_sid(domain, mem_ctx,
                                                   domain_name, name, flags,
 
        if (reconnect_need_retry(result, domain))
                result = msrpc_methods.name_to_sid(domain, mem_ctx,
                                                   domain_name, name, flags,
-                                                  sid, type);
+                                                  pdom_name, sid, type);
 
        return result;
 }
 
        return result;
 }
index 0a0a14f6dd02a623d954b0422de022370b860a36..f77430572d07fb25d854c4aec40918dd3e92a8e6 100644 (file)
@@ -137,18 +137,19 @@ static NTSTATUS name_to_sid(struct winbindd_domain *domain,
                            const char *domain_name,
                            const char *name,
                            uint32_t flags,
                            const char *domain_name,
                            const char *name,
                            uint32_t flags,
+                           const char **pdom_name,
                            struct dom_sid *sid,
                            enum lsa_SidType *type)
 {
        NTSTATUS result;
 
        result = ads_methods.name_to_sid(domain, mem_ctx, domain_name, name,
                            struct dom_sid *sid,
                            enum lsa_SidType *type)
 {
        NTSTATUS result;
 
        result = ads_methods.name_to_sid(domain, mem_ctx, domain_name, name,
-                                        flags, sid, type);
+                                        flags, pdom_name, sid, type);
 
        if (reconnect_need_retry(result, domain)) {
                result = ads_methods.name_to_sid(domain, mem_ctx,
                                                 domain_name, name, flags,
 
        if (reconnect_need_retry(result, domain)) {
                result = ads_methods.name_to_sid(domain, mem_ctx,
                                                 domain_name, name, flags,
-                                                sid, type);
+                                                pdom_name, sid, type);
        }
 
        return result;
        }
 
        return result;
index 81f9f98a4bd435f225d81b71396ab02bebb75755..ffbaabcfe4922a5b18983e24d84ca915b408344f 100644 (file)
@@ -247,6 +247,7 @@ NTSTATUS rpc_name_to_sid(TALLOC_CTX *mem_ctx,
                         const char *domain_name,
                         const char *name,
                         uint32_t flags,
                         const char *domain_name,
                         const char *name,
                         uint32_t flags,
+                        const char **pdom_name,
                         struct dom_sid *sid,
                         enum lsa_SidType *type)
 {
                         struct dom_sid *sid,
                         enum lsa_SidType *type)
 {
@@ -301,6 +302,17 @@ NTSTATUS rpc_name_to_sid(TALLOC_CTX *mem_ctx,
                return status;
        }
 
                return status;
        }
 
+       if (pdom_name != NULL) {
+               const char *dom_name;
+
+               dom_name = talloc_strdup(mem_ctx, domains[0]);
+               if (dom_name == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+
+               *pdom_name = dom_name;
+       }
+
        sid_copy(sid, &sids[0]);
        *type = types[0];
 
        sid_copy(sid, &sids[0]);
        *type = types[0];
 
index 162f1ef3329feb21e3c6a1bd11e838f9c353641e..a5cfe77f289f71eb0473010a18aa49c8fc2e366b 100644 (file)
@@ -53,6 +53,7 @@ NTSTATUS rpc_name_to_sid(TALLOC_CTX *mem_ctx,
                         const char *domain_name,
                         const char *name,
                         uint32_t flags,
                         const char *domain_name,
                         const char *name,
                         uint32_t flags,
+                        const char **pdom_name,
                         struct dom_sid *psid,
                         enum lsa_SidType *ptype);
 
                         struct dom_sid *psid,
                         enum lsa_SidType *ptype);
 
index 35e7febceff733ef0b5313a47b01580c347fbb2f..396e2c97709b4013e2918e363ba4022a19150dbe 100644 (file)
@@ -581,6 +581,7 @@ static NTSTATUS sam_name_to_sid(struct winbindd_domain *domain,
                                   const char *domain_name,
                                   const char *name,
                                   uint32_t flags,
                                   const char *domain_name,
                                   const char *name,
                                   uint32_t flags,
+                                  const char **pdom_name,
                                   struct dom_sid *psid,
                                   enum lsa_SidType *ptype)
 {
                                   struct dom_sid *psid,
                                   enum lsa_SidType *ptype)
 {
@@ -629,6 +630,14 @@ again:
                goto done;
        }
 
                goto done;
        }
 
+       if (pdom_name != NULL) {
+               *pdom_name = talloc_strdup(mem_ctx, dom_name);
+               if (*pdom_name == NULL) {
+                       status = NT_STATUS_NO_MEMORY;
+                       goto done;
+               }
+       }
+
        if (psid) {
                sid_copy(psid, &sid);
        }
        if (psid) {
                sid_copy(psid, &sid);
        }