Line data Source code
1 : /* 2 : Unix SMB/CIFS implementation. 3 : async implementation of WINBINDD_LOOKUPNAME 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/dom_sid.h" 23 : 24 : struct winbindd_lookupname_state { 25 : struct tevent_context *ev; 26 : struct dom_sid sid; 27 : enum lsa_SidType type; 28 : }; 29 : 30 : static void winbindd_lookupname_done(struct tevent_req *subreq); 31 : 32 708 : struct tevent_req *winbindd_lookupname_send(TALLOC_CTX *mem_ctx, 33 : struct tevent_context *ev, 34 : struct winbindd_cli_state *cli, 35 : struct winbindd_request *request) 36 : { 37 : struct tevent_req *req, *subreq; 38 : struct winbindd_lookupname_state *state; 39 708 : char *p = NULL; 40 708 : const char *domname = NULL; 41 708 : const char *name = NULL; 42 708 : const char *namespace = NULL; 43 : 44 708 : req = tevent_req_create(mem_ctx, &state, 45 : struct winbindd_lookupname_state); 46 708 : if (req == NULL) { 47 0 : return NULL; 48 : } 49 : 50 708 : D_NOTICE("[%s (%u)] Winbind external command LOOKUPNAME start.\n", 51 : cli->client_name, 52 : (unsigned int)cli->pid); 53 : 54 708 : state->ev = ev; 55 : 56 : /* Ensure null termination */ 57 : request->data.name.dom_name[ 58 708 : sizeof(request->data.name.dom_name)-1]='\0'; 59 708 : request->data.name.name[sizeof(request->data.name.name)-1]='\0'; 60 : 61 708 : if (strlen(request->data.name.dom_name) == 0) { 62 : /* cope with the name being a fully qualified name */ 63 8 : p = strstr(request->data.name.name, lp_winbind_separator()); 64 8 : if (p != NULL) { 65 0 : *p = '\0'; 66 0 : domname = request->data.name.name; 67 0 : namespace = domname; 68 0 : name = p + 1; 69 : } else { 70 8 : p = strchr(request->data.name.name, '@'); 71 8 : if (p != NULL) { 72 : /* upn */ 73 8 : namespace = p + 1; 74 : } else { 75 0 : namespace = ""; 76 : } 77 8 : domname = ""; 78 8 : name = request->data.name.name; 79 : } 80 : } else { 81 700 : domname = request->data.name.dom_name; 82 700 : namespace = domname; 83 700 : name = request->data.name.name; 84 : } 85 : 86 708 : D_NOTICE("lookupname %s%s%s\n", domname, lp_winbind_separator(), name); 87 : 88 708 : subreq = wb_lookupname_send(state, ev, namespace, domname, name, 0); 89 708 : if (tevent_req_nomem(subreq, req)) { 90 0 : return tevent_req_post(req, ev); 91 : } 92 708 : tevent_req_set_callback(subreq, winbindd_lookupname_done, req); 93 708 : return req; 94 : } 95 : 96 708 : static void winbindd_lookupname_done(struct tevent_req *subreq) 97 : { 98 708 : struct tevent_req *req = tevent_req_callback_data( 99 : subreq, struct tevent_req); 100 708 : struct winbindd_lookupname_state *state = tevent_req_data( 101 : req, struct winbindd_lookupname_state); 102 : NTSTATUS status; 103 : 104 708 : status = wb_lookupname_recv(subreq, &state->sid, &state->type); 105 708 : TALLOC_FREE(subreq); 106 708 : if (tevent_req_nterror(req, status)) { 107 172 : return; 108 : } 109 536 : tevent_req_done(req); 110 : } 111 : 112 708 : NTSTATUS winbindd_lookupname_recv(struct tevent_req *req, 113 : struct winbindd_response *response) 114 : { 115 708 : struct winbindd_lookupname_state *state = tevent_req_data( 116 : req, struct winbindd_lookupname_state); 117 : NTSTATUS status; 118 : 119 708 : D_NOTICE("Winbind external command LOOKUPNAME end.\n"); 120 708 : if (tevent_req_is_nterror(req, &status)) { 121 : struct dom_sid_buf buf; 122 172 : D_WARNING("Could not convert SID %s, error is %s\n", 123 : dom_sid_str_buf(&state->sid, &buf), 124 : nt_errstr(status)); 125 172 : return status; 126 : } 127 536 : sid_to_fstring(response->data.sid.sid, &state->sid); 128 536 : response->data.sid.type = state->type; 129 536 : return NT_STATUS_OK; 130 : }