Revert "winbind: Remove wb_cache_lookup_usergroups"
authorVolker Lendecke <vl@samba.org>
Thu, 2 Mar 2017 13:54:46 +0000 (14:54 +0100)
committerRalph Boehme <slow@samba.org>
Mon, 6 Mar 2017 14:09:17 +0000 (15:09 +0100)
This reverts commit f83863b4d1510a9519d15934c960fd1675235812.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=12612

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
source3/winbindd/winbindd_cache.c
source3/winbindd/winbindd_proto.h

index e05e0484b3e64e719741291397728ccc8f4da2da..5787441968558a24e6d60ea907edaf842f34f2bd 100644 (file)
@@ -2379,6 +2379,77 @@ NTSTATUS wcache_lookup_usergroups(struct winbindd_domain *domain,
        return status;
 }
 
+/* Lookup groups a user is a member of. */
+NTSTATUS wb_cache_lookup_usergroups(struct winbindd_domain *domain,
+                                   TALLOC_CTX *mem_ctx,
+                                   const struct dom_sid *user_sid,
+                                   uint32_t *num_groups,
+                                   struct dom_sid **user_gids)
+{
+       struct cache_entry *centry = NULL;
+       NTSTATUS status;
+       unsigned int i;
+       fstring sid_string;
+       bool old_status;
+
+       old_status = domain->online;
+       status = wcache_lookup_usergroups(domain, mem_ctx, user_sid,
+                                         num_groups, user_gids);
+       if (!NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) {
+               return status;
+       }
+
+       (*num_groups) = 0;
+       (*user_gids) = NULL;
+
+       /* Return status value returned by seq number check */
+
+       if (!NT_STATUS_IS_OK(domain->last_status))
+               return domain->last_status;
+
+       DEBUG(10,("lookup_usergroups: [Cached] - doing backend query for info for domain %s\n",
+               domain->name ));
+
+       status = domain->backend->lookup_usergroups(domain, mem_ctx, user_sid, num_groups, user_gids);
+
+       if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT) ||
+               NT_STATUS_EQUAL(status, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND)) {
+               if (!domain->internal && old_status) {
+                       set_domain_offline(domain);
+               }
+               if (!domain->internal &&
+                       !domain->online &&
+                       old_status) {
+                       NTSTATUS cache_status;
+                       cache_status = wcache_lookup_usergroups(domain, mem_ctx, user_sid,
+                                                         num_groups, user_gids);
+                       return cache_status;
+               }
+       }
+       if ( NT_STATUS_EQUAL(status, NT_STATUS_SYNCHRONIZATION_REQUIRED) )
+               goto skip_save;
+
+       /* and save it */
+       refresh_sequence_number(domain);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+       centry = centry_start(domain, status);
+       if (!centry)
+               goto skip_save;
+
+       centry_put_uint32(centry, *num_groups);
+       for (i=0; i<(*num_groups); i++) {
+               centry_put_sid(centry, &(*user_gids)[i]);
+       }       
+
+       centry_end(centry, "UG/%s", sid_to_fstring(sid_string, user_sid));
+       centry_free(centry);
+
+skip_save:
+       return status;
+}
+
 static char *wcache_make_sidlist(TALLOC_CTX *mem_ctx, uint32_t num_sids,
                                 const struct dom_sid *sids)
 {
index e1ded99aace2d5705a682aa21f452e5fea0c6d1a..ca9897a5d204eb38eaea596d4423687a8a9ad924 100644 (file)
@@ -89,6 +89,11 @@ NTSTATUS wb_cache_rids_to_names(struct winbindd_domain *domain,
                                char **domain_name,
                                char ***names,
                                enum lsa_SidType **types);
+NTSTATUS wb_cache_lookup_usergroups(struct winbindd_domain *domain,
+                                   TALLOC_CTX *mem_ctx,
+                                   const struct dom_sid *user_sid,
+                                   uint32_t *pnum_sids,
+                                   struct dom_sid **psids);
 NTSTATUS wb_cache_lookup_useraliases(struct winbindd_domain *domain,
                                     TALLOC_CTX *mem_ctx,
                                     uint32_t num_sids,