svn commit: samba r15306 - branches/SAMBA_3_0/source/nsswitch trunk/source/nsswitch

gd at samba.org gd at samba.org
Fri Apr 28 14:48:23 GMT 2006


Author: gd
Date: 2006-04-28 14:48:22 +0000 (Fri, 28 Apr 2006)
New Revision: 15306

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=15306

Log:
Be consistent between rpc and ads winbind backend: let the ads backend
query the samlogon cache first as well.

Guenther

Modified:
   branches/SAMBA_3_0/source/nsswitch/winbindd_ads.c
   branches/SAMBA_3_0/source/nsswitch/winbindd_rpc.c
   branches/SAMBA_3_0/source/nsswitch/winbindd_util.c
   trunk/source/nsswitch/winbindd_ads.c
   trunk/source/nsswitch/winbindd_rpc.c
   trunk/source/nsswitch/winbindd_util.c


Changeset:
Modified: branches/SAMBA_3_0/source/nsswitch/winbindd_ads.c
===================================================================
--- branches/SAMBA_3_0/source/nsswitch/winbindd_ads.c	2006-04-28 14:44:43 UTC (rev 15305)
+++ branches/SAMBA_3_0/source/nsswitch/winbindd_ads.c	2006-04-28 14:48:22 UTC (rev 15306)
@@ -626,6 +626,12 @@
 	DEBUG(3,("ads: lookup_usergroups\n"));
 	*p_num_groups = 0;
 
+	status = lookup_usergroups_cached(domain, mem_ctx, sid, 
+					  p_num_groups, user_sids);
+	if (NT_STATUS_IS_OK(status)) {
+		return NT_STATUS_OK;
+	}
+
 	ads = ads_cached_connection(domain);
 	
 	if (!ads) {
@@ -681,10 +687,12 @@
 
 	/* there must always be at least one group in the token, 
 	   unless we are talking to a buggy Win2k server */
+
 	if (count == 0) {
+
 		status = lookup_usergroups_alt(domain, mem_ctx, user_dn, 
-					     &primary_group,
-					     &num_groups, user_sids);
+					       &primary_group,
+					       &num_groups, user_sids);
 		*p_num_groups = (uint32)num_groups;
 		return status;
 	}

Modified: branches/SAMBA_3_0/source/nsswitch/winbindd_rpc.c
===================================================================
--- branches/SAMBA_3_0/source/nsswitch/winbindd_rpc.c	2006-04-28 14:44:43 UTC (rev 15305)
+++ branches/SAMBA_3_0/source/nsswitch/winbindd_rpc.c	2006-04-28 14:48:22 UTC (rev 15306)
@@ -412,7 +412,6 @@
 	unsigned int i;
 	fstring sid_string;
 	uint32 user_rid;
-	NET_USER_INFO_3 *user;
 	struct rpc_pipe_client *cli;
 
 	DEBUG(3,("rpc: lookup_usergroups sid=%s\n",
@@ -425,23 +424,10 @@
 	*user_grpsids = NULL;
 
 	/* so lets see if we have a cached user_info_3 */
-	
-	if ( (user = netsamlogon_cache_get( mem_ctx, user_sid )) != NULL )
-	{
-		DEBUG(5,("lookup_usergroups: Cache lookup succeeded for %s\n", 
-			sid_string_static(user_sid)));
-			
-		*num_groups = user->num_groups;
-				
-		(*user_grpsids) = TALLOC_ARRAY(mem_ctx, DOM_SID, *num_groups);
-		for (i=0;i<(*num_groups);i++) {
-			sid_copy(&((*user_grpsids)[i]), &domain->sid);
-			sid_append_rid(&((*user_grpsids)[i]),
-				       user->gids[i].g_rid);
-		}
-				
-		SAFE_FREE(user);
-				
+	result = lookup_usergroups_cached(domain, mem_ctx, user_sid, 
+					  num_groups, user_grpsids);
+
+	if (NT_STATUS_IS_OK(result)) {
 		return NT_STATUS_OK;
 	}
 

Modified: branches/SAMBA_3_0/source/nsswitch/winbindd_util.c
===================================================================
--- branches/SAMBA_3_0/source/nsswitch/winbindd_util.c	2006-04-28 14:44:43 UTC (rev 15305)
+++ branches/SAMBA_3_0/source/nsswitch/winbindd_util.c	2006-04-28 14:48:22 UTC (rev 15306)
@@ -1232,3 +1232,49 @@
 #endif
 }
 
+NTSTATUS lookup_usergroups_cached(struct winbindd_domain *domain,
+				  TALLOC_CTX *mem_ctx,
+				  const DOM_SID *user_sid,
+				  uint32 *p_num_groups, DOM_SID **user_sids)
+{
+	NET_USER_INFO_3 *info3 = NULL;
+	NTSTATUS status = NT_STATUS_NO_MEMORY;
+	int i;
+	size_t num_groups = 0;
+	DOM_SID group_sid, primary_group;
+	
+	DEBUG(3,(": lookup_usergroups_cached\n"));
+	
+	*user_sids = NULL;
+	num_groups = 0;
+
+	info3 = netsamlogon_cache_get(mem_ctx, user_sid);
+
+	if (info3 == NULL) {
+		return NT_STATUS_OBJECT_NAME_NOT_FOUND;
+	}
+
+	if (info3->num_groups == 0) {
+		SAFE_FREE(info3);
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+	
+	/* always add the primary group to the sid array */
+	sid_compose(&primary_group, &info3->dom_sid.sid, info3->user_rid);
+	
+	add_sid_to_array(mem_ctx, &primary_group, user_sids, &num_groups);
+
+	for (i=0; i<info3->num_groups; i++) {
+		sid_copy(&group_sid, &info3->dom_sid.sid);
+		sid_append_rid(&group_sid, info3->gids[i].g_rid);
+
+		add_sid_to_array(mem_ctx, &group_sid, user_sids,
+				 &num_groups);
+	}
+
+	SAFE_FREE(info3);
+	*p_num_groups = num_groups;
+	status = (user_sids != NULL) ? NT_STATUS_OK : NT_STATUS_NO_MEMORY;
+		
+	return status;
+}

Modified: trunk/source/nsswitch/winbindd_ads.c
===================================================================
--- trunk/source/nsswitch/winbindd_ads.c	2006-04-28 14:44:43 UTC (rev 15305)
+++ trunk/source/nsswitch/winbindd_ads.c	2006-04-28 14:48:22 UTC (rev 15306)
@@ -626,6 +626,12 @@
 	DEBUG(3,("ads: lookup_usergroups\n"));
 	*p_num_groups = 0;
 
+	status = lookup_usergroups_cached(domain, mem_ctx, sid, 
+					  p_num_groups, user_sids);
+	if (NT_STATUS_IS_OK(status)) {
+		return NT_STATUS_OK;
+	}
+
 	ads = ads_cached_connection(domain);
 	
 	if (!ads) {
@@ -681,10 +687,12 @@
 
 	/* there must always be at least one group in the token, 
 	   unless we are talking to a buggy Win2k server */
+
 	if (count == 0) {
+
 		status = lookup_usergroups_alt(domain, mem_ctx, user_dn, 
-					     &primary_group,
-					     &num_groups, user_sids);
+					       &primary_group,
+					       &num_groups, user_sids);
 		*p_num_groups = (uint32)num_groups;
 		return status;
 	}

Modified: trunk/source/nsswitch/winbindd_rpc.c
===================================================================
--- trunk/source/nsswitch/winbindd_rpc.c	2006-04-28 14:44:43 UTC (rev 15305)
+++ trunk/source/nsswitch/winbindd_rpc.c	2006-04-28 14:48:22 UTC (rev 15306)
@@ -464,7 +464,6 @@
 	unsigned int i;
 	fstring sid_string;
 	uint32 user_rid;
-	NET_USER_INFO_3 *user;
 	struct rpc_pipe_client *cli;
 
 	DEBUG(3,("rpc: lookup_usergroups sid=%s\n",
@@ -477,23 +476,10 @@
 	*user_grpsids = NULL;
 
 	/* so lets see if we have a cached user_info_3 */
-	
-	if ( (user = netsamlogon_cache_get( mem_ctx, user_sid )) != NULL )
-	{
-		DEBUG(5,("lookup_usergroups: Cache lookup succeeded for %s\n", 
-			sid_string_static(user_sid)));
-			
-		*num_groups = user->num_groups;
-				
-		(*user_grpsids) = TALLOC_ARRAY(mem_ctx, DOM_SID, *num_groups);
-		for (i=0;i<(*num_groups);i++) {
-			sid_copy(&((*user_grpsids)[i]), &domain->sid);
-			sid_append_rid(&((*user_grpsids)[i]),
-				       user->gids[i].g_rid);
-		}
-				
-		SAFE_FREE(user);
-				
+	result = lookup_usergroups_cached(domain, mem_ctx, user_sid, 
+					  num_groups, user_grpsids);
+
+	if (NT_STATUS_IS_OK(result)) {
 		return NT_STATUS_OK;
 	}
 

Modified: trunk/source/nsswitch/winbindd_util.c
===================================================================
--- trunk/source/nsswitch/winbindd_util.c	2006-04-28 14:44:43 UTC (rev 15305)
+++ trunk/source/nsswitch/winbindd_util.c	2006-04-28 14:48:22 UTC (rev 15306)
@@ -1232,3 +1232,49 @@
 #endif
 }
 
+NTSTATUS lookup_usergroups_cached(struct winbindd_domain *domain,
+				  TALLOC_CTX *mem_ctx,
+				  const DOM_SID *user_sid,
+				  uint32 *p_num_groups, DOM_SID **user_sids)
+{
+	NET_USER_INFO_3 *info3 = NULL;
+	NTSTATUS status = NT_STATUS_NO_MEMORY;
+	int i;
+	size_t num_groups = 0;
+	DOM_SID group_sid, primary_group;
+	
+	DEBUG(3,(": lookup_usergroups_cached\n"));
+	
+	*user_sids = NULL;
+	num_groups = 0;
+
+	info3 = netsamlogon_cache_get(mem_ctx, user_sid);
+
+	if (info3 == NULL) {
+		return NT_STATUS_OBJECT_NAME_NOT_FOUND;
+	}
+
+	if (info3->num_groups == 0) {
+		SAFE_FREE(info3);
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+	
+	/* always add the primary group to the sid array */
+	sid_compose(&primary_group, &info3->dom_sid.sid, info3->user_rid);
+	
+	add_sid_to_array(mem_ctx, &primary_group, user_sids, &num_groups);
+
+	for (i=0; i<info3->num_groups; i++) {
+		sid_copy(&group_sid, &info3->dom_sid.sid);
+		sid_append_rid(&group_sid, info3->gids[i].g_rid);
+
+		add_sid_to_array(mem_ctx, &group_sid, user_sids,
+				 &num_groups);
+	}
+
+	SAFE_FREE(info3);
+	*p_num_groups = num_groups;
+	status = (user_sids != NULL) ? NT_STATUS_OK : NT_STATUS_NO_MEMORY;
+		
+	return status;
+}



More information about the samba-cvs mailing list