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 "libcli/resolve/resolve.h"
28 #include "system/network.h"
29 #include "lib/socket/netif.h"
30 #include "param/param.h"
32 #define TEST_NAME "TORTURE_TEST"
35 reply handler for netlogon request
37 static void netlogon_handler(struct dgram_mailslot_handler *dgmslot,
38 struct nbt_dgram_packet *packet,
39 struct socket_address *src)
42 struct nbt_netlogon_response *netlogon = dgmslot->private_data;
44 dgmslot->private_data = netlogon = talloc(dgmslot, struct nbt_netlogon_response);
46 if (!dgmslot->private_data) {
50 printf("netlogon reply from %s:%d\n", src->addr, src->port);
52 /* Fills in the netlogon pointer */
53 status = dgram_mailslot_netlogon_parse_response(dgmslot, netlogon, packet, netlogon);
54 if (!NT_STATUS_IS_OK(status)) {
55 printf("Failed to parse netlogon packet from %s:%d\n",
56 src->addr, src->port);
63 /* test UDP/138 netlogon requests */
64 static bool nbt_test_netlogon(struct torture_context *tctx)
66 struct dgram_mailslot_handler *dgmslot;
67 struct nbt_dgram_socket *dgmsock = nbt_dgram_socket_init(tctx, tctx->ev);
68 struct socket_address *dest;
69 const char *myaddress;
70 struct nbt_netlogon_packet logon;
71 struct nbt_netlogon_response *response;
72 struct nbt_name myname;
74 struct timeval tv = timeval_current();
76 struct socket_address *socket_address;
81 struct interface *ifaces;
83 name.name = lp_workgroup(tctx->lp_ctx);
84 name.type = NBT_NAME_LOGON;
87 /* do an initial name resolution to find its IP */
88 torture_assert_ntstatus_ok(tctx,
89 resolve_name(lp_resolve_context(tctx->lp_ctx), &name, tctx, &address, tctx->ev),
90 talloc_asprintf(tctx, "Failed to resolve %s", name.name));
92 load_interfaces(tctx, lp_interfaces(tctx->lp_ctx), &ifaces);
93 myaddress = talloc_strdup(dgmsock, iface_best_ip(ifaces, address));
96 socket_address = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name,
97 myaddress, lp_dgram_port(tctx->lp_ctx));
98 torture_assert(tctx, socket_address != NULL, "Error getting address");
100 /* try receiving replies on port 138 first, which will only
101 work if we are root and smbd/nmbd are not running - fall
102 back to listening on any port, which means replies from
103 most windows versions won't be seen */
104 status = socket_listen(dgmsock->sock, socket_address, 0, 0);
105 if (!NT_STATUS_IS_OK(status)) {
106 talloc_free(socket_address);
107 socket_address = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name,
109 torture_assert(tctx, socket_address != NULL, "Error getting address");
111 socket_listen(dgmsock->sock, socket_address, 0, 0);
114 /* setup a temporary mailslot listener for replies */
115 dgmslot = dgram_mailslot_temp(dgmsock, NBT_MAILSLOT_GETDC,
116 netlogon_handler, NULL);
119 logon.command = LOGON_PRIMARY_QUERY;
120 logon.req.pdc.computer_name = TEST_NAME;
121 logon.req.pdc.mailslot_name = dgmslot->mailslot_name;
122 logon.req.pdc.unicode_name = TEST_NAME;
123 logon.req.pdc.nt_version = 1;
124 logon.req.pdc.lmnt_token = 0xFFFF;
125 logon.req.pdc.lm20_token = 0xFFFF;
127 make_nbt_name_client(&myname, TEST_NAME);
129 dest = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name,
130 address, lp_dgram_port(tctx->lp_ctx));
131 torture_assert(tctx, dest != NULL, "Error getting address");
133 status = dgram_mailslot_netlogon_send(dgmsock, &name, dest,
134 NBT_MAILSLOT_NETLOGON,
136 torture_assert_ntstatus_ok(tctx, status, "Failed to send netlogon request");
138 while (timeval_elapsed(&tv) < 5 && !dgmslot->private_data) {
139 event_loop_once(dgmsock->event_ctx);
142 response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
144 torture_assert(tctx, response != NULL, "Failed to receive a netlogon reply packet");
146 torture_assert(tctx, response->response_type == NETLOGON_GET_PDC, "Got incorrect type of netlogon response");
147 torture_assert(tctx, response->data.get_pdc.command == NETLOGON_RESPONSE_FROM_PDC, "Got incorrect netlogon response command");
153 /* test UDP/138 netlogon requests */
154 static bool nbt_test_netlogon2(struct torture_context *tctx)
156 struct dgram_mailslot_handler *dgmslot;
157 struct nbt_dgram_socket *dgmsock = nbt_dgram_socket_init(tctx, tctx->ev);
158 struct socket_address *dest;
159 const char *myaddress;
160 struct nbt_netlogon_packet logon;
161 struct nbt_netlogon_response *response;
162 struct nbt_name myname;
164 struct timeval tv = timeval_current();
166 struct socket_address *socket_address;
169 struct nbt_name name;
171 struct interface *ifaces;
172 struct test_join *join_ctx;
173 struct cli_credentials *machine_credentials;
174 const struct dom_sid *dom_sid;
176 name.name = lp_workgroup(tctx->lp_ctx);
177 name.type = NBT_NAME_LOGON;
180 /* do an initial name resolution to find its IP */
181 torture_assert_ntstatus_ok(tctx,
182 resolve_name(lp_resolve_context(tctx->lp_ctx), &name, tctx, &address, tctx->ev),
183 talloc_asprintf(tctx, "Failed to resolve %s", name.name));
185 load_interfaces(tctx, lp_interfaces(tctx->lp_ctx), &ifaces);
186 myaddress = talloc_strdup(dgmsock, iface_best_ip(ifaces, address));
188 socket_address = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name,
189 myaddress, lp_dgram_port(tctx->lp_ctx));
190 torture_assert(tctx, socket_address != NULL, "Error getting address");
192 /* try receiving replies on port 138 first, which will only
193 work if we are root and smbd/nmbd are not running - fall
194 back to listening on any port, which means replies from
195 some windows versions won't be seen */
196 status = socket_listen(dgmsock->sock, socket_address, 0, 0);
197 if (!NT_STATUS_IS_OK(status)) {
198 talloc_free(socket_address);
199 socket_address = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name,
201 torture_assert(tctx, socket_address != NULL, "Error getting address");
203 socket_listen(dgmsock->sock, socket_address, 0, 0);
206 /* setup a temporary mailslot listener for replies */
207 dgmslot = dgram_mailslot_temp(dgmsock, NBT_MAILSLOT_GETDC,
208 netlogon_handler, NULL);
212 logon.command = LOGON_SAM_LOGON_REQUEST;
213 logon.req.logon.request_count = 0;
214 logon.req.logon.computer_name = TEST_NAME;
215 logon.req.logon.user_name = "";
216 logon.req.logon.mailslot_name = dgmslot->mailslot_name;
217 logon.req.logon.nt_version = NETLOGON_NT_VERSION_5EX_WITH_IP|NETLOGON_NT_VERSION_5|NETLOGON_NT_VERSION_1;
218 logon.req.logon.lmnt_token = 0xFFFF;
219 logon.req.logon.lm20_token = 0xFFFF;
221 make_nbt_name_client(&myname, TEST_NAME);
223 dest = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name,
224 address, lp_dgram_port(tctx->lp_ctx));
226 torture_assert(tctx, dest != NULL, "Error getting address");
227 status = dgram_mailslot_netlogon_send(dgmsock, &name, dest,
228 NBT_MAILSLOT_NETLOGON,
230 torture_assert_ntstatus_ok(tctx, status, "Failed to send netlogon request");
232 while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
233 event_loop_once(dgmsock->event_ctx);
236 response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
238 torture_assert(tctx, response != NULL, "Failed to receive a netlogon reply packet");
240 torture_assert_int_equal(tctx, response->response_type, NETLOGON_SAMLOGON, "Got incorrect type of netlogon response");
241 map_netlogon_samlogon_response(&response->data.samlogon);
243 torture_assert_int_equal(tctx, response->data.samlogon.data.nt5_ex.command, LOGON_SAM_LOGON_RESPONSE_EX, "Got incorrect netlogon response command");
244 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");
246 /* setup (another) temporary mailslot listener for replies */
247 dgmslot = dgram_mailslot_temp(dgmsock, NBT_MAILSLOT_GETDC,
248 netlogon_handler, NULL);
251 logon.command = LOGON_SAM_LOGON_REQUEST;
252 logon.req.logon.request_count = 0;
253 logon.req.logon.computer_name = TEST_NAME;
254 logon.req.logon.user_name = TEST_NAME"$";
255 logon.req.logon.mailslot_name = dgmslot->mailslot_name;
256 logon.req.logon.nt_version = 1;
257 logon.req.logon.lmnt_token = 0xFFFF;
258 logon.req.logon.lm20_token = 0xFFFF;
260 make_nbt_name_client(&myname, TEST_NAME);
262 dest = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name,
263 address, lp_dgram_port(tctx->lp_ctx));
265 torture_assert(tctx, dest != NULL, "Error getting address");
266 status = dgram_mailslot_netlogon_send(dgmsock, &name, dest,
267 NBT_MAILSLOT_NETLOGON,
269 torture_assert_ntstatus_ok(tctx, status, "Failed to send netlogon request");
271 while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
272 event_loop_once(dgmsock->event_ctx);
275 response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
277 torture_assert(tctx, response != NULL, "Failed to receive a netlogon reply packet");
279 torture_assert_int_equal(tctx, response->response_type, NETLOGON_SAMLOGON, "Got incorrect type of netlogon response");
280 map_netlogon_samlogon_response(&response->data.samlogon);
282 torture_assert_int_equal(tctx, response->data.samlogon.data.nt5_ex.command, LOGON_SAM_LOGON_USER_UNKNOWN, "Got incorrect netlogon response command");
284 torture_assert_str_equal(tctx, response->data.samlogon.data.nt5_ex.user_name, TEST_NAME"$", "Got incorrect user in netlogon response");
286 join_ctx = torture_join_domain(tctx, TEST_NAME,
287 ACB_WSTRUST, &machine_credentials);
289 torture_assert(tctx, join_ctx != NULL,
290 talloc_asprintf(tctx, "Failed to join domain %s as %s\n",
291 lp_workgroup(tctx->lp_ctx), TEST_NAME));
293 dom_sid = torture_join_sid(join_ctx);
295 /* setup (another) temporary mailslot listener for replies */
296 dgmslot = dgram_mailslot_temp(dgmsock, NBT_MAILSLOT_GETDC,
297 netlogon_handler, NULL);
300 logon.command = LOGON_SAM_LOGON_REQUEST;
301 logon.req.logon.request_count = 0;
302 logon.req.logon.computer_name = TEST_NAME;
303 logon.req.logon.user_name = TEST_NAME"$";
304 logon.req.logon.mailslot_name = dgmslot->mailslot_name;
305 logon.req.logon.sid = *dom_sid;
306 logon.req.logon.nt_version = 1;
307 logon.req.logon.lmnt_token = 0xFFFF;
308 logon.req.logon.lm20_token = 0xFFFF;
310 make_nbt_name_client(&myname, TEST_NAME);
312 dest = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name,
313 address, lp_dgram_port(tctx->lp_ctx));
315 torture_assert(tctx, dest != NULL, "Error getting address");
316 status = dgram_mailslot_netlogon_send(dgmsock, &name, dest,
317 NBT_MAILSLOT_NETLOGON,
319 torture_assert_ntstatus_ok(tctx, status, "Failed to send netlogon request");
322 while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
323 event_loop_once(dgmsock->event_ctx);
326 response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
328 torture_assert(tctx, response != NULL, "Failed to receive a netlogon reply packet");
330 torture_assert_int_equal(tctx, response->response_type, NETLOGON_SAMLOGON, "Got incorrect type of netlogon response");
331 map_netlogon_samlogon_response(&response->data.samlogon);
333 torture_assert_int_equal(tctx, response->data.samlogon.data.nt5_ex.command, LOGON_SAM_LOGON_USER_UNKNOWN, "Got incorrect netlogon response command");
335 /* setup (another) temporary mailslot listener for replies */
336 dgmslot = dgram_mailslot_temp(dgmsock, NBT_MAILSLOT_GETDC,
337 netlogon_handler, NULL);
339 torture_assert(tctx, dgmslot != NULL, "Error getting a Mailslot for GetDC reply");
342 logon.command = LOGON_SAM_LOGON_REQUEST;
343 logon.req.logon.request_count = 0;
344 logon.req.logon.computer_name = TEST_NAME;
345 logon.req.logon.user_name = TEST_NAME"$";
346 logon.req.logon.mailslot_name = dgmslot->mailslot_name;
347 logon.req.logon.sid = *dom_sid;
348 logon.req.logon.acct_control = ACB_WSTRUST;
349 logon.req.logon.nt_version = 1;
350 logon.req.logon.lmnt_token = 0xFFFF;
351 logon.req.logon.lm20_token = 0xFFFF;
353 make_nbt_name_client(&myname, TEST_NAME);
355 dest = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name,
356 address, lp_dgram_port(tctx->lp_ctx));
358 torture_assert(tctx, dest != NULL, "Error getting address");
359 status = dgram_mailslot_netlogon_send(dgmsock, &name, dest,
360 NBT_MAILSLOT_NETLOGON,
362 torture_assert_ntstatus_ok(tctx, status, "Failed to send netlogon request");
365 while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
366 event_loop_once(dgmsock->event_ctx);
369 response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
371 torture_assert(tctx, response != NULL, "Failed to receive a netlogon reply packet");
373 torture_assert_int_equal(tctx, response->response_type, NETLOGON_SAMLOGON, "Got incorrect type of netlogon response");
374 map_netlogon_samlogon_response(&response->data.samlogon);
376 torture_assert_int_equal(tctx, response->data.samlogon.data.nt5_ex.command, LOGON_SAM_LOGON_RESPONSE, "Got incorrect netlogon response command");
378 dgmslot->private_data = NULL;
381 logon.command = LOGON_SAM_LOGON_REQUEST;
382 logon.req.logon.request_count = 0;
383 logon.req.logon.computer_name = TEST_NAME;
384 logon.req.logon.user_name = TEST_NAME"$";
385 logon.req.logon.mailslot_name = dgmslot->mailslot_name;
386 logon.req.logon.sid = *dom_sid;
387 logon.req.logon.acct_control = ACB_NORMAL;
388 logon.req.logon.nt_version = 1;
389 logon.req.logon.lmnt_token = 0xFFFF;
390 logon.req.logon.lm20_token = 0xFFFF;
392 make_nbt_name_client(&myname, TEST_NAME);
394 dest = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name,
395 address, lp_dgram_port(tctx->lp_ctx));
397 torture_assert(tctx, dest != NULL, "Error getting address");
398 status = dgram_mailslot_netlogon_send(dgmsock, &name, dest,
399 NBT_MAILSLOT_NETLOGON,
401 torture_assert_ntstatus_ok(tctx, status, "Failed to send netlogon request");
404 while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
405 event_loop_once(dgmsock->event_ctx);
408 response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
410 torture_assert(tctx, response != NULL, "Failed to receive a netlogon reply packet");
412 torture_assert_int_equal(tctx, response->response_type, NETLOGON_SAMLOGON, "Got incorrect type of netlogon response");
413 map_netlogon_samlogon_response(&response->data.samlogon);
415 torture_assert_int_equal(tctx, response->data.samlogon.data.nt5_ex.command, LOGON_SAM_LOGON_USER_UNKNOWN, "Got incorrect netlogon response command");
417 torture_leave_domain(tctx, join_ctx);
422 /* test UDP/138 ntlogon requests */
423 static bool nbt_test_ntlogon(struct torture_context *tctx)
425 struct dgram_mailslot_handler *dgmslot;
426 struct nbt_dgram_socket *dgmsock = nbt_dgram_socket_init(tctx, tctx->ev);
427 struct socket_address *dest;
428 struct test_join *join_ctx;
429 const struct dom_sid *dom_sid;
430 struct cli_credentials *machine_credentials;
432 const char *myaddress;
433 struct nbt_netlogon_packet logon;
434 struct nbt_netlogon_response *response;
435 struct nbt_name myname;
437 struct timeval tv = timeval_current();
439 struct socket_address *socket_address;
441 struct nbt_name name;
443 struct interface *ifaces;
445 name.name = lp_workgroup(tctx->lp_ctx);
446 name.type = NBT_NAME_LOGON;
449 /* do an initial name resolution to find its IP */
450 torture_assert_ntstatus_ok(tctx,
451 resolve_name(lp_resolve_context(tctx->lp_ctx), &name, tctx, &address, tctx->ev),
452 talloc_asprintf(tctx, "Failed to resolve %s", name.name));
454 load_interfaces(tctx, lp_interfaces(tctx->lp_ctx), &ifaces);
455 myaddress = talloc_strdup(dgmsock, iface_best_ip(ifaces, address));
457 socket_address = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name,
458 myaddress, lp_dgram_port(tctx->lp_ctx));
459 torture_assert(tctx, socket_address != NULL, "Error getting address");
461 /* try receiving replies on port 138 first, which will only
462 work if we are root and smbd/nmbd are not running - fall
463 back to listening on any port, which means replies from
464 most windows versions won't be seen */
465 status = socket_listen(dgmsock->sock, socket_address, 0, 0);
466 if (!NT_STATUS_IS_OK(status)) {
467 talloc_free(socket_address);
468 socket_address = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name,
470 torture_assert(tctx, socket_address != NULL, "Error getting address");
472 socket_listen(dgmsock->sock, socket_address, 0, 0);
475 join_ctx = torture_join_domain(tctx, TEST_NAME,
476 ACB_WSTRUST, &machine_credentials);
477 dom_sid = torture_join_sid(join_ctx);
479 torture_assert(tctx, join_ctx != NULL,
480 talloc_asprintf(tctx, "Failed to join domain %s as %s\n",
481 lp_workgroup(tctx->lp_ctx), TEST_NAME));
483 /* setup a temporary mailslot listener for replies */
484 dgmslot = dgram_mailslot_temp(dgmsock, NBT_MAILSLOT_GETDC,
485 netlogon_handler, NULL);
489 logon.command = LOGON_SAM_LOGON_REQUEST;
490 logon.req.logon.request_count = 0;
491 logon.req.logon.computer_name = TEST_NAME;
492 logon.req.logon.user_name = TEST_NAME"$";
493 logon.req.logon.mailslot_name = dgmslot->mailslot_name;
494 logon.req.logon.acct_control = ACB_WSTRUST;
495 /* Try with a SID this time */
496 logon.req.logon.sid = *dom_sid;
497 logon.req.logon.nt_version = 1;
498 logon.req.logon.lmnt_token = 0xFFFF;
499 logon.req.logon.lm20_token = 0xFFFF;
501 make_nbt_name_client(&myname, TEST_NAME);
503 dest = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name,
504 address, lp_dgram_port(tctx->lp_ctx));
505 torture_assert(tctx, dest != NULL, "Error getting address");
506 status = dgram_mailslot_netlogon_send(dgmsock,
508 NBT_MAILSLOT_NTLOGON,
510 torture_assert_ntstatus_ok(tctx, status, "Failed to send ntlogon request");
512 while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
513 event_loop_once(dgmsock->event_ctx);
516 response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
518 torture_assert(tctx, response != NULL, "Failed to receive a netlogon reply packet");
520 torture_assert_int_equal(tctx, response->response_type, NETLOGON_SAMLOGON, "Got incorrect type of netlogon response");
521 map_netlogon_samlogon_response(&response->data.samlogon);
523 torture_assert_int_equal(tctx, response->data.samlogon.data.nt5_ex.command, LOGON_SAM_LOGON_RESPONSE, "Got incorrect netlogon response command");
525 torture_assert_str_equal(tctx, response->data.samlogon.data.nt5_ex.user_name, TEST_NAME"$", "Got incorrect user in netlogon response");
528 /* setup a temporary mailslot listener for replies */
529 dgmslot = dgram_mailslot_temp(dgmsock, NBT_MAILSLOT_GETDC,
530 netlogon_handler, NULL);
534 logon.command = LOGON_SAM_LOGON_REQUEST;
535 logon.req.logon.request_count = 0;
536 logon.req.logon.computer_name = TEST_NAME;
537 logon.req.logon.user_name = TEST_NAME"$";
538 logon.req.logon.mailslot_name = dgmslot->mailslot_name;
539 logon.req.logon.acct_control = ACB_WSTRUST;
540 /* Leave sid as all zero */
541 logon.req.logon.nt_version = 1;
542 logon.req.logon.lmnt_token = 0xFFFF;
543 logon.req.logon.lm20_token = 0xFFFF;
545 make_nbt_name_client(&myname, TEST_NAME);
547 dest = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name,
548 address, lp_dgram_port(tctx->lp_ctx));
549 torture_assert(tctx, dest != NULL, "Error getting address");
550 status = dgram_mailslot_netlogon_send(dgmsock,
552 NBT_MAILSLOT_NTLOGON,
554 torture_assert_ntstatus_ok(tctx, status, "Failed to send ntlogon request");
556 while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
557 event_loop_once(dgmsock->event_ctx);
560 response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
562 torture_assert(tctx, response != NULL, "Failed to receive a netlogon reply packet");
564 torture_assert_int_equal(tctx, response->response_type, NETLOGON_SAMLOGON, "Got incorrect type of netlogon response");
565 map_netlogon_samlogon_response(&response->data.samlogon);
567 torture_assert_int_equal(tctx, response->data.samlogon.data.nt5_ex.command, LOGON_SAM_LOGON_RESPONSE, "Got incorrect netlogon response command");
569 torture_assert_str_equal(tctx, response->data.samlogon.data.nt5_ex.user_name, TEST_NAME"$", "Got incorrect user in netlogon response");
572 /* setup (another) temporary mailslot listener for replies */
573 dgmslot = dgram_mailslot_temp(dgmsock, NBT_MAILSLOT_GETDC,
574 netlogon_handler, NULL);
577 logon.command = LOGON_PRIMARY_QUERY;
578 logon.req.pdc.computer_name = TEST_NAME;
579 logon.req.pdc.mailslot_name = dgmslot->mailslot_name;
580 logon.req.pdc.unicode_name = TEST_NAME;
581 logon.req.pdc.nt_version = 1;
582 logon.req.pdc.lmnt_token = 0xFFFF;
583 logon.req.pdc.lm20_token = 0xFFFF;
585 make_nbt_name_client(&myname, TEST_NAME);
587 dest = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name,
588 address, lp_dgram_port(tctx->lp_ctx));
589 torture_assert(tctx, dest != NULL, "Error getting address");
590 status = dgram_mailslot_netlogon_send(dgmsock,
592 NBT_MAILSLOT_NTLOGON,
594 torture_assert_ntstatus_ok(tctx, status, "Failed to send ntlogon request");
596 while (timeval_elapsed(&tv) < 5 && !dgmslot->private_data) {
597 event_loop_once(dgmsock->event_ctx);
600 response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
602 torture_assert(tctx, response != NULL, "Failed to receive a netlogon reply packet");
604 torture_assert_int_equal(tctx, response->response_type, NETLOGON_GET_PDC, "Got incorrect type of ntlogon response");
605 torture_assert_int_equal(tctx, response->data.get_pdc.command, NETLOGON_RESPONSE_FROM_PDC, "Got incorrect ntlogon response command");
607 torture_leave_domain(tctx, join_ctx);
609 /* setup (another) temporary mailslot listener for replies */
610 dgmslot = dgram_mailslot_temp(dgmsock, NBT_MAILSLOT_GETDC,
611 netlogon_handler, NULL);
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, lp_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 event_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");
650 test nbt dgram operations
652 struct torture_suite *torture_nbt_dgram(TALLOC_CTX *mem_ctx)
654 struct torture_suite *suite = torture_suite_create(mem_ctx, "DGRAM");
656 torture_suite_add_simple_test(suite, "netlogon", nbt_test_netlogon);
657 torture_suite_add_simple_test(suite, "netlogon2", nbt_test_netlogon2);
658 torture_suite_add_simple_test(suite, "ntlogon", nbt_test_ntlogon);