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 23struct winbindd_lookupsid_state { 24 struct tevent_context *ev; 25 struct dom_sid sid; 26 enum lsa_SidType type; 27 const char *domname; 28 const char *name; 29}; 30 31static void winbindd_lookupsid_done(struct tevent_req *subreq); 32 33struct tevent_req *winbindd_lookupsid_send(TALLOC_CTX *mem_ctx, 34 struct tevent_context *ev, 35 struct winbindd_cli_state *cli, 36 struct winbindd_request *request) 37{ 38 struct tevent_req *req, *subreq; 39 struct winbindd_lookupsid_state *state; 40 41 req = tevent_req_create(mem_ctx, &state, 42 struct winbindd_lookupsid_state); 43 if (req == NULL) { 44 return NULL; 45 } 46 state->ev = ev; 47 48 /* Ensure null termination */ 49 request->data.sid[sizeof(request->data.sid)-1]='\0'; 50 51 DEBUG(3, ("lookupsid %s\n", request->data.sid)); 52 53 if (!string_to_sid(&state->sid, request->data.sid)) { 54 DEBUG(5, ("%s not a SID\n", request->data.sid)); 55 tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER); 56 return tevent_req_post(req, ev);; 57 } 58 59 subreq = wb_lookupsid_send(state, ev, &state->sid); 60 if (tevent_req_nomem(subreq, req)) { 61 return tevent_req_post(req, ev); 62 } 63 tevent_req_set_callback(subreq, winbindd_lookupsid_done, req); 64 return req; 65} 66 67static void winbindd_lookupsid_done(struct tevent_req *subreq) 68{ 69 struct tevent_req *req = tevent_req_callback_data( 70 subreq, struct tevent_req); 71 struct winbindd_lookupsid_state *state = tevent_req_data( 72 req, struct winbindd_lookupsid_state); 73 NTSTATUS status; 74 75 status = wb_lookupsid_recv(subreq, state, &state->type, 76 &state->domname, &state->name); 77 TALLOC_FREE(subreq); 78 if (!NT_STATUS_IS_OK(status)) { 79 tevent_req_nterror(req, status); 80 return; 81 } 82 tevent_req_done(req); 83} 84 85NTSTATUS winbindd_lookupsid_recv(struct tevent_req *req, 86 struct winbindd_response *response) 87{ 88 struct winbindd_lookupsid_state *state = tevent_req_data( 89 req, struct winbindd_lookupsid_state); 90 NTSTATUS status; 91 92 if (tevent_req_is_nterror(req, &status)) { 93 DEBUG(5, ("Could not lookup sid %s: %s\n", 94 sid_string_dbg(&state->sid), nt_errstr(status))); 95 return status; 96 } 97 98 fstrcpy(response->data.name.dom_name, state->domname); 99 fstrcpy(response->data.name.name, state->name); 100 response->data.name.type = state->type; 101 return NT_STATUS_OK; 102} 103