wb-ndr: implement WINBIND_LOOKUP_LEVEL_SID2USERINFO
authorStefan Metzmacher <metze@sernet.de>
Mon, 10 Mar 2008 16:18:01 +0000 (17:18 +0100)
committerStefan Metzmacher <metze@sernet.de>
Fri, 2 May 2008 14:13:29 +0000 (16:13 +0200)
metze

source/winbindd/winbindd_async.c

index 9f4142990e384f0aff7f897b5cda24ddba567479..e71fdd3e82f73f9907ea1884515ade93f9c8a16f 100644 (file)
@@ -446,6 +446,44 @@ static void ndr_child_lookup_rids2names(struct winbindd_domain *domain,
        r->out.result = WINBIND_STATUS_OK;
 }
 
+static void ndr_child_lookup_sid2userinfo(struct winbindd_domain *domain,
+                                         struct winbindd_cli_state *state,
+                                         struct winbind_lookup *r)
+{
+       NTSTATUS status;
+       WINBIND_USERINFO user_info;
+
+       DEBUG(3, ("lookup sid2userinfo user:%s\n",
+                 sid_string_dbg(r->in.req.sid)));
+
+
+       status = domain->methods->query_user(domain, state->mem_ctx,
+                                            r->in.req.sid, &user_info);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(1, ("error getting user info for sid %s: %s\n",
+                         sid_string_dbg(r->in.req.sid), nt_errstr(status)));
+               r->out.result = WINBIND_STATUS_FOOBAR;
+               return;
+       }
+
+       r->out.rep->user_info.account           = user_info.acct_name;
+       r->out.rep->user_info.gecos             = user_info.full_name;
+       r->out.rep->user_info.homedir           = user_info.homedir;
+       r->out.rep->user_info.shell             = user_info.shell;
+       r->out.rep->user_info.primary_gid       = user_info.primary_gid;
+
+       if (!sid_peek_check_rid(&domain->sid, &user_info.group_sid,
+                               &r->out.rep->user_info.primary_rid)) {
+               DEBUG(1, ("Could not extract group rid out of %s\n",
+                         sid_string_dbg(&user_info.group_sid)));
+               r->out.result = WINBIND_STATUS_FOOBAR;
+               return;
+       }
+
+       r->out.result = WINBIND_STATUS_OK;
+}
+
+
 void winbindd_ndr_domain_child_lookup(struct winbindd_domain *domain,
                                      struct winbindd_cli_state *state)
 {
@@ -466,6 +504,10 @@ void winbindd_ndr_domain_child_lookup(struct winbindd_domain *domain,
        case WINBIND_LOOKUP_LEVEL_RIDS2NAMES:
                ndr_child_lookup_rids2names(domain, state, r);
                return;
+
+       case WINBIND_LOOKUP_LEVEL_SID2USERINFO:
+               ndr_child_lookup_sid2userinfo(domain, state, r);
+               return;
        }
 
        r->out.result = WINBIND_STATUS_UNKNOWN_LEVEL;