s3:winbind: Fix 'winbind normalize names' in wb_getpwsid()
authorAndreas Schneider <asn@samba.org>
Tue, 20 Jun 2017 08:27:07 +0000 (10:27 +0200)
committerVolker Lendecke <vl@samba.org>
Tue, 20 Jun 2017 21:04:34 +0000 (23:04 +0200)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=12851

Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
source3/winbindd/wb_getpwsid.c

index 56a6a29ee457b1e457f173774880e2bfb6272a3c..e9ffc33a323225a64c37d866e2ae2ac4685728a3 100644 (file)
@@ -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)) {