[PATCH] winbind use default domain [HEAD] [SAMBA_2_2]
Alexander Bokovoy
a.bokovoy at sam-solutions.net
Thu Dec 20 06:25:02 GMT 2001
This is new version of 'winbind use default domain' patch which
adds forgotten change for nsswitch/wb_client.c. Additionally patch for
SAMBA_2_2 branch attached as well.
--
/ Alexander Bokovoy
$ cat /proc/identity >~/.signature
`Senior software developer and analyst for SaM-Solutions Ltd.`
---
Nov 21 20:58:58 alconost kernel: VFS: Busy inodes after unmount.
Self-destruct in 5 seconds. Have a nice day...
-------------- next part --------------
diff -urk.orig samba/source/nsswitch/wb_client.c.orig samba/source/nsswitch/wb_client.c
--- samba/source/nsswitch/wb_client.c.orig Thu Dec 20 16:08:22 2001
+++ samba/source/nsswitch/wb_client.c Thu Dec 20 16:14:28 2001
@@ -31,20 +31,28 @@
/* Copy of parse_domain_user from winbindd_util.c. Parse a string of the
form DOMAIN/user into a domain and a user */
-
-static BOOL parse_domain_user(char *domuser, fstring domain, fstring user)
+ /* Parse a string of the form DOMAIN/user into a domain and a user */
+extern fstring global_myworkgroup;
+
+static BOOL parse_domain_user(const char *domuser, fstring domain, fstring user)
{
- char *p = strchr(domuser,*lp_winbind_separator());
-
- if (!p)
- return False;
-
- fstrcpy(user, p+1);
- fstrcpy(domain, domuser);
- domain[PTR_DIFF(p, domuser)] = 0;
- strupper(domain);
- return True;
+ char *p = strchr(domuser,*lp_winbind_separator());
+
+ if (!(p || lp_winbind_use_default_domain()))
+ return False;
+
+ if(!p && lp_winbind_use_default_domain()) {
+ fstrcpy(user, domuser);
+ fstrcpy(domain, global_myworkgroup);
+ } else {
+ fstrcpy(user, p+1);
+ fstrcpy(domain, domuser);
+ domain[PTR_DIFF(p, domuser)] = 0;
+ }
+ strupper(domain);
+ return True;
}
+
/* Call winbindd to convert a name to a sid */
diff -urk.orig samba/source/nsswitch/winbindd_group.c.orig samba/source/nsswitch/winbindd_group.c
--- samba/source/nsswitch/winbindd_group.c.orig Thu Dec 20 16:08:22 2001
+++ samba/source/nsswitch/winbindd_group.c Thu Dec 20 16:10:35 2001
@@ -24,6 +24,7 @@
#include "winbindd.h"
+extern fstring global_myworkgroup;
/***************************************************************
Empty static struct for negative caching.
****************************************************************/
@@ -40,13 +41,34 @@
gr->gr_gid = unix_gid;
/* Group name and password */
-
safe_strcpy(gr->gr_name, gr_name, sizeof(gr->gr_name) - 1);
safe_strcpy(gr->gr_passwd, "x", sizeof(gr->gr_passwd) - 1);
return True;
}
+/*
+ Strip domain name if it is same as default domain name and
+ winbind use default domain = true
+
+ it assumes that name is actually fstring so that memory management
+ isn't needed.
+*/
+static void strip_domain_name_if_needed(fstring *name)
+{
+ if(lp_winbind_use_default_domain()) {
+ char *sep = lp_winbind_separator();
+ char *new_name = strchr(*name, *sep);
+ if(new_name) {
+ *new_name = 0;
+ if (!strcmp(global_myworkgroup, *name)) {
+ new_name++;
+ safe_strcpy(*name, new_name, sizeof(fstring));
+ }
+ }
+ }
+}
+
/* Fill in the group membership field of a NT group given by group_rid */
static BOOL fill_grent_mem(struct winbindd_domain *domain,
@@ -136,6 +158,7 @@
snprintf(name, sizeof(name), "%s%s%s", domain->name,
lp_winbind_separator(), the_name);
+ strip_domain_name_if_needed(&name);
len = strlen(name);
@@ -366,6 +389,7 @@
if (strcmp(lp_winbind_separator(),"\\"))
string_sub(group_name, "\\", lp_winbind_separator(),
sizeof(fstring));
+ strip_domain_name_if_needed(&group_name);
if (!((name_type == SID_NAME_ALIAS) ||
(name_type == SID_NAME_DOM_GRP))) {
@@ -669,6 +693,8 @@
"%s%s%s", ent->domain->name, lp_winbind_separator(),
name_list[ent->sam_entry_index].acct_name);
+ strip_domain_name_if_needed(&domain_group_name);
+
result = fill_grent(&group_list[group_list_ndx],
domain_group_name, group_gid);
@@ -885,6 +911,8 @@
snprintf(name, sizeof(name), "%s%s%s", domain->name,
lp_winbind_separator(), group_name);
+
+ strip_domain_name_if_needed(&name);
/* Append to extra data */
diff -urk.orig samba/source/nsswitch/winbindd_user.c.orig samba/source/nsswitch/winbindd_user.c
--- samba/source/nsswitch/winbindd_user.c.orig Thu Dec 20 16:08:22 2001
+++ samba/source/nsswitch/winbindd_user.c Thu Dec 20 16:12:17 2001
@@ -24,6 +24,8 @@
#include "winbindd.h"
+extern fstring global_myworkgroup;
+
/* Fill a pwent structure with information we have obtained */
static BOOL winbindd_fill_pwent(char *domain_name, char *name,
@@ -91,6 +93,29 @@
return True;
}
+/*
+ Strip domain name if it is same as default domain name and
+ winbind use default domain = true
+
+ it assumes that name is actually fstring so that memory management
+ isn't needed.
+ */
+static void strip_domain_name_if_needed(fstring *name)
+{
+ if(lp_winbind_use_default_domain()) {
+ char *sep = lp_winbind_separator();
+ char *new_name = strchr(*name, *sep);
+ if(new_name) {
+ *new_name = 0;
+ if (!strcmp(global_myworkgroup, *name)) {
+ new_name++;
+ safe_strcpy(*name, new_name, sizeof(fstring));
+ }
+ }
+ }
+}
+
+
/************************************************************************
Empty static struct for negative caching.
*************************************************************************/
@@ -191,6 +216,7 @@
return WINBINDD_OK;
}
+
/* Return a password structure given a uid number */
enum winbindd_result winbindd_getpwnam_from_uid(struct winbindd_cli_state *state)
@@ -252,6 +278,7 @@
if (strcmp("\\", lp_winbind_separator()))
string_sub(user_name, "\\", lp_winbind_separator(),
sizeof(fstring));
+ strip_domain_name_if_needed(&user_name);
/* Get some user info */
@@ -580,6 +607,8 @@
slprintf(domain_user_name, sizeof(domain_user_name) - 1,
"%s%s%s", ent->domain->name, sep,
name_list[ent->sam_entry_index].name);
+
+ strip_domain_name_if_needed(&domain_user_name);
result = winbindd_fill_pwent(
ent->domain->name,
@@ -692,6 +721,8 @@
slprintf(name, sizeof(name) - 1, "%s%s%s",
domain->name, lp_winbind_separator(),
acct_name);
+
+ strip_domain_name_if_needed(&name);
/* Append to extra data */
diff -urk.orig samba/source/nsswitch/winbindd_util.c.orig samba/source/nsswitch/winbindd_util.c
--- samba/source/nsswitch/winbindd_util.c.orig Thu Dec 20 16:08:22 2001
+++ samba/source/nsswitch/winbindd_util.c Thu Dec 20 16:13:30 2001
@@ -900,18 +900,25 @@
return False;
}
-/* Parse a string of the form DOMAIN/user into a domain and a user */
-
-BOOL parse_domain_user(char *domuser, fstring domain, fstring user)
+ /* Parse a string of the form DOMAIN/user into a domain and a user */
+extern fstring global_myworkgroup;
+
+BOOL parse_domain_user(const char *domuser, fstring domain, fstring user)
{
- char *p = strchr(domuser,*lp_winbind_separator());
-
- if (!p)
- return False;
-
- fstrcpy(user, p+1);
- fstrcpy(domain, domuser);
- domain[PTR_DIFF(p, domuser)] = 0;
- strupper(domain);
- return True;
+ char *p = strchr(domuser,*lp_winbind_separator());
+
+ if (!(p || lp_winbind_use_default_domain()))
+ return False;
+
+ if(!p && lp_winbind_use_default_domain()) {
+ fstrcpy(user, domuser);
+ fstrcpy(domain, global_myworkgroup);
+ } else {
+ fstrcpy(user, p+1);
+ fstrcpy(domain, domuser);
+ domain[PTR_DIFF(p, domuser)] = 0;
+ }
+ strupper(domain);
+ return True;
}
+
diff -urk.orig samba/source/param/loadparm.c.orig samba/source/param/loadparm.c
--- samba/source/param/loadparm.c.orig Thu Dec 20 16:08:19 2001
+++ samba/source/param/loadparm.c Thu Dec 20 16:09:15 2001
@@ -170,6 +170,7 @@
char *szWinbindSeparator;
BOOL bWinbindEnumUsers;
BOOL bWinbindEnumGroups;
+ BOOL bWinbindUseDefaultDomain;
char *szAddShareCommand;
char *szChangeShareCommand;
char *szDeleteShareCommand;
@@ -1059,6 +1060,7 @@
{"winbind cache time", P_INTEGER, P_GLOBAL, &Globals.winbind_cache_time, NULL, NULL, 0},
{"winbind enum users", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumUsers, NULL, NULL, 0},
{"winbind enum groups", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumGroups, NULL, NULL, 0},
+ {"winbind use default domain", P_BOOL, P_GLOBAL, &Globals.bWinbindUseDefaultDomain, NULL, NULL, 0},
{NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
};
@@ -1385,6 +1387,7 @@
Globals.bWinbindEnumUsers = True;
Globals.bWinbindEnumGroups = True;
+ Globals.bWinbindUseDefaultDomain = False;
/*
* This must be done last as it checks the value in
@@ -1518,6 +1521,7 @@
FN_GLOBAL_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
FN_GLOBAL_BOOL(lp_winbind_enum_users, &Globals.bWinbindEnumUsers)
FN_GLOBAL_BOOL(lp_winbind_enum_groups, &Globals.bWinbindEnumGroups)
+FN_GLOBAL_BOOL(lp_winbind_use_default_domain, &Globals.bWinbindUseDefaultDomain)
FN_GLOBAL_STRING(lp_codepagedir,&Globals.szCodePageDir)
#ifdef WITH_LDAP_SAM
FN_GLOBAL_STRING(lp_ldap_server, &Globals.szLdapServer)
-------------- next part --------------
diff -uk.orig samba-3.0/source/param/loadparm.c.orig samba-3.0/source/param/loadparm.c
--- samba-3.0/source/param/loadparm.c.orig Mon Dec 17 10:44:17 2001
+++ samba-3.0/source/param/loadparm.c Wed Dec 19 18:12:38 2001
@@ -155,6 +155,7 @@
char *szWinbindSeparator;
BOOL bWinbindEnumUsers;
BOOL bWinbindEnumGroups;
+ BOOL bWinbindUseDefaultDomain;
char *szAddShareCommand;
char *szChangeShareCommand;
char *szDeleteShareCommand;
@@ -1042,6 +1043,7 @@
{"winbind cache time", P_INTEGER, P_GLOBAL, &Globals.winbind_cache_time, NULL, NULL, 0},
{"winbind enum users", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumUsers, NULL, NULL, 0},
{"winbind enum groups", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumGroups, NULL, NULL, 0},
+ {"winbind use default domain", P_BOOL, P_GLOBAL, &Globals.bWinbindUseDefaultDomain, NULL, NULL, 0},
{NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
};
@@ -1367,6 +1369,7 @@
Globals.winbind_cache_time = 15;
Globals.bWinbindEnumUsers = True;
Globals.bWinbindEnumGroups = True;
+ Globals.bWinbindUseDefaultDomain = False;
Globals.bUseSpnego = True;
@@ -1510,6 +1513,7 @@
FN_GLOBAL_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
FN_GLOBAL_BOOL(lp_winbind_enum_users, &Globals.bWinbindEnumUsers)
FN_GLOBAL_BOOL(lp_winbind_enum_groups, &Globals.bWinbindEnumGroups)
+FN_GLOBAL_BOOL(lp_winbind_use_default_domain, &Globals.bWinbindUseDefaultDomain)
#ifdef WITH_LDAP_SAM
FN_GLOBAL_STRING(lp_ldap_server, &Globals.szLdapServer)
FN_GLOBAL_STRING(lp_ldap_suffix, &Globals.szLdapSuffix)
diff -uk.orig samba-3.0/source/nsswitch/winbindd_group.c.orig samba-3.0/source/nsswitch/winbindd_group.c
--- samba-3.0/source/nsswitch/winbindd_group.c.orig Tue Dec 18 11:31:38 2001
+++ samba-3.0/source/nsswitch/winbindd_group.c Wed Dec 19 18:12:39 2001
@@ -24,6 +24,7 @@
#include "winbindd.h"
+extern fstring global_myworkgroup;
/***************************************************************
Empty static struct for negative caching.
****************************************************************/
@@ -38,13 +39,34 @@
gr->gr_gid = unix_gid;
/* Group name and password */
-
safe_strcpy(gr->gr_name, gr_name, sizeof(gr->gr_name) - 1);
safe_strcpy(gr->gr_passwd, "x", sizeof(gr->gr_passwd) - 1);
return True;
}
+/*
+ Strip domain name if it is same as default domain name and
+ winbind use default domain = true
+
+ it assumes that name is actually fstring so that memory management
+ isn't needed.
+*/
+static void strip_domain_name_if_needed(fstring *name)
+{
+ if(lp_winbind_use_default_domain()) {
+ char *sep = lp_winbind_separator();
+ char *new_name = strchr(*name, *sep);
+ if(new_name) {
+ *new_name = 0;
+ if (!strcmp(global_myworkgroup, *name)) {
+ new_name++;
+ safe_strcpy(*name, new_name, sizeof(fstring));
+ }
+ }
+ }
+}
+
/* Fill in the group membership field of a NT group given by group_rid */
static BOOL fill_grent_mem(struct winbindd_domain *domain,
@@ -134,6 +156,7 @@
snprintf(name, sizeof(name), "%s%s%s", domain->name,
lp_winbind_separator(), the_name);
+ strip_domain_name_if_needed(&name);
len = strlen(name);
@@ -306,6 +329,7 @@
if (strcmp(lp_winbind_separator(),"\\"))
string_sub(group_name, "\\", lp_winbind_separator(),
sizeof(fstring));
+ strip_domain_name_if_needed(&group_name);
if (!((name_type == SID_NAME_ALIAS) ||
(name_type == SID_NAME_DOM_GRP))) {
@@ -563,6 +587,8 @@
"%s%s%s", ent->domain->name, lp_winbind_separator(),
name_list[ent->sam_entry_index].acct_name);
+ strip_domain_name_if_needed(&domain_group_name);
+
result = fill_grent(&group_list[group_list_ndx],
domain_group_name, group_gid);
@@ -727,13 +753,20 @@
groups.sam_entries)[i].acct_name;
fstring name;
- snprintf(name, sizeof(name), "%s%s%s", domain->name,
- lp_winbind_separator(), group_name);
-
- /* Append to extra data */
- memcpy(&extra_data[extra_data_len], name,
- strlen(name));
- extra_data_len += strlen(name);
+ if(!lp_winbind_use_default_domain()) {
+ snprintf(name, sizeof(name), "%s%s%s", domain->name,
+ lp_winbind_separator(), group_name);
+
+ /* Append to extra data */
+ memcpy(&extra_data[extra_data_len], name,
+ strlen(name));
+ extra_data_len += strlen(name);
+ } else {
+ /* Append to extra data */
+ memcpy(&extra_data[extra_data_len], group_name,
+ strlen(group_name));
+ extra_data_len += strlen(name);
+ }
extra_data[extra_data_len++] = ',';
}
diff -uk.orig samba-3.0/source/nsswitch/winbindd_user.c.orig samba-3.0/source/nsswitch/winbindd_user.c
--- samba-3.0/source/nsswitch/winbindd_user.c.orig Tue Dec 11 18:51:41 2001
+++ samba-3.0/source/nsswitch/winbindd_user.c Wed Dec 19 18:12:54 2001
@@ -24,6 +24,8 @@
#include "winbindd.h"
+extern fstring global_myworkgroup;
+
/* Fill a pwent structure with information we have obtained */
static BOOL winbindd_fill_pwent(char *domain_name, char *name,
@@ -91,6 +93,28 @@
return True;
}
+/*
+ Strip domain name if it is same as default domain name and
+ winbind use default domain = true
+
+ it assumes that name is actually fstring so that memory management
+ isn't needed.
+*/
+static void strip_domain_name_if_needed(fstring *name)
+{
+ if(lp_winbind_use_default_domain()) {
+ char *sep = lp_winbind_separator();
+ char *new_name = strchr(*name, *sep);
+ if(new_name) {
+ *new_name = 0;
+ if (!strcmp(global_myworkgroup, *name)) {
+ new_name++;
+ safe_strcpy(*name, new_name, sizeof(fstring));
+ }
+ }
+ }
+}
+
/* Return a password structure from a username. */
enum winbindd_result winbindd_getpwnam_from_user(struct winbindd_cli_state *state)
@@ -165,6 +189,7 @@
return WINBINDD_OK;
}
+
/* Return a password structure given a uid number */
enum winbindd_result winbindd_getpwnam_from_uid(struct winbindd_cli_state *state)
@@ -213,6 +238,7 @@
if (strcmp("\\", lp_winbind_separator()))
string_sub(user_name, "\\", lp_winbind_separator(),
sizeof(fstring));
+ strip_domain_name_if_needed(&user_name);
/* Get some user info */
@@ -487,6 +513,8 @@
slprintf(domain_user_name, sizeof(domain_user_name) - 1,
"%s%s%s", ent->domain->name, sep,
name_list[ent->sam_entry_index].name);
+
+ strip_domain_name_if_needed(&domain_user_name);
result = winbindd_fill_pwent(
ent->domain->name,
@@ -583,14 +611,21 @@
fstrcpy(acct_name, info[i].acct_name);
}
- slprintf(name, sizeof(name) - 1, "%s%s%s",
- domain->name, lp_winbind_separator(),
- acct_name);
+ if(!lp_winbind_use_default_domain()) {
+ slprintf(name, sizeof(name) - 1, "%s%s%s",
+ domain->name, lp_winbind_separator(),
+ acct_name);
/* Append to extra data */
- memcpy(&extra_data[extra_data_len], name,
- strlen(name));
- extra_data_len += strlen(name);
+ memcpy(&extra_data[extra_data_len], name,
+ strlen(name));
+ extra_data_len += strlen(name);
+ } else {
+ /* Append to extra data */
+ memcpy(&extra_data[extra_data_len], acct_name,
+ strlen(acct_name));
+ extra_data_len += strlen(acct_name);
+ }
extra_data[extra_data_len++] = ',';
}
}
diff -uk.orig samba-3.0/source/nsswitch/wb_client.c.orig samba-3.0/source/nsswitch/wb_client.c
--- samba-3.0/source/nsswitch/wb_client.c.orig 13 Dec 2001 11:58:38 -0000 1.32
+++ samba-3.0/source/nsswitch/wb_client.c 20 Dec 2001 14:15:59 -0000
@@ -32,17 +32,23 @@
/* Copy of parse_domain_user from winbindd_util.c. Parse a string of the
form DOMAIN/user into a domain and a user */
+extern fstring global_myworkgroup;
static BOOL parse_domain_user(const char *domuser, fstring domain, fstring user)
{
char *p = strchr(domuser,*lp_winbind_separator());
- if (!p)
+ if (!(p || lp_winbind_use_default_domain()))
return False;
-
- fstrcpy(user, p+1);
- fstrcpy(domain, domuser);
- domain[PTR_DIFF(p, domuser)] = 0;
+
+ if(!p && lp_winbind_use_default_domain()) {
+ fstrcpy(user, domuser);
+ fstrcpy(domain, global_myworkgroup);
+ } else {
+ fstrcpy(user, p+1);
+ fstrcpy(domain, domuser);
+ domain[PTR_DIFF(p, domuser)] = 0;
+ }
strupper(domain);
return True;
}
diff -uk.orig samba-3.0/source/nsswitch/winbindd_util.c.orig samba-3.0/source/nsswitch/winbindd_util.c
--- samba-3.0/source/nsswitch/winbindd_util.c.orig Wed Dec 19 15:33:44 2001
+++ samba-3.0/source/nsswitch/winbindd_util.c Wed Dec 19 18:11:46 2001
@@ -308,17 +308,23 @@
}
/* Parse a string of the form DOMAIN/user into a domain and a user */
+extern fstring global_myworkgroup;
BOOL parse_domain_user(const char *domuser, fstring domain, fstring user)
{
char *p = strchr(domuser,*lp_winbind_separator());
- if (!p)
+ if (!(p || lp_winbind_use_default_domain()))
return False;
- fstrcpy(user, p+1);
- fstrcpy(domain, domuser);
- domain[PTR_DIFF(p, domuser)] = 0;
+ if(!p && lp_winbind_use_default_domain()) {
+ fstrcpy(user, domuser);
+ fstrcpy(domain, global_myworkgroup);
+ } else {
+ fstrcpy(user, p+1);
+ fstrcpy(domain, domuser);
+ domain[PTR_DIFF(p, domuser)] = 0;
+ }
strupper(domain);
return True;
}
More information about the samba-technical
mailing list