From a94b044a5cba2d4e5d4dadbd7b3a433322748c2c Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Wed, 31 Jan 2007 05:38:36 +0000 Subject: r21070: * Add the new boolean 'winbind normalize names' option as discussed on the samba-technical ml. The replacement character is hardcoded as a '_' for now. (This used to be commit bd8238417b8d692ed381a870901ff1ee4cfa80f6) --- source3/nsswitch/winbindd_group.c | 3 +++ source3/nsswitch/winbindd_rpc.c | 11 +++++++++-- source3/nsswitch/winbindd_user.c | 3 +++ source3/nsswitch/winbindd_util.c | 34 ++++++++++++++++++++++++++++++++++ source3/param/loadparm.c | 4 ++++ 5 files changed, 53 insertions(+), 2 deletions(-) diff --git a/source3/nsswitch/winbindd_group.c b/source3/nsswitch/winbindd_group.c index e5cdc404a0..9d8b41b4bf 100644 --- a/source3/nsswitch/winbindd_group.c +++ b/source3/nsswitch/winbindd_group.c @@ -462,6 +462,7 @@ void winbindd_getgrnam(struct winbindd_cli_state *state) gid_t gid; union unid_t id; NTSTATUS status; + char replace_char[2] = { 0x0, 0x0 }; /* Ensure null termination */ state->request.data.groupname[sizeof(state->request.data.groupname)-1]='\0'; @@ -502,6 +503,8 @@ void winbindd_getgrnam(struct winbindd_cli_state *state) } /* Get rid and name type from name */ + + ws_name_replace( name_group, '_' ); if (!winbindd_lookup_sid_by_name(state->mem_ctx, domain, domain->name, name_group, &group_sid, &name_type)) { diff --git a/source3/nsswitch/winbindd_rpc.c b/source3/nsswitch/winbindd_rpc.c index 08fe129db0..6e6add2009 100644 --- a/source3/nsswitch/winbindd_rpc.c +++ b/source3/nsswitch/winbindd_rpc.c @@ -246,7 +246,7 @@ NTSTATUS msrpc_name_to_sid(struct winbindd_domain *domain, NTSTATUS result; DOM_SID *sids = NULL; enum lsa_SidType *types = NULL; - const char *full_name; + char *full_name; struct rpc_pipe_client *cli; POLICY_HND lsa_policy; @@ -262,6 +262,8 @@ NTSTATUS msrpc_name_to_sid(struct winbindd_domain *domain, return NT_STATUS_NO_MEMORY; } + ws_name_return( full_name, '_' ); + DEBUG(3,("name_to_sid [rpc] %s for domain %s\n", full_name?full_name:"", domain_name )); result = cm_connect_lsa(domain, mem_ctx, &cli, &lsa_policy); @@ -314,6 +316,9 @@ NTSTATUS msrpc_sid_to_name(struct winbindd_domain *domain, *type = (enum lsa_SidType)types[0]; *domain_name = domains[0]; *name = names[0]; + + ws_name_replace( *name, '_' ); + DEBUG(5,("Mapped sid to [%s]\\[%s]\n", domains[0], *name)); return NT_STATUS_OK; } @@ -333,6 +338,7 @@ NTSTATUS msrpc_rids_to_names(struct winbindd_domain *domain, POLICY_HND lsa_policy; DOM_SID *sids; size_t i; + char **ret_names; DEBUG(3, ("rids_to_names [rpc] for domain %s\n", domain->name )); @@ -360,10 +366,11 @@ NTSTATUS msrpc_rids_to_names(struct winbindd_domain *domain, return result; } + ret_names = *names; for (i=0; iusername = talloc_strdup(s->state->mem_ctx, username); + + ws_name_replace( s->username, '_' ); + s->fullname = talloc_strdup(s->state->mem_ctx, full_name); s->homedir = talloc_strdup(s->state->mem_ctx, homedir); s->shell = talloc_strdup(s->state->mem_ctx, shell); diff --git a/source3/nsswitch/winbindd_util.c b/source3/nsswitch/winbindd_util.c index 7a3a7bdf28..85d5f3443a 100644 --- a/source3/nsswitch/winbindd_util.c +++ b/source3/nsswitch/winbindd_util.c @@ -1073,3 +1073,37 @@ NTSTATUS lookup_usergroups_cached(struct winbindd_domain *domain, return status; } + +/********************************************************************* + We use this to remove spaces from user and group names +********************************************************************/ + +void ws_name_replace( char *name, char replace ) +{ + char replace_char[2] = { 0x0, 0x0 }; + + if ( !lp_winbind_normalize_names() || (replace == '\0') ) + return; + + replace_char[0] = replace; + all_string_sub( name, " ", replace_char, 0 ); + + return; +} + +/********************************************************************* + We use this to do the inverse of ws_name_replace() +********************************************************************/ + +void ws_name_return( char *name, char replace ) +{ + char replace_char[2] = { 0x0, 0x0 }; + + if ( !lp_winbind_normalize_names() || (replace == '\0') ) + return; + + replace_char[0] = replace; + all_string_sub( name, replace_char, " ", 0 ); + + return; +} diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index e1cce4b963..8634c48b31 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -180,6 +180,7 @@ typedef struct { BOOL bWinbindNestedGroups; BOOL bWinbindRefreshTickets; BOOL bWinbindOfflineLogon; + BOOL bWinbindNormalizeNames; char **szIdmapDomains; char **szIdmapBackend; /* deprecated */ char *szIdmapAllocBackend; @@ -1288,6 +1289,7 @@ static struct parm_struct parm_table[] = { {"winbind nss info", P_LIST, P_GLOBAL, &Globals.szWinbindNssInfo, NULL, NULL, FLAG_ADVANCED}, {"winbind refresh tickets", P_BOOL, P_GLOBAL, &Globals.bWinbindRefreshTickets, NULL, NULL, FLAG_ADVANCED}, {"winbind offline logon", P_BOOL, P_GLOBAL, &Globals.bWinbindOfflineLogon, NULL, NULL, FLAG_ADVANCED}, + {"winbind normalize names", P_BOOL, P_GLOBAL, &Globals.bWinbindNormalizeNames, NULL, NULL, FLAG_ADVANCED}, {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0} }; @@ -1622,6 +1624,7 @@ static void init_globals(BOOL first_time_only) string_set(&Globals.szTemplateShell, "/bin/false"); string_set(&Globals.szTemplateHomedir, "/home/%D/%U"); string_set(&Globals.szWinbindSeparator, "\\"); + string_set(&Globals.szCupsServer, ""); string_set(&Globals.szIPrintServer, ""); @@ -1854,6 +1857,7 @@ FN_GLOBAL_BOOL(lp_winbind_trusted_domains_only, &Globals.bWinbindTrustedDomainsO FN_GLOBAL_BOOL(lp_winbind_nested_groups, &Globals.bWinbindNestedGroups) FN_GLOBAL_BOOL(lp_winbind_refresh_tickets, &Globals.bWinbindRefreshTickets) FN_GLOBAL_BOOL(lp_winbind_offline_logon, &Globals.bWinbindOfflineLogon) +FN_GLOBAL_BOOL(lp_winbind_normalize_names, &Globals.bWinbindNormalizeNames) FN_GLOBAL_LIST(lp_idmap_domains, &Globals.szIdmapDomains) FN_GLOBAL_LIST(lp_idmap_backend, &Globals.szIdmapBackend) /* deprecated */ -- cgit