Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 : async implementation of WINBINDD_LOOKUPSID
4 : Copyright (C) Volker Lendecke 2009
5 :
6 : This program is free software; you can redistribute it and/or modify
7 : it under the terms of the GNU General Public License as published by
8 : the Free Software Foundation; either version 3 of the License, or
9 : (at your option) any later version.
10 :
11 : This program is distributed in the hope that it will be useful,
12 : but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : GNU General Public License for more details.
15 :
16 : You should have received a copy of the GNU General Public License
17 : along with this program. If not, see <http://www.gnu.org/licenses/>.
18 : */
19 :
20 : #include "includes.h"
21 : #include "winbindd.h"
22 : #include "../libcli/security/security.h"
23 : #include "lib/util/string_wrappers.h"
24 :
25 : struct winbindd_lookupsid_state {
26 : struct dom_sid sid;
27 : enum lsa_SidType type;
28 : const char *domname;
29 : const char *name;
30 : };
31 :
32 : static void winbindd_lookupsid_done(struct tevent_req *subreq);
33 :
34 301 : struct tevent_req *winbindd_lookupsid_send(TALLOC_CTX *mem_ctx,
35 : struct tevent_context *ev,
36 : struct winbindd_cli_state *cli,
37 : struct winbindd_request *request)
38 : {
39 : struct tevent_req *req, *subreq;
40 : struct winbindd_lookupsid_state *state;
41 :
42 301 : req = tevent_req_create(mem_ctx, &state,
43 : struct winbindd_lookupsid_state);
44 301 : if (req == NULL) {
45 0 : return NULL;
46 : }
47 :
48 : /* Ensure null termination */
49 301 : request->data.sid[sizeof(request->data.sid)-1]='\0';
50 :
51 301 : DEBUG(3, ("lookupsid %s\n", request->data.sid));
52 :
53 301 : if (!string_to_sid(&state->sid, request->data.sid)) {
54 0 : DEBUG(5, ("%s not a SID\n", request->data.sid));
55 0 : tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
56 0 : return tevent_req_post(req, ev);
57 : }
58 :
59 301 : subreq = wb_lookupsid_send(state, ev, &state->sid);
60 301 : if (tevent_req_nomem(subreq, req)) {
61 0 : return tevent_req_post(req, ev);
62 : }
63 301 : tevent_req_set_callback(subreq, winbindd_lookupsid_done, req);
64 301 : return req;
65 : }
66 :
67 301 : static void winbindd_lookupsid_done(struct tevent_req *subreq)
68 : {
69 301 : struct tevent_req *req = tevent_req_callback_data(
70 : subreq, struct tevent_req);
71 301 : struct winbindd_lookupsid_state *state = tevent_req_data(
72 : req, struct winbindd_lookupsid_state);
73 : NTSTATUS status;
74 :
75 301 : status = wb_lookupsid_recv(subreq, state, &state->type,
76 : &state->domname, &state->name);
77 301 : TALLOC_FREE(subreq);
78 301 : if (!NT_STATUS_IS_OK(status)) {
79 10 : tevent_req_nterror(req, status);
80 10 : return;
81 : }
82 291 : tevent_req_done(req);
83 : }
84 :
85 301 : NTSTATUS winbindd_lookupsid_recv(struct tevent_req *req,
86 : struct winbindd_response *response)
87 : {
88 301 : struct winbindd_lookupsid_state *state = tevent_req_data(
89 : req, struct winbindd_lookupsid_state);
90 : NTSTATUS status;
91 :
92 301 : if (tevent_req_is_nterror(req, &status)) {
93 : struct dom_sid_buf buf;
94 10 : DEBUG(5, ("Could not lookup sid %s: %s\n",
95 : dom_sid_str_buf(&state->sid, &buf),
96 : nt_errstr(status)));
97 10 : return status;
98 : }
99 :
100 291 : fstrcpy(response->data.name.dom_name, state->domname);
101 291 : fstrcpy(response->data.name.name, state->name);
102 291 : response->data.name.type = state->type;
103 291 : return NT_STATUS_OK;
104 : }
|