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 1504 : 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 0 : struct tevent_req *req, *subreq; 40 0 : struct winbindd_lookupsid_state *state; 41 : 42 1504 : req = tevent_req_create(mem_ctx, &state, 43 : struct winbindd_lookupsid_state); 44 1504 : if (req == NULL) { 45 0 : return NULL; 46 : } 47 : 48 : /* Ensure null termination */ 49 1504 : request->data.sid[sizeof(request->data.sid)-1]='\0'; 50 : 51 1504 : DEBUG(3, ("lookupsid %s\n", request->data.sid)); 52 : 53 1504 : 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 1504 : subreq = wb_lookupsid_send(state, ev, &state->sid); 60 1504 : if (tevent_req_nomem(subreq, req)) { 61 0 : return tevent_req_post(req, ev); 62 : } 63 1504 : tevent_req_set_callback(subreq, winbindd_lookupsid_done, req); 64 1504 : return req; 65 : } 66 : 67 1504 : static void winbindd_lookupsid_done(struct tevent_req *subreq) 68 : { 69 1504 : struct tevent_req *req = tevent_req_callback_data( 70 : subreq, struct tevent_req); 71 1504 : struct winbindd_lookupsid_state *state = tevent_req_data( 72 : req, struct winbindd_lookupsid_state); 73 0 : NTSTATUS status; 74 : 75 1504 : status = wb_lookupsid_recv(subreq, state, &state->type, 76 : &state->domname, &state->name); 77 1504 : TALLOC_FREE(subreq); 78 1504 : if (!NT_STATUS_IS_OK(status)) { 79 12 : tevent_req_nterror(req, status); 80 12 : return; 81 : } 82 1492 : tevent_req_done(req); 83 : } 84 : 85 1504 : NTSTATUS winbindd_lookupsid_recv(struct tevent_req *req, 86 : struct winbindd_response *response) 87 : { 88 1504 : struct winbindd_lookupsid_state *state = tevent_req_data( 89 : req, struct winbindd_lookupsid_state); 90 0 : NTSTATUS status; 91 : 92 1504 : if (tevent_req_is_nterror(req, &status)) { 93 0 : struct dom_sid_buf buf; 94 12 : DEBUG(5, ("Could not lookup sid %s: %s\n", 95 : dom_sid_str_buf(&state->sid, &buf), 96 : nt_errstr(status))); 97 12 : return status; 98 : } 99 : 100 1492 : fstrcpy(response->data.name.dom_name, state->domname); 101 1492 : fstrcpy(response->data.name.name, state->name); 102 1492 : response->data.name.type = state->type; 103 1492 : return NT_STATUS_OK; 104 : }