Line data Source code
1 : /* s3 compat server functions auto-generated by pidl */
2 : #include "bin/default/librpc/gen_ndr/ndr_wkssvc.h"
3 : #include "bin/default/librpc/gen_ndr/ndr_wkssvc_scompat.h"
4 : #include <librpc/rpc/dcesrv_core.h>
5 : #include <rpc_server/rpc_config.h>
6 : #include <rpc_server/rpc_server.h>
7 : #include <util/debug.h>
8 :
9 : enum s3compat_rpc_dispatch {
10 : S3COMPAT_RPC_DISPATCH_EXTERNAL = 0x00000001,
11 : S3COMPAT_RPC_DISPATCH_INTERNAL = 0x00000002,
12 : };
13 :
14 : /* wkssvc - dcerpc server boilerplate generated by pidl */
15 4 : static NTSTATUS wkssvc__op_bind(struct dcesrv_connection_context *context, const struct dcesrv_interface *iface)
16 : {
17 4 : struct pipes_struct *p = NULL;
18 :
19 : /* Retrieve pipes struct */
20 4 : p = dcesrv_get_pipes_struct(context->conn);
21 4 : p->pipe_bound = true;
22 : #ifdef DCESRV_INTERFACE_WKSSVC_BIND
23 : return DCESRV_INTERFACE_WKSSVC_BIND(context,iface);
24 : #else
25 4 : return NT_STATUS_OK;
26 : #endif
27 : }
28 :
29 4 : static void wkssvc__op_unbind(struct dcesrv_connection_context *context, const struct dcesrv_interface *iface)
30 : {
31 : #ifdef DCESRV_INTERFACE_WKSSVC_UNBIND
32 : DCESRV_INTERFACE_WKSSVC_UNBIND(context, iface);
33 : #else
34 4 : return;
35 : #endif
36 : }
37 :
38 58 : NTSTATUS wkssvc__op_ndr_pull(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ndr_pull *pull, void **r)
39 : {
40 : enum ndr_err_code ndr_err;
41 58 : uint16_t opnum = dce_call->pkt.u.request.opnum;
42 :
43 58 : dce_call->fault_code = 0;
44 :
45 58 : if (opnum >= ndr_table_wkssvc.num_calls) {
46 0 : dce_call->fault_code = DCERPC_FAULT_OP_RNG_ERROR;
47 0 : return NT_STATUS_NET_WRITE_FAULT;
48 : }
49 :
50 58 : *r = talloc_named(mem_ctx, ndr_table_wkssvc.calls[opnum].struct_size, "struct %s", ndr_table_wkssvc.calls[opnum].name);
51 58 : NT_STATUS_HAVE_NO_MEMORY(*r);
52 :
53 : /* unravel the NDR for the packet */
54 58 : ndr_err = ndr_table_wkssvc.calls[opnum].ndr_pull(pull, NDR_IN, *r);
55 58 : if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
56 0 : dce_call->fault_code = DCERPC_FAULT_NDR;
57 0 : return NT_STATUS_NET_WRITE_FAULT;
58 : }
59 :
60 58 : return NT_STATUS_OK;
61 : }
62 :
63 58 : static NTSTATUS wkssvc__op_dispatch_internal(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r, enum s3compat_rpc_dispatch dispatch)
64 : {
65 58 : uint16_t opnum = dce_call->pkt.u.request.opnum;
66 58 : struct pipes_struct *p = NULL;
67 58 : struct auth_session_info *pipe_session_info = NULL;
68 58 : NTSTATUS status = NT_STATUS_OK;
69 58 : bool impersonated = false;
70 :
71 : /* Retrieve pipes struct */
72 58 : p = dcesrv_get_pipes_struct(dce_call->conn);
73 : /* Update pipes struct opnum */
74 58 : p->opnum = opnum;
75 58 : p->dce_call = dce_call;
76 58 : p->mem_ctx = mem_ctx;
77 : /* Update pipes struct session info */
78 58 : pipe_session_info = p->session_info;
79 58 : p->session_info = dce_call->auth_state->session_info;
80 58 : p->auth.auth_type = dce_call->auth_state->auth_type;
81 58 : p->auth.auth_level = dce_call->auth_state->auth_level;
82 58 : p->auth.auth_context_id = dce_call->auth_state->auth_context_id;
83 : /* Reset pipes struct fault state */
84 58 : p->fault_state = 0;
85 :
86 : /* Impersonate */
87 58 : if (dispatch == S3COMPAT_RPC_DISPATCH_EXTERNAL) {
88 58 : impersonated = become_authenticated_pipe_user(p->session_info);
89 58 : if (!impersonated) {
90 0 : dce_call->fault_code = DCERPC_FAULT_ACCESS_DENIED;
91 0 : status = NT_STATUS_NET_WRITE_FAULT;
92 0 : goto fail;
93 : }
94 : }
95 :
96 58 : switch (opnum) {
97 10 : case 0: { /* wkssvc_NetWkstaGetInfo */
98 10 : struct wkssvc_NetWkstaGetInfo *r2 = (struct wkssvc_NetWkstaGetInfo *)r;
99 10 : if (DEBUGLEVEL >= 10) {
100 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetWkstaGetInfo, NDR_IN, r2);
101 : }
102 10 : NDR_ZERO_STRUCT(r2->out);
103 10 : r2->out.info = talloc_zero(r2, union wkssvc_NetWkstaInfo);
104 10 : if (r2->out.info == NULL) {
105 0 : status = NT_STATUS_NO_MEMORY;
106 0 : p->fault_state = DCERPC_FAULT_CANT_PERFORM;
107 0 : goto fail;
108 : }
109 :
110 10 : r2->out.result = _wkssvc_NetWkstaGetInfo(p, r2);
111 10 : break;
112 : }
113 0 : case 1: { /* wkssvc_NetWkstaSetInfo */
114 0 : struct wkssvc_NetWkstaSetInfo *r2 = (struct wkssvc_NetWkstaSetInfo *)r;
115 0 : if (DEBUGLEVEL >= 10) {
116 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetWkstaSetInfo, NDR_IN, r2);
117 : }
118 0 : NDR_ZERO_STRUCT(r2->out);
119 0 : r2->out.parm_error = r2->in.parm_error;
120 0 : r2->out.result = _wkssvc_NetWkstaSetInfo(p, r2);
121 0 : break;
122 : }
123 4 : case 2: { /* wkssvc_NetWkstaEnumUsers */
124 4 : struct wkssvc_NetWkstaEnumUsers *r2 = (struct wkssvc_NetWkstaEnumUsers *)r;
125 4 : if (DEBUGLEVEL >= 10) {
126 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetWkstaEnumUsers, NDR_IN, r2);
127 : }
128 4 : NDR_ZERO_STRUCT(r2->out);
129 4 : r2->out.info = r2->in.info;
130 4 : r2->out.resume_handle = r2->in.resume_handle;
131 4 : r2->out.entries_read = talloc_zero(r2, uint32_t);
132 4 : if (r2->out.entries_read == NULL) {
133 0 : status = NT_STATUS_NO_MEMORY;
134 0 : p->fault_state = DCERPC_FAULT_CANT_PERFORM;
135 0 : goto fail;
136 : }
137 :
138 4 : r2->out.result = _wkssvc_NetWkstaEnumUsers(p, r2);
139 4 : break;
140 : }
141 2 : case 3: { /* wkssvc_NetrWkstaUserGetInfo */
142 2 : struct wkssvc_NetrWkstaUserGetInfo *r2 = (struct wkssvc_NetrWkstaUserGetInfo *)r;
143 2 : if (DEBUGLEVEL >= 10) {
144 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrWkstaUserGetInfo, NDR_IN, r2);
145 : }
146 2 : NDR_ZERO_STRUCT(r2->out);
147 2 : r2->out.info = talloc_zero(r2, union wkssvc_NetrWkstaUserInfo);
148 2 : if (r2->out.info == NULL) {
149 0 : status = NT_STATUS_NO_MEMORY;
150 0 : p->fault_state = DCERPC_FAULT_CANT_PERFORM;
151 0 : goto fail;
152 : }
153 :
154 2 : r2->out.result = _wkssvc_NetrWkstaUserGetInfo(p, r2);
155 2 : break;
156 : }
157 0 : case 4: { /* wkssvc_NetrWkstaUserSetInfo */
158 0 : struct wkssvc_NetrWkstaUserSetInfo *r2 = (struct wkssvc_NetrWkstaUserSetInfo *)r;
159 0 : if (DEBUGLEVEL >= 10) {
160 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrWkstaUserSetInfo, NDR_IN, r2);
161 : }
162 0 : NDR_ZERO_STRUCT(r2->out);
163 0 : r2->out.parm_err = r2->in.parm_err;
164 0 : r2->out.result = _wkssvc_NetrWkstaUserSetInfo(p, r2);
165 0 : break;
166 : }
167 2 : case 5: { /* wkssvc_NetWkstaTransportEnum */
168 2 : struct wkssvc_NetWkstaTransportEnum *r2 = (struct wkssvc_NetWkstaTransportEnum *)r;
169 2 : if (DEBUGLEVEL >= 10) {
170 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetWkstaTransportEnum, NDR_IN, r2);
171 : }
172 2 : NDR_ZERO_STRUCT(r2->out);
173 2 : r2->out.info = r2->in.info;
174 2 : r2->out.resume_handle = r2->in.resume_handle;
175 2 : r2->out.total_entries = talloc_zero(r2, uint32_t);
176 2 : if (r2->out.total_entries == NULL) {
177 0 : status = NT_STATUS_NO_MEMORY;
178 0 : p->fault_state = DCERPC_FAULT_CANT_PERFORM;
179 0 : goto fail;
180 : }
181 :
182 2 : r2->out.result = _wkssvc_NetWkstaTransportEnum(p, r2);
183 2 : break;
184 : }
185 2 : case 6: { /* wkssvc_NetrWkstaTransportAdd */
186 2 : struct wkssvc_NetrWkstaTransportAdd *r2 = (struct wkssvc_NetrWkstaTransportAdd *)r;
187 2 : if (DEBUGLEVEL >= 10) {
188 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrWkstaTransportAdd, NDR_IN, r2);
189 : }
190 2 : NDR_ZERO_STRUCT(r2->out);
191 2 : r2->out.parm_err = r2->in.parm_err;
192 2 : r2->out.result = _wkssvc_NetrWkstaTransportAdd(p, r2);
193 2 : break;
194 : }
195 2 : case 7: { /* wkssvc_NetrWkstaTransportDel */
196 2 : struct wkssvc_NetrWkstaTransportDel *r2 = (struct wkssvc_NetrWkstaTransportDel *)r;
197 2 : if (DEBUGLEVEL >= 10) {
198 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrWkstaTransportDel, NDR_IN, r2);
199 : }
200 2 : r2->out.result = _wkssvc_NetrWkstaTransportDel(p, r2);
201 2 : break;
202 : }
203 2 : case 8: { /* wkssvc_NetrUseAdd */
204 2 : struct wkssvc_NetrUseAdd *r2 = (struct wkssvc_NetrUseAdd *)r;
205 2 : if (DEBUGLEVEL >= 10) {
206 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrUseAdd, NDR_IN, r2);
207 : }
208 2 : NDR_ZERO_STRUCT(r2->out);
209 2 : r2->out.parm_err = r2->in.parm_err;
210 2 : r2->out.result = _wkssvc_NetrUseAdd(p, r2);
211 2 : break;
212 : }
213 0 : case 9: { /* wkssvc_NetrUseGetInfo */
214 0 : struct wkssvc_NetrUseGetInfo *r2 = (struct wkssvc_NetrUseGetInfo *)r;
215 0 : if (DEBUGLEVEL >= 10) {
216 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrUseGetInfo, NDR_IN, r2);
217 : }
218 0 : NDR_ZERO_STRUCT(r2->out);
219 0 : r2->out.ctr = talloc_zero(r2, union wkssvc_NetrUseGetInfoCtr);
220 0 : if (r2->out.ctr == NULL) {
221 0 : status = NT_STATUS_NO_MEMORY;
222 0 : p->fault_state = DCERPC_FAULT_CANT_PERFORM;
223 0 : goto fail;
224 : }
225 :
226 0 : r2->out.result = _wkssvc_NetrUseGetInfo(p, r2);
227 0 : break;
228 : }
229 2 : case 10: { /* wkssvc_NetrUseDel */
230 2 : struct wkssvc_NetrUseDel *r2 = (struct wkssvc_NetrUseDel *)r;
231 2 : if (DEBUGLEVEL >= 10) {
232 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrUseDel, NDR_IN, r2);
233 : }
234 2 : r2->out.result = _wkssvc_NetrUseDel(p, r2);
235 2 : break;
236 : }
237 4 : case 11: { /* wkssvc_NetrUseEnum */
238 4 : struct wkssvc_NetrUseEnum *r2 = (struct wkssvc_NetrUseEnum *)r;
239 4 : if (DEBUGLEVEL >= 10) {
240 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrUseEnum, NDR_IN, r2);
241 : }
242 4 : NDR_ZERO_STRUCT(r2->out);
243 4 : r2->out.info = r2->in.info;
244 4 : r2->out.resume_handle = r2->in.resume_handle;
245 4 : r2->out.entries_read = talloc_zero(r2, uint32_t);
246 4 : if (r2->out.entries_read == NULL) {
247 0 : status = NT_STATUS_NO_MEMORY;
248 0 : p->fault_state = DCERPC_FAULT_CANT_PERFORM;
249 0 : goto fail;
250 : }
251 :
252 4 : r2->out.result = _wkssvc_NetrUseEnum(p, r2);
253 4 : break;
254 : }
255 2 : case 12: { /* wkssvc_NetrMessageBufferSend */
256 2 : struct wkssvc_NetrMessageBufferSend *r2 = (struct wkssvc_NetrMessageBufferSend *)r;
257 2 : if (DEBUGLEVEL >= 10) {
258 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrMessageBufferSend, NDR_IN, r2);
259 : }
260 2 : r2->out.result = _wkssvc_NetrMessageBufferSend(p, r2);
261 2 : break;
262 : }
263 2 : case 13: { /* wkssvc_NetrWorkstationStatisticsGet */
264 2 : struct wkssvc_NetrWorkstationStatisticsGet *r2 = (struct wkssvc_NetrWorkstationStatisticsGet *)r;
265 2 : if (DEBUGLEVEL >= 10) {
266 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrWorkstationStatisticsGet, NDR_IN, r2);
267 : }
268 2 : NDR_ZERO_STRUCT(r2->out);
269 2 : r2->out.info = talloc_zero(r2, struct wkssvc_NetrWorkstationStatistics *);
270 2 : if (r2->out.info == NULL) {
271 0 : status = NT_STATUS_NO_MEMORY;
272 0 : p->fault_state = DCERPC_FAULT_CANT_PERFORM;
273 0 : goto fail;
274 : }
275 :
276 2 : r2->out.result = _wkssvc_NetrWorkstationStatisticsGet(p, r2);
277 2 : break;
278 : }
279 2 : case 14: { /* wkssvc_NetrLogonDomainNameAdd */
280 2 : struct wkssvc_NetrLogonDomainNameAdd *r2 = (struct wkssvc_NetrLogonDomainNameAdd *)r;
281 2 : if (DEBUGLEVEL >= 10) {
282 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrLogonDomainNameAdd, NDR_IN, r2);
283 : }
284 2 : r2->out.result = _wkssvc_NetrLogonDomainNameAdd(p, r2);
285 2 : break;
286 : }
287 2 : case 15: { /* wkssvc_NetrLogonDomainNameDel */
288 2 : struct wkssvc_NetrLogonDomainNameDel *r2 = (struct wkssvc_NetrLogonDomainNameDel *)r;
289 2 : if (DEBUGLEVEL >= 10) {
290 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrLogonDomainNameDel, NDR_IN, r2);
291 : }
292 2 : r2->out.result = _wkssvc_NetrLogonDomainNameDel(p, r2);
293 2 : break;
294 : }
295 2 : case 16: { /* wkssvc_NetrJoinDomain */
296 2 : struct wkssvc_NetrJoinDomain *r2 = (struct wkssvc_NetrJoinDomain *)r;
297 2 : if (DEBUGLEVEL >= 10) {
298 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrJoinDomain, NDR_IN, r2);
299 : }
300 2 : r2->out.result = _wkssvc_NetrJoinDomain(p, r2);
301 2 : break;
302 : }
303 2 : case 17: { /* wkssvc_NetrUnjoinDomain */
304 2 : struct wkssvc_NetrUnjoinDomain *r2 = (struct wkssvc_NetrUnjoinDomain *)r;
305 2 : if (DEBUGLEVEL >= 10) {
306 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrUnjoinDomain, NDR_IN, r2);
307 : }
308 2 : r2->out.result = _wkssvc_NetrUnjoinDomain(p, r2);
309 2 : break;
310 : }
311 0 : case 18: { /* wkssvc_NetrRenameMachineInDomain */
312 0 : struct wkssvc_NetrRenameMachineInDomain *r2 = (struct wkssvc_NetrRenameMachineInDomain *)r;
313 0 : if (DEBUGLEVEL >= 10) {
314 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrRenameMachineInDomain, NDR_IN, r2);
315 : }
316 0 : r2->out.result = _wkssvc_NetrRenameMachineInDomain(p, r2);
317 0 : break;
318 : }
319 2 : case 19: { /* wkssvc_NetrValidateName */
320 2 : struct wkssvc_NetrValidateName *r2 = (struct wkssvc_NetrValidateName *)r;
321 2 : if (DEBUGLEVEL >= 10) {
322 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrValidateName, NDR_IN, r2);
323 : }
324 2 : r2->out.result = _wkssvc_NetrValidateName(p, r2);
325 2 : break;
326 : }
327 2 : case 20: { /* wkssvc_NetrGetJoinInformation */
328 2 : struct wkssvc_NetrGetJoinInformation *r2 = (struct wkssvc_NetrGetJoinInformation *)r;
329 2 : if (DEBUGLEVEL >= 10) {
330 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrGetJoinInformation, NDR_IN, r2);
331 : }
332 2 : NDR_ZERO_STRUCT(r2->out);
333 2 : r2->out.name_buffer = r2->in.name_buffer;
334 2 : r2->out.name_type = talloc_zero(r2, enum wkssvc_NetJoinStatus);
335 2 : if (r2->out.name_type == NULL) {
336 0 : status = NT_STATUS_NO_MEMORY;
337 0 : p->fault_state = DCERPC_FAULT_CANT_PERFORM;
338 0 : goto fail;
339 : }
340 :
341 2 : r2->out.result = _wkssvc_NetrGetJoinInformation(p, r2);
342 2 : break;
343 : }
344 2 : case 21: { /* wkssvc_NetrGetJoinableOus */
345 2 : struct wkssvc_NetrGetJoinableOus *r2 = (struct wkssvc_NetrGetJoinableOus *)r;
346 2 : if (DEBUGLEVEL >= 10) {
347 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrGetJoinableOus, NDR_IN, r2);
348 : }
349 2 : NDR_ZERO_STRUCT(r2->out);
350 2 : r2->out.num_ous = r2->in.num_ous;
351 2 : r2->out.ous = talloc_zero(r2, const char **);
352 2 : if (r2->out.ous == NULL) {
353 0 : status = NT_STATUS_NO_MEMORY;
354 0 : p->fault_state = DCERPC_FAULT_CANT_PERFORM;
355 0 : goto fail;
356 : }
357 :
358 2 : r2->out.result = _wkssvc_NetrGetJoinableOus(p, r2);
359 2 : break;
360 : }
361 0 : case 22: { /* wkssvc_NetrJoinDomain2 */
362 0 : struct wkssvc_NetrJoinDomain2 *r2 = (struct wkssvc_NetrJoinDomain2 *)r;
363 0 : if (DEBUGLEVEL >= 10) {
364 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrJoinDomain2, NDR_IN, r2);
365 : }
366 0 : r2->out.result = _wkssvc_NetrJoinDomain2(p, r2);
367 0 : break;
368 : }
369 0 : case 23: { /* wkssvc_NetrUnjoinDomain2 */
370 0 : struct wkssvc_NetrUnjoinDomain2 *r2 = (struct wkssvc_NetrUnjoinDomain2 *)r;
371 0 : if (DEBUGLEVEL >= 10) {
372 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrUnjoinDomain2, NDR_IN, r2);
373 : }
374 0 : r2->out.result = _wkssvc_NetrUnjoinDomain2(p, r2);
375 0 : break;
376 : }
377 0 : case 24: { /* wkssvc_NetrRenameMachineInDomain2 */
378 0 : struct wkssvc_NetrRenameMachineInDomain2 *r2 = (struct wkssvc_NetrRenameMachineInDomain2 *)r;
379 0 : if (DEBUGLEVEL >= 10) {
380 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrRenameMachineInDomain2, NDR_IN, r2);
381 : }
382 0 : r2->out.result = _wkssvc_NetrRenameMachineInDomain2(p, r2);
383 0 : break;
384 : }
385 2 : case 25: { /* wkssvc_NetrValidateName2 */
386 2 : struct wkssvc_NetrValidateName2 *r2 = (struct wkssvc_NetrValidateName2 *)r;
387 2 : if (DEBUGLEVEL >= 10) {
388 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrValidateName2, NDR_IN, r2);
389 : }
390 2 : r2->out.result = _wkssvc_NetrValidateName2(p, r2);
391 2 : break;
392 : }
393 2 : case 26: { /* wkssvc_NetrGetJoinableOus2 */
394 2 : struct wkssvc_NetrGetJoinableOus2 *r2 = (struct wkssvc_NetrGetJoinableOus2 *)r;
395 2 : if (DEBUGLEVEL >= 10) {
396 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrGetJoinableOus2, NDR_IN, r2);
397 : }
398 2 : NDR_ZERO_STRUCT(r2->out);
399 2 : r2->out.num_ous = r2->in.num_ous;
400 2 : r2->out.ous = talloc_zero(r2, const char **);
401 2 : if (r2->out.ous == NULL) {
402 0 : status = NT_STATUS_NO_MEMORY;
403 0 : p->fault_state = DCERPC_FAULT_CANT_PERFORM;
404 0 : goto fail;
405 : }
406 :
407 2 : r2->out.result = _wkssvc_NetrGetJoinableOus2(p, r2);
408 2 : break;
409 : }
410 2 : case 27: { /* wkssvc_NetrAddAlternateComputerName */
411 2 : struct wkssvc_NetrAddAlternateComputerName *r2 = (struct wkssvc_NetrAddAlternateComputerName *)r;
412 2 : if (DEBUGLEVEL >= 10) {
413 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrAddAlternateComputerName, NDR_IN, r2);
414 : }
415 2 : r2->out.result = _wkssvc_NetrAddAlternateComputerName(p, r2);
416 2 : break;
417 : }
418 2 : case 28: { /* wkssvc_NetrRemoveAlternateComputerName */
419 2 : struct wkssvc_NetrRemoveAlternateComputerName *r2 = (struct wkssvc_NetrRemoveAlternateComputerName *)r;
420 2 : if (DEBUGLEVEL >= 10) {
421 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrRemoveAlternateComputerName, NDR_IN, r2);
422 : }
423 2 : r2->out.result = _wkssvc_NetrRemoveAlternateComputerName(p, r2);
424 2 : break;
425 : }
426 0 : case 29: { /* wkssvc_NetrSetPrimaryComputername */
427 0 : struct wkssvc_NetrSetPrimaryComputername *r2 = (struct wkssvc_NetrSetPrimaryComputername *)r;
428 0 : if (DEBUGLEVEL >= 10) {
429 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrSetPrimaryComputername, NDR_IN, r2);
430 : }
431 0 : r2->out.result = _wkssvc_NetrSetPrimaryComputername(p, r2);
432 0 : break;
433 : }
434 2 : case 30: { /* wkssvc_NetrEnumerateComputerNames */
435 2 : struct wkssvc_NetrEnumerateComputerNames *r2 = (struct wkssvc_NetrEnumerateComputerNames *)r;
436 2 : if (DEBUGLEVEL >= 10) {
437 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrEnumerateComputerNames, NDR_IN, r2);
438 : }
439 2 : NDR_ZERO_STRUCT(r2->out);
440 2 : r2->out.ctr = talloc_zero(r2, struct wkssvc_ComputerNamesCtr *);
441 2 : if (r2->out.ctr == NULL) {
442 0 : status = NT_STATUS_NO_MEMORY;
443 0 : p->fault_state = DCERPC_FAULT_CANT_PERFORM;
444 0 : goto fail;
445 : }
446 :
447 2 : r2->out.result = _wkssvc_NetrEnumerateComputerNames(p, r2);
448 2 : break;
449 : }
450 0 : default:
451 0 : dce_call->fault_code = DCERPC_FAULT_OP_RNG_ERROR;
452 0 : break;
453 : }
454 :
455 58 : fail:
456 : /* Unimpersonate */
457 58 : if (impersonated) {
458 58 : unbecome_authenticated_pipe_user();
459 : }
460 :
461 58 : p->dce_call = NULL;
462 58 : p->mem_ctx = NULL;
463 : /* Restore session info */
464 58 : p->session_info = pipe_session_info;
465 58 : p->auth.auth_type = 0;
466 58 : p->auth.auth_level = 0;
467 58 : p->auth.auth_context_id = 0;
468 : /* Check pipes struct fault state */
469 58 : if (p->fault_state != 0) {
470 44 : dce_call->fault_code = p->fault_state;
471 : }
472 58 : if (dce_call->fault_code != 0) {
473 44 : status = NT_STATUS_NET_WRITE_FAULT;
474 : }
475 :
476 58 : return status;
477 : }
478 :
479 58 : NTSTATUS wkssvc__op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r)
480 : {
481 58 : return wkssvc__op_dispatch_internal(dce_call, mem_ctx, r, S3COMPAT_RPC_DISPATCH_EXTERNAL);
482 : }
483 :
484 14 : NTSTATUS wkssvc__op_reply(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r)
485 : {
486 14 : uint16_t opnum = dce_call->pkt.u.request.opnum;
487 :
488 14 : switch (opnum) {
489 10 : case 0: { /* wkssvc_NetWkstaGetInfo */
490 10 : struct wkssvc_NetWkstaGetInfo *r2 = (struct wkssvc_NetWkstaGetInfo *)r;
491 10 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
492 0 : DEBUG(5,("function wkssvc_NetWkstaGetInfo replied async\n"));
493 : }
494 10 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
495 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetWkstaGetInfo, NDR_OUT | NDR_SET_VALUES, r2);
496 : }
497 10 : if (dce_call->fault_code != 0) {
498 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetWkstaGetInfo\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
499 : }
500 10 : break;
501 : }
502 0 : case 1: { /* wkssvc_NetWkstaSetInfo */
503 0 : struct wkssvc_NetWkstaSetInfo *r2 = (struct wkssvc_NetWkstaSetInfo *)r;
504 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
505 0 : DEBUG(5,("function wkssvc_NetWkstaSetInfo replied async\n"));
506 : }
507 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
508 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetWkstaSetInfo, NDR_OUT | NDR_SET_VALUES, r2);
509 : }
510 0 : if (dce_call->fault_code != 0) {
511 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetWkstaSetInfo\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
512 : }
513 0 : break;
514 : }
515 4 : case 2: { /* wkssvc_NetWkstaEnumUsers */
516 4 : struct wkssvc_NetWkstaEnumUsers *r2 = (struct wkssvc_NetWkstaEnumUsers *)r;
517 4 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
518 0 : DEBUG(5,("function wkssvc_NetWkstaEnumUsers replied async\n"));
519 : }
520 4 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
521 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetWkstaEnumUsers, NDR_OUT | NDR_SET_VALUES, r2);
522 : }
523 4 : if (dce_call->fault_code != 0) {
524 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetWkstaEnumUsers\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
525 : }
526 4 : break;
527 : }
528 0 : case 3: { /* wkssvc_NetrWkstaUserGetInfo */
529 0 : struct wkssvc_NetrWkstaUserGetInfo *r2 = (struct wkssvc_NetrWkstaUserGetInfo *)r;
530 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
531 0 : DEBUG(5,("function wkssvc_NetrWkstaUserGetInfo replied async\n"));
532 : }
533 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
534 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrWkstaUserGetInfo, NDR_OUT | NDR_SET_VALUES, r2);
535 : }
536 0 : if (dce_call->fault_code != 0) {
537 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrWkstaUserGetInfo\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
538 : }
539 0 : break;
540 : }
541 0 : case 4: { /* wkssvc_NetrWkstaUserSetInfo */
542 0 : struct wkssvc_NetrWkstaUserSetInfo *r2 = (struct wkssvc_NetrWkstaUserSetInfo *)r;
543 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
544 0 : DEBUG(5,("function wkssvc_NetrWkstaUserSetInfo replied async\n"));
545 : }
546 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
547 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrWkstaUserSetInfo, NDR_OUT | NDR_SET_VALUES, r2);
548 : }
549 0 : if (dce_call->fault_code != 0) {
550 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrWkstaUserSetInfo\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
551 : }
552 0 : break;
553 : }
554 0 : case 5: { /* wkssvc_NetWkstaTransportEnum */
555 0 : struct wkssvc_NetWkstaTransportEnum *r2 = (struct wkssvc_NetWkstaTransportEnum *)r;
556 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
557 0 : DEBUG(5,("function wkssvc_NetWkstaTransportEnum replied async\n"));
558 : }
559 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
560 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetWkstaTransportEnum, NDR_OUT | NDR_SET_VALUES, r2);
561 : }
562 0 : if (dce_call->fault_code != 0) {
563 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetWkstaTransportEnum\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
564 : }
565 0 : break;
566 : }
567 0 : case 6: { /* wkssvc_NetrWkstaTransportAdd */
568 0 : struct wkssvc_NetrWkstaTransportAdd *r2 = (struct wkssvc_NetrWkstaTransportAdd *)r;
569 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
570 0 : DEBUG(5,("function wkssvc_NetrWkstaTransportAdd replied async\n"));
571 : }
572 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
573 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrWkstaTransportAdd, NDR_OUT | NDR_SET_VALUES, r2);
574 : }
575 0 : if (dce_call->fault_code != 0) {
576 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrWkstaTransportAdd\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
577 : }
578 0 : break;
579 : }
580 0 : case 7: { /* wkssvc_NetrWkstaTransportDel */
581 0 : struct wkssvc_NetrWkstaTransportDel *r2 = (struct wkssvc_NetrWkstaTransportDel *)r;
582 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
583 0 : DEBUG(5,("function wkssvc_NetrWkstaTransportDel replied async\n"));
584 : }
585 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
586 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrWkstaTransportDel, NDR_OUT | NDR_SET_VALUES, r2);
587 : }
588 0 : if (dce_call->fault_code != 0) {
589 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrWkstaTransportDel\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
590 : }
591 0 : break;
592 : }
593 0 : case 8: { /* wkssvc_NetrUseAdd */
594 0 : struct wkssvc_NetrUseAdd *r2 = (struct wkssvc_NetrUseAdd *)r;
595 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
596 0 : DEBUG(5,("function wkssvc_NetrUseAdd replied async\n"));
597 : }
598 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
599 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrUseAdd, NDR_OUT | NDR_SET_VALUES, r2);
600 : }
601 0 : if (dce_call->fault_code != 0) {
602 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrUseAdd\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
603 : }
604 0 : break;
605 : }
606 0 : case 9: { /* wkssvc_NetrUseGetInfo */
607 0 : struct wkssvc_NetrUseGetInfo *r2 = (struct wkssvc_NetrUseGetInfo *)r;
608 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
609 0 : DEBUG(5,("function wkssvc_NetrUseGetInfo replied async\n"));
610 : }
611 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
612 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrUseGetInfo, NDR_OUT | NDR_SET_VALUES, r2);
613 : }
614 0 : if (dce_call->fault_code != 0) {
615 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrUseGetInfo\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
616 : }
617 0 : break;
618 : }
619 0 : case 10: { /* wkssvc_NetrUseDel */
620 0 : struct wkssvc_NetrUseDel *r2 = (struct wkssvc_NetrUseDel *)r;
621 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
622 0 : DEBUG(5,("function wkssvc_NetrUseDel replied async\n"));
623 : }
624 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
625 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrUseDel, NDR_OUT | NDR_SET_VALUES, r2);
626 : }
627 0 : if (dce_call->fault_code != 0) {
628 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrUseDel\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
629 : }
630 0 : break;
631 : }
632 0 : case 11: { /* wkssvc_NetrUseEnum */
633 0 : struct wkssvc_NetrUseEnum *r2 = (struct wkssvc_NetrUseEnum *)r;
634 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
635 0 : DEBUG(5,("function wkssvc_NetrUseEnum replied async\n"));
636 : }
637 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
638 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrUseEnum, NDR_OUT | NDR_SET_VALUES, r2);
639 : }
640 0 : if (dce_call->fault_code != 0) {
641 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrUseEnum\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
642 : }
643 0 : break;
644 : }
645 0 : case 12: { /* wkssvc_NetrMessageBufferSend */
646 0 : struct wkssvc_NetrMessageBufferSend *r2 = (struct wkssvc_NetrMessageBufferSend *)r;
647 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
648 0 : DEBUG(5,("function wkssvc_NetrMessageBufferSend replied async\n"));
649 : }
650 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
651 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrMessageBufferSend, NDR_OUT | NDR_SET_VALUES, r2);
652 : }
653 0 : if (dce_call->fault_code != 0) {
654 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrMessageBufferSend\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
655 : }
656 0 : break;
657 : }
658 0 : case 13: { /* wkssvc_NetrWorkstationStatisticsGet */
659 0 : struct wkssvc_NetrWorkstationStatisticsGet *r2 = (struct wkssvc_NetrWorkstationStatisticsGet *)r;
660 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
661 0 : DEBUG(5,("function wkssvc_NetrWorkstationStatisticsGet replied async\n"));
662 : }
663 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
664 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrWorkstationStatisticsGet, NDR_OUT | NDR_SET_VALUES, r2);
665 : }
666 0 : if (dce_call->fault_code != 0) {
667 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrWorkstationStatisticsGet\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
668 : }
669 0 : break;
670 : }
671 0 : case 14: { /* wkssvc_NetrLogonDomainNameAdd */
672 0 : struct wkssvc_NetrLogonDomainNameAdd *r2 = (struct wkssvc_NetrLogonDomainNameAdd *)r;
673 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
674 0 : DEBUG(5,("function wkssvc_NetrLogonDomainNameAdd replied async\n"));
675 : }
676 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
677 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrLogonDomainNameAdd, NDR_OUT | NDR_SET_VALUES, r2);
678 : }
679 0 : if (dce_call->fault_code != 0) {
680 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrLogonDomainNameAdd\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
681 : }
682 0 : break;
683 : }
684 0 : case 15: { /* wkssvc_NetrLogonDomainNameDel */
685 0 : struct wkssvc_NetrLogonDomainNameDel *r2 = (struct wkssvc_NetrLogonDomainNameDel *)r;
686 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
687 0 : DEBUG(5,("function wkssvc_NetrLogonDomainNameDel replied async\n"));
688 : }
689 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
690 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrLogonDomainNameDel, NDR_OUT | NDR_SET_VALUES, r2);
691 : }
692 0 : if (dce_call->fault_code != 0) {
693 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrLogonDomainNameDel\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
694 : }
695 0 : break;
696 : }
697 0 : case 16: { /* wkssvc_NetrJoinDomain */
698 0 : struct wkssvc_NetrJoinDomain *r2 = (struct wkssvc_NetrJoinDomain *)r;
699 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
700 0 : DEBUG(5,("function wkssvc_NetrJoinDomain replied async\n"));
701 : }
702 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
703 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrJoinDomain, NDR_OUT | NDR_SET_VALUES, r2);
704 : }
705 0 : if (dce_call->fault_code != 0) {
706 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrJoinDomain\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
707 : }
708 0 : break;
709 : }
710 0 : case 17: { /* wkssvc_NetrUnjoinDomain */
711 0 : struct wkssvc_NetrUnjoinDomain *r2 = (struct wkssvc_NetrUnjoinDomain *)r;
712 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
713 0 : DEBUG(5,("function wkssvc_NetrUnjoinDomain replied async\n"));
714 : }
715 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
716 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrUnjoinDomain, NDR_OUT | NDR_SET_VALUES, r2);
717 : }
718 0 : if (dce_call->fault_code != 0) {
719 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrUnjoinDomain\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
720 : }
721 0 : break;
722 : }
723 0 : case 18: { /* wkssvc_NetrRenameMachineInDomain */
724 0 : struct wkssvc_NetrRenameMachineInDomain *r2 = (struct wkssvc_NetrRenameMachineInDomain *)r;
725 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
726 0 : DEBUG(5,("function wkssvc_NetrRenameMachineInDomain replied async\n"));
727 : }
728 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
729 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrRenameMachineInDomain, NDR_OUT | NDR_SET_VALUES, r2);
730 : }
731 0 : if (dce_call->fault_code != 0) {
732 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrRenameMachineInDomain\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
733 : }
734 0 : break;
735 : }
736 0 : case 19: { /* wkssvc_NetrValidateName */
737 0 : struct wkssvc_NetrValidateName *r2 = (struct wkssvc_NetrValidateName *)r;
738 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
739 0 : DEBUG(5,("function wkssvc_NetrValidateName replied async\n"));
740 : }
741 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
742 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrValidateName, NDR_OUT | NDR_SET_VALUES, r2);
743 : }
744 0 : if (dce_call->fault_code != 0) {
745 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrValidateName\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
746 : }
747 0 : break;
748 : }
749 0 : case 20: { /* wkssvc_NetrGetJoinInformation */
750 0 : struct wkssvc_NetrGetJoinInformation *r2 = (struct wkssvc_NetrGetJoinInformation *)r;
751 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
752 0 : DEBUG(5,("function wkssvc_NetrGetJoinInformation replied async\n"));
753 : }
754 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
755 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrGetJoinInformation, NDR_OUT | NDR_SET_VALUES, r2);
756 : }
757 0 : if (dce_call->fault_code != 0) {
758 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrGetJoinInformation\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
759 : }
760 0 : break;
761 : }
762 0 : case 21: { /* wkssvc_NetrGetJoinableOus */
763 0 : struct wkssvc_NetrGetJoinableOus *r2 = (struct wkssvc_NetrGetJoinableOus *)r;
764 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
765 0 : DEBUG(5,("function wkssvc_NetrGetJoinableOus replied async\n"));
766 : }
767 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
768 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrGetJoinableOus, NDR_OUT | NDR_SET_VALUES, r2);
769 : }
770 0 : if (dce_call->fault_code != 0) {
771 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrGetJoinableOus\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
772 : }
773 0 : break;
774 : }
775 0 : case 22: { /* wkssvc_NetrJoinDomain2 */
776 0 : struct wkssvc_NetrJoinDomain2 *r2 = (struct wkssvc_NetrJoinDomain2 *)r;
777 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
778 0 : DEBUG(5,("function wkssvc_NetrJoinDomain2 replied async\n"));
779 : }
780 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
781 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrJoinDomain2, NDR_OUT | NDR_SET_VALUES, r2);
782 : }
783 0 : if (dce_call->fault_code != 0) {
784 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrJoinDomain2\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
785 : }
786 0 : break;
787 : }
788 0 : case 23: { /* wkssvc_NetrUnjoinDomain2 */
789 0 : struct wkssvc_NetrUnjoinDomain2 *r2 = (struct wkssvc_NetrUnjoinDomain2 *)r;
790 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
791 0 : DEBUG(5,("function wkssvc_NetrUnjoinDomain2 replied async\n"));
792 : }
793 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
794 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrUnjoinDomain2, NDR_OUT | NDR_SET_VALUES, r2);
795 : }
796 0 : if (dce_call->fault_code != 0) {
797 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrUnjoinDomain2\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
798 : }
799 0 : break;
800 : }
801 0 : case 24: { /* wkssvc_NetrRenameMachineInDomain2 */
802 0 : struct wkssvc_NetrRenameMachineInDomain2 *r2 = (struct wkssvc_NetrRenameMachineInDomain2 *)r;
803 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
804 0 : DEBUG(5,("function wkssvc_NetrRenameMachineInDomain2 replied async\n"));
805 : }
806 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
807 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrRenameMachineInDomain2, NDR_OUT | NDR_SET_VALUES, r2);
808 : }
809 0 : if (dce_call->fault_code != 0) {
810 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrRenameMachineInDomain2\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
811 : }
812 0 : break;
813 : }
814 0 : case 25: { /* wkssvc_NetrValidateName2 */
815 0 : struct wkssvc_NetrValidateName2 *r2 = (struct wkssvc_NetrValidateName2 *)r;
816 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
817 0 : DEBUG(5,("function wkssvc_NetrValidateName2 replied async\n"));
818 : }
819 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
820 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrValidateName2, NDR_OUT | NDR_SET_VALUES, r2);
821 : }
822 0 : if (dce_call->fault_code != 0) {
823 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrValidateName2\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
824 : }
825 0 : break;
826 : }
827 0 : case 26: { /* wkssvc_NetrGetJoinableOus2 */
828 0 : struct wkssvc_NetrGetJoinableOus2 *r2 = (struct wkssvc_NetrGetJoinableOus2 *)r;
829 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
830 0 : DEBUG(5,("function wkssvc_NetrGetJoinableOus2 replied async\n"));
831 : }
832 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
833 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrGetJoinableOus2, NDR_OUT | NDR_SET_VALUES, r2);
834 : }
835 0 : if (dce_call->fault_code != 0) {
836 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrGetJoinableOus2\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
837 : }
838 0 : break;
839 : }
840 0 : case 27: { /* wkssvc_NetrAddAlternateComputerName */
841 0 : struct wkssvc_NetrAddAlternateComputerName *r2 = (struct wkssvc_NetrAddAlternateComputerName *)r;
842 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
843 0 : DEBUG(5,("function wkssvc_NetrAddAlternateComputerName replied async\n"));
844 : }
845 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
846 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrAddAlternateComputerName, NDR_OUT | NDR_SET_VALUES, r2);
847 : }
848 0 : if (dce_call->fault_code != 0) {
849 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrAddAlternateComputerName\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
850 : }
851 0 : break;
852 : }
853 0 : case 28: { /* wkssvc_NetrRemoveAlternateComputerName */
854 0 : struct wkssvc_NetrRemoveAlternateComputerName *r2 = (struct wkssvc_NetrRemoveAlternateComputerName *)r;
855 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
856 0 : DEBUG(5,("function wkssvc_NetrRemoveAlternateComputerName replied async\n"));
857 : }
858 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
859 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrRemoveAlternateComputerName, NDR_OUT | NDR_SET_VALUES, r2);
860 : }
861 0 : if (dce_call->fault_code != 0) {
862 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrRemoveAlternateComputerName\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
863 : }
864 0 : break;
865 : }
866 0 : case 29: { /* wkssvc_NetrSetPrimaryComputername */
867 0 : struct wkssvc_NetrSetPrimaryComputername *r2 = (struct wkssvc_NetrSetPrimaryComputername *)r;
868 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
869 0 : DEBUG(5,("function wkssvc_NetrSetPrimaryComputername replied async\n"));
870 : }
871 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
872 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrSetPrimaryComputername, NDR_OUT | NDR_SET_VALUES, r2);
873 : }
874 0 : if (dce_call->fault_code != 0) {
875 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrSetPrimaryComputername\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
876 : }
877 0 : break;
878 : }
879 0 : case 30: { /* wkssvc_NetrEnumerateComputerNames */
880 0 : struct wkssvc_NetrEnumerateComputerNames *r2 = (struct wkssvc_NetrEnumerateComputerNames *)r;
881 0 : if (dce_call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC) {
882 0 : DEBUG(5,("function wkssvc_NetrEnumerateComputerNames replied async\n"));
883 : }
884 0 : if (DEBUGLEVEL >= 10 && dce_call->fault_code == 0) {
885 0 : NDR_PRINT_FUNCTION_DEBUG(wkssvc_NetrEnumerateComputerNames, NDR_OUT | NDR_SET_VALUES, r2);
886 : }
887 0 : if (dce_call->fault_code != 0) {
888 0 : DBG_WARNING("dcerpc_fault %s in wkssvc_NetrEnumerateComputerNames\n", dcerpc_errstr(mem_ctx, dce_call->fault_code));
889 : }
890 0 : break;
891 : }
892 0 : default:
893 0 : dce_call->fault_code = DCERPC_FAULT_OP_RNG_ERROR;
894 0 : break;
895 : }
896 :
897 14 : if (dce_call->fault_code != 0) {
898 0 : return NT_STATUS_NET_WRITE_FAULT;
899 : }
900 :
901 14 : return NT_STATUS_OK;
902 : }
903 :
904 14 : NTSTATUS wkssvc__op_ndr_push(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ndr_push *push, const void *r)
905 : {
906 : enum ndr_err_code ndr_err;
907 14 : uint16_t opnum = dce_call->pkt.u.request.opnum;
908 :
909 14 : ndr_err = ndr_table_wkssvc.calls[opnum].ndr_push(push, NDR_OUT, r);
910 14 : if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
911 0 : dce_call->fault_code = DCERPC_FAULT_NDR;
912 0 : return NT_STATUS_NET_WRITE_FAULT;
913 : }
914 :
915 14 : return NT_STATUS_OK;
916 : }
917 :
918 0 : NTSTATUS wkssvc__op_local(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r)
919 : {
920 0 : return wkssvc__op_dispatch_internal(dce_call, mem_ctx, r, S3COMPAT_RPC_DISPATCH_INTERNAL);
921 : }
922 :
923 : static const struct dcesrv_interface dcesrv_wkssvc_interface = {
924 : .name = "wkssvc",
925 : .syntax_id = {{0x6bffd098,0xa112,0x3610,{0x98,0x33},{0x46,0xc3,0xf8,0x7e,0x34,0x5a}},1.0},
926 : .bind = wkssvc__op_bind,
927 : .unbind = wkssvc__op_unbind,
928 : .ndr_pull = wkssvc__op_ndr_pull,
929 : .dispatch = wkssvc__op_dispatch,
930 : .reply = wkssvc__op_reply,
931 : .ndr_push = wkssvc__op_ndr_push,
932 : .local = wkssvc__op_local,
933 : #ifdef DCESRV_INTERFACE_WKSSVC_FLAGS
934 : .flags = DCESRV_INTERFACE_WKSSVC_FLAGS
935 : #else
936 : .flags = 0
937 : #endif
938 : };
939 :
940 84 : static NTSTATUS wkssvc__check_register_in_endpoint(const char *name, struct dcerpc_binding *binding) {
941 84 : enum dcerpc_transport_t transport = dcerpc_binding_get_transport(binding);
942 : NTSTATUS status;
943 :
944 : /* If service is disabled, do not register */
945 84 : if (rpc_service_mode(name) == RPC_SERVICE_MODE_DISABLED) {
946 0 : return NT_STATUS_NOT_IMPLEMENTED;
947 : }
948 :
949 : /* If service is embedded, register only for ncacn_np
950 : * see 8466b3c85e4b835e57e41776853093f4a0edc8b8
951 : */
952 84 : if (rpc_service_mode(name) == RPC_SERVICE_MODE_EMBEDDED && (transport != NCACN_NP && transport != NCALRPC)) {
953 28 : DBG_INFO("Interface 'wkssvc' not registered in endpoint '%s' as service is embedded\n", name);
954 28 : return NT_STATUS_NOT_SUPPORTED;
955 : }
956 :
957 : /*
958 : * If rpc service is external then change the default ncalrpc endpoint,
959 : * otherwise if the rpc daemon running this service is configured in
960 : * fork mode the forked process will race with main smbd to accept the
961 : * connections in the default ncalrpc socket, and the forked process
962 : * may not have the requested interface registered.
963 : * For example, in the ad_member test environment:
964 : *
965 : * rpc_server:lsarpc = external
966 : * rpc_server:samr = external
967 : * rpc_server:netlogon = disabled
968 : * rpc_daemon:lsasd = fork
969 : *
970 : * With these settings both, the main smbd and all the preforked lsasd
971 : * processes would be listening in the default ncalrpc socket if it is
972 : * not changed. If a client connection is accepted by one of the lsasd
973 : * worker processes and the client asks for an interface not registered
974 : * in these processes (winreg for example) it will get an error.
975 : */
976 56 : if (rpc_service_mode(name) == RPC_SERVICE_MODE_EXTERNAL && transport == NCALRPC) {
977 0 : status = dcerpc_binding_set_string_option(binding, "endpoint", "WKSSVC");
978 0 : if (!NT_STATUS_IS_OK(status)) {
979 0 : return status;
980 : }
981 : }
982 :
983 56 : return NT_STATUS_OK;
984 : }
985 :
986 28 : static NTSTATUS wkssvc__op_init_server(struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server *ep_server)
987 : {
988 : uint32_t i;
989 : NTSTATUS ret;
990 : struct dcerpc_binding *binding;
991 28 : struct dcerpc_binding *binding2 = NULL;
992 :
993 : #ifdef DCESRV_INTERFACE_WKSSVC_NCACN_NP_SECONDARY_ENDPOINT
994 : const char *ncacn_np_secondary_endpoint = DCESRV_INTERFACE_WKSSVC_NCACN_NP_SECONDARY_ENDPOINT;
995 : #else
996 28 : const char *ncacn_np_secondary_endpoint = NULL;
997 : #endif
998 :
999 112 : for (i=0;i<ndr_table_wkssvc.endpoints->count;i++) {
1000 84 : const char *name = ndr_table_wkssvc.endpoints->names[i];
1001 :
1002 84 : ret = dcerpc_parse_binding(dce_ctx, name, &binding);
1003 84 : if (NT_STATUS_IS_ERR(ret)) {
1004 0 : DBG_ERR("Failed to parse binding string '%s'\n", name);
1005 0 : return ret;
1006 : }
1007 :
1008 84 : ret = wkssvc__check_register_in_endpoint("wkssvc", binding);
1009 84 : if (NT_STATUS_IS_ERR(ret)) {
1010 28 : talloc_free(binding);
1011 28 : continue;
1012 : }
1013 :
1014 56 : if (ncacn_np_secondary_endpoint != NULL) {
1015 0 : ret = dcerpc_parse_binding(dce_ctx, ncacn_np_secondary_endpoint, &binding2);
1016 0 : if (NT_STATUS_IS_ERR(ret)) {
1017 0 : DBG_ERR("Failed to parse 2nd binding string '%s'\n", ncacn_np_secondary_endpoint);
1018 0 : TALLOC_FREE(binding);
1019 0 : return ret;
1020 : }
1021 : }
1022 :
1023 56 : ret = dcesrv_interface_register_b(dce_ctx, binding, binding2, &dcesrv_wkssvc_interface, NULL);
1024 56 : TALLOC_FREE(binding);
1025 56 : TALLOC_FREE(binding2);
1026 56 : if (!NT_STATUS_IS_OK(ret)) {
1027 0 : DBG_ERR("Failed to register endpoint '%s'\n",name);
1028 0 : return ret;
1029 : }
1030 : }
1031 :
1032 28 : return NT_STATUS_OK;
1033 : }
1034 :
1035 19 : static NTSTATUS wkssvc__op_shutdown_server(struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server *ep_server)
1036 : {
1037 19 : return NT_STATUS_OK;
1038 : }
1039 :
1040 0 : static bool wkssvc__op_interface_by_uuid(struct dcesrv_interface *iface, const struct GUID *uuid, uint32_t if_version)
1041 : {
1042 0 : if (dcesrv_wkssvc_interface.syntax_id.if_version == if_version && GUID_equal(&dcesrv_wkssvc_interface.syntax_id.uuid, uuid)) {
1043 0 : memcpy(iface,&dcesrv_wkssvc_interface, sizeof(*iface));
1044 0 : return true;
1045 : }
1046 :
1047 0 : return false;
1048 : }
1049 :
1050 0 : static bool wkssvc__op_interface_by_name(struct dcesrv_interface *iface, const char *name)
1051 : {
1052 0 : if (strcmp(dcesrv_wkssvc_interface.name, name)==0) {
1053 0 : memcpy(iface, &dcesrv_wkssvc_interface, sizeof(*iface));
1054 0 : return true;
1055 : }
1056 :
1057 0 : return false;
1058 : }
1059 :
1060 : static const struct dcesrv_endpoint_server wkssvc_ep_server = {
1061 : /* fill in our name */
1062 : .name = "wkssvc",
1063 :
1064 : /* Initialization flag */
1065 : .initialized = false,
1066 :
1067 : /* fill in all the operations */
1068 : #ifdef DCESRV_INTERFACE_WKSSVC_INIT_SERVER
1069 : .init_server = DCESRV_INTERFACE_WKSSVC_INIT_SERVER,
1070 : #else
1071 : .init_server = wkssvc__op_init_server,
1072 : #endif
1073 : #ifdef DCESRV_INTERFACE_WKSSVC_SHUTDOWN_SERVER
1074 : .shutdown_server = DCESRV_INTERFACE_WKSSVC_SHUTDOWN_SERVER,
1075 : #else
1076 : .shutdown_server = wkssvc__op_shutdown_server,
1077 : #endif
1078 : .interface_by_uuid = wkssvc__op_interface_by_uuid,
1079 : .interface_by_name = wkssvc__op_interface_by_name
1080 : };
1081 :
1082 60 : const struct dcesrv_endpoint_server *wkssvc_get_ep_server(void)
1083 : {
1084 60 : return &wkssvc_ep_server;
1085 : }
|