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_SMB2_24);
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:
242 printf("Server supports %s\n", name);
244 printf("Server DOES NOT support SMB2\n");
248 status = smbXcli_negprot(cli->conn, cli->timeout,
250 if (!NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_RESET) &&
251 !NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_DISCONNECTED) &&
252 !NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_ABORTED)) {
253 printf("2nd smbXcli_negprot should disconnect - returned %s\n",
258 if (smbXcli_conn_is_connected(cli->conn)) {
259 printf("2nd smbXcli_negprot should disconnect "
260 "- still connected\n");
267 bool run_smb2_session_reconnect(int dummy)
269 struct cli_state *cli1;
270 struct cli_state *cli2;
273 uint64_t fid_persistent, fid_volatile;
274 struct tevent_context *ev;
275 struct tevent_req *subreq;
276 DATA_BLOB in_blob = data_blob_null;
278 DATA_BLOB session_key;
279 struct auth_generic_state *auth_generic_state;
280 struct iovec *recv_iov;
281 const char *hello = "Hello, world\n";
285 printf("Starting SMB2-SESSION-RECONNECT\n");
287 if (!torture_init_connection(&cli1)) {
290 cli1->smb2.pid = 0xFEFF;
292 status = smbXcli_negprot(cli1->conn, cli1->timeout,
293 PROTOCOL_SMB2_02, PROTOCOL_SMB2_24);
294 if (!NT_STATUS_IS_OK(status)) {
295 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
299 status = cli_session_setup(cli1, username,
300 password, strlen(password),
301 password, strlen(password),
303 if (!NT_STATUS_IS_OK(status)) {
304 printf("cli_session_setup returned %s\n", nt_errstr(status));
308 status = cli_tree_connect(cli1, share, "?????", "", 0);
309 if (!NT_STATUS_IS_OK(status)) {
310 printf("cli_tree_connect returned %s\n", nt_errstr(status));
314 status = smb2cli_create(cli1, "session-reconnect.txt",
315 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
316 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
317 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
318 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
319 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
320 FILE_CREATE, /* create_disposition, */
321 FILE_DELETE_ON_CLOSE, /* create_options, */
322 NULL, /* smb2_create_blobs *blobs */
325 if (!NT_STATUS_IS_OK(status)) {
326 printf("smb2cli_create on cli1 %s\n", nt_errstr(status));
330 status = smb2cli_write(cli1, strlen(hello), 0, fid_persistent,
331 fid_volatile, 0, 0, (const uint8_t *)hello);
332 if (!NT_STATUS_IS_OK(status)) {
333 printf("smb2cli_write returned %s\n", nt_errstr(status));
337 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
338 if (!NT_STATUS_IS_OK(status)) {
339 printf("smb2cli_flush returned %s\n", nt_errstr(status));
343 status = smb2cli_read(cli1, 0x10000, 0, fid_persistent,
345 talloc_tos(), &result, &nread);
346 if (!NT_STATUS_IS_OK(status)) {
347 printf("smb2cli_read returned %s\n", nt_errstr(status));
351 if (nread != strlen(hello)) {
352 printf("smb2cli_read returned %d bytes, expected %d\n",
353 (int)nread, (int)strlen(hello));
357 if (memcmp(hello, result, nread) != 0) {
358 printf("smb2cli_read returned '%s', expected '%s'\n",
363 /* prepare second session */
365 if (!torture_init_connection(&cli2)) {
368 cli2->smb2.pid = 0xFEFF;
370 status = smbXcli_negprot(cli2->conn, cli2->timeout,
371 PROTOCOL_SMB2_02, PROTOCOL_SMB2_24);
372 if (!NT_STATUS_IS_OK(status)) {
373 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
377 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
378 if (!NT_STATUS_IS_OK(status)) {
379 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
383 gensec_want_feature(auth_generic_state->gensec_security,
384 GENSEC_FEATURE_SESSION_KEY);
385 status = auth_generic_set_username(auth_generic_state, username);
386 if (!NT_STATUS_IS_OK(status)) {
387 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
391 status = auth_generic_set_domain(auth_generic_state, workgroup);
392 if (!NT_STATUS_IS_OK(status)) {
393 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
397 status = auth_generic_set_password(auth_generic_state, password);
398 if (!NT_STATUS_IS_OK(status)) {
399 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
403 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
404 if (!NT_STATUS_IS_OK(status)) {
405 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
409 ev = event_context_init(talloc_tos());
411 printf("event_context_init() returned NULL\n");
415 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
416 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
417 printf("gensec_update returned %s\n", nt_errstr(status));
421 cli2->smb2.session = smbXcli_session_create(cli2, cli2->conn);
423 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
428 SMB2_CAP_DFS, /* in_capabilities */
430 /* in_previous_session_id: */
431 smb2cli_session_current_id(cli1->smb2.session),
432 &in_blob); /* in_security_buffer */
433 if (subreq == NULL) {
434 printf("smb2cli_session_setup_send() returned NULL\n");
438 ok = tevent_req_poll(subreq, ev);
440 printf("tevent_req_poll() returned false\n");
444 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
446 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
447 printf("smb2cli_session_setup_recv returned %s\n",
452 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
453 if (!NT_STATUS_IS_OK(status)) {
454 printf("auth_generic_update returned %s\n", nt_errstr(status));
458 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
463 SMB2_CAP_DFS, /* in_capabilities */
465 /* in_previous_session_id: */
466 smb2cli_session_current_id(cli1->smb2.session),
467 &in_blob); /* in_security_buffer */
468 if (subreq == NULL) {
469 printf("smb2cli_session_setup_send() returned NULL\n");
473 ok = tevent_req_poll(subreq, ev);
475 printf("tevent_req_poll() returned false\n");
479 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
480 &recv_iov, &out_blob);
481 if (!NT_STATUS_IS_OK(status)) {
482 printf("smb2cli_session_setup_recv returned %s\n",
487 status = gensec_session_key(auth_generic_state->gensec_security, talloc_tos(),
489 if (!NT_STATUS_IS_OK(status)) {
490 printf("gensec_session_key returned %s\n",
495 /* check file operation on the old client */
497 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
498 if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
499 printf("smb2cli_flush returned %s\n", nt_errstr(status));
503 status = cli_tree_connect(cli1, share, "?????", "", 0);
504 if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
505 printf("cli_tree_connect returned %s\n", nt_errstr(status));
510 * checking file operations without signing.
511 * on w2k8r2 at least, flush, read and write also work the same way,
512 * while create gives ACCESS_DENIED without signing
514 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
515 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
516 printf("smb2cli_flush returned %s\n", nt_errstr(status));
520 status = smb2cli_write(cli2, strlen(hello), 0, fid_persistent,
521 fid_volatile, 0, 0, (const uint8_t *)hello);
522 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
523 printf("smb2cli_write returned %s\n", nt_errstr(status));
527 status = smb2cli_read(cli2, 0x10000, 0, fid_persistent,
529 talloc_tos(), &result, &nread);
530 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
531 printf("smb2cli_read returned %s\n", nt_errstr(status));
535 status = smb2cli_create(cli2, "session-reconnect.txt",
536 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
537 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
538 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
539 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
540 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
541 FILE_CREATE, /* create_disposition, */
542 FILE_DELETE_ON_CLOSE, /* create_options, */
543 NULL, /* smb2_create_blobs *blobs */
546 if (!NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED) &&
547 !NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
548 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
552 /* now grab the session key and try with signing */
554 status = smb2cli_session_set_session_key(cli2->smb2.session,
557 if (!NT_STATUS_IS_OK(status)) {
558 printf("smb2cli_session_set_session_key %s\n", nt_errstr(status));
562 /* the tid seems to be irrelevant at this stage */
564 cli2->smb2.tid = cli1->smb2.tid;
566 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
567 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
568 printf("smb2cli_flush returned %s\n", nt_errstr(status));
572 status = smb2cli_write(cli2, strlen(hello), 0, fid_persistent,
573 fid_volatile, 0, 0, (const uint8_t *)hello);
574 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
575 printf("smb2cli_write returned %s\n", nt_errstr(status));
579 status = smb2cli_read(cli2, 0x10000, 0, fid_persistent,
581 talloc_tos(), &result, &nread);
582 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
583 printf("smb2cli_read returned %s\n", nt_errstr(status));
587 status = smb2cli_create(cli2, "session-reconnect.txt",
588 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
589 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
590 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
591 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
592 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
593 FILE_CREATE, /* create_disposition, */
594 FILE_DELETE_ON_CLOSE, /* create_options, */
595 NULL, /* smb2_create_blobs *blobs */
598 if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
599 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
603 /* now do a new tcon and test file calls again */
605 status = cli_tree_connect(cli2, share, "?????", "", 0);
606 if (!NT_STATUS_IS_OK(status)) {
607 printf("cli_tree_connect returned %s\n", nt_errstr(status));
611 status = smb2cli_create(cli2, "session-reconnect.txt",
612 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
613 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
614 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
615 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
616 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
617 FILE_CREATE, /* create_disposition, */
618 FILE_DELETE_ON_CLOSE, /* create_options, */
619 NULL, /* smb2_create_blobs *blobs */
622 if (!NT_STATUS_IS_OK(status)) {
623 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
627 status = smb2cli_write(cli2, strlen(hello), 0, fid_persistent,
628 fid_volatile, 0, 0, (const uint8_t *)hello);
629 if (!NT_STATUS_IS_OK(status)) {
630 printf("smb2cli_write returned %s\n", nt_errstr(status));
634 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
635 if (!NT_STATUS_IS_OK(status)) {
636 printf("smb2cli_flush returned %s\n", nt_errstr(status));
640 status = smb2cli_read(cli2, 0x10000, 0, fid_persistent,
642 talloc_tos(), &result, &nread);
643 if (!NT_STATUS_IS_OK(status)) {
644 printf("smb2cli_read returned %s\n", nt_errstr(status));
648 if (nread != strlen(hello)) {
649 printf("smb2cli_read returned %d bytes, expected %d\n",
650 (int)nread, (int)strlen(hello));
654 if (memcmp(hello, result, nread) != 0) {
655 printf("smb2cli_read returned '%s', expected '%s'\n",
663 bool run_smb2_tcon_dependence(int dummy)
665 struct cli_state *cli;
667 uint64_t fid_persistent, fid_volatile;
668 const char *hello = "Hello, world\n";
672 printf("Starting SMB2-TCON-DEPENDENCE\n");
674 if (!torture_init_connection(&cli)) {
677 cli->smb2.pid = 0xFEFF;
679 status = smbXcli_negprot(cli->conn, cli->timeout,
680 PROTOCOL_SMB2_02, PROTOCOL_SMB2_24);
681 if (!NT_STATUS_IS_OK(status)) {
682 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
686 status = cli_session_setup(cli, username,
687 password, strlen(password),
688 password, strlen(password),
690 if (!NT_STATUS_IS_OK(status)) {
691 printf("cli_session_setup returned %s\n", nt_errstr(status));
695 status = cli_tree_connect(cli, share, "?????", "", 0);
696 if (!NT_STATUS_IS_OK(status)) {
697 printf("cli_tree_connect returned %s\n", nt_errstr(status));
701 status = smb2cli_create(cli, "tcon_depedence.txt",
702 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
703 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
704 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
705 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
706 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
707 FILE_CREATE, /* create_disposition, */
708 FILE_DELETE_ON_CLOSE, /* create_options, */
709 NULL, /* smb2_create_blobs *blobs */
712 if (!NT_STATUS_IS_OK(status)) {
713 printf("smb2cli_create on cli %s\n", nt_errstr(status));
717 status = smb2cli_write(cli, strlen(hello), 0, fid_persistent,
718 fid_volatile, 0, 0, (const uint8_t *)hello);
719 if (!NT_STATUS_IS_OK(status)) {
720 printf("smb2cli_write returned %s\n", nt_errstr(status));
724 status = smb2cli_flush(cli, fid_persistent, fid_volatile);
725 if (!NT_STATUS_IS_OK(status)) {
726 printf("smb2cli_flush returned %s\n", nt_errstr(status));
730 status = smb2cli_read(cli, 0x10000, 0, fid_persistent,
732 talloc_tos(), &result, &nread);
733 if (!NT_STATUS_IS_OK(status)) {
734 printf("smb2cli_read returned %s\n", nt_errstr(status));
738 if (nread != strlen(hello)) {
739 printf("smb2cli_read returned %d bytes, expected %d\n",
740 (int)nread, (int)strlen(hello));
744 if (memcmp(hello, result, nread) != 0) {
745 printf("smb2cli_read returned '%s', expected '%s'\n",
750 /* check behaviour with wrong tid... */
754 status = smb2cli_read(cli, 0x10000, 0, fid_persistent,
756 talloc_tos(), &result, &nread);
757 if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
758 printf("smb2cli_read returned %s\n", nt_errstr(status));
767 bool run_smb2_multi_channel(int dummy)
769 struct cli_state *cli1;
770 struct cli_state *cli2;
771 struct cli_state *cli3;
774 uint64_t fid_persistent, fid_volatile;
775 struct tevent_context *ev;
776 struct tevent_req *subreq;
777 DATA_BLOB in_blob = data_blob_null;
779 DATA_BLOB channel_session_key;
780 struct auth_generic_state *auth_generic_state;
781 struct iovec *recv_iov;
782 const char *hello = "Hello, world\n";
786 printf("Starting SMB2-MULTI-CHANNEL\n");
788 if (!torture_init_connection(&cli1)) {
791 cli1->smb2.pid = 0xFEFF;
793 if (!torture_init_connection(&cli2)) {
796 cli2->smb2.pid = 0xFEFF;
798 if (!torture_init_connection(&cli3)) {
801 cli3->smb2.pid = 0xFEFF;
803 status = smbXcli_negprot(cli1->conn, cli1->timeout,
804 PROTOCOL_SMB2_22, PROTOCOL_SMB2_24);
805 if (!NT_STATUS_IS_OK(status)) {
806 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
810 status = smbXcli_negprot(cli2->conn, cli2->timeout,
811 PROTOCOL_SMB2_22, PROTOCOL_SMB2_24);
812 if (!NT_STATUS_IS_OK(status)) {
813 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
817 status = smbXcli_negprot(cli3->conn, cli3->timeout,
818 PROTOCOL_SMB2_22, PROTOCOL_SMB2_24);
819 if (!NT_STATUS_IS_OK(status)) {
820 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
824 status = cli_session_setup(cli1, username,
825 password, strlen(password),
826 password, strlen(password),
828 if (!NT_STATUS_IS_OK(status)) {
829 printf("smb2cli_sesssetup returned %s\n", nt_errstr(status));
833 status = cli_tree_connect(cli1, share, "?????", "", 0);
834 if (!NT_STATUS_IS_OK(status)) {
835 printf("cli_tree_connect returned %s\n", nt_errstr(status));
839 status = smb2cli_session_create_channel(cli2,
842 &cli2->smb2.session);
843 if (!NT_STATUS_IS_OK(status)) {
844 printf("smb2cli_session_create_channel returned %s\n",
849 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
850 if (!NT_STATUS_IS_OK(status)) {
851 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
855 gensec_want_feature(auth_generic_state->gensec_security,
856 GENSEC_FEATURE_SESSION_KEY);
857 status = auth_generic_set_username(auth_generic_state, username);
858 if (!NT_STATUS_IS_OK(status)) {
859 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
863 status = auth_generic_set_domain(auth_generic_state, workgroup);
864 if (!NT_STATUS_IS_OK(status)) {
865 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
869 status = auth_generic_set_password(auth_generic_state, password);
870 if (!NT_STATUS_IS_OK(status)) {
871 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
875 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
876 if (!NT_STATUS_IS_OK(status)) {
877 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
881 ev = event_context_init(talloc_tos());
883 printf("event_context_init() returned NULL\n");
887 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
888 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
889 printf("gensec_update returned %s\n", nt_errstr(status));
893 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
898 SMB2_CAP_DFS, /* in_capabilities */
900 0, /* in_previous_session_id */
901 &in_blob); /* in_security_buffer */
902 if (subreq == NULL) {
903 printf("smb2cli_session_setup_send() returned NULL\n");
907 ok = tevent_req_poll(subreq, ev);
909 printf("tevent_req_poll() returned false\n");
913 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
915 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
916 printf("smb2cli_session_setup_recv returned %s\n",
921 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
922 if (!NT_STATUS_IS_OK(status)) {
923 printf("auth_generic_update returned %s\n", nt_errstr(status));
927 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
932 SMB2_CAP_DFS, /* in_capabilities */
934 0, /* in_previous_session_id */
935 &in_blob); /* in_security_buffer */
936 if (subreq == NULL) {
937 printf("smb2cli_session_setup_send() returned NULL\n");
941 ok = tevent_req_poll(subreq, ev);
943 printf("tevent_req_poll() returned false\n");
947 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
948 &recv_iov, &out_blob);
949 if (!NT_STATUS_IS_OK(status)) {
950 printf("smb2cli_session_setup_recv returned %s\n",
955 status = gensec_session_key(auth_generic_state->gensec_security, talloc_tos(),
956 &channel_session_key);
957 if (!NT_STATUS_IS_OK(status)) {
958 printf("gensec_session_key returned %s\n",
963 status = smb2cli_session_set_channel_key(cli2->smb2.session,
966 if (!NT_STATUS_IS_OK(status)) {
967 printf("smb2cli_session_set_channel_key %s\n", nt_errstr(status));
971 cli2->smb2.tid = cli1->smb2.tid;
973 status = smb2cli_session_create_channel(cli3,
976 &cli3->smb2.session);
977 if (!NT_STATUS_IS_OK(status)) {
978 printf("smb2cli_session_create_channel returned %s\n",
983 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
984 if (!NT_STATUS_IS_OK(status)) {
985 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
989 gensec_want_feature(auth_generic_state->gensec_security,
990 GENSEC_FEATURE_SESSION_KEY);
991 status = auth_generic_set_username(auth_generic_state, username);
992 if (!NT_STATUS_IS_OK(status)) {
993 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
997 status = auth_generic_set_domain(auth_generic_state, workgroup);
998 if (!NT_STATUS_IS_OK(status)) {
999 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
1003 status = auth_generic_set_password(auth_generic_state, password);
1004 if (!NT_STATUS_IS_OK(status)) {
1005 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
1009 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
1010 if (!NT_STATUS_IS_OK(status)) {
1011 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
1015 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
1016 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1017 printf("gensec_update returned %s\n", nt_errstr(status));
1021 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1025 0x01, /* in_flags */
1026 SMB2_CAP_DFS, /* in_capabilities */
1028 0, /* in_previous_session_id */
1029 &in_blob); /* in_security_buffer */
1030 if (subreq == NULL) {
1031 printf("smb2cli_session_setup_send() returned NULL\n");
1035 ok = tevent_req_poll(subreq, ev);
1037 printf("tevent_req_poll() returned false\n");
1041 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1043 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1044 printf("smb2cli_session_setup_recv returned %s\n",
1049 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
1050 if (!NT_STATUS_IS_OK(status)) {
1051 printf("auth_generic_update returned %s\n", nt_errstr(status));
1055 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1059 0x01, /* in_flags */
1060 SMB2_CAP_DFS, /* in_capabilities */
1062 0, /* in_previous_session_id */
1063 &in_blob); /* in_security_buffer */
1064 if (subreq == NULL) {
1065 printf("smb2cli_session_setup_send() returned NULL\n");
1069 ok = tevent_req_poll(subreq, ev);
1071 printf("tevent_req_poll() returned false\n");
1075 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1076 &recv_iov, &out_blob);
1077 if (!NT_STATUS_IS_OK(status)) {
1078 printf("smb2cli_session_setup_recv returned %s\n",
1083 status = gensec_session_key(auth_generic_state->gensec_security, talloc_tos(),
1084 &channel_session_key);
1085 if (!NT_STATUS_IS_OK(status)) {
1086 printf("gensec_session_key returned %s\n",
1091 status = smb2cli_session_set_channel_key(cli3->smb2.session,
1092 channel_session_key,
1094 if (!NT_STATUS_IS_OK(status)) {
1095 printf("smb2cli_session_set_channel_key %s\n", nt_errstr(status));
1099 cli3->smb2.tid = cli2->smb2.tid;
1101 status = smb2cli_create(cli2, "multi-channel.txt",
1102 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1103 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1104 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1105 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1106 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1107 FILE_CREATE, /* create_disposition, */
1108 FILE_DELETE_ON_CLOSE, /* create_options, */
1109 NULL, /* smb2_create_blobs *blobs */
1112 if (!NT_STATUS_IS_OK(status)) {
1113 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
1117 status = smb2cli_write(cli1, strlen(hello), 0, fid_persistent,
1118 fid_volatile, 0, 0, (const uint8_t *)hello);
1119 if (!NT_STATUS_IS_OK(status)) {
1120 printf("smb2cli_write returned %s\n", nt_errstr(status));
1124 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
1125 if (!NT_STATUS_IS_OK(status)) {
1126 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1130 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
1131 if (!NT_STATUS_IS_OK(status)) {
1132 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1136 status = smb2cli_flush(cli3, fid_persistent, fid_volatile);
1137 if (!NT_STATUS_IS_OK(status)) {
1138 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1142 status = smb2cli_read(cli2, 0x10000, 0, fid_persistent,
1144 talloc_tos(), &result, &nread);
1145 if (!NT_STATUS_IS_OK(status)) {
1146 printf("smb2cli_read returned %s\n", nt_errstr(status));
1150 if (nread != strlen(hello)) {
1151 printf("smb2cli_read returned %d bytes, expected %d\n",
1152 (int)nread, (int)strlen(hello));
1156 if (memcmp(hello, result, nread) != 0) {
1157 printf("smb2cli_read returned '%s', expected '%s'\n",
1162 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
1163 if (!NT_STATUS_IS_OK(status)) {
1164 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
1168 gensec_want_feature(auth_generic_state->gensec_security,
1169 GENSEC_FEATURE_SESSION_KEY);
1170 status = auth_generic_set_username(auth_generic_state, username);
1171 if (!NT_STATUS_IS_OK(status)) {
1172 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
1176 status = auth_generic_set_domain(auth_generic_state, workgroup);
1177 if (!NT_STATUS_IS_OK(status)) {
1178 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
1182 status = auth_generic_set_password(auth_generic_state, password);
1183 if (!NT_STATUS_IS_OK(status)) {
1184 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
1188 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
1189 if (!NT_STATUS_IS_OK(status)) {
1190 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
1194 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
1195 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1196 printf("gensec_update returned %s\n", nt_errstr(status));
1200 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1205 SMB2_CAP_DFS, /* in_capabilities */
1207 0, /* in_previous_session_id */
1208 &in_blob); /* in_security_buffer */
1209 if (subreq == NULL) {
1210 printf("smb2cli_session_setup_send() returned NULL\n");
1214 ok = tevent_req_poll(subreq, ev);
1216 printf("tevent_req_poll() returned false\n");
1220 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1222 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1223 printf("smb2cli_session_setup_recv returned %s\n",
1228 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
1229 if (!NT_STATUS_IS_OK(status)) {
1230 printf("auth_generic_update returned %s\n", nt_errstr(status));
1234 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
1235 if (!NT_STATUS_IS_OK(status)) {
1236 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1240 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
1241 if (!NT_STATUS_IS_OK(status)) {
1242 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1246 status = smb2cli_flush(cli3, fid_persistent, fid_volatile);
1247 if (!NT_STATUS_IS_OK(status)) {
1248 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1252 status = smb2cli_create(cli1, "multi-channel-invalid.txt",
1253 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1254 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1255 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1256 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1257 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1258 FILE_CREATE, /* create_disposition, */
1259 FILE_DELETE_ON_CLOSE, /* create_options, */
1260 NULL, /* smb2_create_blobs *blobs */
1263 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1264 printf("smb2cli_create %s\n", nt_errstr(status));
1268 status = smb2cli_create(cli2, "multi-channel-invalid.txt",
1269 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1270 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1271 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1272 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1273 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1274 FILE_CREATE, /* create_disposition, */
1275 FILE_DELETE_ON_CLOSE, /* create_options, */
1276 NULL, /* smb2_create_blobs *blobs */
1279 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1280 printf("smb2cli_create %s\n", nt_errstr(status));
1284 status = smb2cli_create(cli3, "multi-channel-invalid.txt",
1285 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1286 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1287 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1288 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1289 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1290 FILE_CREATE, /* create_disposition, */
1291 FILE_DELETE_ON_CLOSE, /* create_options, */
1292 NULL, /* smb2_create_blobs *blobs */
1295 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1296 printf("smb2cli_create %s\n", nt_errstr(status));
1300 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1305 SMB2_CAP_DFS, /* in_capabilities */
1307 0, /* in_previous_session_id */
1308 &in_blob); /* in_security_buffer */
1309 if (subreq == NULL) {
1310 printf("smb2cli_session_setup_send() returned NULL\n");
1314 ok = tevent_req_poll(subreq, ev);
1316 printf("tevent_req_poll() returned false\n");
1320 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1321 &recv_iov, &out_blob);
1322 if (!NT_STATUS_IS_OK(status)) {
1323 printf("smb2cli_session_setup_recv returned %s\n",
1328 status = smb2cli_close(cli3, 0, fid_persistent, fid_volatile);
1329 if (!NT_STATUS_IS_OK(status)) {
1330 printf("smb2cli_close returned %s\n", nt_errstr(status));
1334 status = smb2cli_flush(cli3, fid_persistent, fid_volatile);
1335 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
1336 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1340 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
1341 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
1342 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1346 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
1347 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
1348 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1355 bool run_smb2_session_reauth(int dummy)
1357 struct cli_state *cli;
1360 uint64_t fid_persistent, fid_volatile;
1361 uint64_t dir_persistent, dir_volatile;
1363 uint32_t dir_data_length;
1364 struct tevent_context *ev;
1365 struct tevent_req *subreq;
1366 DATA_BLOB in_blob = data_blob_null;
1368 DATA_BLOB in_input_buffer;
1369 DATA_BLOB out_output_buffer;
1370 uint8_t in_file_info_class;
1371 struct auth_generic_state *auth_generic_state;
1372 struct iovec *recv_iov;
1375 printf("Starting SMB2-SESSION_REAUTH\n");
1377 if (!torture_init_connection(&cli)) {
1380 cli->smb2.pid = 0xFEFF;
1383 * PROTOCOL_SMB2_22 has a bug in win8pre0
1384 * it behaves like PROTOCOL_SMB2_02
1385 * and returns NT_STATUS_REQUEST_NOT_ACCEPTED,
1386 * while it allows it on PROTOCOL_SMB2_02.
1388 status = smbXcli_negprot(cli->conn, cli->timeout,
1389 PROTOCOL_SMB2_10, PROTOCOL_SMB2_10);
1390 if (!NT_STATUS_IS_OK(status)) {
1391 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
1395 status = cli_session_setup(cli, username,
1396 password, strlen(password),
1397 password, strlen(password),
1399 if (!NT_STATUS_IS_OK(status)) {
1400 printf("smb2cli_sesssetup returned %s\n", nt_errstr(status));
1404 status = cli_tree_connect(cli, share, "?????", "", 0);
1405 if (!NT_STATUS_IS_OK(status)) {
1406 printf("cli_tree_connect returned %s\n", nt_errstr(status));
1410 status = smb2cli_create(cli, "session-reauth.txt",
1411 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1412 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1413 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1414 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1415 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1416 FILE_CREATE, /* create_disposition, */
1417 FILE_DELETE_ON_CLOSE, /* create_options, */
1418 NULL, /* smb2_create_blobs *blobs */
1421 if (!NT_STATUS_IS_OK(status)) {
1422 printf("smb2cli_create %s\n", nt_errstr(status));
1426 status = smb2cli_create(cli, "",
1427 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1428 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1429 SEC_STD_SYNCHRONIZE|
1431 SEC_DIR_READ_ATTRIBUTE, /* desired_access, */
1432 0, /* file_attributes, */
1433 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1434 FILE_OPEN, /* create_disposition, */
1435 FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, /* create_options, */
1436 NULL, /* smb2_create_blobs *blobs */
1439 if (!NT_STATUS_IS_OK(status)) {
1440 printf("smb2cli_create returned %s\n", nt_errstr(status));
1444 status = smb2cli_query_directory(
1445 cli, 1, 0x3, 0, dir_persistent, dir_volatile,
1446 "session-reauth.txt", 0xffff,
1447 talloc_tos(), &dir_data, &dir_data_length);
1448 if (!NT_STATUS_IS_OK(status)) {
1449 printf("smb2cli_query_directory returned %s\n", nt_errstr(status));
1453 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
1454 if (!NT_STATUS_IS_OK(status)) {
1455 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
1459 gensec_want_feature(auth_generic_state->gensec_security,
1460 GENSEC_FEATURE_SESSION_KEY);
1461 status = auth_generic_set_username(auth_generic_state, username);
1462 if (!NT_STATUS_IS_OK(status)) {
1463 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
1467 status = auth_generic_set_domain(auth_generic_state, workgroup);
1468 if (!NT_STATUS_IS_OK(status)) {
1469 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
1473 status = auth_generic_set_password(auth_generic_state, password);
1474 if (!NT_STATUS_IS_OK(status)) {
1475 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
1479 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
1480 if (!NT_STATUS_IS_OK(status)) {
1481 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
1485 ev = event_context_init(talloc_tos());
1487 printf("event_context_init() returned NULL\n");
1491 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
1492 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1493 printf("gensec_update returned %s\n", nt_errstr(status));
1497 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1502 SMB2_CAP_DFS, /* in_capabilities */
1504 0, /* in_previous_session_id */
1505 &in_blob); /* in_security_buffer */
1506 if (subreq == NULL) {
1507 printf("smb2cli_session_setup_send() returned NULL\n");
1511 ok = tevent_req_poll(subreq, ev);
1513 printf("tevent_req_poll() returned false\n");
1517 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1519 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1520 printf("smb2cli_session_setup_recv returned %s\n",
1525 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
1526 if (!NT_STATUS_IS_OK(status)) {
1527 printf("auth_generic_update returned %s\n", nt_errstr(status));
1531 status = smb2cli_flush(cli, fid_persistent, fid_volatile);
1532 if (!NT_STATUS_IS_OK(status)) {
1533 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1537 status = smb2cli_query_directory(
1538 cli, 1, 0x3, 0, dir_persistent, dir_volatile,
1539 "session-reauth.txt", 0xffff,
1540 talloc_tos(), &dir_data, &dir_data_length);
1541 if (!NT_STATUS_IS_OK(status)) {
1542 printf("smb2cli_query_directory returned %s\n", nt_errstr(status));
1547 * query_info seems to be a path based operation on Windows...
1549 status = smb2cli_query_info(cli->conn,
1553 SMB2_GETINFO_SECURITY,
1554 0, /* in_file_info_class */
1555 1024, /* in_max_output_length */
1556 NULL, /* in_input_buffer */
1557 SECINFO_OWNER, /* in_additional_info */
1562 &out_output_buffer);
1563 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1564 printf("smb2cli_query_info (security) returned %s\n", nt_errstr(status));
1568 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1569 status = smb2cli_query_info(cli->conn,
1575 1024, /* in_max_output_length */
1576 NULL, /* in_input_buffer */
1577 0, /* in_additional_info */
1582 &out_output_buffer);
1583 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1584 printf("smb2cli_query_info (position) returned %s\n", nt_errstr(status));
1588 in_input_buffer = data_blob_talloc(talloc_tos(), NULL, 8);
1589 SBVAL(in_input_buffer.data, 0, 512);
1591 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1592 status = smb2cli_set_info(cli->conn,
1599 0, /* in_additional_info */
1602 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1603 printf("smb2cli_set_info (position) returned %s\n", nt_errstr(status));
1607 status = smb2cli_create(cli, "session-reauth-invalid.txt",
1608 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1609 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1610 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1611 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1612 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1613 FILE_CREATE, /* create_disposition, */
1614 FILE_DELETE_ON_CLOSE, /* create_options, */
1615 NULL, /* smb2_create_blobs *blobs */
1618 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1619 printf("smb2cli_create %s\n", nt_errstr(status));
1623 status = smb2cli_create(cli, "",
1624 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1625 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1626 SEC_STD_SYNCHRONIZE|
1628 SEC_DIR_READ_ATTRIBUTE, /* desired_access, */
1629 0, /* file_attributes, */
1630 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1631 FILE_OPEN, /* create_disposition, */
1632 FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, /* create_options, */
1633 NULL, /* smb2_create_blobs *blobs */
1636 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1637 printf("smb2cli_create returned %s\n", nt_errstr(status));
1641 saved_tid = cli->smb2.tid;
1642 status = cli_tree_connect(cli, share, "?????", "", 0);
1643 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1644 printf("cli_tree_connect returned %s\n", nt_errstr(status));
1647 cli->smb2.tid = saved_tid;
1649 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1654 SMB2_CAP_DFS, /* in_capabilities */
1656 0, /* in_previous_session_id */
1657 &in_blob); /* in_security_buffer */
1658 if (subreq == NULL) {
1659 printf("smb2cli_session_setup_send() returned NULL\n");
1663 ok = tevent_req_poll(subreq, ev);
1665 printf("tevent_req_poll() returned false\n");
1669 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1670 &recv_iov, &out_blob);
1671 if (!NT_STATUS_IS_OK(status)) {
1672 printf("smb2cli_session_setup_recv returned %s\n",
1677 status = smb2cli_flush(cli, fid_persistent, fid_volatile);
1678 if (!NT_STATUS_IS_OK(status)) {
1679 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1683 status = smb2cli_query_info(cli->conn,
1687 SMB2_GETINFO_SECURITY,
1688 0, /* in_file_info_class */
1689 1024, /* in_max_output_length */
1690 NULL, /* in_input_buffer */
1691 SECINFO_OWNER, /* in_additional_info */
1696 &out_output_buffer);
1697 if (!NT_STATUS_IS_OK(status)) {
1698 printf("smb2cli_query_info (security) returned %s\n", nt_errstr(status));
1702 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1703 status = smb2cli_query_info(cli->conn,
1709 1024, /* in_max_output_length */
1710 NULL, /* in_input_buffer */
1711 0, /* in_additional_info */
1716 &out_output_buffer);
1717 if (!NT_STATUS_IS_OK(status)) {
1718 printf("smb2cli_query_info (position) returned %s\n", nt_errstr(status));
1722 in_input_buffer = data_blob_talloc(talloc_tos(), NULL, 8);
1723 SBVAL(in_input_buffer.data, 0, 512);
1725 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1726 status = smb2cli_set_info(cli->conn,
1733 0, /* in_additional_info */
1736 if (!NT_STATUS_IS_OK(status)) {
1737 printf("smb2cli_set_info (position) returned %s\n", nt_errstr(status));
1741 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1742 status = smb2cli_query_info(cli->conn,
1748 1024, /* in_max_output_length */
1749 NULL, /* in_input_buffer */
1750 0, /* in_additional_info */
1755 &out_output_buffer);
1756 if (!NT_STATUS_IS_OK(status)) {
1757 printf("smb2cli_query_info (position) returned %s\n", nt_errstr(status));
1761 status = smb2cli_close(cli, 0, fid_persistent, fid_volatile);
1762 if (!NT_STATUS_IS_OK(status)) {
1763 printf("smb2cli_close returned %s\n", nt_errstr(status));
1767 status = smb2cli_create(cli, "session-reauth.txt",
1768 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1769 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1770 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1771 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1772 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1773 FILE_CREATE, /* create_disposition, */
1774 FILE_DELETE_ON_CLOSE, /* create_options, */
1775 NULL, /* smb2_create_blobs *blobs */
1778 if (!NT_STATUS_IS_OK(status)) {
1779 printf("smb2cli_create %s\n", nt_errstr(status));
1783 status = smb2cli_query_directory(
1784 cli, 1, 0x3, 0, dir_persistent, dir_volatile,
1785 "session-reauth.txt", 0xffff,
1786 talloc_tos(), &dir_data, &dir_data_length);
1787 if (!NT_STATUS_IS_OK(status)) {
1788 printf("smb2cli_query_directory returned %s\n", nt_errstr(status));
1792 status = smb2cli_close(cli, 0, dir_persistent, dir_volatile);
1793 if (!NT_STATUS_IS_OK(status)) {
1794 printf("smb2cli_close returned %s\n", nt_errstr(status));
1798 status = smb2cli_close(cli, 0, fid_persistent, fid_volatile);
1799 if (!NT_STATUS_IS_OK(status)) {
1800 printf("smb2cli_close returned %s\n", nt_errstr(status));
1804 saved_tid = cli->smb2.tid;
1805 status = cli_tree_connect(cli, share, "?????", "", 0);
1806 if (!NT_STATUS_IS_OK(status)) {
1807 printf("cli_tree_connect returned %s\n", nt_errstr(status));
1810 cli->smb2.tid = saved_tid;