s3: Implement wbcGetpwsid
[ira/wip.git] / source3 / winbindd / winbindd_user.c
index e5d0a22a7324e03c905d1832fa526de3121f8f56..50aea4e0cb2ffa762dc035a4495a6a97d6553cf1 100644 (file)
@@ -80,9 +80,18 @@ static bool winbindd_fill_pwent(TALLOC_CTX *ctx, char *dom_name, char *user_name
        if (!pw || !dom_name || !user_name)
                return False;
 
+       domain = find_domain_from_name_noinit(dom_name);
+       if (domain == NULL) {
+               DEBUG(5,("winbindd_fill_pwent: Failed to find domain for %s.\n",
+                        dom_name));
+               nt_status = NT_STATUS_NO_SUCH_DOMAIN;
+               return false;
+       }
+
        /* Resolve the uid number */
 
-       if (!NT_STATUS_IS_OK(idmap_sid_to_uid(dom_name, user_sid,
+       if (!NT_STATUS_IS_OK(idmap_sid_to_uid(domain->have_idmap_config ?
+                                             dom_name : "", user_sid,
                                              &pw->pw_uid))) {
                DEBUG(1, ("error getting user id for sid %s\n",
                          sid_string_dbg(user_sid)));
@@ -91,26 +100,18 @@ static bool winbindd_fill_pwent(TALLOC_CTX *ctx, char *dom_name, char *user_name
 
        /* Resolve the gid number */
 
-       if (!NT_STATUS_IS_OK(idmap_sid_to_gid(dom_name, group_sid,
+       if (!NT_STATUS_IS_OK(idmap_sid_to_gid(domain->have_idmap_config ?
+                                             dom_name : "", group_sid,
                                              &pw->pw_gid))) {
                DEBUG(1, ("error getting group id for sid %s\n",
                          sid_string_dbg(group_sid)));
                return False;
        }
 
-       strlower_m(user_name);
-
        /* Username */
 
-       domain = find_domain_from_name_noinit(dom_name);
-       if (domain) {
-               nt_status = normalize_name_map(ctx, domain, user_name,
-                                              &mapped_name);
-       } else {
-               DEBUG(5,("winbindd_fill_pwent: Failed to find domain for %s.  "
-                        "Disabling name alias support\n", dom_name));
-               nt_status = NT_STATUS_NO_SUCH_DOMAIN;
-       }
+       strlower_m(user_name);
+       nt_status = normalize_name_map(ctx, domain, user_name, &mapped_name);
 
        /* Basic removal of whitespace */
        if (NT_STATUS_IS_OK(nt_status)) {
@@ -216,8 +217,8 @@ static void getpwsid_queryuser_recv(void *private_data, bool success,
 static void getpwsid_sid2uid_recv(void *private_data, bool success, uid_t uid);
 static void getpwsid_sid2gid_recv(void *private_data, bool success, gid_t gid);
 
-static void winbindd_getpwsid(struct winbindd_cli_state *state,
-                             const DOM_SID *sid)
+static void getpwsid_queryuser(struct winbindd_cli_state *state,
+                               const DOM_SID *sid)
 {
        struct getpwsid_state *s;
 
@@ -456,7 +457,7 @@ void winbindd_getpwnam(struct winbindd_cli_state *state)
 
        /* Get info for the domain */
 
-       domain = find_domain_from_name(domname);
+       domain = find_domain_from_name_noinit(domname);
 
        if (domain == NULL) {
                DEBUG(7, ("could not find domain entry for domain %s.  "
@@ -508,7 +509,7 @@ static void getpwnam_name2sid_recv(void *private_data, bool success,
                check_domain_trusted(domname, sid);
        }
 
-       winbindd_getpwsid(state, sid);
+       getpwsid_queryuser(state, sid);
 }
 
 static void getpwuid_recv(void *private_data, bool success, const char *sid)
@@ -527,8 +528,14 @@ static void getpwuid_recv(void *private_data, bool success, const char *sid)
        DEBUG(10,("uid2sid_recv: uid %lu has sid %s\n",
                  (unsigned long)(state->request.data.uid), sid));
 
-       string_to_sid(&user_sid, sid);
-       winbindd_getpwsid(state, &user_sid);
+       if (!string_to_sid(&user_sid, sid)) {
+               DEBUG(1,("uid2sid_recv: Could not convert sid %s "
+                       "from string\n,", sid));
+               request_error(state);
+               return;
+       }
+
+       getpwsid_queryuser(state, &user_sid);
 }
 
 /* Return a password structure given a uid number */
@@ -546,6 +553,26 @@ void winbindd_getpwuid(struct winbindd_cli_state *state)
        winbindd_uid2sid_async(state->mem_ctx, uid, getpwuid_recv, state);
 }
 
+/* Return a password structure given a sid */
+void winbindd_getpwsid(struct winbindd_cli_state *state)
+{
+       DOM_SID sid;
+
+       /* Ensure null termination */
+       state->request.data.sid[sizeof(state->request.data.sid)-1]='\0';
+
+       DEBUG(3, ("[%5lu]: getpwsid %s\n", (unsigned long)state->pid,
+                 state->request.data.sid));
+
+       if (!string_to_sid(&sid, state->request.data.sid)) {
+               DEBUG(5, ("%s not a SID\n", state->request.data.sid));
+               request_error(state);
+               return;
+       }
+
+       getpwsid_queryuser(state, &sid);
+}
+
 /*
  * set/get/endpwent functions
  */