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 "libsmb/smb2cli.h"
26 #include "libcli/security/security.h"
27 #include "libsmb/proto.h"
28 #include "auth/gensec/gensec.h"
29 #include "auth_generic.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 uint64_t saved_uid = 0;
46 printf("Starting SMB2-BASIC\n");
48 if (!torture_init_connection(&cli)) {
51 cli->smb2.pid = 0xFEFF;
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,
61 password, strlen(password),
62 password, strlen(password),
64 if (!NT_STATUS_IS_OK(status)) {
65 printf("cli_session_setup returned %s\n", nt_errstr(status));
69 status = cli_tree_connect(cli, share, "?????", "", 0);
70 if (!NT_STATUS_IS_OK(status)) {
71 printf("cli_tree_connect returned %s\n", nt_errstr(status));
75 status = smb2cli_create(cli, "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 */
86 if (!NT_STATUS_IS_OK(status)) {
87 printf("smb2cli_create returned %s\n", nt_errstr(status));
91 status = smb2cli_write(cli, strlen(hello), 0, fid_persistent,
92 fid_volatile, 0, 0, (const uint8_t *)hello);
93 if (!NT_STATUS_IS_OK(status)) {
94 printf("smb2cli_write returned %s\n", nt_errstr(status));
98 status = smb2cli_flush(cli, fid_persistent, fid_volatile);
99 if (!NT_STATUS_IS_OK(status)) {
100 printf("smb2cli_flush returned %s\n", nt_errstr(status));
104 status = smb2cli_read(cli, 0x10000, 0, fid_persistent,
106 talloc_tos(), &result, &nread);
107 if (!NT_STATUS_IS_OK(status)) {
108 printf("smb2cli_read returned %s\n", nt_errstr(status));
112 if (nread != strlen(hello)) {
113 printf("smb2cli_read returned %d bytes, expected %d\n",
114 (int)nread, (int)strlen(hello));
118 if (memcmp(hello, result, nread) != 0) {
119 printf("smb2cli_read returned '%s', expected '%s'\n",
124 status = smb2cli_close(cli, 0, fid_persistent, fid_volatile);
125 if (!NT_STATUS_IS_OK(status)) {
126 printf("smb2cli_close returned %s\n", nt_errstr(status));
130 status = smb2cli_create(cli, "",
131 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
132 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
135 SEC_DIR_READ_ATTRIBUTE, /* desired_access, */
136 0, /* file_attributes, */
137 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
138 FILE_OPEN, /* create_disposition, */
139 FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, /* create_options, */
140 NULL, /* smb2_create_blobs *blobs */
143 if (!NT_STATUS_IS_OK(status)) {
144 printf("smb2cli_create returned %s\n", nt_errstr(status));
148 status = smb2cli_query_directory(
149 cli, 1, 0, 0, fid_persistent, fid_volatile, "*", 0xffff,
150 talloc_tos(), &dir_data, &dir_data_length);
152 if (!NT_STATUS_IS_OK(status)) {
153 printf("smb2cli_query_directory returned %s\n", nt_errstr(status));
157 status = smb2cli_close(cli, 0, fid_persistent, fid_volatile);
158 if (!NT_STATUS_IS_OK(status)) {
159 printf("smb2cli_close returned %s\n", nt_errstr(status));
163 saved_tid = cli->smb2.tid;
164 status = smb2cli_tdis(cli);
165 if (!NT_STATUS_IS_OK(status)) {
166 printf("smb2cli_tdis returned %s\n", nt_errstr(status));
169 cli->smb2.tid = saved_tid;
171 status = smb2cli_tdis(cli);
172 if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
173 printf("2nd smb2cli_tdis returned %s\n", nt_errstr(status));
177 saved_uid = smb2cli_session_current_id(cli->smb2.session);
178 status = smb2cli_logoff(cli);
179 if (!NT_STATUS_IS_OK(status)) {
180 printf("smb2cli_logoff returned %s\n", nt_errstr(status));
184 cli->smb2.session = smbXcli_session_create(cli, cli->conn);
185 if (cli->smb2.session == NULL) {
186 printf("smbXcli_session_create() returned NULL\n");
190 smb2cli_session_set_id_and_flags(cli->smb2.session, saved_uid, 0);
192 status = smb2cli_logoff(cli);
193 if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
194 printf("2nd smb2cli_logoff returned %s\n", nt_errstr(status));
201 bool run_smb2_negprot(int dummy)
203 struct cli_state *cli;
205 enum protocol_types protocol;
206 const char *name = NULL;
208 printf("Starting SMB2-NEGPROT\n");
210 if (!torture_init_connection(&cli)) {
213 cli->smb2.pid = 0xFEFF;
215 status = smbXcli_negprot(cli->conn, cli->timeout,
216 PROTOCOL_CORE, PROTOCOL_LATEST);
217 if (!NT_STATUS_IS_OK(status)) {
218 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
222 protocol = smbXcli_conn_protocol(cli->conn);
225 case PROTOCOL_SMB2_02:
228 case PROTOCOL_SMB2_10:
231 case PROTOCOL_SMB2_22:
234 case PROTOCOL_SMB2_24:
237 case PROTOCOL_SMB3_00:
245 printf("Server supports %s\n", name);
247 printf("Server DOES NOT support SMB2\n");
251 status = smbXcli_negprot(cli->conn, cli->timeout,
253 if (!NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_RESET) &&
254 !NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_DISCONNECTED) &&
255 !NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_ABORTED)) {
256 printf("2nd smbXcli_negprot should disconnect - returned %s\n",
261 if (smbXcli_conn_is_connected(cli->conn)) {
262 printf("2nd smbXcli_negprot should disconnect "
263 "- still connected\n");
270 bool run_smb2_session_reconnect(int dummy)
272 struct cli_state *cli1;
273 struct cli_state *cli2;
276 uint64_t fid_persistent, fid_volatile;
277 struct tevent_context *ev;
278 struct tevent_req *subreq;
279 DATA_BLOB in_blob = data_blob_null;
281 DATA_BLOB session_key;
282 struct auth_generic_state *auth_generic_state;
283 struct iovec *recv_iov;
284 const char *hello = "Hello, world\n";
288 printf("Starting SMB2-SESSION-RECONNECT\n");
290 if (!torture_init_connection(&cli1)) {
293 cli1->smb2.pid = 0xFEFF;
295 status = smbXcli_negprot(cli1->conn, cli1->timeout,
296 PROTOCOL_SMB2_02, PROTOCOL_LATEST);
297 if (!NT_STATUS_IS_OK(status)) {
298 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
302 status = cli_session_setup(cli1, username,
303 password, strlen(password),
304 password, strlen(password),
306 if (!NT_STATUS_IS_OK(status)) {
307 printf("cli_session_setup returned %s\n", nt_errstr(status));
311 status = cli_tree_connect(cli1, share, "?????", "", 0);
312 if (!NT_STATUS_IS_OK(status)) {
313 printf("cli_tree_connect returned %s\n", nt_errstr(status));
317 status = smb2cli_create(cli1, "session-reconnect.txt",
318 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
319 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
320 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
321 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
322 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
323 FILE_CREATE, /* create_disposition, */
324 FILE_DELETE_ON_CLOSE, /* create_options, */
325 NULL, /* smb2_create_blobs *blobs */
328 if (!NT_STATUS_IS_OK(status)) {
329 printf("smb2cli_create on cli1 %s\n", nt_errstr(status));
333 status = smb2cli_write(cli1, strlen(hello), 0, fid_persistent,
334 fid_volatile, 0, 0, (const uint8_t *)hello);
335 if (!NT_STATUS_IS_OK(status)) {
336 printf("smb2cli_write returned %s\n", nt_errstr(status));
340 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
341 if (!NT_STATUS_IS_OK(status)) {
342 printf("smb2cli_flush returned %s\n", nt_errstr(status));
346 status = smb2cli_read(cli1, 0x10000, 0, fid_persistent,
348 talloc_tos(), &result, &nread);
349 if (!NT_STATUS_IS_OK(status)) {
350 printf("smb2cli_read returned %s\n", nt_errstr(status));
354 if (nread != strlen(hello)) {
355 printf("smb2cli_read returned %d bytes, expected %d\n",
356 (int)nread, (int)strlen(hello));
360 if (memcmp(hello, result, nread) != 0) {
361 printf("smb2cli_read returned '%s', expected '%s'\n",
366 /* prepare second session */
368 if (!torture_init_connection(&cli2)) {
371 cli2->smb2.pid = 0xFEFF;
373 status = smbXcli_negprot(cli2->conn, cli2->timeout,
374 PROTOCOL_SMB2_02, PROTOCOL_LATEST);
375 if (!NT_STATUS_IS_OK(status)) {
376 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
380 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
381 if (!NT_STATUS_IS_OK(status)) {
382 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
386 gensec_want_feature(auth_generic_state->gensec_security,
387 GENSEC_FEATURE_SESSION_KEY);
388 status = auth_generic_set_username(auth_generic_state, username);
389 if (!NT_STATUS_IS_OK(status)) {
390 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
394 status = auth_generic_set_domain(auth_generic_state, workgroup);
395 if (!NT_STATUS_IS_OK(status)) {
396 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
400 status = auth_generic_set_password(auth_generic_state, password);
401 if (!NT_STATUS_IS_OK(status)) {
402 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
406 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
407 if (!NT_STATUS_IS_OK(status)) {
408 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
412 ev = event_context_init(talloc_tos());
414 printf("event_context_init() returned NULL\n");
418 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
419 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
420 printf("gensec_update returned %s\n", nt_errstr(status));
424 cli2->smb2.session = smbXcli_session_create(cli2, cli2->conn);
426 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
431 SMB2_CAP_DFS, /* in_capabilities */
433 /* in_previous_session_id: */
434 smb2cli_session_current_id(cli1->smb2.session),
435 &in_blob); /* in_security_buffer */
436 if (subreq == NULL) {
437 printf("smb2cli_session_setup_send() returned NULL\n");
441 ok = tevent_req_poll(subreq, ev);
443 printf("tevent_req_poll() returned false\n");
447 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
449 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
450 printf("smb2cli_session_setup_recv returned %s\n",
455 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
456 if (!NT_STATUS_IS_OK(status)) {
457 printf("auth_generic_update returned %s\n", nt_errstr(status));
461 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
466 SMB2_CAP_DFS, /* in_capabilities */
468 /* in_previous_session_id: */
469 smb2cli_session_current_id(cli1->smb2.session),
470 &in_blob); /* in_security_buffer */
471 if (subreq == NULL) {
472 printf("smb2cli_session_setup_send() returned NULL\n");
476 ok = tevent_req_poll(subreq, ev);
478 printf("tevent_req_poll() returned false\n");
482 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
483 &recv_iov, &out_blob);
484 if (!NT_STATUS_IS_OK(status)) {
485 printf("smb2cli_session_setup_recv returned %s\n",
490 status = gensec_session_key(auth_generic_state->gensec_security, talloc_tos(),
492 if (!NT_STATUS_IS_OK(status)) {
493 printf("gensec_session_key returned %s\n",
498 /* check file operation on the old client */
500 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
501 if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
502 printf("smb2cli_flush returned %s\n", nt_errstr(status));
506 status = cli_tree_connect(cli1, share, "?????", "", 0);
507 if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
508 printf("cli_tree_connect returned %s\n", nt_errstr(status));
513 * checking file operations without signing.
514 * on w2k8r2 at least, flush, read and write also work the same way,
515 * while create gives ACCESS_DENIED without signing
517 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
518 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
519 printf("smb2cli_flush returned %s\n", nt_errstr(status));
523 status = smb2cli_write(cli2, strlen(hello), 0, fid_persistent,
524 fid_volatile, 0, 0, (const uint8_t *)hello);
525 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
526 printf("smb2cli_write returned %s\n", nt_errstr(status));
530 status = smb2cli_read(cli2, 0x10000, 0, fid_persistent,
532 talloc_tos(), &result, &nread);
533 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
534 printf("smb2cli_read returned %s\n", nt_errstr(status));
538 status = smb2cli_create(cli2, "session-reconnect.txt",
539 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
540 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
541 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
542 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
543 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
544 FILE_CREATE, /* create_disposition, */
545 FILE_DELETE_ON_CLOSE, /* create_options, */
546 NULL, /* smb2_create_blobs *blobs */
549 if (!NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED) &&
550 !NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
551 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
555 /* now grab the session key and try with signing */
557 status = smb2cli_session_set_session_key(cli2->smb2.session,
560 if (!NT_STATUS_IS_OK(status)) {
561 printf("smb2cli_session_set_session_key %s\n", nt_errstr(status));
565 /* the tid seems to be irrelevant at this stage */
567 cli2->smb2.tid = cli1->smb2.tid;
569 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
570 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
571 printf("smb2cli_flush returned %s\n", nt_errstr(status));
575 status = smb2cli_write(cli2, strlen(hello), 0, fid_persistent,
576 fid_volatile, 0, 0, (const uint8_t *)hello);
577 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
578 printf("smb2cli_write returned %s\n", nt_errstr(status));
582 status = smb2cli_read(cli2, 0x10000, 0, fid_persistent,
584 talloc_tos(), &result, &nread);
585 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
586 printf("smb2cli_read returned %s\n", nt_errstr(status));
590 status = smb2cli_create(cli2, "session-reconnect.txt",
591 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
592 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
593 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
594 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
595 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
596 FILE_CREATE, /* create_disposition, */
597 FILE_DELETE_ON_CLOSE, /* create_options, */
598 NULL, /* smb2_create_blobs *blobs */
601 if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
602 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
606 /* now do a new tcon and test file calls again */
608 status = cli_tree_connect(cli2, share, "?????", "", 0);
609 if (!NT_STATUS_IS_OK(status)) {
610 printf("cli_tree_connect returned %s\n", nt_errstr(status));
614 status = smb2cli_create(cli2, "session-reconnect.txt",
615 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
616 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
617 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
618 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
619 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
620 FILE_CREATE, /* create_disposition, */
621 FILE_DELETE_ON_CLOSE, /* create_options, */
622 NULL, /* smb2_create_blobs *blobs */
625 if (!NT_STATUS_IS_OK(status)) {
626 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
630 status = smb2cli_write(cli2, strlen(hello), 0, fid_persistent,
631 fid_volatile, 0, 0, (const uint8_t *)hello);
632 if (!NT_STATUS_IS_OK(status)) {
633 printf("smb2cli_write returned %s\n", nt_errstr(status));
637 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
638 if (!NT_STATUS_IS_OK(status)) {
639 printf("smb2cli_flush returned %s\n", nt_errstr(status));
643 status = smb2cli_read(cli2, 0x10000, 0, fid_persistent,
645 talloc_tos(), &result, &nread);
646 if (!NT_STATUS_IS_OK(status)) {
647 printf("smb2cli_read returned %s\n", nt_errstr(status));
651 if (nread != strlen(hello)) {
652 printf("smb2cli_read returned %d bytes, expected %d\n",
653 (int)nread, (int)strlen(hello));
657 if (memcmp(hello, result, nread) != 0) {
658 printf("smb2cli_read returned '%s', expected '%s'\n",
666 bool run_smb2_tcon_dependence(int dummy)
668 struct cli_state *cli;
670 uint64_t fid_persistent, fid_volatile;
671 const char *hello = "Hello, world\n";
675 printf("Starting SMB2-TCON-DEPENDENCE\n");
677 if (!torture_init_connection(&cli)) {
680 cli->smb2.pid = 0xFEFF;
682 status = smbXcli_negprot(cli->conn, cli->timeout,
683 PROTOCOL_SMB2_02, PROTOCOL_LATEST);
684 if (!NT_STATUS_IS_OK(status)) {
685 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
689 status = cli_session_setup(cli, username,
690 password, strlen(password),
691 password, strlen(password),
693 if (!NT_STATUS_IS_OK(status)) {
694 printf("cli_session_setup returned %s\n", nt_errstr(status));
698 status = cli_tree_connect(cli, share, "?????", "", 0);
699 if (!NT_STATUS_IS_OK(status)) {
700 printf("cli_tree_connect returned %s\n", nt_errstr(status));
704 status = smb2cli_create(cli, "tcon_depedence.txt",
705 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
706 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
707 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
708 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
709 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
710 FILE_CREATE, /* create_disposition, */
711 FILE_DELETE_ON_CLOSE, /* create_options, */
712 NULL, /* smb2_create_blobs *blobs */
715 if (!NT_STATUS_IS_OK(status)) {
716 printf("smb2cli_create on cli %s\n", nt_errstr(status));
720 status = smb2cli_write(cli, strlen(hello), 0, fid_persistent,
721 fid_volatile, 0, 0, (const uint8_t *)hello);
722 if (!NT_STATUS_IS_OK(status)) {
723 printf("smb2cli_write returned %s\n", nt_errstr(status));
727 status = smb2cli_flush(cli, fid_persistent, fid_volatile);
728 if (!NT_STATUS_IS_OK(status)) {
729 printf("smb2cli_flush returned %s\n", nt_errstr(status));
733 status = smb2cli_read(cli, 0x10000, 0, fid_persistent,
735 talloc_tos(), &result, &nread);
736 if (!NT_STATUS_IS_OK(status)) {
737 printf("smb2cli_read returned %s\n", nt_errstr(status));
741 if (nread != strlen(hello)) {
742 printf("smb2cli_read returned %d bytes, expected %d\n",
743 (int)nread, (int)strlen(hello));
747 if (memcmp(hello, result, nread) != 0) {
748 printf("smb2cli_read returned '%s', expected '%s'\n",
753 /* check behaviour with wrong tid... */
757 status = smb2cli_read(cli, 0x10000, 0, fid_persistent,
759 talloc_tos(), &result, &nread);
760 if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
761 printf("smb2cli_read returned %s\n", nt_errstr(status));
770 bool run_smb2_multi_channel(int dummy)
772 struct cli_state *cli1;
773 struct cli_state *cli2;
774 struct cli_state *cli3;
777 uint64_t fid_persistent, fid_volatile;
778 struct tevent_context *ev;
779 struct tevent_req *subreq;
780 DATA_BLOB in_blob = data_blob_null;
782 DATA_BLOB channel_session_key;
783 struct auth_generic_state *auth_generic_state;
784 struct iovec *recv_iov;
785 const char *hello = "Hello, world\n";
789 printf("Starting SMB2-MULTI-CHANNEL\n");
791 if (!torture_init_connection(&cli1)) {
794 cli1->smb2.pid = 0xFEFF;
796 if (!torture_init_connection(&cli2)) {
799 cli2->smb2.pid = 0xFEFF;
801 if (!torture_init_connection(&cli3)) {
804 cli3->smb2.pid = 0xFEFF;
806 status = smbXcli_negprot(cli1->conn, cli1->timeout,
807 PROTOCOL_SMB2_22, PROTOCOL_LATEST);
808 if (!NT_STATUS_IS_OK(status)) {
809 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
813 status = smbXcli_negprot(cli2->conn, cli2->timeout,
814 PROTOCOL_SMB2_22, PROTOCOL_LATEST);
815 if (!NT_STATUS_IS_OK(status)) {
816 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
820 status = smbXcli_negprot(cli3->conn, cli3->timeout,
821 PROTOCOL_SMB2_22, PROTOCOL_LATEST);
822 if (!NT_STATUS_IS_OK(status)) {
823 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
827 status = cli_session_setup(cli1, username,
828 password, strlen(password),
829 password, strlen(password),
831 if (!NT_STATUS_IS_OK(status)) {
832 printf("smb2cli_sesssetup returned %s\n", nt_errstr(status));
836 status = cli_tree_connect(cli1, share, "?????", "", 0);
837 if (!NT_STATUS_IS_OK(status)) {
838 printf("cli_tree_connect returned %s\n", nt_errstr(status));
842 status = smb2cli_session_create_channel(cli2,
845 &cli2->smb2.session);
846 if (!NT_STATUS_IS_OK(status)) {
847 printf("smb2cli_session_create_channel returned %s\n",
852 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
853 if (!NT_STATUS_IS_OK(status)) {
854 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
858 gensec_want_feature(auth_generic_state->gensec_security,
859 GENSEC_FEATURE_SESSION_KEY);
860 status = auth_generic_set_username(auth_generic_state, username);
861 if (!NT_STATUS_IS_OK(status)) {
862 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
866 status = auth_generic_set_domain(auth_generic_state, workgroup);
867 if (!NT_STATUS_IS_OK(status)) {
868 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
872 status = auth_generic_set_password(auth_generic_state, password);
873 if (!NT_STATUS_IS_OK(status)) {
874 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
878 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
879 if (!NT_STATUS_IS_OK(status)) {
880 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
884 ev = event_context_init(talloc_tos());
886 printf("event_context_init() returned NULL\n");
890 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
891 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
892 printf("gensec_update returned %s\n", nt_errstr(status));
896 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
901 SMB2_CAP_DFS, /* in_capabilities */
903 0, /* in_previous_session_id */
904 &in_blob); /* in_security_buffer */
905 if (subreq == NULL) {
906 printf("smb2cli_session_setup_send() returned NULL\n");
910 ok = tevent_req_poll(subreq, ev);
912 printf("tevent_req_poll() returned false\n");
916 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
918 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
919 printf("smb2cli_session_setup_recv returned %s\n",
924 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
925 if (!NT_STATUS_IS_OK(status)) {
926 printf("auth_generic_update returned %s\n", nt_errstr(status));
930 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
935 SMB2_CAP_DFS, /* in_capabilities */
937 0, /* in_previous_session_id */
938 &in_blob); /* in_security_buffer */
939 if (subreq == NULL) {
940 printf("smb2cli_session_setup_send() returned NULL\n");
944 ok = tevent_req_poll(subreq, ev);
946 printf("tevent_req_poll() returned false\n");
950 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
951 &recv_iov, &out_blob);
952 if (!NT_STATUS_IS_OK(status)) {
953 printf("smb2cli_session_setup_recv returned %s\n",
958 status = gensec_session_key(auth_generic_state->gensec_security, talloc_tos(),
959 &channel_session_key);
960 if (!NT_STATUS_IS_OK(status)) {
961 printf("gensec_session_key returned %s\n",
966 status = smb2cli_session_set_channel_key(cli2->smb2.session,
969 if (!NT_STATUS_IS_OK(status)) {
970 printf("smb2cli_session_set_channel_key %s\n", nt_errstr(status));
974 cli2->smb2.tid = cli1->smb2.tid;
976 status = smb2cli_session_create_channel(cli3,
979 &cli3->smb2.session);
980 if (!NT_STATUS_IS_OK(status)) {
981 printf("smb2cli_session_create_channel returned %s\n",
986 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
987 if (!NT_STATUS_IS_OK(status)) {
988 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
992 gensec_want_feature(auth_generic_state->gensec_security,
993 GENSEC_FEATURE_SESSION_KEY);
994 status = auth_generic_set_username(auth_generic_state, username);
995 if (!NT_STATUS_IS_OK(status)) {
996 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
1000 status = auth_generic_set_domain(auth_generic_state, workgroup);
1001 if (!NT_STATUS_IS_OK(status)) {
1002 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
1006 status = auth_generic_set_password(auth_generic_state, password);
1007 if (!NT_STATUS_IS_OK(status)) {
1008 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
1012 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
1013 if (!NT_STATUS_IS_OK(status)) {
1014 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
1018 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
1019 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1020 printf("gensec_update returned %s\n", nt_errstr(status));
1024 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1028 0x01, /* in_flags */
1029 SMB2_CAP_DFS, /* in_capabilities */
1031 0, /* in_previous_session_id */
1032 &in_blob); /* in_security_buffer */
1033 if (subreq == NULL) {
1034 printf("smb2cli_session_setup_send() returned NULL\n");
1038 ok = tevent_req_poll(subreq, ev);
1040 printf("tevent_req_poll() returned false\n");
1044 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1046 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1047 printf("smb2cli_session_setup_recv returned %s\n",
1052 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
1053 if (!NT_STATUS_IS_OK(status)) {
1054 printf("auth_generic_update returned %s\n", nt_errstr(status));
1058 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1062 0x01, /* in_flags */
1063 SMB2_CAP_DFS, /* in_capabilities */
1065 0, /* in_previous_session_id */
1066 &in_blob); /* in_security_buffer */
1067 if (subreq == NULL) {
1068 printf("smb2cli_session_setup_send() returned NULL\n");
1072 ok = tevent_req_poll(subreq, ev);
1074 printf("tevent_req_poll() returned false\n");
1078 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1079 &recv_iov, &out_blob);
1080 if (!NT_STATUS_IS_OK(status)) {
1081 printf("smb2cli_session_setup_recv returned %s\n",
1086 status = gensec_session_key(auth_generic_state->gensec_security, talloc_tos(),
1087 &channel_session_key);
1088 if (!NT_STATUS_IS_OK(status)) {
1089 printf("gensec_session_key returned %s\n",
1094 status = smb2cli_session_set_channel_key(cli3->smb2.session,
1095 channel_session_key,
1097 if (!NT_STATUS_IS_OK(status)) {
1098 printf("smb2cli_session_set_channel_key %s\n", nt_errstr(status));
1102 cli3->smb2.tid = cli2->smb2.tid;
1104 status = smb2cli_create(cli2, "multi-channel.txt",
1105 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1106 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1107 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1108 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1109 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1110 FILE_CREATE, /* create_disposition, */
1111 FILE_DELETE_ON_CLOSE, /* create_options, */
1112 NULL, /* smb2_create_blobs *blobs */
1115 if (!NT_STATUS_IS_OK(status)) {
1116 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
1120 status = smb2cli_write(cli1, strlen(hello), 0, fid_persistent,
1121 fid_volatile, 0, 0, (const uint8_t *)hello);
1122 if (!NT_STATUS_IS_OK(status)) {
1123 printf("smb2cli_write returned %s\n", nt_errstr(status));
1127 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
1128 if (!NT_STATUS_IS_OK(status)) {
1129 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1133 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
1134 if (!NT_STATUS_IS_OK(status)) {
1135 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1139 status = smb2cli_flush(cli3, fid_persistent, fid_volatile);
1140 if (!NT_STATUS_IS_OK(status)) {
1141 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1145 status = smb2cli_read(cli2, 0x10000, 0, fid_persistent,
1147 talloc_tos(), &result, &nread);
1148 if (!NT_STATUS_IS_OK(status)) {
1149 printf("smb2cli_read returned %s\n", nt_errstr(status));
1153 if (nread != strlen(hello)) {
1154 printf("smb2cli_read returned %d bytes, expected %d\n",
1155 (int)nread, (int)strlen(hello));
1159 if (memcmp(hello, result, nread) != 0) {
1160 printf("smb2cli_read returned '%s', expected '%s'\n",
1165 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
1166 if (!NT_STATUS_IS_OK(status)) {
1167 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
1171 gensec_want_feature(auth_generic_state->gensec_security,
1172 GENSEC_FEATURE_SESSION_KEY);
1173 status = auth_generic_set_username(auth_generic_state, username);
1174 if (!NT_STATUS_IS_OK(status)) {
1175 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
1179 status = auth_generic_set_domain(auth_generic_state, workgroup);
1180 if (!NT_STATUS_IS_OK(status)) {
1181 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
1185 status = auth_generic_set_password(auth_generic_state, password);
1186 if (!NT_STATUS_IS_OK(status)) {
1187 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
1191 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
1192 if (!NT_STATUS_IS_OK(status)) {
1193 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
1197 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
1198 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1199 printf("gensec_update returned %s\n", nt_errstr(status));
1203 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1208 SMB2_CAP_DFS, /* in_capabilities */
1210 0, /* in_previous_session_id */
1211 &in_blob); /* in_security_buffer */
1212 if (subreq == NULL) {
1213 printf("smb2cli_session_setup_send() returned NULL\n");
1217 ok = tevent_req_poll(subreq, ev);
1219 printf("tevent_req_poll() returned false\n");
1223 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1225 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1226 printf("smb2cli_session_setup_recv returned %s\n",
1231 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
1232 if (!NT_STATUS_IS_OK(status)) {
1233 printf("auth_generic_update returned %s\n", nt_errstr(status));
1237 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
1238 if (!NT_STATUS_IS_OK(status)) {
1239 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1243 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
1244 if (!NT_STATUS_IS_OK(status)) {
1245 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1249 status = smb2cli_flush(cli3, fid_persistent, fid_volatile);
1250 if (!NT_STATUS_IS_OK(status)) {
1251 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1255 status = smb2cli_create(cli1, "multi-channel-invalid.txt",
1256 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1257 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1258 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1259 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1260 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1261 FILE_CREATE, /* create_disposition, */
1262 FILE_DELETE_ON_CLOSE, /* create_options, */
1263 NULL, /* smb2_create_blobs *blobs */
1266 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1267 printf("smb2cli_create %s\n", nt_errstr(status));
1271 status = smb2cli_create(cli2, "multi-channel-invalid.txt",
1272 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1273 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1274 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1275 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1276 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1277 FILE_CREATE, /* create_disposition, */
1278 FILE_DELETE_ON_CLOSE, /* create_options, */
1279 NULL, /* smb2_create_blobs *blobs */
1282 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1283 printf("smb2cli_create %s\n", nt_errstr(status));
1287 status = smb2cli_create(cli3, "multi-channel-invalid.txt",
1288 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1289 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1290 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1291 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1292 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1293 FILE_CREATE, /* create_disposition, */
1294 FILE_DELETE_ON_CLOSE, /* create_options, */
1295 NULL, /* smb2_create_blobs *blobs */
1298 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1299 printf("smb2cli_create %s\n", nt_errstr(status));
1303 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1308 SMB2_CAP_DFS, /* in_capabilities */
1310 0, /* in_previous_session_id */
1311 &in_blob); /* in_security_buffer */
1312 if (subreq == NULL) {
1313 printf("smb2cli_session_setup_send() returned NULL\n");
1317 ok = tevent_req_poll(subreq, ev);
1319 printf("tevent_req_poll() returned false\n");
1323 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1324 &recv_iov, &out_blob);
1325 if (!NT_STATUS_IS_OK(status)) {
1326 printf("smb2cli_session_setup_recv returned %s\n",
1331 status = smb2cli_close(cli3, 0, fid_persistent, fid_volatile);
1332 if (!NT_STATUS_IS_OK(status)) {
1333 printf("smb2cli_close returned %s\n", nt_errstr(status));
1337 status = smb2cli_flush(cli3, fid_persistent, fid_volatile);
1338 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
1339 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1343 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
1344 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
1345 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1349 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
1350 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
1351 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1358 bool run_smb2_session_reauth(int dummy)
1360 struct cli_state *cli;
1363 uint64_t fid_persistent, fid_volatile;
1364 uint64_t dir_persistent, dir_volatile;
1366 uint32_t dir_data_length;
1367 struct tevent_context *ev;
1368 struct tevent_req *subreq;
1369 DATA_BLOB in_blob = data_blob_null;
1371 DATA_BLOB in_input_buffer;
1372 DATA_BLOB out_output_buffer;
1373 uint8_t in_file_info_class;
1374 struct auth_generic_state *auth_generic_state;
1375 struct iovec *recv_iov;
1378 printf("Starting SMB2-SESSION_REAUTH\n");
1380 if (!torture_init_connection(&cli)) {
1383 cli->smb2.pid = 0xFEFF;
1386 * PROTOCOL_SMB2_22 has a bug in win8pre0
1387 * it behaves like PROTOCOL_SMB2_02
1388 * and returns NT_STATUS_REQUEST_NOT_ACCEPTED,
1389 * while it allows it on PROTOCOL_SMB2_02.
1391 status = smbXcli_negprot(cli->conn, cli->timeout,
1392 PROTOCOL_SMB2_10, PROTOCOL_SMB2_10);
1393 if (!NT_STATUS_IS_OK(status)) {
1394 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
1398 status = cli_session_setup(cli, username,
1399 password, strlen(password),
1400 password, strlen(password),
1402 if (!NT_STATUS_IS_OK(status)) {
1403 printf("smb2cli_sesssetup returned %s\n", nt_errstr(status));
1407 status = cli_tree_connect(cli, share, "?????", "", 0);
1408 if (!NT_STATUS_IS_OK(status)) {
1409 printf("cli_tree_connect returned %s\n", nt_errstr(status));
1413 status = smb2cli_create(cli, "session-reauth.txt",
1414 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1415 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1416 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1417 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1418 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1419 FILE_CREATE, /* create_disposition, */
1420 FILE_DELETE_ON_CLOSE, /* create_options, */
1421 NULL, /* smb2_create_blobs *blobs */
1424 if (!NT_STATUS_IS_OK(status)) {
1425 printf("smb2cli_create %s\n", nt_errstr(status));
1429 status = smb2cli_create(cli, "",
1430 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1431 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1432 SEC_STD_SYNCHRONIZE|
1434 SEC_DIR_READ_ATTRIBUTE, /* desired_access, */
1435 0, /* file_attributes, */
1436 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1437 FILE_OPEN, /* create_disposition, */
1438 FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, /* create_options, */
1439 NULL, /* smb2_create_blobs *blobs */
1442 if (!NT_STATUS_IS_OK(status)) {
1443 printf("smb2cli_create returned %s\n", nt_errstr(status));
1447 status = smb2cli_query_directory(
1448 cli, 1, 0x3, 0, dir_persistent, dir_volatile,
1449 "session-reauth.txt", 0xffff,
1450 talloc_tos(), &dir_data, &dir_data_length);
1451 if (!NT_STATUS_IS_OK(status)) {
1452 printf("smb2cli_query_directory returned %s\n", nt_errstr(status));
1456 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
1457 if (!NT_STATUS_IS_OK(status)) {
1458 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
1462 gensec_want_feature(auth_generic_state->gensec_security,
1463 GENSEC_FEATURE_SESSION_KEY);
1464 status = auth_generic_set_username(auth_generic_state, username);
1465 if (!NT_STATUS_IS_OK(status)) {
1466 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
1470 status = auth_generic_set_domain(auth_generic_state, workgroup);
1471 if (!NT_STATUS_IS_OK(status)) {
1472 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
1476 status = auth_generic_set_password(auth_generic_state, password);
1477 if (!NT_STATUS_IS_OK(status)) {
1478 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
1482 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
1483 if (!NT_STATUS_IS_OK(status)) {
1484 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
1488 ev = event_context_init(talloc_tos());
1490 printf("event_context_init() returned NULL\n");
1494 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
1495 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1496 printf("gensec_update returned %s\n", nt_errstr(status));
1500 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1505 SMB2_CAP_DFS, /* in_capabilities */
1507 0, /* in_previous_session_id */
1508 &in_blob); /* in_security_buffer */
1509 if (subreq == NULL) {
1510 printf("smb2cli_session_setup_send() returned NULL\n");
1514 ok = tevent_req_poll(subreq, ev);
1516 printf("tevent_req_poll() returned false\n");
1520 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1522 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1523 printf("smb2cli_session_setup_recv returned %s\n",
1528 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
1529 if (!NT_STATUS_IS_OK(status)) {
1530 printf("auth_generic_update returned %s\n", nt_errstr(status));
1534 status = smb2cli_flush(cli, fid_persistent, fid_volatile);
1535 if (!NT_STATUS_IS_OK(status)) {
1536 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1540 status = smb2cli_query_directory(
1541 cli, 1, 0x3, 0, dir_persistent, dir_volatile,
1542 "session-reauth.txt", 0xffff,
1543 talloc_tos(), &dir_data, &dir_data_length);
1544 if (!NT_STATUS_IS_OK(status)) {
1545 printf("smb2cli_query_directory returned %s\n", nt_errstr(status));
1550 * query_info seems to be a path based operation on Windows...
1552 status = smb2cli_query_info(cli->conn,
1556 SMB2_GETINFO_SECURITY,
1557 0, /* in_file_info_class */
1558 1024, /* in_max_output_length */
1559 NULL, /* in_input_buffer */
1560 SECINFO_OWNER, /* in_additional_info */
1565 &out_output_buffer);
1566 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1567 printf("smb2cli_query_info (security) returned %s\n", nt_errstr(status));
1571 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1572 status = smb2cli_query_info(cli->conn,
1578 1024, /* in_max_output_length */
1579 NULL, /* in_input_buffer */
1580 0, /* in_additional_info */
1585 &out_output_buffer);
1586 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1587 printf("smb2cli_query_info (position) returned %s\n", nt_errstr(status));
1591 in_input_buffer = data_blob_talloc(talloc_tos(), NULL, 8);
1592 SBVAL(in_input_buffer.data, 0, 512);
1594 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1595 status = smb2cli_set_info(cli->conn,
1602 0, /* in_additional_info */
1605 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1606 printf("smb2cli_set_info (position) returned %s\n", nt_errstr(status));
1610 status = smb2cli_create(cli, "session-reauth-invalid.txt",
1611 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1612 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1613 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1614 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1615 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1616 FILE_CREATE, /* create_disposition, */
1617 FILE_DELETE_ON_CLOSE, /* create_options, */
1618 NULL, /* smb2_create_blobs *blobs */
1621 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1622 printf("smb2cli_create %s\n", nt_errstr(status));
1626 status = smb2cli_create(cli, "",
1627 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1628 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1629 SEC_STD_SYNCHRONIZE|
1631 SEC_DIR_READ_ATTRIBUTE, /* desired_access, */
1632 0, /* file_attributes, */
1633 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1634 FILE_OPEN, /* create_disposition, */
1635 FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, /* create_options, */
1636 NULL, /* smb2_create_blobs *blobs */
1639 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1640 printf("smb2cli_create returned %s\n", nt_errstr(status));
1644 saved_tid = cli->smb2.tid;
1645 status = cli_tree_connect(cli, share, "?????", "", 0);
1646 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1647 printf("cli_tree_connect returned %s\n", nt_errstr(status));
1650 cli->smb2.tid = saved_tid;
1652 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1657 SMB2_CAP_DFS, /* in_capabilities */
1659 0, /* in_previous_session_id */
1660 &in_blob); /* in_security_buffer */
1661 if (subreq == NULL) {
1662 printf("smb2cli_session_setup_send() returned NULL\n");
1666 ok = tevent_req_poll(subreq, ev);
1668 printf("tevent_req_poll() returned false\n");
1672 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1673 &recv_iov, &out_blob);
1674 if (!NT_STATUS_IS_OK(status)) {
1675 printf("smb2cli_session_setup_recv returned %s\n",
1680 status = smb2cli_flush(cli, fid_persistent, fid_volatile);
1681 if (!NT_STATUS_IS_OK(status)) {
1682 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1686 status = smb2cli_query_info(cli->conn,
1690 SMB2_GETINFO_SECURITY,
1691 0, /* in_file_info_class */
1692 1024, /* in_max_output_length */
1693 NULL, /* in_input_buffer */
1694 SECINFO_OWNER, /* in_additional_info */
1699 &out_output_buffer);
1700 if (!NT_STATUS_IS_OK(status)) {
1701 printf("smb2cli_query_info (security) returned %s\n", nt_errstr(status));
1705 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1706 status = smb2cli_query_info(cli->conn,
1712 1024, /* in_max_output_length */
1713 NULL, /* in_input_buffer */
1714 0, /* in_additional_info */
1719 &out_output_buffer);
1720 if (!NT_STATUS_IS_OK(status)) {
1721 printf("smb2cli_query_info (position) returned %s\n", nt_errstr(status));
1725 in_input_buffer = data_blob_talloc(talloc_tos(), NULL, 8);
1726 SBVAL(in_input_buffer.data, 0, 512);
1728 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1729 status = smb2cli_set_info(cli->conn,
1736 0, /* in_additional_info */
1739 if (!NT_STATUS_IS_OK(status)) {
1740 printf("smb2cli_set_info (position) returned %s\n", nt_errstr(status));
1744 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1745 status = smb2cli_query_info(cli->conn,
1751 1024, /* in_max_output_length */
1752 NULL, /* in_input_buffer */
1753 0, /* in_additional_info */
1758 &out_output_buffer);
1759 if (!NT_STATUS_IS_OK(status)) {
1760 printf("smb2cli_query_info (position) returned %s\n", nt_errstr(status));
1764 status = smb2cli_close(cli, 0, fid_persistent, fid_volatile);
1765 if (!NT_STATUS_IS_OK(status)) {
1766 printf("smb2cli_close returned %s\n", nt_errstr(status));
1770 status = smb2cli_create(cli, "session-reauth.txt",
1771 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1772 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1773 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1774 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1775 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1776 FILE_CREATE, /* create_disposition, */
1777 FILE_DELETE_ON_CLOSE, /* create_options, */
1778 NULL, /* smb2_create_blobs *blobs */
1781 if (!NT_STATUS_IS_OK(status)) {
1782 printf("smb2cli_create %s\n", nt_errstr(status));
1786 status = smb2cli_query_directory(
1787 cli, 1, 0x3, 0, dir_persistent, dir_volatile,
1788 "session-reauth.txt", 0xffff,
1789 talloc_tos(), &dir_data, &dir_data_length);
1790 if (!NT_STATUS_IS_OK(status)) {
1791 printf("smb2cli_query_directory returned %s\n", nt_errstr(status));
1795 status = smb2cli_close(cli, 0, dir_persistent, dir_volatile);
1796 if (!NT_STATUS_IS_OK(status)) {
1797 printf("smb2cli_close returned %s\n", nt_errstr(status));
1801 status = smb2cli_close(cli, 0, fid_persistent, fid_volatile);
1802 if (!NT_STATUS_IS_OK(status)) {
1803 printf("smb2cli_close returned %s\n", nt_errstr(status));
1807 saved_tid = cli->smb2.tid;
1808 status = cli_tree_connect(cli, share, "?????", "", 0);
1809 if (!NT_STATUS_IS_OK(status)) {
1810 printf("cli_tree_connect returned %s\n", nt_errstr(status));
1813 cli->smb2.tid = saved_tid;