2 Unix SMB/CIFS implementation.
6 Copyright (C) Andrew Tridgell 2005
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.
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.
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/>.
23 #include "libcli/dgram/libdgram.h"
24 #include "lib/socket/socket.h"
25 #include "lib/events/events.h"
26 #include "torture/rpc/torture_rpc.h"
27 #include "torture/nbt/proto.h"
28 #include "libcli/resolve/resolve.h"
29 #include "system/network.h"
30 #include "lib/socket/netif.h"
31 #include "param/param.h"
33 #define TEST_NAME "TORTURE_TEST"
36 reply handler for netlogon request
38 static void netlogon_handler(struct dgram_mailslot_handler
*dgmslot
,
39 struct nbt_dgram_packet
*packet
,
40 struct socket_address
*src
)
43 struct nbt_netlogon_response
*netlogon
= dgmslot
->private_data
;
45 dgmslot
->private_data
= netlogon
= talloc(dgmslot
, struct nbt_netlogon_response
);
47 if (!dgmslot
->private_data
) {
51 printf("netlogon reply from %s:%d\n", src
->addr
, src
->port
);
53 /* Fills in the netlogon pointer */
54 status
= dgram_mailslot_netlogon_parse_response(netlogon
, packet
,
56 if (!NT_STATUS_IS_OK(status
)) {
57 printf("Failed to parse netlogon packet from %s:%d\n",
58 src
->addr
, src
->port
);
65 /* test UDP/138 netlogon requests */
66 static bool nbt_test_netlogon(struct torture_context
*tctx
)
68 struct dgram_mailslot_handler
*dgmslot
;
69 struct nbt_dgram_socket
*dgmsock
= nbt_dgram_socket_init(tctx
, tctx
->ev
);
70 struct socket_address
*dest
;
71 const char *myaddress
;
72 struct nbt_netlogon_packet logon
;
73 struct nbt_netlogon_response
*response
;
74 struct nbt_name myname
;
76 struct timeval tv
= timeval_current();
78 struct socket_address
*socket_address
;
83 struct interface
*ifaces
;
85 name
.name
= lpcfg_workgroup(tctx
->lp_ctx
);
86 name
.type
= NBT_NAME_LOGON
;
89 /* do an initial name resolution to find its IP */
90 torture_assert_ntstatus_ok(tctx
,
91 resolve_name_ex(lpcfg_resolve_context(tctx
->lp_ctx
),
93 &name
, tctx
, &address
, tctx
->ev
),
94 talloc_asprintf(tctx
, "Failed to resolve %s", name
.name
));
96 load_interface_list(tctx
, tctx
->lp_ctx
, &ifaces
);
97 myaddress
= talloc_strdup(dgmsock
, iface_list_best_ip(ifaces
, address
));
100 socket_address
= socket_address_from_strings(dgmsock
, dgmsock
->sock
->backend_name
,
101 myaddress
, lpcfg_dgram_port(tctx
->lp_ctx
));
102 torture_assert(tctx
, socket_address
!= NULL
, "Error getting address");
104 /* try receiving replies on port 138 first, which will only
105 work if we are root and smbd/nmbd are not running - fall
106 back to listening on any port, which means replies from
107 most windows versions won't be seen */
108 status
= socket_listen(dgmsock
->sock
, socket_address
, 0, 0);
109 if (!NT_STATUS_IS_OK(status
)) {
110 talloc_free(socket_address
);
111 socket_address
= socket_address_from_strings(dgmsock
, dgmsock
->sock
->backend_name
,
113 torture_assert(tctx
, socket_address
!= NULL
, "Error getting address");
115 socket_listen(dgmsock
->sock
, socket_address
, 0, 0);
118 /* setup a temporary mailslot listener for replies */
119 dgmslot
= dgram_mailslot_temp(dgmsock
, NBT_MAILSLOT_GETDC
,
120 netlogon_handler
, NULL
);
121 torture_assert(tctx
, dgmslot
!= NULL
, "Error temporary mailslot for GetDC");
124 logon
.command
= LOGON_PRIMARY_QUERY
;
125 logon
.req
.pdc
.computer_name
= TEST_NAME
;
126 logon
.req
.pdc
.mailslot_name
= dgmslot
->mailslot_name
;
127 logon
.req
.pdc
.unicode_name
= TEST_NAME
;
128 logon
.req
.pdc
.nt_version
= 1;
129 logon
.req
.pdc
.lmnt_token
= 0xFFFF;
130 logon
.req
.pdc
.lm20_token
= 0xFFFF;
132 make_nbt_name_client(&myname
, TEST_NAME
);
134 dest
= socket_address_from_strings(dgmsock
, dgmsock
->sock
->backend_name
,
135 address
, lpcfg_dgram_port(tctx
->lp_ctx
));
136 torture_assert(tctx
, dest
!= NULL
, "Error getting address");
138 status
= dgram_mailslot_netlogon_send(dgmsock
, &name
, dest
,
139 NBT_MAILSLOT_NETLOGON
,
141 torture_assert_ntstatus_ok(tctx
, status
, "Failed to send netlogon request");
143 while (timeval_elapsed(&tv
) < 5 && !dgmslot
->private_data
) {
144 tevent_loop_once(dgmsock
->event_ctx
);
147 response
= talloc_get_type(dgmslot
->private_data
, struct nbt_netlogon_response
);
149 torture_assert(tctx
, response
!= NULL
, "Failed to receive a netlogon reply packet");
151 torture_assert(tctx
, response
->response_type
== NETLOGON_GET_PDC
, "Got incorrect type of netlogon response");
152 torture_assert(tctx
, response
->data
.get_pdc
.command
== NETLOGON_RESPONSE_FROM_PDC
, "Got incorrect netlogon response command");
158 /* test UDP/138 netlogon requests */
159 static bool nbt_test_netlogon2(struct torture_context
*tctx
)
161 struct dgram_mailslot_handler
*dgmslot
;
162 struct nbt_dgram_socket
*dgmsock
= nbt_dgram_socket_init(tctx
, tctx
->ev
);
163 struct socket_address
*dest
;
164 const char *myaddress
;
165 struct nbt_netlogon_packet logon
;
166 struct nbt_netlogon_response
*response
;
167 struct nbt_name myname
;
169 struct timeval tv
= timeval_current();
171 struct socket_address
*socket_address
;
174 struct nbt_name name
;
176 struct interface
*ifaces
;
177 struct test_join
*join_ctx
;
178 struct cli_credentials
*machine_credentials
;
179 const struct dom_sid
*dom_sid
;
181 name
.name
= lpcfg_workgroup(tctx
->lp_ctx
);
182 name
.type
= NBT_NAME_LOGON
;
185 /* do an initial name resolution to find its IP */
186 torture_assert_ntstatus_ok(tctx
,
187 resolve_name_ex(lpcfg_resolve_context(tctx
->lp_ctx
),
189 &name
, tctx
, &address
, tctx
->ev
),
190 talloc_asprintf(tctx
, "Failed to resolve %s", name
.name
));
192 load_interface_list(tctx
, tctx
->lp_ctx
, &ifaces
);
193 myaddress
= talloc_strdup(dgmsock
, iface_list_best_ip(ifaces
, address
));
195 socket_address
= socket_address_from_strings(dgmsock
, dgmsock
->sock
->backend_name
,
196 myaddress
, lpcfg_dgram_port(tctx
->lp_ctx
));
197 torture_assert(tctx
, socket_address
!= NULL
, "Error getting address");
199 /* try receiving replies on port 138 first, which will only
200 work if we are root and smbd/nmbd are not running - fall
201 back to listening on any port, which means replies from
202 some windows versions won't be seen */
203 status
= socket_listen(dgmsock
->sock
, socket_address
, 0, 0);
204 if (!NT_STATUS_IS_OK(status
)) {
205 talloc_free(socket_address
);
206 socket_address
= socket_address_from_strings(dgmsock
, dgmsock
->sock
->backend_name
,
208 torture_assert(tctx
, socket_address
!= NULL
, "Error getting address");
210 socket_listen(dgmsock
->sock
, socket_address
, 0, 0);
213 /* setup a temporary mailslot listener for replies */
214 dgmslot
= dgram_mailslot_temp(dgmsock
, NBT_MAILSLOT_GETDC
,
215 netlogon_handler
, NULL
);
216 torture_assert(tctx
, dgmslot
!= NULL
, "Error temporary mailslot for GetDC");
219 logon
.command
= LOGON_SAM_LOGON_REQUEST
;
220 logon
.req
.logon
.request_count
= 0;
221 logon
.req
.logon
.computer_name
= TEST_NAME
;
222 logon
.req
.logon
.user_name
= "";
223 logon
.req
.logon
.mailslot_name
= dgmslot
->mailslot_name
;
224 logon
.req
.logon
.nt_version
= NETLOGON_NT_VERSION_5EX_WITH_IP
|NETLOGON_NT_VERSION_5
|NETLOGON_NT_VERSION_1
;
225 logon
.req
.logon
.lmnt_token
= 0xFFFF;
226 logon
.req
.logon
.lm20_token
= 0xFFFF;
228 make_nbt_name_client(&myname
, TEST_NAME
);
230 dest
= socket_address_from_strings(dgmsock
, dgmsock
->sock
->backend_name
,
231 address
, lpcfg_dgram_port(tctx
->lp_ctx
));
233 torture_assert(tctx
, dest
!= NULL
, "Error getting address");
234 status
= dgram_mailslot_netlogon_send(dgmsock
, &name
, dest
,
235 NBT_MAILSLOT_NETLOGON
,
237 torture_assert_ntstatus_ok(tctx
, status
, "Failed to send netlogon request");
239 while (timeval_elapsed(&tv
) < 5 && dgmslot
->private_data
== NULL
) {
240 tevent_loop_once(dgmsock
->event_ctx
);
243 response
= talloc_get_type(dgmslot
->private_data
, struct nbt_netlogon_response
);
245 torture_assert(tctx
, response
!= NULL
, "Failed to receive a netlogon reply packet");
247 torture_assert_int_equal(tctx
, response
->response_type
, NETLOGON_SAMLOGON
, "Got incorrect type of netlogon response");
248 map_netlogon_samlogon_response(&response
->data
.samlogon
);
250 torture_assert_int_equal(tctx
, response
->data
.samlogon
.data
.nt5_ex
.command
, LOGON_SAM_LOGON_RESPONSE_EX
, "Got incorrect netlogon response command");
252 torture_assert_int_equal(tctx
, response
->data
.samlogon
.data
.nt5_ex
.nt_version
, NETLOGON_NT_VERSION_5EX_WITH_IP
|NETLOGON_NT_VERSION_5EX
|NETLOGON_NT_VERSION_1
, "Got incorrect netlogon response command");
255 strstr(response
->data
.samlogon
.data
.nt5_ex
.pdc_name
, "\\\\") == NULL
,
256 "PDC name should not be in UNC form");
258 /* setup (another) temporary mailslot listener for replies */
259 dgmslot
= dgram_mailslot_temp(dgmsock
, NBT_MAILSLOT_GETDC
,
260 netlogon_handler
, NULL
);
261 torture_assert(tctx
, dgmslot
!= NULL
, "Error temporary mailslot for GetDC");
264 logon
.command
= LOGON_SAM_LOGON_REQUEST
;
265 logon
.req
.logon
.request_count
= 0;
266 logon
.req
.logon
.computer_name
= TEST_NAME
;
267 logon
.req
.logon
.user_name
= TEST_NAME
"$";
268 logon
.req
.logon
.mailslot_name
= dgmslot
->mailslot_name
;
269 logon
.req
.logon
.nt_version
= 1;
270 logon
.req
.logon
.lmnt_token
= 0xFFFF;
271 logon
.req
.logon
.lm20_token
= 0xFFFF;
273 make_nbt_name_client(&myname
, TEST_NAME
);
275 dest
= socket_address_from_strings(dgmsock
, dgmsock
->sock
->backend_name
,
276 address
, lpcfg_dgram_port(tctx
->lp_ctx
));
278 torture_assert(tctx
, dest
!= NULL
, "Error getting address");
279 status
= dgram_mailslot_netlogon_send(dgmsock
, &name
, dest
,
280 NBT_MAILSLOT_NETLOGON
,
282 torture_assert_ntstatus_ok(tctx
, status
, "Failed to send netlogon request");
284 while (timeval_elapsed(&tv
) < 5 && dgmslot
->private_data
== NULL
) {
285 tevent_loop_once(dgmsock
->event_ctx
);
288 response
= talloc_get_type(dgmslot
->private_data
, struct nbt_netlogon_response
);
290 torture_assert(tctx
, response
!= NULL
, "Failed to receive a netlogon reply packet");
292 torture_assert_int_equal(tctx
, response
->response_type
, NETLOGON_SAMLOGON
, "Got incorrect type of netlogon response");
293 map_netlogon_samlogon_response(&response
->data
.samlogon
);
295 torture_assert_int_equal(tctx
, response
->data
.samlogon
.data
.nt5_ex
.command
, LOGON_SAM_LOGON_USER_UNKNOWN
, "Got incorrect netlogon response command");
297 torture_assert_str_equal(tctx
, response
->data
.samlogon
.data
.nt5_ex
.user_name
, TEST_NAME
"$", "Got incorrect user in netlogon response");
300 strstr(response
->data
.samlogon
.data
.nt5_ex
.pdc_name
, "\\\\") != NULL
,
301 "PDC name should be in UNC form");
303 join_ctx
= torture_join_domain(tctx
, TEST_NAME
,
304 ACB_WSTRUST
, &machine_credentials
);
306 torture_assert(tctx
, join_ctx
!= NULL
,
307 talloc_asprintf(tctx
, "Failed to join domain %s as %s\n",
308 lpcfg_workgroup(tctx
->lp_ctx
), TEST_NAME
));
310 dom_sid
= torture_join_sid(join_ctx
);
312 /* setup (another) temporary mailslot listener for replies */
313 dgmslot
= dgram_mailslot_temp(dgmsock
, NBT_MAILSLOT_GETDC
,
314 netlogon_handler
, NULL
);
315 torture_assert(tctx
, dgmslot
!= NULL
, "Error temporary mailslot for GetDC");
318 logon
.command
= LOGON_SAM_LOGON_REQUEST
;
319 logon
.req
.logon
.request_count
= 0;
320 logon
.req
.logon
.computer_name
= TEST_NAME
;
321 logon
.req
.logon
.user_name
= TEST_NAME
"$";
322 logon
.req
.logon
.mailslot_name
= dgmslot
->mailslot_name
;
323 logon
.req
.logon
.sid
= *dom_sid
;
324 logon
.req
.logon
.nt_version
= 1;
325 logon
.req
.logon
.lmnt_token
= 0xFFFF;
326 logon
.req
.logon
.lm20_token
= 0xFFFF;
328 make_nbt_name_client(&myname
, TEST_NAME
);
330 dest
= socket_address_from_strings(dgmsock
, dgmsock
->sock
->backend_name
,
331 address
, lpcfg_dgram_port(tctx
->lp_ctx
));
333 torture_assert(tctx
, dest
!= NULL
, "Error getting address");
334 status
= dgram_mailslot_netlogon_send(dgmsock
, &name
, dest
,
335 NBT_MAILSLOT_NETLOGON
,
337 torture_assert_ntstatus_ok(tctx
, status
, "Failed to send netlogon request");
340 while (timeval_elapsed(&tv
) < 5 && dgmslot
->private_data
== NULL
) {
341 tevent_loop_once(dgmsock
->event_ctx
);
344 response
= talloc_get_type(dgmslot
->private_data
, struct nbt_netlogon_response
);
346 torture_assert(tctx
, response
!= NULL
, "Failed to receive a netlogon reply packet");
348 torture_assert_int_equal(tctx
, response
->response_type
, NETLOGON_SAMLOGON
, "Got incorrect type of netlogon response");
349 map_netlogon_samlogon_response(&response
->data
.samlogon
);
351 torture_assert_int_equal(tctx
, response
->data
.samlogon
.data
.nt5_ex
.command
, LOGON_SAM_LOGON_USER_UNKNOWN
, "Got incorrect netlogon response command");
354 strstr(response
->data
.samlogon
.data
.nt5_ex
.pdc_name
, "\\\\") != NULL
,
355 "PDC name should be in UNC form");
357 /* setup (another) temporary mailslot listener for replies */
358 dgmslot
= dgram_mailslot_temp(dgmsock
, NBT_MAILSLOT_GETDC
,
359 netlogon_handler
, NULL
);
360 torture_assert(tctx
, dgmslot
!= NULL
, "Error getting a Mailslot for GetDC reply");
363 logon
.command
= LOGON_SAM_LOGON_REQUEST
;
364 logon
.req
.logon
.request_count
= 0;
365 logon
.req
.logon
.computer_name
= TEST_NAME
;
366 logon
.req
.logon
.user_name
= TEST_NAME
"$";
367 logon
.req
.logon
.mailslot_name
= dgmslot
->mailslot_name
;
368 logon
.req
.logon
.sid
= *dom_sid
;
369 logon
.req
.logon
.acct_control
= ACB_WSTRUST
;
370 logon
.req
.logon
.nt_version
= 1;
371 logon
.req
.logon
.lmnt_token
= 0xFFFF;
372 logon
.req
.logon
.lm20_token
= 0xFFFF;
374 make_nbt_name_client(&myname
, TEST_NAME
);
376 dest
= socket_address_from_strings(dgmsock
, dgmsock
->sock
->backend_name
,
377 address
, lpcfg_dgram_port(tctx
->lp_ctx
));
379 torture_assert(tctx
, dest
!= NULL
, "Error getting address");
380 status
= dgram_mailslot_netlogon_send(dgmsock
, &name
, dest
,
381 NBT_MAILSLOT_NETLOGON
,
383 torture_assert_ntstatus_ok(tctx
, status
, "Failed to send netlogon request");
386 while (timeval_elapsed(&tv
) < 5 && dgmslot
->private_data
== NULL
) {
387 tevent_loop_once(dgmsock
->event_ctx
);
390 response
= talloc_get_type(dgmslot
->private_data
, struct nbt_netlogon_response
);
392 torture_assert(tctx
, response
!= NULL
, "Failed to receive a netlogon reply packet");
394 torture_assert_int_equal(tctx
, response
->response_type
, NETLOGON_SAMLOGON
, "Got incorrect type of netlogon response");
395 map_netlogon_samlogon_response(&response
->data
.samlogon
);
397 torture_assert_int_equal(tctx
, response
->data
.samlogon
.data
.nt5_ex
.command
, LOGON_SAM_LOGON_RESPONSE
, "Got incorrect netlogon response command");
400 strstr(response
->data
.samlogon
.data
.nt5_ex
.pdc_name
, "\\\\") != NULL
,
401 "PDC name should be in UNC form");
403 dgmslot
->private_data
= NULL
;
406 logon
.command
= LOGON_SAM_LOGON_REQUEST
;
407 logon
.req
.logon
.request_count
= 0;
408 logon
.req
.logon
.computer_name
= TEST_NAME
;
409 logon
.req
.logon
.user_name
= TEST_NAME
"$";
410 logon
.req
.logon
.mailslot_name
= dgmslot
->mailslot_name
;
411 logon
.req
.logon
.sid
= *dom_sid
;
412 logon
.req
.logon
.acct_control
= ACB_NORMAL
;
413 logon
.req
.logon
.nt_version
= 1;
414 logon
.req
.logon
.lmnt_token
= 0xFFFF;
415 logon
.req
.logon
.lm20_token
= 0xFFFF;
417 make_nbt_name_client(&myname
, TEST_NAME
);
419 dest
= socket_address_from_strings(dgmsock
, dgmsock
->sock
->backend_name
,
420 address
, lpcfg_dgram_port(tctx
->lp_ctx
));
422 torture_assert(tctx
, dest
!= NULL
, "Error getting address");
423 status
= dgram_mailslot_netlogon_send(dgmsock
, &name
, dest
,
424 NBT_MAILSLOT_NETLOGON
,
426 torture_assert_ntstatus_ok(tctx
, status
, "Failed to send netlogon request");
429 while (timeval_elapsed(&tv
) < 5 && dgmslot
->private_data
== NULL
) {
430 tevent_loop_once(dgmsock
->event_ctx
);
433 response
= talloc_get_type(dgmslot
->private_data
, struct nbt_netlogon_response
);
435 torture_assert(tctx
, response
!= NULL
, "Failed to receive a netlogon reply packet");
437 torture_assert_int_equal(tctx
, response
->response_type
, NETLOGON_SAMLOGON
, "Got incorrect type of netlogon response");
438 map_netlogon_samlogon_response(&response
->data
.samlogon
);
440 torture_assert_int_equal(tctx
, response
->data
.samlogon
.data
.nt5_ex
.command
, LOGON_SAM_LOGON_USER_UNKNOWN
, "Got incorrect netlogon response command");
443 strstr(response
->data
.samlogon
.data
.nt5_ex
.pdc_name
, "\\\\") != NULL
,
444 "PDC name should be in UNC form");
446 torture_leave_domain(tctx
, join_ctx
);
451 /* test UDP/138 ntlogon requests */
452 static bool nbt_test_ntlogon(struct torture_context
*tctx
)
454 struct dgram_mailslot_handler
*dgmslot
;
455 struct nbt_dgram_socket
*dgmsock
= nbt_dgram_socket_init(tctx
, tctx
->ev
);
456 struct socket_address
*dest
;
457 struct test_join
*join_ctx
;
458 const struct dom_sid
*dom_sid
;
459 struct cli_credentials
*machine_credentials
;
461 const char *myaddress
;
462 struct nbt_netlogon_packet logon
;
463 struct nbt_netlogon_response
*response
;
464 struct nbt_name myname
;
466 struct timeval tv
= timeval_current();
468 struct socket_address
*socket_address
;
470 struct nbt_name name
;
472 struct interface
*ifaces
;
474 name
.name
= lpcfg_workgroup(tctx
->lp_ctx
);
475 name
.type
= NBT_NAME_LOGON
;
478 /* do an initial name resolution to find its IP */
479 torture_assert_ntstatus_ok(tctx
,
480 resolve_name_ex(lpcfg_resolve_context(tctx
->lp_ctx
),
481 0, 0, &name
, tctx
, &address
, tctx
->ev
),
482 talloc_asprintf(tctx
, "Failed to resolve %s", name
.name
));
484 load_interface_list(tctx
, tctx
->lp_ctx
, &ifaces
);
485 myaddress
= talloc_strdup(dgmsock
, iface_list_best_ip(ifaces
, address
));
487 socket_address
= socket_address_from_strings(dgmsock
, dgmsock
->sock
->backend_name
,
488 myaddress
, lpcfg_dgram_port(tctx
->lp_ctx
));
489 torture_assert(tctx
, socket_address
!= NULL
, "Error getting address");
491 /* try receiving replies on port 138 first, which will only
492 work if we are root and smbd/nmbd are not running - fall
493 back to listening on any port, which means replies from
494 most windows versions won't be seen */
495 status
= socket_listen(dgmsock
->sock
, socket_address
, 0, 0);
496 if (!NT_STATUS_IS_OK(status
)) {
497 talloc_free(socket_address
);
498 socket_address
= socket_address_from_strings(dgmsock
, dgmsock
->sock
->backend_name
,
500 torture_assert(tctx
, socket_address
!= NULL
, "Error getting address");
502 socket_listen(dgmsock
->sock
, socket_address
, 0, 0);
505 join_ctx
= torture_join_domain(tctx
, TEST_NAME
,
506 ACB_WSTRUST
, &machine_credentials
);
508 torture_assert(tctx
, join_ctx
!= NULL
,
509 talloc_asprintf(tctx
, "Failed to join domain %s as %s\n",
510 lpcfg_workgroup(tctx
->lp_ctx
), TEST_NAME
));
511 dom_sid
= torture_join_sid(join_ctx
);
513 /* setup a temporary mailslot listener for replies */
514 dgmslot
= dgram_mailslot_temp(dgmsock
, NBT_MAILSLOT_GETDC
,
515 netlogon_handler
, NULL
);
516 torture_assert(tctx
, dgmslot
!= NULL
, "Error temporary mailslot for GetDC");
519 logon
.command
= LOGON_SAM_LOGON_REQUEST
;
520 logon
.req
.logon
.request_count
= 0;
521 logon
.req
.logon
.computer_name
= TEST_NAME
;
522 logon
.req
.logon
.user_name
= TEST_NAME
"$";
523 logon
.req
.logon
.mailslot_name
= dgmslot
->mailslot_name
;
524 logon
.req
.logon
.acct_control
= ACB_WSTRUST
;
525 /* Try with a SID this time */
526 logon
.req
.logon
.sid
= *dom_sid
;
527 logon
.req
.logon
.nt_version
= 1;
528 logon
.req
.logon
.lmnt_token
= 0xFFFF;
529 logon
.req
.logon
.lm20_token
= 0xFFFF;
531 make_nbt_name_client(&myname
, TEST_NAME
);
533 dest
= socket_address_from_strings(dgmsock
, dgmsock
->sock
->backend_name
,
534 address
, lpcfg_dgram_port(tctx
->lp_ctx
));
535 torture_assert(tctx
, dest
!= NULL
, "Error getting address");
536 status
= dgram_mailslot_netlogon_send(dgmsock
,
538 NBT_MAILSLOT_NTLOGON
,
540 torture_assert_ntstatus_ok(tctx
, status
, "Failed to send ntlogon request");
542 while (timeval_elapsed(&tv
) < 5 && dgmslot
->private_data
== NULL
) {
543 tevent_loop_once(dgmsock
->event_ctx
);
546 response
= talloc_get_type(dgmslot
->private_data
, struct nbt_netlogon_response
);
548 torture_assert(tctx
, response
!= NULL
, "Failed to receive a netlogon reply packet");
550 torture_assert_int_equal(tctx
, response
->response_type
, NETLOGON_SAMLOGON
, "Got incorrect type of netlogon response");
551 map_netlogon_samlogon_response(&response
->data
.samlogon
);
553 torture_assert_int_equal(tctx
, response
->data
.samlogon
.data
.nt5_ex
.command
, LOGON_SAM_LOGON_RESPONSE
, "Got incorrect netlogon response command");
555 torture_assert_str_equal(tctx
, response
->data
.samlogon
.data
.nt5_ex
.user_name
, TEST_NAME
"$", "Got incorrect user in netlogon response");
558 strstr(response
->data
.samlogon
.data
.nt5_ex
.pdc_name
, "\\\\") != NULL
,
559 "PDC name should be in UNC form");
561 /* setup a temporary mailslot listener for replies */
562 dgmslot
= dgram_mailslot_temp(dgmsock
, NBT_MAILSLOT_GETDC
,
563 netlogon_handler
, NULL
);
564 torture_assert(tctx
, dgmslot
!= NULL
, "Error temporary mailslot for GetDC");
567 logon
.command
= LOGON_SAM_LOGON_REQUEST
;
568 logon
.req
.logon
.request_count
= 0;
569 logon
.req
.logon
.computer_name
= TEST_NAME
;
570 logon
.req
.logon
.user_name
= TEST_NAME
"$";
571 logon
.req
.logon
.mailslot_name
= dgmslot
->mailslot_name
;
572 logon
.req
.logon
.acct_control
= ACB_WSTRUST
;
573 /* Leave sid as all zero */
574 logon
.req
.logon
.nt_version
= 1;
575 logon
.req
.logon
.lmnt_token
= 0xFFFF;
576 logon
.req
.logon
.lm20_token
= 0xFFFF;
578 make_nbt_name_client(&myname
, TEST_NAME
);
580 dest
= socket_address_from_strings(dgmsock
, dgmsock
->sock
->backend_name
,
581 address
, lpcfg_dgram_port(tctx
->lp_ctx
));
582 torture_assert(tctx
, dest
!= NULL
, "Error getting address");
583 status
= dgram_mailslot_netlogon_send(dgmsock
,
585 NBT_MAILSLOT_NTLOGON
,
587 torture_assert_ntstatus_ok(tctx
, status
, "Failed to send ntlogon request");
589 while (timeval_elapsed(&tv
) < 5 && dgmslot
->private_data
== NULL
) {
590 tevent_loop_once(dgmsock
->event_ctx
);
593 response
= talloc_get_type(dgmslot
->private_data
, struct nbt_netlogon_response
);
595 torture_assert(tctx
, response
!= NULL
, "Failed to receive a netlogon reply packet");
597 torture_assert_int_equal(tctx
, response
->response_type
, NETLOGON_SAMLOGON
, "Got incorrect type of netlogon response");
598 map_netlogon_samlogon_response(&response
->data
.samlogon
);
600 torture_assert_int_equal(tctx
, response
->data
.samlogon
.data
.nt5_ex
.command
, LOGON_SAM_LOGON_RESPONSE
, "Got incorrect netlogon response command");
602 torture_assert_str_equal(tctx
, response
->data
.samlogon
.data
.nt5_ex
.user_name
, TEST_NAME
"$", "Got incorrect user in netlogon response");
605 strstr(response
->data
.samlogon
.data
.nt5_ex
.pdc_name
, "\\\\") != NULL
,
606 "PDC name should be in UNC form");
608 /* setup (another) temporary mailslot listener for replies */
609 dgmslot
= dgram_mailslot_temp(dgmsock
, NBT_MAILSLOT_GETDC
,
610 netlogon_handler
, NULL
);
611 torture_assert(tctx
, dgmslot
!= NULL
, "Error temporary mailslot for GetDC");
614 logon
.command
= LOGON_PRIMARY_QUERY
;
615 logon
.req
.pdc
.computer_name
= TEST_NAME
;
616 logon
.req
.pdc
.mailslot_name
= dgmslot
->mailslot_name
;
617 logon
.req
.pdc
.unicode_name
= TEST_NAME
;
618 logon
.req
.pdc
.nt_version
= 1;
619 logon
.req
.pdc
.lmnt_token
= 0xFFFF;
620 logon
.req
.pdc
.lm20_token
= 0xFFFF;
622 make_nbt_name_client(&myname
, TEST_NAME
);
624 dest
= socket_address_from_strings(dgmsock
, dgmsock
->sock
->backend_name
,
625 address
, lpcfg_dgram_port(tctx
->lp_ctx
));
626 torture_assert(tctx
, dest
!= NULL
, "Error getting address");
627 status
= dgram_mailslot_netlogon_send(dgmsock
,
629 NBT_MAILSLOT_NTLOGON
,
631 torture_assert_ntstatus_ok(tctx
, status
, "Failed to send ntlogon request");
633 while (timeval_elapsed(&tv
) < 5 && !dgmslot
->private_data
) {
634 tevent_loop_once(dgmsock
->event_ctx
);
637 response
= talloc_get_type(dgmslot
->private_data
, struct nbt_netlogon_response
);
639 torture_assert(tctx
, response
!= NULL
, "Failed to receive a netlogon reply packet");
641 torture_assert_int_equal(tctx
, response
->response_type
, NETLOGON_GET_PDC
, "Got incorrect type of ntlogon response");
642 torture_assert_int_equal(tctx
, response
->data
.get_pdc
.command
, NETLOGON_RESPONSE_FROM_PDC
, "Got incorrect ntlogon response command");
644 torture_leave_domain(tctx
, join_ctx
);
646 /* setup (another) temporary mailslot listener for replies */
647 dgmslot
= dgram_mailslot_temp(dgmsock
, NBT_MAILSLOT_GETDC
,
648 netlogon_handler
, NULL
);
649 torture_assert(tctx
, dgmslot
!= NULL
, "Error temporary mailslot for GetDC");
652 logon
.command
= LOGON_PRIMARY_QUERY
;
653 logon
.req
.pdc
.computer_name
= TEST_NAME
;
654 logon
.req
.pdc
.mailslot_name
= dgmslot
->mailslot_name
;
655 logon
.req
.pdc
.unicode_name
= TEST_NAME
;
656 logon
.req
.pdc
.nt_version
= 1;
657 logon
.req
.pdc
.lmnt_token
= 0xFFFF;
658 logon
.req
.pdc
.lm20_token
= 0xFFFF;
660 make_nbt_name_client(&myname
, TEST_NAME
);
662 dest
= socket_address_from_strings(dgmsock
, dgmsock
->sock
->backend_name
,
663 address
, lpcfg_dgram_port(tctx
->lp_ctx
));
664 torture_assert(tctx
, dest
!= NULL
, "Error getting address");
665 status
= dgram_mailslot_netlogon_send(dgmsock
,
667 NBT_MAILSLOT_NTLOGON
,
669 torture_assert_ntstatus_ok(tctx
, status
, "Failed to send ntlogon request");
671 while (timeval_elapsed(&tv
) < 5 && !dgmslot
->private_data
) {
672 tevent_loop_once(dgmsock
->event_ctx
);
675 response
= talloc_get_type(dgmslot
->private_data
, struct nbt_netlogon_response
);
677 torture_assert(tctx
, response
!= NULL
, "Failed to receive a netlogon reply packet");
679 torture_assert_int_equal(tctx
, response
->response_type
, NETLOGON_GET_PDC
, "Got incorrect type of ntlogon response");
680 torture_assert_int_equal(tctx
, response
->data
.get_pdc
.command
, NETLOGON_RESPONSE_FROM_PDC
, "Got incorrect ntlogon response command");
688 test nbt dgram operations
690 struct torture_suite
*torture_nbt_dgram(TALLOC_CTX
*mem_ctx
)
692 struct torture_suite
*suite
= torture_suite_create(mem_ctx
, "dgram");
694 torture_suite_add_simple_test(suite
, "netlogon", nbt_test_netlogon
);
695 torture_suite_add_simple_test(suite
, "netlogon2", nbt_test_netlogon2
);
696 torture_suite_add_simple_test(suite
, "ntlogon", nbt_test_ntlogon
);