svn commit: samba r1658 - branches/SAMBA_3_0/source/nsswitch

vlendec at samba.org vlendec at samba.org
Thu Aug 5 07:57:37 GMT 2004


Author: vlendec
Date: 2004-08-05 07:57:37 +0000 (Thu, 05 Aug 2004)
New Revision: 1658
WebSVN: http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/&rev=1658&nolog=1
Log:
Expand aliases for getusersids as well.

Volker

Modified:
   branches/SAMBA_3_0/source/nsswitch/winbindd_group.c

Changeset:
Modified: branches/SAMBA_3_0/source/nsswitch/winbindd_group.c
===================================================================
--- branches/SAMBA_3_0/source/nsswitch/winbindd_group.c	2004-08-05 05:03:04 UTC (rev 1657)
+++ branches/SAMBA_3_0/source/nsswitch/winbindd_group.c	2004-08-05 07:57:37 UTC (rev 1658)
@@ -1169,7 +1169,49 @@
 	return result;
 }
 
+static void add_sid_to_array_unique(TALLOC_CTX *mem_ctx, const DOM_SID *sid,
+				    DOM_SID ***sids, int *num_sids)
+{
+	int i;
 
+	for (i=0; i<(*num_sids); i++) {
+		if (sid_compare(sid, (*sids)[i]) == 0)
+			return;
+	}
+
+	*sids = talloc_realloc(mem_ctx, *sids, sizeof(**sids) * (*num_sids+1));
+
+	if (*sids == NULL)
+		return;
+
+	(*sids)[*num_sids] = talloc(mem_ctx, sizeof(DOM_SID));
+	sid_copy((*sids)[*num_sids], sid);
+	*num_sids += 1;
+	return;
+}
+
+static void add_local_sids_from_sid(TALLOC_CTX *mem_ctx, const DOM_SID *sid,
+				    DOM_SID ***user_grpsids,
+				    int *num_groups)
+{
+	DOM_SID *aliases = NULL;
+	int i, num_aliases = 0;
+
+	if (!pdb_enum_alias_memberships(sid, &aliases, &num_aliases))
+		return;
+
+	if (num_aliases == 0)
+		return;
+
+	for (i=0; i<num_aliases; i++)
+		add_sid_to_array_unique(mem_ctx, &aliases[i], user_grpsids,
+					num_groups);
+
+	SAFE_FREE(aliases);
+
+	return;
+}
+
 /* Get user supplementary sids. This is equivalent to the
    winbindd_getgroups() function but it involves a SID->SIDs mapping
    rather than a NAME->SID->SIDS->GIDS mapping, which means we avoid
@@ -1224,6 +1266,20 @@
 		goto no_groups;
 	}
 
+	if (lp_winbind_nested_groups()) {
+		int k;
+		/* num_groups is changed during the loop, that's why we have
+		   to count down here.*/
+
+		for (k=num_groups-1; k>=0; k--) {
+			add_local_sids_from_sid(mem_ctx, user_grpsids[k],
+						&user_grpsids, &num_groups);
+		}
+
+		add_local_sids_from_sid(mem_ctx, &user_sid, &user_grpsids,
+					&num_groups);
+	}
+
 	/* work out the response size */
 	for (i = 0; i < num_groups; i++) {
 		const char *s = sid_string_static(user_grpsids[i]);



More information about the samba-cvs mailing list