winbind primary group = 213478
winbind force primary = no		// this is the default, but I just
wanted to be explicit
Stephen A Jazdzewski
Steve@Jazd.com
 <<samba-2.2.4-forceprimarygrouprid.patch>> 
------_=_NextPart_000_01C1FC4A.A7164AC0
Content-Type: application/octet-stream;
	name="samba-2.2.4-forceprimarygrouprid.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="samba-2.2.4-forceprimarygrouprid.patch"
--- samba-2.2.4/source/include/proto.h	Wed May 15 12:08:38 2002=0A+++
samba-2.2.4/source/include/proto.h.forceprimarygrouprid	Wed May 15 12:07:45
2002=0A@@ -2140,6 +2140,8 @@=0A int lp_write_cache_size(int );=0A char
lp_magicchar(int );=0A int lp_winbind_cache_time(void);=0A+int
lp_winbind_primary_group(void);=0A+BOOL lp_winbind_force_primary(void);=0A BOOL
lp_hide_local_users(void);=0A BOOL lp_add_home(char *pszHomename, int
iDefaultService, char *pszHomedir);=0A int lp_add_service(char *pszService, int
iDefaultService);=0A--- samba-2.2.4/source/nsswitch/winbindd_rpc.c	Wed May 15
12:08:51 2002=0A+++
samba-2.2.4/source/nsswitch/winbindd_rpc.c.forceprimarygrouprid	Wed May 15
12:08:04 2002=0A@@ -37,6 +37,9 @@=0A 	BOOL got_dom_pol =3D False;=0A 	uint32
des_access =3D SEC_RIGHTS_MAXIMUM_ALLOWED;=0A 	int i;=0A+	uint32 num_groups,
k;=0A+	uint32 *user_gids;=0A+	NTSTATUS status;=0A =0A 	*num_entries =3D 0;=0A 
*info =3D NULL;=0A@@ -95,14 +98,35 @@=0A 			(*info)[i].acct_name =3D
unistr2_tdup(mem_ctx, &info1.str[j].uni_acct_name);=0A 		
(*info)[i].full_name =3D unistr2_tdup(mem_ctx,
&info1.str[j].uni_full_name);=0A 			(*info)[i].user_rid =3D
info1.sam[j].rid_user;=0A-			/* For the moment we set the primary group for=0A-	
every user to be the Domain Users group.=0A-			   There are serious problems
with determining=0A+			/* There are serious problems with determining=0A 			  
the actual primary group for large domains.=0A-			   This should really be made
into a 'winbind=0A-			   force group' smb.conf parameter or=0A-			  
something like that. */=0A+			   'winbind primary group' smb.conf
parameter=0A+			   defaults to 0. */=0A 			(*info)[i].group_rid =3D
DOMAIN_GROUP_RID_USERS;=0A+=0A+			/* Check for primary group rid */=0A+			if
(lp_winbind_primary_group()) {=0A+=0A+				/* Check for forced primary group
*/=0A+				if (!lp_winbind_force_primary()) {=0A+			    =0A+					/* only set
primary group to primary_group if member */=0A+					status =3D
domain->methods->lookup_usergroups(domain, mem_ctx, (*info)[i].user_rid,
&num_groups, &user_gids);=0A+					if (NT_STATUS_IS_OK(status)) {=0A+=0A+
/* loop through group list */=0A+						for (k =3D 0; k < num_groups; k++)
{=0A+							DEBUG(3,("%d is member of %d\n", (*info)[i].user_rid,
user_gids[k]));=0A+							if (user_gids[k] =3D=3D lp_winbind_primary_group())
{=0A+								(*info)[i].group_rid =3D lp_winbind_primary_group();=0A+							
break;=0A+							}=0A+						}=0A+					} else=0A+						DEBUG(1,("failed to
lookup_usergroups for %d\n",(*info)[i].user_rid));=0A+				} else /* force
primary group */=0A+					(*info)[i].group_rid =3D
lp_winbind_primary_group();=0A+			}=0A 		}=0A =0A 		talloc_destroy(ctx2);=0A@@
-263,10 +287,12 @@=0A 			   WINBIND_USERINFO *user_info)=0A {=0A 	CLI_POLICY_HND
*hnd;=0A-	NTSTATUS result;=0A+	NTSTATUS result, status;=0A 	POLICY_HND dom_pol,
user_pol;=0A 	BOOL got_dom_pol =3D False, got_user_pol =3D False;=0A 
SAM_USERINFO_CTR *ctr;=0A+	uint32 num_groups, i;=0A+	uint32 *user_gids;=0A =0A 
/* Get sam handle */=0A 	if (!(hnd =3D cm_get_sam_handle(domain->name)))=0A@@
-300,6 +326,34 @@=0A 	got_user_pol =3D False;=0A =0A 	user_info->group_rid
=3D ctr->info.id21->group_rid;=0A+=0A+	/* Check for primary group rid
*/=0A+	if (lp_winbind_primary_group()) {=0A+=0A+		/* Check for forced primary
group */=0A+		if (!lp_winbind_force_primary()) {=0A+=0A+			/* only set primary
group to primary_group if member */=0A+			status =3D
domain->methods->lookup_usergroups(domain, mem_ctx, user_rid,
&num_groups, &user_gids);=0A+			if (NT_STATUS_IS_OK(status)) {=0A+=0A+		
/* loop through group list */=0A+				for (i =3D 0; i < num_groups; i++) {=0A+
DEBUG(3,("%d is member of %d\n", user_rid, user_gids[i]));=0A+=0A+				
if (user_gids[i] =3D=3D lp_winbind_primary_group()) {=0A+					
user_info->group_rid =3D lp_winbind_primary_group();=0A+						break;=0A+				
}=0A+				}=0A+			} else=0A+				DEBUG(1,("failed to lookup_usergroups for
%d\n",user_rid));=0A+		} else /* force primary group */=0A+		
user_info->group_rid =3D lp_winbind_primary_group();=0A+	}=0A+=0A+
DEBUG(1,("set user %d primary group to %d\n", user_rid,
user_info->group_rid));=0A+=0A 	user_info->acct_name =3D
unistr2_tdup(mem_ctx, =0A 					    &ctr->info.id21->uni_user_name);=0A
user_info->full_name =3D unistr2_tdup(mem_ctx, =0A---
samba-2.2.4/source/param/loadparm.c	Wed May 15 12:09:02 2002=0A+++
samba-2.2.4/source/param/loadparm.c.forceprimarygrouprid	Wed May 15 12:08:14
2002=0A@@ -210,6 +210,8 @@=0A 	int min_passwd_length;=0A 	int
oplock_break_wait_time;=0A 	int winbind_cache_time;=0A+	int
winbind_primary_group;=0A+	BOOL bWinbindForcePrimary;=0A 	int iLockSpinCount;=0A
int iLockSpinTime;=0A #ifdef WITH_LDAP_SAM=0A@@ -1098,6 +1100,8 @@=0A 
{"winbind enum users", P_BOOL, P_GLOBAL,
&Globals.bWinbindEnumUsers, NULL, NULL, 0},=0A 	{"winbind enum
groups", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumGroups, NULL, NULL,
0},=0A 	{"winbind use default domain", P_BOOL, P_GLOBAL,
&Globals.bWinbindUseDefaultDomain, NULL, NULL, 0},=0A+	{"winbind
primary group", P_INTEGER, P_GLOBAL, &Globals.winbind_primary_group,
NULL, NULL, 0},=0A+	{"winbind force primary", P_BOOL, P_GLOBAL,
&Globals.bWinbindForcePrimary, NULL, NULL, 0},=0A =0A 	{NULL, P_BOOL,
P_NONE, NULL, NULL, NULL, 0}=0A };=0A@@ -1427,6 +1431,8 @@=0A 
string_set(&Globals.szTemplateHomedir, "/home/%D/%U");=0A 
string_set(&Globals.szWinbindSeparator, "\\");=0A 
Globals.winbind_cache_time =3D 15;=0A+	Globals.winbind_primary_group =3D 0;  /*
use primary group from domain */=0A+	Globals.bWinbindForcePrimary =3D False; /*
True to force membership to primary_group */=0A =0A 	Globals.bWinbindEnumUsers
=3D True;=0A 	Globals.bWinbindEnumGroups =3D True;=0A@@ -1787,6 +1793,8 @@=0A
FN_LOCAL_INTEGER(lp_write_cache_size, iWriteCacheSize)=0A
FN_LOCAL_CHAR(lp_magicchar, magic_char)=0A
FN_GLOBAL_INTEGER(lp_winbind_cache_time,
&Globals.winbind_cache_time)=0A+FN_GLOBAL_INTEGER(lp_winbind_primary_group,
&Globals.winbind_primary_group)=0A+FN_GLOBAL_BOOL(lp_winbind_force_primary,
&Globals.bWinbindForcePrimary)=0A FN_GLOBAL_BOOL(lp_hide_local_users,
&Globals.bHideLocalUsers)=0A =0A /* local prototypes */=0A
------_=_NextPart_000_01C1FC4A.A7164AC0--