Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 : async implementation of WINBINDD_SIDS_TO_XIDS
4 : Copyright (C) Volker Lendecke 2011
5 : Copyright (C) Michael Adam 2012
6 :
7 : This program is free software; you can redistribute it and/or modify
8 : it under the terms of the GNU General Public License as published by
9 : the Free Software Foundation; either version 3 of the License, or
10 : (at your option) any later version.
11 :
12 : This program is distributed in the hope that it will be useful,
13 : but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 : GNU General Public License for more details.
16 :
17 : You should have received a copy of the GNU General Public License
18 : along with this program. If not, see <http://www.gnu.org/licenses/>.
19 : */
20 :
21 : #include "includes.h"
22 : #include "winbindd.h"
23 : #include "../libcli/security/security.h"
24 :
25 :
26 : struct winbindd_xids_to_sids_state {
27 : struct tevent_context *ev;
28 :
29 : struct unixid *xids;
30 : uint32_t num_xids;
31 :
32 : struct dom_sid *sids;
33 : };
34 :
35 : static void winbindd_xids_to_sids_done(struct tevent_req *subreq);
36 :
37 2794 : struct tevent_req *winbindd_xids_to_sids_send(TALLOC_CTX *mem_ctx,
38 : struct tevent_context *ev,
39 : struct winbindd_cli_state *cli,
40 : struct winbindd_request *request)
41 : {
42 0 : struct tevent_req *req, *subreq;
43 0 : struct winbindd_xids_to_sids_state *state;
44 :
45 2794 : req = tevent_req_create(mem_ctx, &state,
46 : struct winbindd_xids_to_sids_state);
47 2794 : if (req == NULL) {
48 0 : return NULL;
49 : }
50 2794 : state->ev = ev;
51 :
52 2794 : D_NOTICE("[%s (%u)] Winbind external command XIDS_TO_SIDS start.\n",
53 : cli->client_name,
54 : (unsigned int)cli->pid);
55 :
56 2794 : if (request->extra_len == 0) {
57 0 : tevent_req_done(req);
58 0 : return tevent_req_post(req, ev);
59 : }
60 2794 : if (request->extra_data.data[request->extra_len-1] != '\0') {
61 0 : D_DEBUG("Got invalid XID list.\n");
62 0 : tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
63 0 : return tevent_req_post(req, ev);
64 : }
65 2794 : if (!parse_xidlist(state, request->extra_data.data,
66 2794 : &state->xids, &state->num_xids)) {
67 0 : D_DEBUG("parse_sidlist failed\n");
68 0 : tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
69 0 : return tevent_req_post(req, ev);
70 : }
71 :
72 2794 : D_DEBUG("Resolving %"PRIu32" XID(s):\n%s\n",
73 : state->num_xids,
74 : (char *)request->extra_data.data);
75 :
76 2794 : subreq = wb_xids2sids_send(state, ev, state->xids, state->num_xids);
77 2794 : if (tevent_req_nomem(subreq, req)) {
78 0 : return tevent_req_post(req, ev);
79 : }
80 2794 : tevent_req_set_callback(subreq, winbindd_xids_to_sids_done, req);
81 2794 : return req;
82 : }
83 :
84 2794 : static void winbindd_xids_to_sids_done(struct tevent_req *subreq)
85 : {
86 2794 : struct tevent_req *req = tevent_req_callback_data(
87 : subreq, struct tevent_req);
88 2794 : struct winbindd_xids_to_sids_state *state = tevent_req_data(
89 : req, struct winbindd_xids_to_sids_state);
90 0 : NTSTATUS status;
91 :
92 2794 : status = wb_xids2sids_recv(subreq, state, &state->sids);
93 2794 : TALLOC_FREE(subreq);
94 2794 : if (tevent_req_nterror(req, status)) {
95 0 : return;
96 : }
97 2794 : tevent_req_done(req);
98 : }
99 :
100 2794 : NTSTATUS winbindd_xids_to_sids_recv(struct tevent_req *req,
101 : struct winbindd_response *response)
102 : {
103 2794 : struct winbindd_xids_to_sids_state *state = tevent_req_data(
104 : req, struct winbindd_xids_to_sids_state);
105 0 : NTSTATUS status;
106 2794 : char *result = NULL;
107 0 : uint32_t i;
108 :
109 2794 : D_NOTICE("Winbind external command XIDS_TO_SIDS end.\n");
110 2794 : if (tevent_req_is_nterror(req, &status)) {
111 0 : D_WARNING("Could not convert xids: %s\n", nt_errstr(status));
112 0 : return status;
113 : }
114 :
115 2794 : result = talloc_strdup(response, "");
116 2794 : if (result == NULL) {
117 0 : return NT_STATUS_NO_MEMORY;
118 : }
119 :
120 5656 : for (i=0; i<state->num_xids; i++) {
121 0 : struct dom_sid_buf sid_buf;
122 2862 : const char *str = "-";
123 :
124 2862 : if (!is_null_sid(&state->sids[i])) {
125 2574 : dom_sid_str_buf(&state->sids[i], &sid_buf);
126 2574 : str = sid_buf.buf;
127 : }
128 :
129 2862 : D_NOTICE("%"PRIu32": XID %"PRIu32" mapped to SID %s.\n",
130 : i, state->xids[i].id, str);
131 2862 : result = talloc_asprintf_append_buffer(
132 : result, "%s\n", str);
133 2862 : if (result == NULL) {
134 0 : return NT_STATUS_NO_MEMORY;
135 : }
136 : }
137 :
138 2794 : response->extra_data.data = result;
139 2794 : response->length += talloc_get_size(result);
140 :
141 2794 : return NT_STATUS_OK;
142 : }
|