2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
5 * Copyright (C) Andrew Tridgell 1992-1997,
6 * Copyright (C) Gerald (Jerry) Carter 2006.
7 * Copyright (C) Guenther Deschner 2007-2008.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, see <http://www.gnu.org/licenses/>.
23 /* This is the implementation of the wks interface. */
26 #include "libnet/libnet.h"
27 #include "../libcli/auth/libcli_auth.h"
30 #define DBGC_CLASS DBGC_RPC_SRV
32 /*******************************************************************
33 Fill in the values for the struct wkssvc_NetWkstaInfo100.
34 ********************************************************************/
36 static void create_wks_info_100(struct wkssvc_NetWkstaInfo100
*info100
)
38 info100
->platform_id
= PLATFORM_ID_NT
; /* unknown */
39 info100
->version_major
= lp_major_announce_version();
40 info100
->version_minor
= lp_minor_announce_version();
42 info100
->server_name
= talloc_asprintf_strupper_m(
43 info100
, "%s", global_myname());
44 info100
->domain_name
= talloc_asprintf_strupper_m(
45 info100
, "%s", lp_workgroup());
50 /********************************************************************
51 only supports info level 100 at the moment.
52 ********************************************************************/
54 WERROR
_wkssvc_NetWkstaGetInfo(pipes_struct
*p
, struct wkssvc_NetWkstaGetInfo
*r
)
56 struct wkssvc_NetWkstaInfo100
*wks100
= NULL
;
58 /* We only support info level 100 currently */
60 if ( r
->in
.level
!= 100 ) {
61 return WERR_UNKNOWN_LEVEL
;
64 if ( (wks100
= TALLOC_ZERO_P(p
->mem_ctx
, struct wkssvc_NetWkstaInfo100
)) == NULL
) {
68 create_wks_info_100( wks100
);
70 r
->out
.info
->info100
= wks100
;
75 /********************************************************************
76 ********************************************************************/
78 WERROR
_wkssvc_NetWkstaSetInfo(pipes_struct
*p
, struct wkssvc_NetWkstaSetInfo
*r
)
80 /* FIXME: Add implementation code here */
81 p
->rng_fault_state
= True
;
82 return WERR_NOT_SUPPORTED
;
85 /********************************************************************
86 ********************************************************************/
88 WERROR
_wkssvc_NetWkstaEnumUsers(pipes_struct
*p
, struct wkssvc_NetWkstaEnumUsers
*r
)
90 /* FIXME: Add implementation code here */
91 p
->rng_fault_state
= True
;
92 return WERR_NOT_SUPPORTED
;
95 /********************************************************************
96 ********************************************************************/
98 WERROR
_wkssvc_NetrWkstaUserGetInfo(pipes_struct
*p
, struct wkssvc_NetrWkstaUserGetInfo
*r
)
100 /* FIXME: Add implementation code here */
101 p
->rng_fault_state
= True
;
102 return WERR_NOT_SUPPORTED
;
105 /********************************************************************
106 ********************************************************************/
108 WERROR
_wkssvc_NetrWkstaUserSetInfo(pipes_struct
*p
, struct wkssvc_NetrWkstaUserSetInfo
*r
)
110 /* FIXME: Add implementation code here */
111 p
->rng_fault_state
= True
;
112 return WERR_NOT_SUPPORTED
;
115 /********************************************************************
116 ********************************************************************/
118 WERROR
_wkssvc_NetWkstaTransportEnum(pipes_struct
*p
, struct wkssvc_NetWkstaTransportEnum
*r
)
120 /* FIXME: Add implementation code here */
121 p
->rng_fault_state
= True
;
122 return WERR_NOT_SUPPORTED
;
125 /********************************************************************
126 ********************************************************************/
128 WERROR
_wkssvc_NetrWkstaTransportAdd(pipes_struct
*p
, struct wkssvc_NetrWkstaTransportAdd
*r
)
130 /* FIXME: Add implementation code here */
131 p
->rng_fault_state
= True
;
132 return WERR_NOT_SUPPORTED
;
135 /********************************************************************
136 ********************************************************************/
138 WERROR
_wkssvc_NetrWkstaTransportDel(pipes_struct
*p
, struct wkssvc_NetrWkstaTransportDel
*r
)
140 /* FIXME: Add implementation code here */
141 p
->rng_fault_state
= True
;
142 return WERR_NOT_SUPPORTED
;
145 /********************************************************************
146 ********************************************************************/
148 WERROR
_wkssvc_NetrUseAdd(pipes_struct
*p
, struct wkssvc_NetrUseAdd
*r
)
150 /* FIXME: Add implementation code here */
151 p
->rng_fault_state
= True
;
152 return WERR_NOT_SUPPORTED
;
155 /********************************************************************
156 ********************************************************************/
158 WERROR
_wkssvc_NetrUseGetInfo(pipes_struct
*p
, struct wkssvc_NetrUseGetInfo
*r
)
160 /* FIXME: Add implementation code here */
161 p
->rng_fault_state
= True
;
162 return WERR_NOT_SUPPORTED
;
165 /********************************************************************
166 ********************************************************************/
168 WERROR
_wkssvc_NetrUseDel(pipes_struct
*p
, struct wkssvc_NetrUseDel
*r
)
170 /* FIXME: Add implementation code here */
171 p
->rng_fault_state
= True
;
172 return WERR_NOT_SUPPORTED
;
175 /********************************************************************
176 ********************************************************************/
178 WERROR
_wkssvc_NetrUseEnum(pipes_struct
*p
, struct wkssvc_NetrUseEnum
*r
)
180 /* FIXME: Add implementation code here */
181 p
->rng_fault_state
= True
;
182 return WERR_NOT_SUPPORTED
;
185 /********************************************************************
186 ********************************************************************/
188 WERROR
_wkssvc_NetrMessageBufferSend(pipes_struct
*p
, struct wkssvc_NetrMessageBufferSend
*r
)
190 /* FIXME: Add implementation code here */
191 p
->rng_fault_state
= True
;
192 return WERR_NOT_SUPPORTED
;
195 /********************************************************************
196 ********************************************************************/
198 WERROR
_wkssvc_NetrWorkstationStatisticsGet(pipes_struct
*p
, struct wkssvc_NetrWorkstationStatisticsGet
*r
)
200 /* FIXME: Add implementation code here */
201 p
->rng_fault_state
= True
;
202 return WERR_NOT_SUPPORTED
;
205 /********************************************************************
206 ********************************************************************/
208 WERROR
_wkssvc_NetrLogonDomainNameAdd(pipes_struct
*p
, struct wkssvc_NetrLogonDomainNameAdd
*r
)
210 /* FIXME: Add implementation code here */
211 p
->rng_fault_state
= True
;
212 return WERR_NOT_SUPPORTED
;
215 /********************************************************************
216 ********************************************************************/
218 WERROR
_wkssvc_NetrLogonDomainNameDel(pipes_struct
*p
, struct wkssvc_NetrLogonDomainNameDel
*r
)
220 /* FIXME: Add implementation code here */
221 p
->rng_fault_state
= True
;
222 return WERR_NOT_SUPPORTED
;
225 /********************************************************************
226 ********************************************************************/
228 WERROR
_wkssvc_NetrJoinDomain(pipes_struct
*p
, struct wkssvc_NetrJoinDomain
*r
)
230 /* FIXME: Add implementation code here */
231 p
->rng_fault_state
= True
;
232 return WERR_NOT_SUPPORTED
;
235 /********************************************************************
236 ********************************************************************/
238 WERROR
_wkssvc_NetrUnjoinDomain(pipes_struct
*p
, struct wkssvc_NetrUnjoinDomain
*r
)
240 /* FIXME: Add implementation code here */
241 p
->rng_fault_state
= True
;
242 return WERR_NOT_SUPPORTED
;
245 /********************************************************************
246 ********************************************************************/
248 WERROR
_wkssvc_NetrRenameMachineInDomain(pipes_struct
*p
, struct wkssvc_NetrRenameMachineInDomain
*r
)
250 /* FIXME: Add implementation code here */
251 p
->rng_fault_state
= True
;
252 return WERR_NOT_SUPPORTED
;
255 /********************************************************************
256 ********************************************************************/
258 WERROR
_wkssvc_NetrValidateName(pipes_struct
*p
, struct wkssvc_NetrValidateName
*r
)
260 /* FIXME: Add implementation code here */
261 p
->rng_fault_state
= True
;
262 return WERR_NOT_SUPPORTED
;
265 /********************************************************************
266 ********************************************************************/
268 WERROR
_wkssvc_NetrGetJoinInformation(pipes_struct
*p
, struct wkssvc_NetrGetJoinInformation
*r
)
270 /* FIXME: Add implementation code here */
271 p
->rng_fault_state
= True
;
272 return WERR_NOT_SUPPORTED
;
275 /********************************************************************
276 ********************************************************************/
278 WERROR
_wkssvc_NetrGetJoinableOus(pipes_struct
*p
, struct wkssvc_NetrGetJoinableOus
*r
)
280 /* FIXME: Add implementation code here */
281 p
->rng_fault_state
= True
;
282 return WERR_NOT_SUPPORTED
;
285 /********************************************************************
286 _wkssvc_NetrJoinDomain2
287 ********************************************************************/
289 WERROR
_wkssvc_NetrJoinDomain2(pipes_struct
*p
,
290 struct wkssvc_NetrJoinDomain2
*r
)
292 struct libnet_JoinCtx
*j
= NULL
;
293 char *cleartext_pwd
= NULL
;
294 char *admin_domain
= NULL
;
295 char *admin_account
= NULL
;
297 struct nt_user_token
*token
= p
->server_info
->ptok
;
299 if (!r
->in
.domain_name
) {
300 return WERR_INVALID_PARAM
;
303 if (!r
->in
.admin_account
|| !r
->in
.encrypted_password
) {
304 return WERR_INVALID_PARAM
;
307 if (!user_has_privileges(token
, &se_machine_account
) &&
308 !nt_token_check_domain_rid(token
, DOMAIN_GROUP_RID_ADMINS
) &&
309 !nt_token_check_sid(&global_sid_Builtin_Administrators
, token
)) {
310 DEBUG(5,("_wkssvc_NetrJoinDomain2: account doesn't have "
311 "sufficient privileges\n"));
312 return WERR_ACCESS_DENIED
;
315 if ((r
->in
.join_flags
& WKSSVC_JOIN_FLAGS_MACHINE_PWD_PASSED
) ||
316 (r
->in
.join_flags
& WKSSVC_JOIN_FLAGS_JOIN_UNSECURE
)) {
317 return WERR_NOT_SUPPORTED
;
320 werr
= decode_wkssvc_join_password_buffer(
321 p
->mem_ctx
, r
->in
.encrypted_password
,
322 &p
->server_info
->user_session_key
, &cleartext_pwd
);
323 if (!W_ERROR_IS_OK(werr
)) {
327 split_domain_user(p
->mem_ctx
,
332 werr
= libnet_init_JoinCtx(p
->mem_ctx
, &j
);
333 if (!W_ERROR_IS_OK(werr
)) {
337 j
->in
.domain_name
= r
->in
.domain_name
;
338 j
->in
.account_ou
= r
->in
.account_ou
;
339 j
->in
.join_flags
= r
->in
.join_flags
;
340 j
->in
.admin_account
= admin_account
;
341 j
->in
.admin_password
= cleartext_pwd
;
343 j
->in
.modify_config
= lp_config_backend_is_registry();
344 j
->in
.msg_ctx
= smbd_messaging_context();
347 werr
= libnet_Join(p
->mem_ctx
, j
);
350 if (!W_ERROR_IS_OK(werr
)) {
351 DEBUG(5,("_wkssvc_NetrJoinDomain2: libnet_Join failed with: %s\n",
352 j
->out
.error_string
? j
->out
.error_string
:
360 /********************************************************************
361 _wkssvc_NetrUnjoinDomain2
362 ********************************************************************/
364 WERROR
_wkssvc_NetrUnjoinDomain2(pipes_struct
*p
,
365 struct wkssvc_NetrUnjoinDomain2
*r
)
367 struct libnet_UnjoinCtx
*u
= NULL
;
368 char *cleartext_pwd
= NULL
;
369 char *admin_domain
= NULL
;
370 char *admin_account
= NULL
;
372 struct nt_user_token
*token
= p
->server_info
->ptok
;
374 if (!r
->in
.account
|| !r
->in
.encrypted_password
) {
375 return WERR_INVALID_PARAM
;
378 if (!user_has_privileges(token
, &se_machine_account
) &&
379 !nt_token_check_domain_rid(token
, DOMAIN_GROUP_RID_ADMINS
) &&
380 !nt_token_check_sid(&global_sid_Builtin_Administrators
, token
)) {
381 DEBUG(5,("_wkssvc_NetrUnjoinDomain2: account doesn't have "
382 "sufficient privileges\n"));
383 return WERR_ACCESS_DENIED
;
386 werr
= decode_wkssvc_join_password_buffer(
387 p
->mem_ctx
, r
->in
.encrypted_password
,
388 &p
->server_info
->user_session_key
, &cleartext_pwd
);
389 if (!W_ERROR_IS_OK(werr
)) {
393 split_domain_user(p
->mem_ctx
,
398 werr
= libnet_init_UnjoinCtx(p
->mem_ctx
, &u
);
399 if (!W_ERROR_IS_OK(werr
)) {
403 u
->in
.domain_name
= lp_realm();
404 u
->in
.unjoin_flags
= r
->in
.unjoin_flags
|
405 WKSSVC_JOIN_FLAGS_JOIN_TYPE
;
406 u
->in
.admin_account
= admin_account
;
407 u
->in
.admin_password
= cleartext_pwd
;
409 u
->in
.modify_config
= lp_config_backend_is_registry();
410 u
->in
.msg_ctx
= smbd_messaging_context();
413 werr
= libnet_Unjoin(p
->mem_ctx
, u
);
416 if (!W_ERROR_IS_OK(werr
)) {
417 DEBUG(5,("_wkssvc_NetrUnjoinDomain2: libnet_Unjoin failed with: %s\n",
418 u
->out
.error_string
? u
->out
.error_string
:
426 /********************************************************************
427 ********************************************************************/
429 WERROR
_wkssvc_NetrRenameMachineInDomain2(pipes_struct
*p
, struct wkssvc_NetrRenameMachineInDomain2
*r
)
431 /* for now just return not supported */
432 return WERR_NOT_SUPPORTED
;
435 /********************************************************************
436 ********************************************************************/
438 WERROR
_wkssvc_NetrValidateName2(pipes_struct
*p
, struct wkssvc_NetrValidateName2
*r
)
440 /* FIXME: Add implementation code here */
441 p
->rng_fault_state
= True
;
442 return WERR_NOT_SUPPORTED
;
445 /********************************************************************
446 ********************************************************************/
448 WERROR
_wkssvc_NetrGetJoinableOus2(pipes_struct
*p
, struct wkssvc_NetrGetJoinableOus2
*r
)
450 /* FIXME: Add implementation code here */
451 p
->rng_fault_state
= True
;
452 return WERR_NOT_SUPPORTED
;
455 /********************************************************************
456 ********************************************************************/
458 WERROR
_wkssvc_NetrAddAlternateComputerName(pipes_struct
*p
, struct wkssvc_NetrAddAlternateComputerName
*r
)
460 /* FIXME: Add implementation code here */
461 p
->rng_fault_state
= True
;
462 return WERR_NOT_SUPPORTED
;
465 /********************************************************************
466 ********************************************************************/
468 WERROR
_wkssvc_NetrRemoveAlternateComputerName(pipes_struct
*p
, struct wkssvc_NetrRemoveAlternateComputerName
*r
)
470 /* FIXME: Add implementation code here */
471 p
->rng_fault_state
= True
;
472 return WERR_NOT_SUPPORTED
;
475 /********************************************************************
476 ********************************************************************/
478 WERROR
_wkssvc_NetrSetPrimaryComputername(pipes_struct
*p
, struct wkssvc_NetrSetPrimaryComputername
*r
)
480 /* FIXME: Add implementation code here */
481 p
->rng_fault_state
= True
;
482 return WERR_NOT_SUPPORTED
;
485 /********************************************************************
486 ********************************************************************/
488 WERROR
_wkssvc_NetrEnumerateComputerNames(pipes_struct
*p
, struct wkssvc_NetrEnumerateComputerNames
*r
)
490 /* FIXME: Add implementation code here */
491 p
->rng_fault_state
= True
;
492 return WERR_NOT_SUPPORTED
;