Final (hopefully :-) part of fix for bug #5551. Allow passdb backend to enumerate...
authorJeremy Allison <jra@samba.org>
Wed, 25 Jun 2008 19:44:27 +0000 (12:44 -0700)
committerJeremy Allison <jra@samba.org>
Wed, 25 Jun 2008 19:44:27 +0000 (12:44 -0700)
Jeremy

source/winbindd/winbindd_passdb.c

index 8b2016c0310bfc3e4c9c20c5c90b246dad886937..ffcf0719be76b1582a1980573ab500d4a86e12ac 100644 (file)
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_WINBIND
 
-/* list all domain groups */
-static NTSTATUS enum_dom_groups(struct winbindd_domain *domain,
+static NTSTATUS enum_groups_internal(struct winbindd_domain *domain,
                                TALLOC_CTX *mem_ctx,
                                uint32 *num_entries, 
-                               struct acct_info **info)
-{
-       /* We don't have domain groups */
-       *num_entries = 0;
-       *info = NULL;
-       return NT_STATUS_OK;
-}
-
-/* List all domain groups */
-
-static NTSTATUS enum_local_groups(struct winbindd_domain *domain,
-                               TALLOC_CTX *mem_ctx,
-                               uint32 *num_entries, 
-                               struct acct_info **info)
+                               struct acct_info **info,
+                               enum lsa_SidType sidtype)
 {
        struct pdb_search *search;
-       struct samr_displayentry *aliases;
+       struct samr_displayentry *entries;
        int i;
        NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
 
-       search = pdb_search_aliases(&domain->sid);
+       if (sidtype == SID_NAME_ALIAS) {
+               search = pdb_search_aliases(&domain->sid);
+       } else {
+               search = pdb_search_groups();
+       }
+
        if (search == NULL) goto done;
 
-       *num_entries = pdb_search_entries(search, 0, 0xffffffff, &aliases);
-       if (*num_entries == 0) goto done;
+       *num_entries = pdb_search_entries(search, 0, 0xffffffff, &entries);
+       if (*num_entries == 0) {
+               /* Zero entries isn't an error */
+               result = NT_STATUS_OK;
+               goto done;
+       }
 
        *info = TALLOC_ARRAY(mem_ctx, struct acct_info, *num_entries);
        if (*info == NULL) {
@@ -65,9 +61,9 @@ static NTSTATUS enum_local_groups(struct winbindd_domain *domain,
        }
 
        for (i=0; i<*num_entries; i++) {
-               fstrcpy((*info)[i].acct_name, aliases[i].account_name);
-               fstrcpy((*info)[i].acct_desc, aliases[i].description);
-               (*info)[i].rid = aliases[i].rid;
+               fstrcpy((*info)[i].acct_name, entries[i].account_name);
+               fstrcpy((*info)[i].acct_desc, entries[i].description);
+               (*info)[i].rid = entries[i].rid;
        }
 
        result = NT_STATUS_OK;
@@ -76,6 +72,32 @@ static NTSTATUS enum_local_groups(struct winbindd_domain *domain,
        return result;
 }
 
+/* list all domain groups */
+static NTSTATUS enum_dom_groups(struct winbindd_domain *domain,
+                               TALLOC_CTX *mem_ctx,
+                               uint32 *num_entries, 
+                               struct acct_info **info)
+{
+       return enum_groups_internal(domain,
+                               mem_ctx,
+                               num_entries,
+                               info,
+                               SID_NAME_DOM_GRP);
+}
+
+/* List all local groups (aliases) */
+static NTSTATUS enum_local_groups(struct winbindd_domain *domain,
+                               TALLOC_CTX *mem_ctx,
+                               uint32 *num_entries, 
+                               struct acct_info **info)
+{
+       return enum_groups_internal(domain,
+                               mem_ctx,
+                               num_entries,
+                               info,
+                               SID_NAME_ALIAS);
+}
+
 /* convert a single name to a sid in a domain */
 static NTSTATUS name_to_sid(struct winbindd_domain *domain,
                            TALLOC_CTX *mem_ctx,