From 0eb6274aacc95601cb9a94922a8176935f336f92 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 20 Jun 2017 10:27:07 +0200 Subject: [PATCH] s3:winbind: Fix 'winbind normalize names' in wb_getpwsid() BUG: https://bugzilla.samba.org/show_bug.cgi?id=12851 Signed-off-by: Andreas Schneider Reviewed-by: Volker Lendecke --- source3/winbindd/wb_getpwsid.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/source3/winbindd/wb_getpwsid.c b/source3/winbindd/wb_getpwsid.c index 8c764f77b08..b0bf6784ba6 100644 --- a/source3/winbindd/wb_getpwsid.c +++ b/source3/winbindd/wb_getpwsid.c @@ -63,7 +63,9 @@ static void wb_getpwsid_queryuser_done(struct tevent_req *subreq) req, struct wb_getpwsid_state); struct winbindd_pw *pw = state->pw; struct wbint_userinfo *info; + struct winbindd_domain *domain = NULL; fstring acct_name, output_username; + char *mapped_name = NULL; char *tmp; NTSTATUS status; @@ -83,8 +85,34 @@ static void wb_getpwsid_queryuser_done(struct tevent_req *subreq) return; } - fill_domain_username(output_username, info->domain_name, - acct_name, true); + domain = find_domain_from_name_noinit(info->domain_name); + if (tevent_req_nomem(domain, req)) { + return; + } + + /* + * TODO: + * This function should be called in 'idmap winbind child'. It shouldn't + * be a blocking call, but for this we need to add a new function for + * winbind.idl. This is a fix which can be backported for now. + */ + status = normalize_name_map(state, + domain, + acct_name, + &mapped_name); + if (NT_STATUS_IS_OK(status)) { + fill_domain_username(output_username, + info->domain_name, + mapped_name, true); + fstrcpy(acct_name, mapped_name); + } else if (NT_STATUS_EQUAL(status, NT_STATUS_FILE_RENAMED)) { + fstrcpy(acct_name, mapped_name); + } else { + fill_domain_username(output_username, + info->domain_name, + acct_name, true); + } + strlcpy(pw->pw_name, output_username, sizeof(pw->pw_name)); strlcpy(pw->pw_gecos, info->full_name ? info->full_name : "", @@ -101,7 +129,7 @@ static void wb_getpwsid_queryuser_done(struct tevent_req *subreq) TALLOC_FREE(tmp); tmp = talloc_sub_specified( - state, info->shell, info->acct_name, + state, info->shell, acct_name, info->primary_group_name, info->domain_name, pw->pw_uid, pw->pw_gid); if (tevent_req_nomem(tmp, req)) { -- 2.13.1