2 Unix SMB/CIFS implementation.
3 Initial test for the smb2 client lib
4 Copyright (C) Volker Lendecke 2011
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #include "torture/proto.h"
24 #include "../libcli/smb/smbXcli_base.h"
25 #include "libcli/security/security.h"
26 #include "libsmb/proto.h"
27 #include "auth/gensec/gensec.h"
28 #include "auth_generic.h"
29 #include "../librpc/ndr/libndr.h"
31 extern fstring host, workgroup, share, password, username, myname;
33 bool run_smb2_basic(int dummy)
35 struct cli_state *cli;
37 uint64_t fid_persistent, fid_volatile;
38 const char *hello = "Hello, world\n";
42 uint32_t dir_data_length;
43 uint32_t saved_tid = 0;
44 struct smbXcli_tcon *saved_tcon = NULL;
45 uint64_t saved_uid = 0;
47 printf("Starting SMB2-BASIC\n");
49 if (!torture_init_connection(&cli)) {
53 status = smbXcli_negprot(cli->conn, cli->timeout,
54 PROTOCOL_SMB2_02, PROTOCOL_SMB2_02);
55 if (!NT_STATUS_IS_OK(status)) {
56 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
60 status = cli_session_setup(cli, username,
63 if (!NT_STATUS_IS_OK(status)) {
64 printf("cli_session_setup returned %s\n", nt_errstr(status));
68 status = cli_tree_connect(cli, share, "?????", "", 0);
69 if (!NT_STATUS_IS_OK(status)) {
70 printf("cli_tree_connect returned %s\n", nt_errstr(status));
74 status = smb2cli_create(cli->conn, cli->timeout, cli->smb2.session,
75 cli->smb2.tcon, "smb2-basic.txt",
76 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
77 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
78 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
79 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
80 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
81 FILE_CREATE, /* create_disposition, */
82 FILE_DELETE_ON_CLOSE, /* create_options, */
83 NULL, /* smb2_create_blobs *blobs */
87 if (!NT_STATUS_IS_OK(status)) {
88 printf("smb2cli_create returned %s\n", nt_errstr(status));
92 status = smb2cli_write(cli->conn, cli->timeout, cli->smb2.session,
93 cli->smb2.tcon, strlen(hello), 0, fid_persistent,
94 fid_volatile, 0, 0, (const uint8_t *)hello, NULL);
95 if (!NT_STATUS_IS_OK(status)) {
96 printf("smb2cli_write returned %s\n", nt_errstr(status));
100 status = smb2cli_flush(cli->conn, cli->timeout, cli->smb2.session,
101 cli->smb2.tcon, fid_persistent, fid_volatile);
102 if (!NT_STATUS_IS_OK(status)) {
103 printf("smb2cli_flush returned %s\n", nt_errstr(status));
107 status = smb2cli_read(cli->conn, cli->timeout, cli->smb2.session,
108 cli->smb2.tcon, 0x10000, 0, fid_persistent,
110 talloc_tos(), &result, &nread);
111 if (!NT_STATUS_IS_OK(status)) {
112 printf("smb2cli_read returned %s\n", nt_errstr(status));
116 if (nread != strlen(hello)) {
117 printf("smb2cli_read returned %d bytes, expected %d\n",
118 (int)nread, (int)strlen(hello));
122 if (memcmp(hello, result, nread) != 0) {
123 printf("smb2cli_read returned '%s', expected '%s'\n",
128 status = smb2cli_close(cli->conn, cli->timeout, cli->smb2.session,
129 cli->smb2.tcon, 0, fid_persistent, fid_volatile);
130 if (!NT_STATUS_IS_OK(status)) {
131 printf("smb2cli_close returned %s\n", nt_errstr(status));
135 status = smb2cli_create(cli->conn, cli->timeout, cli->smb2.session,
137 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
138 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
141 SEC_DIR_READ_ATTRIBUTE, /* desired_access, */
142 0, /* file_attributes, */
143 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
144 FILE_OPEN, /* create_disposition, */
145 FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, /* create_options, */
146 NULL, /* smb2_create_blobs *blobs */
150 if (!NT_STATUS_IS_OK(status)) {
151 printf("smb2cli_create returned %s\n", nt_errstr(status));
155 status = smb2cli_query_directory(
156 cli->conn, cli->timeout, cli->smb2.session, cli->smb2.tcon,
157 1, 0, 0, fid_persistent, fid_volatile, "*", 0xffff,
158 talloc_tos(), &dir_data, &dir_data_length);
160 if (!NT_STATUS_IS_OK(status)) {
161 printf("smb2cli_query_directory returned %s\n", nt_errstr(status));
165 status = smb2cli_close(cli->conn, cli->timeout, cli->smb2.session,
166 cli->smb2.tcon, 0, fid_persistent, fid_volatile);
167 if (!NT_STATUS_IS_OK(status)) {
168 printf("smb2cli_close returned %s\n", nt_errstr(status));
172 saved_tid = smb2cli_tcon_current_id(cli->smb2.tcon);
173 saved_tcon = cli->smb2.tcon;
174 cli->smb2.tcon = smbXcli_tcon_create(cli);
175 smb2cli_tcon_set_values(cli->smb2.tcon,
180 0, /* capabilities */
181 0 /* maximal_access */);
182 status = smb2cli_tdis(cli->conn,
186 if (!NT_STATUS_IS_OK(status)) {
187 printf("smb2cli_tdis returned %s\n", nt_errstr(status));
190 talloc_free(cli->smb2.tcon);
191 cli->smb2.tcon = saved_tcon;
193 status = smb2cli_tdis(cli->conn,
197 if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
198 printf("2nd smb2cli_tdis returned %s\n", nt_errstr(status));
202 saved_uid = smb2cli_session_current_id(cli->smb2.session);
203 status = smb2cli_logoff(cli->conn, cli->timeout, cli->smb2.session);
204 if (!NT_STATUS_IS_OK(status)) {
205 printf("smb2cli_logoff returned %s\n", nt_errstr(status));
209 cli->smb2.session = smbXcli_session_create(cli, cli->conn);
210 if (cli->smb2.session == NULL) {
211 printf("smbXcli_session_create() returned NULL\n");
215 smb2cli_session_set_id_and_flags(cli->smb2.session, saved_uid, 0);
217 status = smb2cli_logoff(cli->conn, cli->timeout, cli->smb2.session);
218 if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
219 printf("2nd smb2cli_logoff returned %s\n", nt_errstr(status));
226 bool run_smb2_negprot(int dummy)
228 struct cli_state *cli;
230 enum protocol_types protocol;
231 const char *name = NULL;
233 printf("Starting SMB2-NEGPROT\n");
235 if (!torture_init_connection(&cli)) {
239 status = smbXcli_negprot(cli->conn, cli->timeout,
240 PROTOCOL_CORE, PROTOCOL_LATEST);
241 if (!NT_STATUS_IS_OK(status)) {
242 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
246 protocol = smbXcli_conn_protocol(cli->conn);
249 case PROTOCOL_SMB2_02:
252 case PROTOCOL_SMB2_10:
255 case PROTOCOL_SMB2_22:
258 case PROTOCOL_SMB2_24:
261 case PROTOCOL_SMB3_00:
264 case PROTOCOL_SMB3_02:
267 case PROTOCOL_SMB3_10:
270 case PROTOCOL_SMB3_11:
278 printf("Server supports %s\n", name);
280 printf("Server DOES NOT support SMB2\n");
284 status = smbXcli_negprot(cli->conn, cli->timeout,
286 if (!NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_RESET) &&
287 !NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_DISCONNECTED) &&
288 !NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_ABORTED)) {
289 printf("2nd smbXcli_negprot should disconnect - returned %s\n",
294 if (smbXcli_conn_is_connected(cli->conn)) {
295 printf("2nd smbXcli_negprot should disconnect "
296 "- still connected\n");
303 bool run_smb2_session_reconnect(int dummy)
305 struct cli_state *cli1;
306 struct cli_state *cli2;
309 uint64_t fid_persistent, fid_volatile;
310 struct tevent_context *ev;
311 struct tevent_req *subreq;
312 DATA_BLOB in_blob = data_blob_null;
314 DATA_BLOB session_key;
315 struct auth_generic_state *auth_generic_state;
316 struct iovec *recv_iov;
317 const char *hello = "Hello, world\n";
321 printf("Starting SMB2-SESSION-RECONNECT\n");
323 if (!torture_init_connection(&cli1)) {
327 status = smbXcli_negprot(cli1->conn, cli1->timeout,
328 PROTOCOL_SMB2_02, PROTOCOL_LATEST);
329 if (!NT_STATUS_IS_OK(status)) {
330 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
334 status = cli_session_setup(cli1, username,
337 if (!NT_STATUS_IS_OK(status)) {
338 printf("cli_session_setup returned %s\n", nt_errstr(status));
342 status = cli_tree_connect(cli1, share, "?????", "", 0);
343 if (!NT_STATUS_IS_OK(status)) {
344 printf("cli_tree_connect returned %s\n", nt_errstr(status));
348 status = smb2cli_create(cli1->conn, cli1->timeout, cli1->smb2.session,
349 cli1->smb2.tcon, "session-reconnect.txt",
350 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
351 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
352 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
353 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
354 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
355 FILE_CREATE, /* create_disposition, */
356 FILE_DELETE_ON_CLOSE, /* create_options, */
357 NULL, /* smb2_create_blobs *blobs */
361 if (!NT_STATUS_IS_OK(status)) {
362 printf("smb2cli_create on cli1 %s\n", nt_errstr(status));
366 status = smb2cli_write(cli1->conn, cli1->timeout, cli1->smb2.session,
367 cli1->smb2.tcon, strlen(hello), 0, fid_persistent,
368 fid_volatile, 0, 0, (const uint8_t *)hello, NULL);
369 if (!NT_STATUS_IS_OK(status)) {
370 printf("smb2cli_write returned %s\n", nt_errstr(status));
374 status = smb2cli_flush(cli1->conn, cli1->timeout, cli1->smb2.session,
375 cli1->smb2.tcon, fid_persistent, fid_volatile);
376 if (!NT_STATUS_IS_OK(status)) {
377 printf("smb2cli_flush returned %s\n", nt_errstr(status));
381 status = smb2cli_read(cli1->conn, cli1->timeout, cli1->smb2.session,
382 cli1->smb2.tcon, 0x10000, 0, fid_persistent,
384 talloc_tos(), &result, &nread);
385 if (!NT_STATUS_IS_OK(status)) {
386 printf("smb2cli_read returned %s\n", nt_errstr(status));
390 if (nread != strlen(hello)) {
391 printf("smb2cli_read returned %d bytes, expected %d\n",
392 (int)nread, (int)strlen(hello));
396 if (memcmp(hello, result, nread) != 0) {
397 printf("smb2cli_read returned '%s', expected '%s'\n",
402 /* prepare second session */
404 if (!torture_init_connection(&cli2)) {
408 status = smbXcli_negprot(cli2->conn, cli2->timeout,
409 PROTOCOL_SMB2_02, PROTOCOL_LATEST);
410 if (!NT_STATUS_IS_OK(status)) {
411 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
415 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
416 if (!NT_STATUS_IS_OK(status)) {
417 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
421 gensec_want_feature(auth_generic_state->gensec_security,
422 GENSEC_FEATURE_SESSION_KEY);
423 status = auth_generic_set_username(auth_generic_state, username);
424 if (!NT_STATUS_IS_OK(status)) {
425 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
429 status = auth_generic_set_domain(auth_generic_state, workgroup);
430 if (!NT_STATUS_IS_OK(status)) {
431 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
435 status = auth_generic_set_password(auth_generic_state, password);
436 if (!NT_STATUS_IS_OK(status)) {
437 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
441 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
442 if (!NT_STATUS_IS_OK(status)) {
443 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
447 ev = samba_tevent_context_init(talloc_tos());
449 printf("samba_tevent_context_init() returned NULL\n");
453 status = gensec_update(auth_generic_state->gensec_security,
454 talloc_tos(), data_blob_null, &in_blob);
455 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
456 printf("gensec_update returned %s\n", nt_errstr(status));
460 cli2->smb2.session = smbXcli_session_create(cli2, cli2->conn);
462 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
467 SMB2_CAP_DFS, /* in_capabilities */
469 /* in_previous_session_id: */
470 smb2cli_session_current_id(cli1->smb2.session),
471 &in_blob); /* in_security_buffer */
472 if (subreq == NULL) {
473 printf("smb2cli_session_setup_send() returned NULL\n");
477 ok = tevent_req_poll(subreq, ev);
479 printf("tevent_req_poll() returned false\n");
483 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
485 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
486 printf("smb2cli_session_setup_recv returned %s\n",
491 status = gensec_update(auth_generic_state->gensec_security,
492 talloc_tos(), out_blob, &in_blob);
493 if (!NT_STATUS_IS_OK(status)) {
494 printf("auth_generic_update returned %s\n", nt_errstr(status));
498 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
503 SMB2_CAP_DFS, /* in_capabilities */
505 /* in_previous_session_id: */
506 smb2cli_session_current_id(cli1->smb2.session),
507 &in_blob); /* in_security_buffer */
508 if (subreq == NULL) {
509 printf("smb2cli_session_setup_send() returned NULL\n");
513 ok = tevent_req_poll(subreq, ev);
515 printf("tevent_req_poll() returned false\n");
519 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
520 &recv_iov, &out_blob);
521 if (!NT_STATUS_IS_OK(status)) {
522 printf("smb2cli_session_setup_recv returned %s\n",
527 status = gensec_session_key(auth_generic_state->gensec_security, talloc_tos(),
529 if (!NT_STATUS_IS_OK(status)) {
530 printf("gensec_session_key returned %s\n",
535 /* check file operation on the old client */
537 status = smb2cli_flush(cli1->conn, cli1->timeout, cli1->smb2.session,
538 cli1->smb2.tcon, fid_persistent, fid_volatile);
539 if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
540 printf("smb2cli_flush returned %s\n", nt_errstr(status));
544 status = cli_tree_connect(cli1, share, "?????", "", 0);
545 if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
546 printf("cli_tree_connect returned %s\n", nt_errstr(status));
551 * checking file operations without signing.
552 * on w2k8r2 at least, flush, read and write also work the same way,
553 * while create gives ACCESS_DENIED without signing
555 status = smb2cli_flush(cli2->conn, cli2->timeout, cli2->smb2.session,
556 cli2->smb2.tcon, fid_persistent, fid_volatile);
557 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED) &&
558 !NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED))
560 printf("smb2cli_flush returned %s\n", nt_errstr(status));
564 status = smb2cli_write(cli2->conn, cli2->timeout, cli2->smb2.session,
565 cli2->smb2.tcon, strlen(hello), 0, fid_persistent,
566 fid_volatile, 0, 0, (const uint8_t *)hello, NULL);
567 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED) &&
568 !NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED))
570 printf("smb2cli_write returned %s\n", nt_errstr(status));
574 status = smb2cli_read(cli2->conn, cli2->timeout, cli2->smb2.session,
575 cli2->smb2.tcon, 0x10000, 0, fid_persistent,
577 talloc_tos(), &result, &nread);
578 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED) &&
579 !NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED))
581 printf("smb2cli_read returned %s\n", nt_errstr(status));
585 status = smb2cli_create(cli2->conn, cli2->timeout, cli2->smb2.session,
586 cli2->smb2.tcon, "session-reconnect.txt",
587 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
588 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
589 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
590 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
591 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
592 FILE_CREATE, /* create_disposition, */
593 FILE_DELETE_ON_CLOSE, /* create_options, */
594 NULL, /* smb2_create_blobs *blobs */
598 if (!NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED) &&
599 !NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
600 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
604 /* now grab the session key and try with signing */
606 status = smb2cli_session_set_session_key(cli2->smb2.session,
609 if (!NT_STATUS_IS_OK(status)) {
610 printf("smb2cli_session_set_session_key %s\n", nt_errstr(status));
614 /* the tid seems to be irrelevant at this stage */
616 status = smb2cli_flush(cli2->conn, cli2->timeout, cli2->smb2.session,
617 cli1->smb2.tcon, fid_persistent, fid_volatile);
618 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED) &&
619 !NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED))
621 printf("smb2cli_flush returned %s\n", nt_errstr(status));
625 status = smb2cli_write(cli2->conn, cli2->timeout, cli2->smb2.session,
626 cli1->smb2.tcon, strlen(hello), 0, fid_persistent,
627 fid_volatile, 0, 0, (const uint8_t *)hello, NULL);
628 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED) &&
629 !NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED))
631 printf("smb2cli_write returned %s\n", nt_errstr(status));
635 status = smb2cli_read(cli2->conn, cli2->timeout, cli2->smb2.session,
636 cli1->smb2.tcon, 0x10000, 0, fid_persistent,
638 talloc_tos(), &result, &nread);
639 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED) &&
640 !NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED))
642 printf("smb2cli_read returned %s\n", nt_errstr(status));
646 status = smb2cli_create(cli2->conn, cli2->timeout, cli2->smb2.session,
647 cli1->smb2.tcon, "session-reconnect.txt",
648 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
649 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
650 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
651 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
652 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
653 FILE_CREATE, /* create_disposition, */
654 FILE_DELETE_ON_CLOSE, /* create_options, */
655 NULL, /* smb2_create_blobs *blobs */
659 if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED) &&
660 !NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED))
662 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
666 /* now do a new tcon and test file calls again */
668 status = cli_tree_connect(cli2, share, "?????", "", 0);
669 if (!NT_STATUS_IS_OK(status)) {
670 printf("cli_tree_connect returned %s\n", nt_errstr(status));
674 status = smb2cli_create(cli2->conn, cli2->timeout, cli2->smb2.session,
675 cli2->smb2.tcon, "session-reconnect.txt",
676 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
677 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
678 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
679 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
680 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
681 FILE_CREATE, /* create_disposition, */
682 FILE_DELETE_ON_CLOSE, /* create_options, */
683 NULL, /* smb2_create_blobs *blobs */
687 if (!NT_STATUS_IS_OK(status)) {
688 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
692 status = smb2cli_write(cli2->conn, cli2->timeout, cli2->smb2.session,
693 cli2->smb2.tcon, strlen(hello), 0, fid_persistent,
694 fid_volatile, 0, 0, (const uint8_t *)hello, NULL);
695 if (!NT_STATUS_IS_OK(status)) {
696 printf("smb2cli_write returned %s\n", nt_errstr(status));
700 status = smb2cli_flush(cli2->conn, cli2->timeout, cli2->smb2.session,
701 cli2->smb2.tcon, fid_persistent, fid_volatile);
702 if (!NT_STATUS_IS_OK(status)) {
703 printf("smb2cli_flush returned %s\n", nt_errstr(status));
707 status = smb2cli_read(cli2->conn, cli2->timeout, cli2->smb2.session,
708 cli2->smb2.tcon, 0x10000, 0, fid_persistent,
710 talloc_tos(), &result, &nread);
711 if (!NT_STATUS_IS_OK(status)) {
712 printf("smb2cli_read returned %s\n", nt_errstr(status));
716 if (nread != strlen(hello)) {
717 printf("smb2cli_read returned %d bytes, expected %d\n",
718 (int)nread, (int)strlen(hello));
722 if (memcmp(hello, result, nread) != 0) {
723 printf("smb2cli_read returned '%s', expected '%s'\n",
731 bool run_smb2_tcon_dependence(int dummy)
733 struct cli_state *cli;
735 uint64_t fid_persistent, fid_volatile;
736 const char *hello = "Hello, world\n";
739 struct smbXcli_tcon *tcon2;
742 printf("Starting SMB2-TCON-DEPENDENCE\n");
744 if (!torture_init_connection(&cli)) {
748 status = smbXcli_negprot(cli->conn, cli->timeout,
749 PROTOCOL_SMB2_02, PROTOCOL_LATEST);
750 if (!NT_STATUS_IS_OK(status)) {
751 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
755 status = cli_session_setup(cli, username,
758 if (!NT_STATUS_IS_OK(status)) {
759 printf("cli_session_setup returned %s\n", nt_errstr(status));
763 status = cli_tree_connect(cli, share, "?????", "", 0);
764 if (!NT_STATUS_IS_OK(status)) {
765 printf("cli_tree_connect returned %s\n", nt_errstr(status));
769 status = smb2cli_create(cli->conn, cli->timeout, cli->smb2.session,
770 cli->smb2.tcon, "tcon_depedence.txt",
771 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
772 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
773 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
774 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
775 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
776 FILE_CREATE, /* create_disposition, */
777 FILE_DELETE_ON_CLOSE, /* create_options, */
778 NULL, /* smb2_create_blobs *blobs */
782 if (!NT_STATUS_IS_OK(status)) {
783 printf("smb2cli_create on cli %s\n", nt_errstr(status));
787 status = smb2cli_write(cli->conn, cli->timeout, cli->smb2.session,
788 cli->smb2.tcon, strlen(hello), 0, fid_persistent,
789 fid_volatile, 0, 0, (const uint8_t *)hello, NULL);
790 if (!NT_STATUS_IS_OK(status)) {
791 printf("smb2cli_write returned %s\n", nt_errstr(status));
795 status = smb2cli_flush(cli->conn, cli->timeout, cli->smb2.session,
796 cli->smb2.tcon, fid_persistent, fid_volatile);
797 if (!NT_STATUS_IS_OK(status)) {
798 printf("smb2cli_flush returned %s\n", nt_errstr(status));
802 status = smb2cli_read(cli->conn, cli->timeout, cli->smb2.session,
803 cli->smb2.tcon, 0x10000, 0, fid_persistent,
805 talloc_tos(), &result, &nread);
806 if (!NT_STATUS_IS_OK(status)) {
807 printf("smb2cli_read returned %s\n", nt_errstr(status));
811 if (nread != strlen(hello)) {
812 printf("smb2cli_read returned %d bytes, expected %d\n",
813 (int)nread, (int)strlen(hello));
817 if (memcmp(hello, result, nread) != 0) {
818 printf("smb2cli_read returned '%s', expected '%s'\n",
823 /* check behaviour with wrong tid... */
825 tcon2 = smbXcli_tcon_create(cli);
826 tcon2_id = smb2cli_tcon_current_id(cli->smb2.tcon);
828 smb2cli_tcon_set_values(tcon2,
833 0, /* capabilities */
834 0 /* maximal_access */);
836 status = smb2cli_read(cli->conn, cli->timeout, cli->smb2.session,
837 tcon2, 0x10000, 0, fid_persistent,
839 talloc_tos(), &result, &nread);
840 if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
841 printf("smb2cli_read returned %s\n", nt_errstr(status));
850 bool run_smb2_multi_channel(int dummy)
852 struct cli_state *cli1;
853 struct cli_state *cli2;
854 struct cli_state *cli3;
857 uint64_t fid_persistent, fid_volatile;
858 struct tevent_context *ev;
859 struct tevent_req *subreq;
860 DATA_BLOB in_blob = data_blob_null;
862 DATA_BLOB channel_session_key;
863 struct auth_generic_state *auth_generic_state;
864 struct iovec *recv_iov;
865 const char *hello = "Hello, world\n";
868 struct GUID saved_guid = cli_state_client_guid;
870 printf("Starting SMB2-MULTI-CHANNEL\n");
872 cli_state_client_guid = GUID_random();
874 if (!torture_init_connection(&cli1)) {
878 if (!torture_init_connection(&cli2)) {
882 if (!torture_init_connection(&cli3)) {
886 cli_state_client_guid = saved_guid;
888 status = smbXcli_negprot(cli1->conn, cli1->timeout,
889 PROTOCOL_SMB2_22, PROTOCOL_LATEST);
890 if (!NT_STATUS_IS_OK(status)) {
891 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
895 status = smbXcli_negprot(cli2->conn, cli2->timeout,
896 PROTOCOL_SMB2_22, PROTOCOL_LATEST);
897 if (!NT_STATUS_IS_OK(status)) {
898 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
902 status = smbXcli_negprot(cli3->conn, cli3->timeout,
903 PROTOCOL_SMB2_22, PROTOCOL_LATEST);
904 if (!NT_STATUS_IS_OK(status)) {
905 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
909 status = cli_session_setup(cli1, username,
912 if (!NT_STATUS_IS_OK(status)) {
913 printf("smb2cli_sesssetup returned %s\n", nt_errstr(status));
917 status = cli_tree_connect(cli1, share, "?????", "", 0);
918 if (!NT_STATUS_IS_OK(status)) {
919 printf("cli_tree_connect returned %s\n", nt_errstr(status));
923 status = smb2cli_session_create_channel(cli2,
926 &cli2->smb2.session);
927 if (!NT_STATUS_IS_OK(status)) {
928 printf("smb2cli_session_create_channel returned %s\n",
933 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
934 if (!NT_STATUS_IS_OK(status)) {
935 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
939 gensec_want_feature(auth_generic_state->gensec_security,
940 GENSEC_FEATURE_SESSION_KEY);
941 status = auth_generic_set_username(auth_generic_state, username);
942 if (!NT_STATUS_IS_OK(status)) {
943 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
947 status = auth_generic_set_domain(auth_generic_state, workgroup);
948 if (!NT_STATUS_IS_OK(status)) {
949 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
953 status = auth_generic_set_password(auth_generic_state, password);
954 if (!NT_STATUS_IS_OK(status)) {
955 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
959 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
960 if (!NT_STATUS_IS_OK(status)) {
961 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
965 ev = samba_tevent_context_init(talloc_tos());
967 printf("samba_tevent_context_init() returned NULL\n");
971 status = gensec_update(auth_generic_state->gensec_security,
972 talloc_tos(), data_blob_null, &in_blob);
973 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
974 printf("gensec_update returned %s\n", nt_errstr(status));
978 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
983 SMB2_CAP_DFS, /* in_capabilities */
985 0, /* in_previous_session_id */
986 &in_blob); /* in_security_buffer */
987 if (subreq == NULL) {
988 printf("smb2cli_session_setup_send() returned NULL\n");
992 ok = tevent_req_poll(subreq, ev);
994 printf("tevent_req_poll() returned false\n");
998 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1000 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1001 printf("smb2cli_session_setup_recv returned %s\n",
1006 status = gensec_update(auth_generic_state->gensec_security,
1007 talloc_tos(), out_blob, &in_blob);
1008 if (!NT_STATUS_IS_OK(status)) {
1009 printf("auth_generic_update returned %s\n", nt_errstr(status));
1013 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1017 0x01, /* in_flags */
1018 SMB2_CAP_DFS, /* in_capabilities */
1020 0, /* in_previous_session_id */
1021 &in_blob); /* in_security_buffer */
1022 if (subreq == NULL) {
1023 printf("smb2cli_session_setup_send() returned NULL\n");
1027 ok = tevent_req_poll(subreq, ev);
1029 printf("tevent_req_poll() returned false\n");
1033 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1034 &recv_iov, &out_blob);
1035 if (!NT_STATUS_IS_OK(status)) {
1036 printf("smb2cli_session_setup_recv returned %s\n",
1041 status = gensec_session_key(auth_generic_state->gensec_security, talloc_tos(),
1042 &channel_session_key);
1043 if (!NT_STATUS_IS_OK(status)) {
1044 printf("gensec_session_key returned %s\n",
1049 status = smb2cli_session_set_channel_key(cli2->smb2.session,
1050 channel_session_key,
1052 if (!NT_STATUS_IS_OK(status)) {
1053 printf("smb2cli_session_set_channel_key %s\n", nt_errstr(status));
1057 status = smb2cli_session_create_channel(cli3,
1060 &cli3->smb2.session);
1061 if (!NT_STATUS_IS_OK(status)) {
1062 printf("smb2cli_session_create_channel returned %s\n",
1067 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
1068 if (!NT_STATUS_IS_OK(status)) {
1069 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
1073 gensec_want_feature(auth_generic_state->gensec_security,
1074 GENSEC_FEATURE_SESSION_KEY);
1075 status = auth_generic_set_username(auth_generic_state, username);
1076 if (!NT_STATUS_IS_OK(status)) {
1077 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
1081 status = auth_generic_set_domain(auth_generic_state, workgroup);
1082 if (!NT_STATUS_IS_OK(status)) {
1083 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
1087 status = auth_generic_set_password(auth_generic_state, password);
1088 if (!NT_STATUS_IS_OK(status)) {
1089 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
1093 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
1094 if (!NT_STATUS_IS_OK(status)) {
1095 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
1099 status = gensec_update(auth_generic_state->gensec_security,
1100 talloc_tos(), data_blob_null, &in_blob);
1101 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1102 printf("gensec_update returned %s\n", nt_errstr(status));
1106 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1110 0x01, /* in_flags */
1111 SMB2_CAP_DFS, /* in_capabilities */
1113 0, /* in_previous_session_id */
1114 &in_blob); /* in_security_buffer */
1115 if (subreq == NULL) {
1116 printf("smb2cli_session_setup_send() returned NULL\n");
1120 ok = tevent_req_poll(subreq, ev);
1122 printf("tevent_req_poll() returned false\n");
1126 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1128 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1129 printf("smb2cli_session_setup_recv returned %s\n",
1134 status = gensec_update(auth_generic_state->gensec_security,
1135 talloc_tos(), out_blob, &in_blob);
1136 if (!NT_STATUS_IS_OK(status)) {
1137 printf("auth_generic_update returned %s\n", nt_errstr(status));
1141 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1145 0x01, /* in_flags */
1146 SMB2_CAP_DFS, /* in_capabilities */
1148 0, /* in_previous_session_id */
1149 &in_blob); /* in_security_buffer */
1150 if (subreq == NULL) {
1151 printf("smb2cli_session_setup_send() returned NULL\n");
1155 ok = tevent_req_poll(subreq, ev);
1157 printf("tevent_req_poll() returned false\n");
1161 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1162 &recv_iov, &out_blob);
1163 if (!NT_STATUS_IS_OK(status)) {
1164 printf("smb2cli_session_setup_recv returned %s\n",
1169 status = gensec_session_key(auth_generic_state->gensec_security, talloc_tos(),
1170 &channel_session_key);
1171 if (!NT_STATUS_IS_OK(status)) {
1172 printf("gensec_session_key returned %s\n",
1177 status = smb2cli_session_set_channel_key(cli3->smb2.session,
1178 channel_session_key,
1180 if (!NT_STATUS_IS_OK(status)) {
1181 printf("smb2cli_session_set_channel_key %s\n", nt_errstr(status));
1185 status = smb2cli_create(cli2->conn, cli2->timeout, cli2->smb2.session,
1186 cli1->smb2.tcon, "multi-channel.txt",
1187 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1188 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1189 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1190 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1191 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1192 FILE_CREATE, /* create_disposition, */
1193 FILE_DELETE_ON_CLOSE, /* create_options, */
1194 NULL, /* smb2_create_blobs *blobs */
1198 if (!NT_STATUS_IS_OK(status)) {
1199 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
1203 status = smb2cli_write(cli1->conn, cli1->timeout, cli1->smb2.session,
1204 cli1->smb2.tcon, strlen(hello), 0, fid_persistent,
1205 fid_volatile, 0, 0, (const uint8_t *)hello, NULL);
1206 if (!NT_STATUS_IS_OK(status)) {
1207 printf("smb2cli_write returned %s\n", nt_errstr(status));
1211 status = smb2cli_flush(cli2->conn, cli2->timeout, cli2->smb2.session,
1212 cli1->smb2.tcon, fid_persistent, fid_volatile);
1213 if (!NT_STATUS_IS_OK(status)) {
1214 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1218 status = smb2cli_flush(cli1->conn, cli1->timeout, cli1->smb2.session,
1219 cli1->smb2.tcon, fid_persistent, fid_volatile);
1220 if (!NT_STATUS_IS_OK(status)) {
1221 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1225 status = smb2cli_flush(cli3->conn, cli3->timeout, cli3->smb2.session,
1226 cli1->smb2.tcon, fid_persistent, fid_volatile);
1227 if (!NT_STATUS_IS_OK(status)) {
1228 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1232 status = smb2cli_read(cli2->conn, cli2->timeout, cli2->smb2.session,
1233 cli1->smb2.tcon, 0x10000, 0, fid_persistent,
1235 talloc_tos(), &result, &nread);
1236 if (!NT_STATUS_IS_OK(status)) {
1237 printf("smb2cli_read returned %s\n", nt_errstr(status));
1241 if (nread != strlen(hello)) {
1242 printf("smb2cli_read returned %d bytes, expected %d\n",
1243 (int)nread, (int)strlen(hello));
1247 if (memcmp(hello, result, nread) != 0) {
1248 printf("smb2cli_read returned '%s', expected '%s'\n",
1253 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
1254 if (!NT_STATUS_IS_OK(status)) {
1255 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
1259 gensec_want_feature(auth_generic_state->gensec_security,
1260 GENSEC_FEATURE_SESSION_KEY);
1261 status = auth_generic_set_username(auth_generic_state, username);
1262 if (!NT_STATUS_IS_OK(status)) {
1263 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
1267 status = auth_generic_set_domain(auth_generic_state, workgroup);
1268 if (!NT_STATUS_IS_OK(status)) {
1269 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
1273 status = auth_generic_set_password(auth_generic_state, password);
1274 if (!NT_STATUS_IS_OK(status)) {
1275 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
1279 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
1280 if (!NT_STATUS_IS_OK(status)) {
1281 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
1285 status = gensec_update(auth_generic_state->gensec_security,
1286 talloc_tos(), data_blob_null, &in_blob);
1287 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1288 printf("gensec_update returned %s\n", nt_errstr(status));
1292 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1297 SMB2_CAP_DFS, /* in_capabilities */
1299 0, /* in_previous_session_id */
1300 &in_blob); /* in_security_buffer */
1301 if (subreq == NULL) {
1302 printf("smb2cli_session_setup_send() returned NULL\n");
1306 ok = tevent_req_poll(subreq, ev);
1308 printf("tevent_req_poll() returned false\n");
1312 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1314 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1315 printf("smb2cli_session_setup_recv returned %s\n",
1320 status = gensec_update(auth_generic_state->gensec_security,
1321 talloc_tos(), out_blob, &in_blob);
1322 if (!NT_STATUS_IS_OK(status)) {
1323 printf("auth_generic_update returned %s\n", nt_errstr(status));
1327 status = smb2cli_flush(cli1->conn, cli1->timeout, cli1->smb2.session,
1328 cli1->smb2.tcon, fid_persistent, fid_volatile);
1329 if (!NT_STATUS_IS_OK(status)) {
1330 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1334 status = smb2cli_flush(cli2->conn, cli2->timeout, cli2->smb2.session,
1335 cli1->smb2.tcon, fid_persistent, fid_volatile);
1336 if (!NT_STATUS_IS_OK(status)) {
1337 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1341 status = smb2cli_flush(cli3->conn, cli3->timeout, cli3->smb2.session,
1342 cli1->smb2.tcon, fid_persistent, fid_volatile);
1343 if (!NT_STATUS_IS_OK(status)) {
1344 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1348 status = smb2cli_create(cli1->conn, cli1->timeout, cli1->smb2.session,
1349 cli1->smb2.tcon, "multi-channel-invalid.txt",
1350 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1351 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1352 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1353 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1354 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1355 FILE_CREATE, /* create_disposition, */
1356 FILE_DELETE_ON_CLOSE, /* create_options, */
1357 NULL, /* smb2_create_blobs *blobs */
1361 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1362 printf("smb2cli_create %s\n", nt_errstr(status));
1366 status = smb2cli_create(cli2->conn, cli2->timeout, cli2->smb2.session,
1367 cli1->smb2.tcon, "multi-channel-invalid.txt",
1368 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1369 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1370 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1371 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1372 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1373 FILE_CREATE, /* create_disposition, */
1374 FILE_DELETE_ON_CLOSE, /* create_options, */
1375 NULL, /* smb2_create_blobs *blobs */
1379 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1380 printf("smb2cli_create %s\n", nt_errstr(status));
1384 status = smb2cli_create(cli3->conn, cli3->timeout, cli3->smb2.session,
1385 cli1->smb2.tcon, "multi-channel-invalid.txt",
1386 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1387 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1388 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1389 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1390 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1391 FILE_CREATE, /* create_disposition, */
1392 FILE_DELETE_ON_CLOSE, /* create_options, */
1393 NULL, /* smb2_create_blobs *blobs */
1397 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1398 printf("smb2cli_create %s\n", nt_errstr(status));
1402 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1407 SMB2_CAP_DFS, /* in_capabilities */
1409 0, /* in_previous_session_id */
1410 &in_blob); /* in_security_buffer */
1411 if (subreq == NULL) {
1412 printf("smb2cli_session_setup_send() returned NULL\n");
1416 ok = tevent_req_poll(subreq, ev);
1418 printf("tevent_req_poll() returned false\n");
1422 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1423 &recv_iov, &out_blob);
1424 if (!NT_STATUS_IS_OK(status)) {
1425 printf("smb2cli_session_setup_recv returned %s\n",
1430 status = smb2cli_close(cli3->conn, cli3->timeout, cli3->smb2.session,
1431 cli1->smb2.tcon, 0, fid_persistent, fid_volatile);
1432 if (!NT_STATUS_IS_OK(status)) {
1433 printf("smb2cli_close returned %s\n", nt_errstr(status));
1437 status = smb2cli_flush(cli3->conn, cli3->timeout, cli3->smb2.session,
1438 cli1->smb2.tcon, fid_persistent, fid_volatile);
1439 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
1440 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1444 status = smb2cli_flush(cli2->conn, cli2->timeout, cli2->smb2.session,
1445 cli1->smb2.tcon, fid_persistent, fid_volatile);
1446 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
1447 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1451 status = smb2cli_flush(cli1->conn, cli1->timeout, cli1->smb2.session,
1452 cli1->smb2.tcon, fid_persistent, fid_volatile);
1453 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
1454 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1461 bool run_smb2_session_reauth(int dummy)
1463 struct cli_state *cli;
1466 uint64_t fid_persistent, fid_volatile;
1467 uint64_t dir_persistent, dir_volatile;
1469 uint32_t dir_data_length;
1470 struct tevent_context *ev;
1471 struct tevent_req *subreq;
1472 DATA_BLOB in_blob = data_blob_null;
1474 DATA_BLOB in_input_buffer;
1475 DATA_BLOB out_output_buffer;
1476 uint8_t in_file_info_class;
1477 struct auth_generic_state *auth_generic_state;
1478 struct iovec *recv_iov;
1480 struct smbXcli_tcon *saved_tcon;
1482 printf("Starting SMB2-SESSION_REAUTH\n");
1484 if (!torture_init_connection(&cli)) {
1489 * PROTOCOL_SMB2_22 has a bug in win8pre0
1490 * it behaves like PROTOCOL_SMB2_02
1491 * and returns NT_STATUS_REQUEST_NOT_ACCEPTED,
1492 * while it allows it on PROTOCOL_SMB2_02.
1494 status = smbXcli_negprot(cli->conn, cli->timeout,
1495 PROTOCOL_SMB2_10, PROTOCOL_SMB2_10);
1496 if (!NT_STATUS_IS_OK(status)) {
1497 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
1501 status = cli_session_setup(cli, username,
1504 if (!NT_STATUS_IS_OK(status)) {
1505 printf("smb2cli_sesssetup returned %s\n", nt_errstr(status));
1509 status = cli_tree_connect(cli, share, "?????", "", 0);
1510 if (!NT_STATUS_IS_OK(status)) {
1511 printf("cli_tree_connect returned %s\n", nt_errstr(status));
1515 status = smb2cli_create(cli->conn, cli->timeout, cli->smb2.session,
1516 cli->smb2.tcon, "session-reauth.txt",
1517 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1518 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1519 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1520 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1521 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1522 FILE_CREATE, /* create_disposition, */
1523 FILE_DELETE_ON_CLOSE, /* create_options, */
1524 NULL, /* smb2_create_blobs *blobs */
1528 if (!NT_STATUS_IS_OK(status)) {
1529 printf("smb2cli_create %s\n", nt_errstr(status));
1533 status = smb2cli_create(cli->conn, cli->timeout, cli->smb2.session,
1535 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1536 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1537 SEC_STD_SYNCHRONIZE|
1539 SEC_DIR_READ_ATTRIBUTE, /* desired_access, */
1540 0, /* file_attributes, */
1541 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1542 FILE_OPEN, /* create_disposition, */
1543 FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, /* create_options, */
1544 NULL, /* smb2_create_blobs *blobs */
1548 if (!NT_STATUS_IS_OK(status)) {
1549 printf("smb2cli_create returned %s\n", nt_errstr(status));
1553 status = smb2cli_query_directory(
1554 cli->conn, cli->timeout, cli->smb2.session, cli->smb2.tcon,
1555 1, 0x3, 0, dir_persistent, dir_volatile,
1556 "session-reauth.txt", 0xffff,
1557 talloc_tos(), &dir_data, &dir_data_length);
1558 if (!NT_STATUS_IS_OK(status)) {
1559 printf("smb2cli_query_directory returned %s\n", nt_errstr(status));
1563 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
1564 if (!NT_STATUS_IS_OK(status)) {
1565 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
1569 gensec_want_feature(auth_generic_state->gensec_security,
1570 GENSEC_FEATURE_SESSION_KEY);
1571 status = auth_generic_set_username(auth_generic_state, username);
1572 if (!NT_STATUS_IS_OK(status)) {
1573 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
1577 status = auth_generic_set_domain(auth_generic_state, workgroup);
1578 if (!NT_STATUS_IS_OK(status)) {
1579 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
1583 status = auth_generic_set_password(auth_generic_state, password);
1584 if (!NT_STATUS_IS_OK(status)) {
1585 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
1589 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
1590 if (!NT_STATUS_IS_OK(status)) {
1591 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
1595 ev = samba_tevent_context_init(talloc_tos());
1597 printf("samba_tevent_context_init() returned NULL\n");
1601 status = gensec_update(auth_generic_state->gensec_security,
1602 talloc_tos(), data_blob_null, &in_blob);
1603 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1604 printf("gensec_update returned %s\n", nt_errstr(status));
1608 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1613 SMB2_CAP_DFS, /* in_capabilities */
1615 0, /* in_previous_session_id */
1616 &in_blob); /* in_security_buffer */
1617 if (subreq == NULL) {
1618 printf("smb2cli_session_setup_send() returned NULL\n");
1622 ok = tevent_req_poll(subreq, ev);
1624 printf("tevent_req_poll() returned false\n");
1628 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1630 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1631 printf("smb2cli_session_setup_recv returned %s\n",
1636 status = gensec_update(auth_generic_state->gensec_security,
1637 talloc_tos(), out_blob, &in_blob);
1638 if (!NT_STATUS_IS_OK(status)) {
1639 printf("auth_generic_update returned %s\n", nt_errstr(status));
1643 status = smb2cli_flush(cli->conn, cli->timeout, cli->smb2.session,
1644 cli->smb2.tcon, fid_persistent, fid_volatile);
1645 if (!NT_STATUS_IS_OK(status)) {
1646 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1650 status = smb2cli_query_directory(
1651 cli->conn, cli->timeout, cli->smb2.session, cli->smb2.tcon,
1652 1, 0x3, 0, dir_persistent, dir_volatile,
1653 "session-reauth.txt", 0xffff,
1654 talloc_tos(), &dir_data, &dir_data_length);
1655 if (!NT_STATUS_IS_OK(status)) {
1656 printf("smb2cli_query_directory returned %s\n", nt_errstr(status));
1661 * query_info seems to be a path based operation on Windows...
1663 status = smb2cli_query_info(cli->conn,
1667 SMB2_GETINFO_SECURITY,
1668 0, /* in_file_info_class */
1669 1024, /* in_max_output_length */
1670 NULL, /* in_input_buffer */
1671 SECINFO_OWNER, /* in_additional_info */
1676 &out_output_buffer);
1677 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1678 printf("smb2cli_query_info (security) returned %s\n", nt_errstr(status));
1682 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1683 status = smb2cli_query_info(cli->conn,
1689 1024, /* in_max_output_length */
1690 NULL, /* in_input_buffer */
1691 0, /* in_additional_info */
1696 &out_output_buffer);
1697 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1698 printf("smb2cli_query_info (position) returned %s\n", nt_errstr(status));
1702 in_input_buffer = data_blob_talloc(talloc_tos(), NULL, 8);
1703 SBVAL(in_input_buffer.data, 0, 512);
1705 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1706 status = smb2cli_set_info(cli->conn,
1713 0, /* in_additional_info */
1716 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1717 printf("smb2cli_set_info (position) returned %s\n", nt_errstr(status));
1721 status = smb2cli_create(cli->conn, cli->timeout, cli->smb2.session,
1722 cli->smb2.tcon, "session-reauth-invalid.txt",
1723 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1724 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1725 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1726 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1727 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1728 FILE_CREATE, /* create_disposition, */
1729 FILE_DELETE_ON_CLOSE, /* create_options, */
1730 NULL, /* smb2_create_blobs *blobs */
1734 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1735 printf("smb2cli_create %s\n", nt_errstr(status));
1739 status = smb2cli_create(cli->conn, cli->timeout, cli->smb2.session,
1741 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1742 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1743 SEC_STD_SYNCHRONIZE|
1745 SEC_DIR_READ_ATTRIBUTE, /* desired_access, */
1746 0, /* file_attributes, */
1747 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1748 FILE_OPEN, /* create_disposition, */
1749 FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, /* create_options, */
1750 NULL, /* smb2_create_blobs *blobs */
1754 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1755 printf("smb2cli_create returned %s\n", nt_errstr(status));
1759 saved_tid = smb2cli_tcon_current_id(cli->smb2.tcon);
1760 saved_tcon = cli->smb2.tcon;
1761 cli->smb2.tcon = smbXcli_tcon_create(cli);
1762 smb2cli_tcon_set_values(cli->smb2.tcon,
1767 0, /* capabilities */
1768 0 /* maximal_access */);
1769 status = cli_tree_connect(cli, share, "?????", "", 0);
1770 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1771 printf("cli_tree_connect returned %s\n", nt_errstr(status));
1774 talloc_free(cli->smb2.tcon);
1775 cli->smb2.tcon = saved_tcon;
1777 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1782 SMB2_CAP_DFS, /* in_capabilities */
1784 0, /* in_previous_session_id */
1785 &in_blob); /* in_security_buffer */
1786 if (subreq == NULL) {
1787 printf("smb2cli_session_setup_send() returned NULL\n");
1791 ok = tevent_req_poll(subreq, ev);
1793 printf("tevent_req_poll() returned false\n");
1797 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1798 &recv_iov, &out_blob);
1799 if (!NT_STATUS_IS_OK(status)) {
1800 printf("smb2cli_session_setup_recv returned %s\n",
1805 status = smb2cli_flush(cli->conn, cli->timeout, cli->smb2.session,
1806 cli->smb2.tcon, fid_persistent, fid_volatile);
1807 if (!NT_STATUS_IS_OK(status)) {
1808 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1812 status = smb2cli_query_info(cli->conn,
1816 SMB2_GETINFO_SECURITY,
1817 0, /* in_file_info_class */
1818 1024, /* in_max_output_length */
1819 NULL, /* in_input_buffer */
1820 SECINFO_OWNER, /* in_additional_info */
1825 &out_output_buffer);
1826 if (!NT_STATUS_IS_OK(status)) {
1827 printf("smb2cli_query_info (security) returned %s\n", nt_errstr(status));
1831 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1832 status = smb2cli_query_info(cli->conn,
1838 1024, /* in_max_output_length */
1839 NULL, /* in_input_buffer */
1840 0, /* in_additional_info */
1845 &out_output_buffer);
1846 if (!NT_STATUS_IS_OK(status)) {
1847 printf("smb2cli_query_info (position) returned %s\n", nt_errstr(status));
1851 in_input_buffer = data_blob_talloc(talloc_tos(), NULL, 8);
1852 SBVAL(in_input_buffer.data, 0, 512);
1854 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1855 status = smb2cli_set_info(cli->conn,
1862 0, /* in_additional_info */
1865 if (!NT_STATUS_IS_OK(status)) {
1866 printf("smb2cli_set_info (position) returned %s\n", nt_errstr(status));
1870 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1871 status = smb2cli_query_info(cli->conn,
1877 1024, /* in_max_output_length */
1878 NULL, /* in_input_buffer */
1879 0, /* in_additional_info */
1884 &out_output_buffer);
1885 if (!NT_STATUS_IS_OK(status)) {
1886 printf("smb2cli_query_info (position) returned %s\n", nt_errstr(status));
1890 status = smb2cli_close(cli->conn, cli->timeout, cli->smb2.session,
1891 cli->smb2.tcon, 0, fid_persistent, fid_volatile);
1892 if (!NT_STATUS_IS_OK(status)) {
1893 printf("smb2cli_close returned %s\n", nt_errstr(status));
1897 status = smb2cli_create(cli->conn, cli->timeout, cli->smb2.session,
1898 cli->smb2.tcon, "session-reauth.txt",
1899 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1900 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1901 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1902 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1903 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1904 FILE_CREATE, /* create_disposition, */
1905 FILE_DELETE_ON_CLOSE, /* create_options, */
1906 NULL, /* smb2_create_blobs *blobs */
1910 if (!NT_STATUS_IS_OK(status)) {
1911 printf("smb2cli_create %s\n", nt_errstr(status));
1915 status = smb2cli_query_directory(
1916 cli->conn, cli->timeout, cli->smb2.session, cli->smb2.tcon,
1917 1, 0x3, 0, dir_persistent, dir_volatile,
1918 "session-reauth.txt", 0xffff,
1919 talloc_tos(), &dir_data, &dir_data_length);
1920 if (!NT_STATUS_IS_OK(status)) {
1921 printf("smb2cli_query_directory returned %s\n", nt_errstr(status));
1925 status = smb2cli_close(cli->conn, cli->timeout, cli->smb2.session,
1926 cli->smb2.tcon, 0, dir_persistent, dir_volatile);
1927 if (!NT_STATUS_IS_OK(status)) {
1928 printf("smb2cli_close returned %s\n", nt_errstr(status));
1932 status = smb2cli_close(cli->conn, cli->timeout, cli->smb2.session,
1933 cli->smb2.tcon, 0, fid_persistent, fid_volatile);
1934 if (!NT_STATUS_IS_OK(status)) {
1935 printf("smb2cli_close returned %s\n", nt_errstr(status));
1939 saved_tid = smb2cli_tcon_current_id(cli->smb2.tcon);
1940 saved_tcon = cli->smb2.tcon;
1941 cli->smb2.tcon = smbXcli_tcon_create(cli);
1942 smb2cli_tcon_set_values(cli->smb2.tcon,
1947 0, /* capabilities */
1948 0 /* maximal_access */);
1949 status = cli_tree_connect(cli, share, "?????", "", 0);
1950 if (!NT_STATUS_IS_OK(status)) {
1951 printf("cli_tree_connect returned %s\n", nt_errstr(status));
1954 talloc_free(cli->smb2.tcon);
1955 cli->smb2.tcon = saved_tcon;