s3: smbd: dfs: Move lp_msdfs_shuffle_referrals() call out of parse_msdfs_symlink().
[Samba.git] / source4 / torture / nbt / dgram.c
blob2f7ea19443fa33b6fa8d037d80e709f58c8ae412
1 /*
2 Unix SMB/CIFS implementation.
4 NBT dgram testing
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/>.
22 #include "includes.h"
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)
42 NTSTATUS status;
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) {
48 return;
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,
55 netlogon);
56 if (!NT_STATUS_IS_OK(status)) {
57 printf("Failed to parse netlogon packet from %s:%d\n",
58 src->addr, src->port);
59 return;
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;
75 NTSTATUS status;
76 struct timeval tv = timeval_current();
78 struct socket_address *socket_address;
80 const char *address;
81 struct nbt_name name;
83 struct interface *ifaces;
85 name.name = lpcfg_workgroup(tctx->lp_ctx);
86 name.type = NBT_NAME_LOGON;
87 name.scope = NULL;
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),
92 0, 0,
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,
112 myaddress, 0);
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");
123 ZERO_STRUCT(logon);
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,
140 &myname, &logon);
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");
154 return true;
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;
168 NTSTATUS status;
169 struct timeval tv = timeval_current();
171 struct socket_address *socket_address;
173 const char *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;
183 name.scope = NULL;
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),
188 0, 0,
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,
207 myaddress, 0);
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");
218 ZERO_STRUCT(logon);
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,
236 &myname, &logon);
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");
254 torture_assert(tctx,
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");
263 ZERO_STRUCT(logon);
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,
281 &myname, &logon);
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");
299 torture_assert(tctx,
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");
317 ZERO_STRUCT(logon);
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,
336 &myname, &logon);
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");
353 torture_assert(tctx,
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");
362 ZERO_STRUCT(logon);
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,
382 &myname, &logon);
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");
399 torture_assert(tctx,
400 strstr(response->data.samlogon.data.nt5_ex.pdc_name, "\\\\") != NULL,
401 "PDC name should be in UNC form");
403 dgmslot->private_data = NULL;
405 ZERO_STRUCT(logon);
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,
425 &myname, &logon);
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");
442 torture_assert(tctx,
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);
447 return true;
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;
465 NTSTATUS status;
466 struct timeval tv = timeval_current();
468 struct socket_address *socket_address;
469 const char *address;
470 struct nbt_name name;
472 struct interface *ifaces;
474 name.name = lpcfg_workgroup(tctx->lp_ctx);
475 name.type = NBT_NAME_LOGON;
476 name.scope = NULL;
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,
499 myaddress, 0);
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");
518 ZERO_STRUCT(logon);
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,
537 &name, dest,
538 NBT_MAILSLOT_NTLOGON,
539 &myname, &logon);
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");
557 torture_assert(tctx,
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");
566 ZERO_STRUCT(logon);
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,
584 &name, dest,
585 NBT_MAILSLOT_NTLOGON,
586 &myname, &logon);
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");
604 torture_assert(tctx,
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");
613 ZERO_STRUCT(logon);
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,
628 &name, dest,
629 NBT_MAILSLOT_NTLOGON,
630 &myname, &logon);
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");
651 ZERO_STRUCT(logon);
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,
666 &name, dest,
667 NBT_MAILSLOT_NTLOGON,
668 &myname, &logon);
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");
683 return true;
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);
698 return suite;