• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/samba-3.5.8/source4/libcli/wbclient/
1/*
2   Unix SMB/CIFS implementation.
3
4   Winbind client library.
5
6   Copyright (C) 2008 Kai Blin  <kai@samba.org>
7
8   This program is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 3 of the License, or
11   (at your option) any later version.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with this program.  If not, see <http://www.gnu.org/licenses/>.
20*/
21
22#include "includes.h"
23#include "libcli/wbclient/wbclient.h"
24
25/**
26 * Get the server_id of the winbind task.
27 *
28 * \param[in] msg_ctx message context to use
29 * \param[in] mem_ctx talloc context to use
30 * \param[out] ids array of server_id structs containing the winbind id
31 * \return NT_STATUS_OK on success, NT_STATUS_INTERNAL_ERROR on failure
32 */
33static NTSTATUS get_server_id(struct messaging_context *msg_ctx,
34			      TALLOC_CTX *mem_ctx, struct server_id **ids)
35{
36	*ids = irpc_servers_byname(msg_ctx, mem_ctx, "winbind_server");
37	if (*ids == NULL || (*ids)[0].id == 0) {
38		DEBUG(0, ("Geting the winbind server ID failed.\n"));
39		return NT_STATUS_INTERNAL_ERROR;
40	}
41	return NT_STATUS_OK;
42}
43
44/**
45 * Initialize the wbclient context, talloc_free() when done.
46 *
47 * \param mem_ctx talloc context to allocate memory from
48 * \param msg_ctx message context to use
49 * \param
50 */
51struct wbc_context *wbc_init(TALLOC_CTX *mem_ctx,
52			     struct messaging_context *msg_ctx,
53			     struct tevent_context *event_ctx)
54{
55	struct wbc_context *ctx;
56	NTSTATUS status;
57
58	ctx = talloc(mem_ctx, struct wbc_context);
59	if (ctx == NULL) return NULL;
60
61	status = get_server_id(msg_ctx, mem_ctx, &ctx->ids);
62	if (!NT_STATUS_IS_OK(status)) {
63		talloc_free(ctx);
64		return NULL;
65	}
66
67	ctx->msg_ctx = msg_ctx;
68	ctx->event_ctx = event_ctx;
69
70	return ctx;
71}
72
73struct wbc_idmap_state {
74	struct composite_context *ctx;
75	struct winbind_get_idmap *req;
76	struct irpc_request *irpc_req;
77	struct id_mapping *ids;
78};
79
80static void sids_to_xids_recv_ids(struct irpc_request *req);
81
82struct composite_context *wbc_sids_to_xids_send(struct wbc_context *wbc_ctx,
83						TALLOC_CTX *mem_ctx,
84						uint32_t count,
85						struct id_mapping *ids)
86{
87	struct composite_context *ctx;
88	struct wbc_idmap_state *state;
89
90	DEBUG(5, ("wbc_sids_to_xids called\n"));
91
92	ctx = composite_create(mem_ctx, wbc_ctx->event_ctx);
93	if (ctx == NULL) return NULL;
94
95	state = talloc(ctx, struct wbc_idmap_state);
96	if (composite_nomem(state, ctx)) return ctx;
97	ctx->private_data = state;
98
99	state->req = talloc(state, struct winbind_get_idmap);
100	if (composite_nomem(state->req, ctx)) return ctx;
101
102	state->req->in.count = count;
103	state->req->in.level = WINBIND_IDMAP_LEVEL_SIDS_TO_XIDS;
104	state->req->in.ids = ids;
105	state->ctx = ctx;
106
107	state->irpc_req = IRPC_CALL_SEND(wbc_ctx->msg_ctx, wbc_ctx->ids[0],
108					 winbind, WINBIND_GET_IDMAP, state->req,
109					 state);
110	if (composite_nomem(state->irpc_req, ctx)) return ctx;
111
112	composite_continue_irpc(ctx, state->irpc_req, sids_to_xids_recv_ids,
113				state);
114	return ctx;
115}
116
117static void sids_to_xids_recv_ids(struct irpc_request *req)
118{
119	struct wbc_idmap_state *state = talloc_get_type_abort(
120							req->async.private_data,
121							struct wbc_idmap_state);
122
123	state->ctx->status = irpc_call_recv(state->irpc_req);
124	if (!composite_is_ok(state->ctx)) return;
125
126	state->ids = state->req->out.ids;
127	composite_done(state->ctx);
128}
129
130NTSTATUS wbc_sids_to_xids_recv(struct composite_context *ctx,
131			       struct id_mapping **ids)
132{
133	NTSTATUS status = composite_wait(ctx);
134		DEBUG(5, ("wbc_sids_to_xids_recv called\n"));
135	if (NT_STATUS_IS_OK(status)) {
136		struct wbc_idmap_state *state =	talloc_get_type_abort(
137							ctx->private_data,
138							struct wbc_idmap_state);
139		*ids = state->ids;
140	}
141
142	return status;
143}
144
145static void xids_to_sids_recv_ids(struct irpc_request *req);
146
147struct composite_context *wbc_xids_to_sids_send(struct wbc_context *wbc_ctx,
148						TALLOC_CTX *mem_ctx,
149						uint32_t count,
150						struct id_mapping *ids)
151{
152	struct composite_context *ctx;
153	struct wbc_idmap_state *state;
154
155	DEBUG(5, ("wbc_xids_to_sids called\n"));
156
157	ctx = composite_create(mem_ctx, wbc_ctx->event_ctx);
158	if (ctx == NULL) return NULL;
159
160	state = talloc(ctx, struct wbc_idmap_state);
161	if (composite_nomem(state, ctx)) return ctx;
162	ctx->private_data = state;
163
164	state->req = talloc(state, struct winbind_get_idmap);
165	if (composite_nomem(state->req, ctx)) return ctx;
166
167	state->req->in.count = count;
168	state->req->in.level = WINBIND_IDMAP_LEVEL_XIDS_TO_SIDS;
169	state->req->in.ids = ids;
170	state->ctx = ctx;
171
172	state->irpc_req = IRPC_CALL_SEND(wbc_ctx->msg_ctx, wbc_ctx->ids[0],
173					 winbind, WINBIND_GET_IDMAP, state->req,
174					 state);
175	if (composite_nomem(state->irpc_req, ctx)) return ctx;
176
177	composite_continue_irpc(ctx, state->irpc_req, xids_to_sids_recv_ids,
178			state);
179
180	return ctx;
181}
182
183static void xids_to_sids_recv_ids(struct irpc_request *req)
184{
185	struct wbc_idmap_state *state = talloc_get_type_abort(
186							req->async.private_data,
187							struct wbc_idmap_state);
188
189	state->ctx->status = irpc_call_recv(state->irpc_req);
190	if (!composite_is_ok(state->ctx)) return;
191
192	state->ids = state->req->out.ids;
193	composite_done(state->ctx);
194}
195
196NTSTATUS wbc_xids_to_sids_recv(struct composite_context *ctx,
197			       struct id_mapping **ids)
198{
199	NTSTATUS status = composite_wait(ctx);
200		DEBUG(5, ("wbc_xids_to_sids_recv called\n"));
201	if (NT_STATUS_IS_OK(status)) {
202		struct wbc_idmap_state *state =	talloc_get_type_abort(
203							ctx->private_data,
204							struct wbc_idmap_state);
205		*ids = state->ids;
206	}
207
208	return status;
209}
210
211