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->conn, cli->timeout, cli->smb2.session,
76 cli->smb2.tid, "smb2-basic.txt",
77 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
78 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
79 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
80 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
81 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
82 FILE_CREATE, /* create_disposition, */
83 FILE_DELETE_ON_CLOSE, /* create_options, */
84 NULL, /* smb2_create_blobs *blobs */
87 if (!NT_STATUS_IS_OK(status)) {
88 printf("smb2cli_create returned %s\n", nt_errstr(status));
92 status = smb2cli_write(cli, strlen(hello), 0, fid_persistent,
93 fid_volatile, 0, 0, (const uint8_t *)hello);
94 if (!NT_STATUS_IS_OK(status)) {
95 printf("smb2cli_write returned %s\n", nt_errstr(status));
99 status = smb2cli_flush(cli->conn, cli->timeout, cli->smb2.session,
100 cli->smb2.tid, fid_persistent, fid_volatile);
101 if (!NT_STATUS_IS_OK(status)) {
102 printf("smb2cli_flush returned %s\n", nt_errstr(status));
106 status = smb2cli_read(cli->conn, cli->timeout, cli->smb2.session,
107 cli->smb2.tid, 0x10000, 0, fid_persistent,
109 talloc_tos(), &result, &nread);
110 if (!NT_STATUS_IS_OK(status)) {
111 printf("smb2cli_read returned %s\n", nt_errstr(status));
115 if (nread != strlen(hello)) {
116 printf("smb2cli_read returned %d bytes, expected %d\n",
117 (int)nread, (int)strlen(hello));
121 if (memcmp(hello, result, nread) != 0) {
122 printf("smb2cli_read returned '%s', expected '%s'\n",
127 status = smb2cli_close(cli->conn, cli->timeout, cli->smb2.session,
128 cli->smb2.tid, 0, fid_persistent, fid_volatile);
129 if (!NT_STATUS_IS_OK(status)) {
130 printf("smb2cli_close returned %s\n", nt_errstr(status));
134 status = smb2cli_create(cli->conn, cli->timeout, cli->smb2.session,
136 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
137 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
140 SEC_DIR_READ_ATTRIBUTE, /* desired_access, */
141 0, /* file_attributes, */
142 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
143 FILE_OPEN, /* create_disposition, */
144 FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, /* create_options, */
145 NULL, /* smb2_create_blobs *blobs */
148 if (!NT_STATUS_IS_OK(status)) {
149 printf("smb2cli_create returned %s\n", nt_errstr(status));
153 status = smb2cli_query_directory(
154 cli->conn, cli->timeout, cli->smb2.session, cli->smb2.tid,
155 1, 0, 0, fid_persistent, fid_volatile, "*", 0xffff,
156 talloc_tos(), &dir_data, &dir_data_length);
158 if (!NT_STATUS_IS_OK(status)) {
159 printf("smb2cli_query_directory returned %s\n", nt_errstr(status));
163 status = smb2cli_close(cli->conn, cli->timeout, cli->smb2.session,
164 cli->smb2.tid, 0, fid_persistent, fid_volatile);
165 if (!NT_STATUS_IS_OK(status)) {
166 printf("smb2cli_close returned %s\n", nt_errstr(status));
170 saved_tid = cli->smb2.tid;
171 status = smb2cli_tdis(cli);
172 if (!NT_STATUS_IS_OK(status)) {
173 printf("smb2cli_tdis returned %s\n", nt_errstr(status));
176 cli->smb2.tid = saved_tid;
178 status = smb2cli_tdis(cli);
179 if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
180 printf("2nd smb2cli_tdis returned %s\n", nt_errstr(status));
184 saved_uid = smb2cli_session_current_id(cli->smb2.session);
185 status = smb2cli_logoff(cli);
186 if (!NT_STATUS_IS_OK(status)) {
187 printf("smb2cli_logoff returned %s\n", nt_errstr(status));
191 cli->smb2.session = smbXcli_session_create(cli, cli->conn);
192 if (cli->smb2.session == NULL) {
193 printf("smbXcli_session_create() returned NULL\n");
197 smb2cli_session_set_id_and_flags(cli->smb2.session, saved_uid, 0);
199 status = smb2cli_logoff(cli);
200 if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
201 printf("2nd smb2cli_logoff returned %s\n", nt_errstr(status));
208 bool run_smb2_negprot(int dummy)
210 struct cli_state *cli;
212 enum protocol_types protocol;
213 const char *name = NULL;
215 printf("Starting SMB2-NEGPROT\n");
217 if (!torture_init_connection(&cli)) {
220 cli->smb2.pid = 0xFEFF;
222 status = smbXcli_negprot(cli->conn, cli->timeout,
223 PROTOCOL_CORE, PROTOCOL_LATEST);
224 if (!NT_STATUS_IS_OK(status)) {
225 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
229 protocol = smbXcli_conn_protocol(cli->conn);
232 case PROTOCOL_SMB2_02:
235 case PROTOCOL_SMB2_10:
238 case PROTOCOL_SMB2_22:
241 case PROTOCOL_SMB2_24:
244 case PROTOCOL_SMB3_00:
252 printf("Server supports %s\n", name);
254 printf("Server DOES NOT support SMB2\n");
258 status = smbXcli_negprot(cli->conn, cli->timeout,
260 if (!NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_RESET) &&
261 !NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_DISCONNECTED) &&
262 !NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_ABORTED)) {
263 printf("2nd smbXcli_negprot should disconnect - returned %s\n",
268 if (smbXcli_conn_is_connected(cli->conn)) {
269 printf("2nd smbXcli_negprot should disconnect "
270 "- still connected\n");
277 bool run_smb2_session_reconnect(int dummy)
279 struct cli_state *cli1;
280 struct cli_state *cli2;
283 uint64_t fid_persistent, fid_volatile;
284 struct tevent_context *ev;
285 struct tevent_req *subreq;
286 DATA_BLOB in_blob = data_blob_null;
288 DATA_BLOB session_key;
289 struct auth_generic_state *auth_generic_state;
290 struct iovec *recv_iov;
291 const char *hello = "Hello, world\n";
295 printf("Starting SMB2-SESSION-RECONNECT\n");
297 if (!torture_init_connection(&cli1)) {
300 cli1->smb2.pid = 0xFEFF;
302 status = smbXcli_negprot(cli1->conn, cli1->timeout,
303 PROTOCOL_SMB2_02, PROTOCOL_LATEST);
304 if (!NT_STATUS_IS_OK(status)) {
305 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
309 status = cli_session_setup(cli1, username,
310 password, strlen(password),
311 password, strlen(password),
313 if (!NT_STATUS_IS_OK(status)) {
314 printf("cli_session_setup returned %s\n", nt_errstr(status));
318 status = cli_tree_connect(cli1, share, "?????", "", 0);
319 if (!NT_STATUS_IS_OK(status)) {
320 printf("cli_tree_connect returned %s\n", nt_errstr(status));
324 status = smb2cli_create(cli1->conn, cli1->timeout, cli1->smb2.session,
325 cli1->smb2.tid, "session-reconnect.txt",
326 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
327 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
328 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
329 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
330 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
331 FILE_CREATE, /* create_disposition, */
332 FILE_DELETE_ON_CLOSE, /* create_options, */
333 NULL, /* smb2_create_blobs *blobs */
336 if (!NT_STATUS_IS_OK(status)) {
337 printf("smb2cli_create on cli1 %s\n", nt_errstr(status));
341 status = smb2cli_write(cli1, strlen(hello), 0, fid_persistent,
342 fid_volatile, 0, 0, (const uint8_t *)hello);
343 if (!NT_STATUS_IS_OK(status)) {
344 printf("smb2cli_write returned %s\n", nt_errstr(status));
348 status = smb2cli_flush(cli1->conn, cli1->timeout, cli1->smb2.session,
349 cli1->smb2.tid, fid_persistent, fid_volatile);
350 if (!NT_STATUS_IS_OK(status)) {
351 printf("smb2cli_flush returned %s\n", nt_errstr(status));
355 status = smb2cli_read(cli1->conn, cli1->timeout, cli1->smb2.session,
356 cli1->smb2.tid, 0x10000, 0, fid_persistent,
358 talloc_tos(), &result, &nread);
359 if (!NT_STATUS_IS_OK(status)) {
360 printf("smb2cli_read returned %s\n", nt_errstr(status));
364 if (nread != strlen(hello)) {
365 printf("smb2cli_read returned %d bytes, expected %d\n",
366 (int)nread, (int)strlen(hello));
370 if (memcmp(hello, result, nread) != 0) {
371 printf("smb2cli_read returned '%s', expected '%s'\n",
376 /* prepare second session */
378 if (!torture_init_connection(&cli2)) {
381 cli2->smb2.pid = 0xFEFF;
383 status = smbXcli_negprot(cli2->conn, cli2->timeout,
384 PROTOCOL_SMB2_02, PROTOCOL_LATEST);
385 if (!NT_STATUS_IS_OK(status)) {
386 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
390 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
391 if (!NT_STATUS_IS_OK(status)) {
392 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
396 gensec_want_feature(auth_generic_state->gensec_security,
397 GENSEC_FEATURE_SESSION_KEY);
398 status = auth_generic_set_username(auth_generic_state, username);
399 if (!NT_STATUS_IS_OK(status)) {
400 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
404 status = auth_generic_set_domain(auth_generic_state, workgroup);
405 if (!NT_STATUS_IS_OK(status)) {
406 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
410 status = auth_generic_set_password(auth_generic_state, password);
411 if (!NT_STATUS_IS_OK(status)) {
412 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
416 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
417 if (!NT_STATUS_IS_OK(status)) {
418 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
422 ev = event_context_init(talloc_tos());
424 printf("event_context_init() returned NULL\n");
428 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
429 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
430 printf("gensec_update returned %s\n", nt_errstr(status));
434 cli2->smb2.session = smbXcli_session_create(cli2, cli2->conn);
436 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
441 SMB2_CAP_DFS, /* in_capabilities */
443 /* in_previous_session_id: */
444 smb2cli_session_current_id(cli1->smb2.session),
445 &in_blob); /* in_security_buffer */
446 if (subreq == NULL) {
447 printf("smb2cli_session_setup_send() returned NULL\n");
451 ok = tevent_req_poll(subreq, ev);
453 printf("tevent_req_poll() returned false\n");
457 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
459 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
460 printf("smb2cli_session_setup_recv returned %s\n",
465 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
466 if (!NT_STATUS_IS_OK(status)) {
467 printf("auth_generic_update returned %s\n", nt_errstr(status));
471 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
476 SMB2_CAP_DFS, /* in_capabilities */
478 /* in_previous_session_id: */
479 smb2cli_session_current_id(cli1->smb2.session),
480 &in_blob); /* in_security_buffer */
481 if (subreq == NULL) {
482 printf("smb2cli_session_setup_send() returned NULL\n");
486 ok = tevent_req_poll(subreq, ev);
488 printf("tevent_req_poll() returned false\n");
492 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
493 &recv_iov, &out_blob);
494 if (!NT_STATUS_IS_OK(status)) {
495 printf("smb2cli_session_setup_recv returned %s\n",
500 status = gensec_session_key(auth_generic_state->gensec_security, talloc_tos(),
502 if (!NT_STATUS_IS_OK(status)) {
503 printf("gensec_session_key returned %s\n",
508 /* check file operation on the old client */
510 status = smb2cli_flush(cli1->conn, cli1->timeout, cli1->smb2.session,
511 cli1->smb2.tid, fid_persistent, fid_volatile);
512 if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
513 printf("smb2cli_flush returned %s\n", nt_errstr(status));
517 status = cli_tree_connect(cli1, share, "?????", "", 0);
518 if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
519 printf("cli_tree_connect returned %s\n", nt_errstr(status));
524 * checking file operations without signing.
525 * on w2k8r2 at least, flush, read and write also work the same way,
526 * while create gives ACCESS_DENIED without signing
528 status = smb2cli_flush(cli2->conn, cli2->timeout, cli2->smb2.session,
529 cli2->smb2.tid, fid_persistent, fid_volatile);
530 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
531 printf("smb2cli_flush returned %s\n", nt_errstr(status));
535 status = smb2cli_write(cli2, strlen(hello), 0, fid_persistent,
536 fid_volatile, 0, 0, (const uint8_t *)hello);
537 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
538 printf("smb2cli_write returned %s\n", nt_errstr(status));
542 status = smb2cli_read(cli2->conn, cli2->timeout, cli2->smb2.session,
543 cli2->smb2.tid, 0x10000, 0, fid_persistent,
545 talloc_tos(), &result, &nread);
546 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
547 printf("smb2cli_read returned %s\n", nt_errstr(status));
551 status = smb2cli_create(cli2->conn, cli2->timeout, cli2->smb2.session,
552 cli2->smb2.tid, "session-reconnect.txt",
553 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
554 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
555 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
556 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
557 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
558 FILE_CREATE, /* create_disposition, */
559 FILE_DELETE_ON_CLOSE, /* create_options, */
560 NULL, /* smb2_create_blobs *blobs */
563 if (!NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED) &&
564 !NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
565 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
569 /* now grab the session key and try with signing */
571 status = smb2cli_session_set_session_key(cli2->smb2.session,
574 if (!NT_STATUS_IS_OK(status)) {
575 printf("smb2cli_session_set_session_key %s\n", nt_errstr(status));
579 /* the tid seems to be irrelevant at this stage */
581 cli2->smb2.tid = cli1->smb2.tid;
583 status = smb2cli_flush(cli2->conn, cli2->timeout, cli2->smb2.session,
584 cli2->smb2.tid, fid_persistent, fid_volatile);
585 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
586 printf("smb2cli_flush returned %s\n", nt_errstr(status));
590 status = smb2cli_write(cli2, strlen(hello), 0, fid_persistent,
591 fid_volatile, 0, 0, (const uint8_t *)hello);
592 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
593 printf("smb2cli_write returned %s\n", nt_errstr(status));
597 status = smb2cli_read(cli2->conn, cli2->timeout, cli2->smb2.session,
598 cli2->smb2.tid, 0x10000, 0, fid_persistent,
600 talloc_tos(), &result, &nread);
601 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
602 printf("smb2cli_read returned %s\n", nt_errstr(status));
606 status = smb2cli_create(cli2->conn, cli2->timeout, cli2->smb2.session,
607 cli2->smb2.tid, "session-reconnect.txt",
608 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
609 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
610 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
611 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
612 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
613 FILE_CREATE, /* create_disposition, */
614 FILE_DELETE_ON_CLOSE, /* create_options, */
615 NULL, /* smb2_create_blobs *blobs */
618 if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
619 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
623 /* now do a new tcon and test file calls again */
625 status = cli_tree_connect(cli2, share, "?????", "", 0);
626 if (!NT_STATUS_IS_OK(status)) {
627 printf("cli_tree_connect returned %s\n", nt_errstr(status));
631 status = smb2cli_create(cli2->conn, cli2->timeout, cli2->smb2.session,
632 cli2->smb2.tid, "session-reconnect.txt",
633 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
634 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
635 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
636 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
637 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
638 FILE_CREATE, /* create_disposition, */
639 FILE_DELETE_ON_CLOSE, /* create_options, */
640 NULL, /* smb2_create_blobs *blobs */
643 if (!NT_STATUS_IS_OK(status)) {
644 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
648 status = smb2cli_write(cli2, strlen(hello), 0, fid_persistent,
649 fid_volatile, 0, 0, (const uint8_t *)hello);
650 if (!NT_STATUS_IS_OK(status)) {
651 printf("smb2cli_write returned %s\n", nt_errstr(status));
655 status = smb2cli_flush(cli2->conn, cli2->timeout, cli2->smb2.session,
656 cli2->smb2.tid, fid_persistent, fid_volatile);
657 if (!NT_STATUS_IS_OK(status)) {
658 printf("smb2cli_flush returned %s\n", nt_errstr(status));
662 status = smb2cli_read(cli2->conn, cli2->timeout, cli2->smb2.session,
663 cli2->smb2.tid, 0x10000, 0, fid_persistent,
665 talloc_tos(), &result, &nread);
666 if (!NT_STATUS_IS_OK(status)) {
667 printf("smb2cli_read returned %s\n", nt_errstr(status));
671 if (nread != strlen(hello)) {
672 printf("smb2cli_read returned %d bytes, expected %d\n",
673 (int)nread, (int)strlen(hello));
677 if (memcmp(hello, result, nread) != 0) {
678 printf("smb2cli_read returned '%s', expected '%s'\n",
686 bool run_smb2_tcon_dependence(int dummy)
688 struct cli_state *cli;
690 uint64_t fid_persistent, fid_volatile;
691 const char *hello = "Hello, world\n";
695 printf("Starting SMB2-TCON-DEPENDENCE\n");
697 if (!torture_init_connection(&cli)) {
700 cli->smb2.pid = 0xFEFF;
702 status = smbXcli_negprot(cli->conn, cli->timeout,
703 PROTOCOL_SMB2_02, PROTOCOL_LATEST);
704 if (!NT_STATUS_IS_OK(status)) {
705 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
709 status = cli_session_setup(cli, username,
710 password, strlen(password),
711 password, strlen(password),
713 if (!NT_STATUS_IS_OK(status)) {
714 printf("cli_session_setup returned %s\n", nt_errstr(status));
718 status = cli_tree_connect(cli, share, "?????", "", 0);
719 if (!NT_STATUS_IS_OK(status)) {
720 printf("cli_tree_connect returned %s\n", nt_errstr(status));
724 status = smb2cli_create(cli->conn, cli->timeout, cli->smb2.session,
725 cli->smb2.tid, "tcon_depedence.txt",
726 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
727 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
728 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
729 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
730 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
731 FILE_CREATE, /* create_disposition, */
732 FILE_DELETE_ON_CLOSE, /* create_options, */
733 NULL, /* smb2_create_blobs *blobs */
736 if (!NT_STATUS_IS_OK(status)) {
737 printf("smb2cli_create on cli %s\n", nt_errstr(status));
741 status = smb2cli_write(cli, strlen(hello), 0, fid_persistent,
742 fid_volatile, 0, 0, (const uint8_t *)hello);
743 if (!NT_STATUS_IS_OK(status)) {
744 printf("smb2cli_write returned %s\n", nt_errstr(status));
748 status = smb2cli_flush(cli->conn, cli->timeout, cli->smb2.session,
749 cli->smb2.tid, fid_persistent, fid_volatile);
750 if (!NT_STATUS_IS_OK(status)) {
751 printf("smb2cli_flush returned %s\n", nt_errstr(status));
755 status = smb2cli_read(cli->conn, cli->timeout, cli->smb2.session,
756 cli->smb2.tid, 0x10000, 0, fid_persistent,
758 talloc_tos(), &result, &nread);
759 if (!NT_STATUS_IS_OK(status)) {
760 printf("smb2cli_read returned %s\n", nt_errstr(status));
764 if (nread != strlen(hello)) {
765 printf("smb2cli_read returned %d bytes, expected %d\n",
766 (int)nread, (int)strlen(hello));
770 if (memcmp(hello, result, nread) != 0) {
771 printf("smb2cli_read returned '%s', expected '%s'\n",
776 /* check behaviour with wrong tid... */
780 status = smb2cli_read(cli->conn, cli->timeout, cli->smb2.session,
781 cli->smb2.tid, 0x10000, 0, fid_persistent,
783 talloc_tos(), &result, &nread);
784 if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
785 printf("smb2cli_read returned %s\n", nt_errstr(status));
794 bool run_smb2_multi_channel(int dummy)
796 struct cli_state *cli1;
797 struct cli_state *cli2;
798 struct cli_state *cli3;
801 uint64_t fid_persistent, fid_volatile;
802 struct tevent_context *ev;
803 struct tevent_req *subreq;
804 DATA_BLOB in_blob = data_blob_null;
806 DATA_BLOB channel_session_key;
807 struct auth_generic_state *auth_generic_state;
808 struct iovec *recv_iov;
809 const char *hello = "Hello, world\n";
813 printf("Starting SMB2-MULTI-CHANNEL\n");
815 if (!torture_init_connection(&cli1)) {
818 cli1->smb2.pid = 0xFEFF;
820 if (!torture_init_connection(&cli2)) {
823 cli2->smb2.pid = 0xFEFF;
825 if (!torture_init_connection(&cli3)) {
828 cli3->smb2.pid = 0xFEFF;
830 status = smbXcli_negprot(cli1->conn, cli1->timeout,
831 PROTOCOL_SMB2_22, PROTOCOL_LATEST);
832 if (!NT_STATUS_IS_OK(status)) {
833 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
837 status = smbXcli_negprot(cli2->conn, cli2->timeout,
838 PROTOCOL_SMB2_22, PROTOCOL_LATEST);
839 if (!NT_STATUS_IS_OK(status)) {
840 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
844 status = smbXcli_negprot(cli3->conn, cli3->timeout,
845 PROTOCOL_SMB2_22, PROTOCOL_LATEST);
846 if (!NT_STATUS_IS_OK(status)) {
847 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
851 status = cli_session_setup(cli1, username,
852 password, strlen(password),
853 password, strlen(password),
855 if (!NT_STATUS_IS_OK(status)) {
856 printf("smb2cli_sesssetup returned %s\n", nt_errstr(status));
860 status = cli_tree_connect(cli1, share, "?????", "", 0);
861 if (!NT_STATUS_IS_OK(status)) {
862 printf("cli_tree_connect returned %s\n", nt_errstr(status));
866 status = smb2cli_session_create_channel(cli2,
869 &cli2->smb2.session);
870 if (!NT_STATUS_IS_OK(status)) {
871 printf("smb2cli_session_create_channel returned %s\n",
876 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
877 if (!NT_STATUS_IS_OK(status)) {
878 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
882 gensec_want_feature(auth_generic_state->gensec_security,
883 GENSEC_FEATURE_SESSION_KEY);
884 status = auth_generic_set_username(auth_generic_state, username);
885 if (!NT_STATUS_IS_OK(status)) {
886 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
890 status = auth_generic_set_domain(auth_generic_state, workgroup);
891 if (!NT_STATUS_IS_OK(status)) {
892 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
896 status = auth_generic_set_password(auth_generic_state, password);
897 if (!NT_STATUS_IS_OK(status)) {
898 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
902 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
903 if (!NT_STATUS_IS_OK(status)) {
904 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
908 ev = event_context_init(talloc_tos());
910 printf("event_context_init() returned NULL\n");
914 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
915 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
916 printf("gensec_update returned %s\n", nt_errstr(status));
920 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
925 SMB2_CAP_DFS, /* in_capabilities */
927 0, /* in_previous_session_id */
928 &in_blob); /* in_security_buffer */
929 if (subreq == NULL) {
930 printf("smb2cli_session_setup_send() returned NULL\n");
934 ok = tevent_req_poll(subreq, ev);
936 printf("tevent_req_poll() returned false\n");
940 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
942 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
943 printf("smb2cli_session_setup_recv returned %s\n",
948 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
949 if (!NT_STATUS_IS_OK(status)) {
950 printf("auth_generic_update returned %s\n", nt_errstr(status));
954 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
959 SMB2_CAP_DFS, /* in_capabilities */
961 0, /* in_previous_session_id */
962 &in_blob); /* in_security_buffer */
963 if (subreq == NULL) {
964 printf("smb2cli_session_setup_send() returned NULL\n");
968 ok = tevent_req_poll(subreq, ev);
970 printf("tevent_req_poll() returned false\n");
974 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
975 &recv_iov, &out_blob);
976 if (!NT_STATUS_IS_OK(status)) {
977 printf("smb2cli_session_setup_recv returned %s\n",
982 status = gensec_session_key(auth_generic_state->gensec_security, talloc_tos(),
983 &channel_session_key);
984 if (!NT_STATUS_IS_OK(status)) {
985 printf("gensec_session_key returned %s\n",
990 status = smb2cli_session_set_channel_key(cli2->smb2.session,
993 if (!NT_STATUS_IS_OK(status)) {
994 printf("smb2cli_session_set_channel_key %s\n", nt_errstr(status));
998 cli2->smb2.tid = cli1->smb2.tid;
1000 status = smb2cli_session_create_channel(cli3,
1003 &cli3->smb2.session);
1004 if (!NT_STATUS_IS_OK(status)) {
1005 printf("smb2cli_session_create_channel returned %s\n",
1010 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
1011 if (!NT_STATUS_IS_OK(status)) {
1012 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
1016 gensec_want_feature(auth_generic_state->gensec_security,
1017 GENSEC_FEATURE_SESSION_KEY);
1018 status = auth_generic_set_username(auth_generic_state, username);
1019 if (!NT_STATUS_IS_OK(status)) {
1020 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
1024 status = auth_generic_set_domain(auth_generic_state, workgroup);
1025 if (!NT_STATUS_IS_OK(status)) {
1026 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
1030 status = auth_generic_set_password(auth_generic_state, password);
1031 if (!NT_STATUS_IS_OK(status)) {
1032 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
1036 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
1037 if (!NT_STATUS_IS_OK(status)) {
1038 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
1042 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
1043 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1044 printf("gensec_update returned %s\n", nt_errstr(status));
1048 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1052 0x01, /* in_flags */
1053 SMB2_CAP_DFS, /* in_capabilities */
1055 0, /* in_previous_session_id */
1056 &in_blob); /* in_security_buffer */
1057 if (subreq == NULL) {
1058 printf("smb2cli_session_setup_send() returned NULL\n");
1062 ok = tevent_req_poll(subreq, ev);
1064 printf("tevent_req_poll() returned false\n");
1068 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1070 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1071 printf("smb2cli_session_setup_recv returned %s\n",
1076 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
1077 if (!NT_STATUS_IS_OK(status)) {
1078 printf("auth_generic_update returned %s\n", nt_errstr(status));
1082 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1086 0x01, /* in_flags */
1087 SMB2_CAP_DFS, /* in_capabilities */
1089 0, /* in_previous_session_id */
1090 &in_blob); /* in_security_buffer */
1091 if (subreq == NULL) {
1092 printf("smb2cli_session_setup_send() returned NULL\n");
1096 ok = tevent_req_poll(subreq, ev);
1098 printf("tevent_req_poll() returned false\n");
1102 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1103 &recv_iov, &out_blob);
1104 if (!NT_STATUS_IS_OK(status)) {
1105 printf("smb2cli_session_setup_recv returned %s\n",
1110 status = gensec_session_key(auth_generic_state->gensec_security, talloc_tos(),
1111 &channel_session_key);
1112 if (!NT_STATUS_IS_OK(status)) {
1113 printf("gensec_session_key returned %s\n",
1118 status = smb2cli_session_set_channel_key(cli3->smb2.session,
1119 channel_session_key,
1121 if (!NT_STATUS_IS_OK(status)) {
1122 printf("smb2cli_session_set_channel_key %s\n", nt_errstr(status));
1126 cli3->smb2.tid = cli2->smb2.tid;
1128 status = smb2cli_create(cli2->conn, cli2->timeout, cli2->smb2.session,
1129 cli2->smb2.tid, "multi-channel.txt",
1130 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1131 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1132 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1133 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1134 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1135 FILE_CREATE, /* create_disposition, */
1136 FILE_DELETE_ON_CLOSE, /* create_options, */
1137 NULL, /* smb2_create_blobs *blobs */
1140 if (!NT_STATUS_IS_OK(status)) {
1141 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
1145 status = smb2cli_write(cli1, strlen(hello), 0, fid_persistent,
1146 fid_volatile, 0, 0, (const uint8_t *)hello);
1147 if (!NT_STATUS_IS_OK(status)) {
1148 printf("smb2cli_write returned %s\n", nt_errstr(status));
1152 status = smb2cli_flush(cli2->conn, cli2->timeout, cli2->smb2.session,
1153 cli2->smb2.tid, fid_persistent, fid_volatile);
1154 if (!NT_STATUS_IS_OK(status)) {
1155 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1159 status = smb2cli_flush(cli1->conn, cli1->timeout, cli1->smb2.session,
1160 cli1->smb2.tid, fid_persistent, fid_volatile);
1161 if (!NT_STATUS_IS_OK(status)) {
1162 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1166 status = smb2cli_flush(cli3->conn, cli3->timeout, cli3->smb2.session,
1167 cli3->smb2.tid, fid_persistent, fid_volatile);
1168 if (!NT_STATUS_IS_OK(status)) {
1169 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1173 status = smb2cli_read(cli2->conn, cli2->timeout, cli2->smb2.session,
1174 cli2->smb2.tid, 0x10000, 0, fid_persistent,
1176 talloc_tos(), &result, &nread);
1177 if (!NT_STATUS_IS_OK(status)) {
1178 printf("smb2cli_read returned %s\n", nt_errstr(status));
1182 if (nread != strlen(hello)) {
1183 printf("smb2cli_read returned %d bytes, expected %d\n",
1184 (int)nread, (int)strlen(hello));
1188 if (memcmp(hello, result, nread) != 0) {
1189 printf("smb2cli_read returned '%s', expected '%s'\n",
1194 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
1195 if (!NT_STATUS_IS_OK(status)) {
1196 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
1200 gensec_want_feature(auth_generic_state->gensec_security,
1201 GENSEC_FEATURE_SESSION_KEY);
1202 status = auth_generic_set_username(auth_generic_state, username);
1203 if (!NT_STATUS_IS_OK(status)) {
1204 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
1208 status = auth_generic_set_domain(auth_generic_state, workgroup);
1209 if (!NT_STATUS_IS_OK(status)) {
1210 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
1214 status = auth_generic_set_password(auth_generic_state, password);
1215 if (!NT_STATUS_IS_OK(status)) {
1216 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
1220 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
1221 if (!NT_STATUS_IS_OK(status)) {
1222 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
1226 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
1227 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1228 printf("gensec_update returned %s\n", nt_errstr(status));
1232 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1237 SMB2_CAP_DFS, /* in_capabilities */
1239 0, /* in_previous_session_id */
1240 &in_blob); /* in_security_buffer */
1241 if (subreq == NULL) {
1242 printf("smb2cli_session_setup_send() returned NULL\n");
1246 ok = tevent_req_poll(subreq, ev);
1248 printf("tevent_req_poll() returned false\n");
1252 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1254 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1255 printf("smb2cli_session_setup_recv returned %s\n",
1260 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
1261 if (!NT_STATUS_IS_OK(status)) {
1262 printf("auth_generic_update returned %s\n", nt_errstr(status));
1266 status = smb2cli_flush(cli1->conn, cli1->timeout, cli1->smb2.session,
1267 cli1->smb2.tid, fid_persistent, fid_volatile);
1268 if (!NT_STATUS_IS_OK(status)) {
1269 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1273 status = smb2cli_flush(cli2->conn, cli2->timeout, cli2->smb2.session,
1274 cli2->smb2.tid, fid_persistent, fid_volatile);
1275 if (!NT_STATUS_IS_OK(status)) {
1276 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1280 status = smb2cli_flush(cli3->conn, cli3->timeout, cli3->smb2.session,
1281 cli3->smb2.tid, fid_persistent, fid_volatile);
1282 if (!NT_STATUS_IS_OK(status)) {
1283 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1287 status = smb2cli_create(cli1->conn, cli1->timeout, cli1->smb2.session,
1288 cli1->smb2.tid, "multi-channel-invalid.txt",
1289 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1290 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1291 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1292 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1293 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1294 FILE_CREATE, /* create_disposition, */
1295 FILE_DELETE_ON_CLOSE, /* create_options, */
1296 NULL, /* smb2_create_blobs *blobs */
1299 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1300 printf("smb2cli_create %s\n", nt_errstr(status));
1304 status = smb2cli_create(cli2->conn, cli2->timeout, cli2->smb2.session,
1305 cli2->smb2.tid, "multi-channel-invalid.txt",
1306 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1307 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1308 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1309 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1310 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1311 FILE_CREATE, /* create_disposition, */
1312 FILE_DELETE_ON_CLOSE, /* create_options, */
1313 NULL, /* smb2_create_blobs *blobs */
1316 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1317 printf("smb2cli_create %s\n", nt_errstr(status));
1321 status = smb2cli_create(cli3->conn, cli3->timeout, cli3->smb2.session,
1322 cli3->smb2.tid, "multi-channel-invalid.txt",
1323 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1324 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1325 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1326 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1327 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1328 FILE_CREATE, /* create_disposition, */
1329 FILE_DELETE_ON_CLOSE, /* create_options, */
1330 NULL, /* smb2_create_blobs *blobs */
1333 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1334 printf("smb2cli_create %s\n", nt_errstr(status));
1338 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1343 SMB2_CAP_DFS, /* in_capabilities */
1345 0, /* in_previous_session_id */
1346 &in_blob); /* in_security_buffer */
1347 if (subreq == NULL) {
1348 printf("smb2cli_session_setup_send() returned NULL\n");
1352 ok = tevent_req_poll(subreq, ev);
1354 printf("tevent_req_poll() returned false\n");
1358 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1359 &recv_iov, &out_blob);
1360 if (!NT_STATUS_IS_OK(status)) {
1361 printf("smb2cli_session_setup_recv returned %s\n",
1366 status = smb2cli_close(cli3->conn, cli3->timeout, cli3->smb2.session,
1367 cli3->smb2.tid, 0, fid_persistent, fid_volatile);
1368 if (!NT_STATUS_IS_OK(status)) {
1369 printf("smb2cli_close returned %s\n", nt_errstr(status));
1373 status = smb2cli_flush(cli3->conn, cli3->timeout, cli3->smb2.session,
1374 cli3->smb2.tid, fid_persistent, fid_volatile);
1375 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
1376 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1380 status = smb2cli_flush(cli2->conn, cli2->timeout, cli2->smb2.session,
1381 cli2->smb2.tid, fid_persistent, fid_volatile);
1382 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
1383 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1387 status = smb2cli_flush(cli1->conn, cli1->timeout, cli1->smb2.session,
1388 cli1->smb2.tid, fid_persistent, fid_volatile);
1389 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
1390 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1397 bool run_smb2_session_reauth(int dummy)
1399 struct cli_state *cli;
1402 uint64_t fid_persistent, fid_volatile;
1403 uint64_t dir_persistent, dir_volatile;
1405 uint32_t dir_data_length;
1406 struct tevent_context *ev;
1407 struct tevent_req *subreq;
1408 DATA_BLOB in_blob = data_blob_null;
1410 DATA_BLOB in_input_buffer;
1411 DATA_BLOB out_output_buffer;
1412 uint8_t in_file_info_class;
1413 struct auth_generic_state *auth_generic_state;
1414 struct iovec *recv_iov;
1417 printf("Starting SMB2-SESSION_REAUTH\n");
1419 if (!torture_init_connection(&cli)) {
1422 cli->smb2.pid = 0xFEFF;
1425 * PROTOCOL_SMB2_22 has a bug in win8pre0
1426 * it behaves like PROTOCOL_SMB2_02
1427 * and returns NT_STATUS_REQUEST_NOT_ACCEPTED,
1428 * while it allows it on PROTOCOL_SMB2_02.
1430 status = smbXcli_negprot(cli->conn, cli->timeout,
1431 PROTOCOL_SMB2_10, PROTOCOL_SMB2_10);
1432 if (!NT_STATUS_IS_OK(status)) {
1433 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
1437 status = cli_session_setup(cli, username,
1438 password, strlen(password),
1439 password, strlen(password),
1441 if (!NT_STATUS_IS_OK(status)) {
1442 printf("smb2cli_sesssetup returned %s\n", nt_errstr(status));
1446 status = cli_tree_connect(cli, share, "?????", "", 0);
1447 if (!NT_STATUS_IS_OK(status)) {
1448 printf("cli_tree_connect returned %s\n", nt_errstr(status));
1452 status = smb2cli_create(cli->conn, cli->timeout, cli->smb2.session,
1453 cli->smb2.tid, "session-reauth.txt",
1454 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1455 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1456 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1457 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1458 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1459 FILE_CREATE, /* create_disposition, */
1460 FILE_DELETE_ON_CLOSE, /* create_options, */
1461 NULL, /* smb2_create_blobs *blobs */
1464 if (!NT_STATUS_IS_OK(status)) {
1465 printf("smb2cli_create %s\n", nt_errstr(status));
1469 status = smb2cli_create(cli->conn, cli->timeout, cli->smb2.session,
1471 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1472 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1473 SEC_STD_SYNCHRONIZE|
1475 SEC_DIR_READ_ATTRIBUTE, /* desired_access, */
1476 0, /* file_attributes, */
1477 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1478 FILE_OPEN, /* create_disposition, */
1479 FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, /* create_options, */
1480 NULL, /* smb2_create_blobs *blobs */
1483 if (!NT_STATUS_IS_OK(status)) {
1484 printf("smb2cli_create returned %s\n", nt_errstr(status));
1488 status = smb2cli_query_directory(
1489 cli->conn, cli->timeout, cli->smb2.session, cli->smb2.tid,
1490 1, 0x3, 0, dir_persistent, dir_volatile,
1491 "session-reauth.txt", 0xffff,
1492 talloc_tos(), &dir_data, &dir_data_length);
1493 if (!NT_STATUS_IS_OK(status)) {
1494 printf("smb2cli_query_directory returned %s\n", nt_errstr(status));
1498 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
1499 if (!NT_STATUS_IS_OK(status)) {
1500 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
1504 gensec_want_feature(auth_generic_state->gensec_security,
1505 GENSEC_FEATURE_SESSION_KEY);
1506 status = auth_generic_set_username(auth_generic_state, username);
1507 if (!NT_STATUS_IS_OK(status)) {
1508 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
1512 status = auth_generic_set_domain(auth_generic_state, workgroup);
1513 if (!NT_STATUS_IS_OK(status)) {
1514 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
1518 status = auth_generic_set_password(auth_generic_state, password);
1519 if (!NT_STATUS_IS_OK(status)) {
1520 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
1524 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
1525 if (!NT_STATUS_IS_OK(status)) {
1526 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
1530 ev = event_context_init(talloc_tos());
1532 printf("event_context_init() returned NULL\n");
1536 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
1537 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1538 printf("gensec_update returned %s\n", nt_errstr(status));
1542 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1547 SMB2_CAP_DFS, /* in_capabilities */
1549 0, /* in_previous_session_id */
1550 &in_blob); /* in_security_buffer */
1551 if (subreq == NULL) {
1552 printf("smb2cli_session_setup_send() returned NULL\n");
1556 ok = tevent_req_poll(subreq, ev);
1558 printf("tevent_req_poll() returned false\n");
1562 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1564 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1565 printf("smb2cli_session_setup_recv returned %s\n",
1570 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
1571 if (!NT_STATUS_IS_OK(status)) {
1572 printf("auth_generic_update returned %s\n", nt_errstr(status));
1576 status = smb2cli_flush(cli->conn, cli->timeout, cli->smb2.session,
1577 cli->smb2.tid, fid_persistent, fid_volatile);
1578 if (!NT_STATUS_IS_OK(status)) {
1579 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1583 status = smb2cli_query_directory(
1584 cli->conn, cli->timeout, cli->smb2.session, cli->smb2.tid,
1585 1, 0x3, 0, dir_persistent, dir_volatile,
1586 "session-reauth.txt", 0xffff,
1587 talloc_tos(), &dir_data, &dir_data_length);
1588 if (!NT_STATUS_IS_OK(status)) {
1589 printf("smb2cli_query_directory returned %s\n", nt_errstr(status));
1594 * query_info seems to be a path based operation on Windows...
1596 status = smb2cli_query_info(cli->conn,
1600 SMB2_GETINFO_SECURITY,
1601 0, /* in_file_info_class */
1602 1024, /* in_max_output_length */
1603 NULL, /* in_input_buffer */
1604 SECINFO_OWNER, /* in_additional_info */
1609 &out_output_buffer);
1610 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1611 printf("smb2cli_query_info (security) returned %s\n", nt_errstr(status));
1615 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1616 status = smb2cli_query_info(cli->conn,
1622 1024, /* in_max_output_length */
1623 NULL, /* in_input_buffer */
1624 0, /* in_additional_info */
1629 &out_output_buffer);
1630 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1631 printf("smb2cli_query_info (position) returned %s\n", nt_errstr(status));
1635 in_input_buffer = data_blob_talloc(talloc_tos(), NULL, 8);
1636 SBVAL(in_input_buffer.data, 0, 512);
1638 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1639 status = smb2cli_set_info(cli->conn,
1646 0, /* in_additional_info */
1649 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1650 printf("smb2cli_set_info (position) returned %s\n", nt_errstr(status));
1654 status = smb2cli_create(cli->conn, cli->timeout, cli->smb2.session,
1655 cli->smb2.tid, "session-reauth-invalid.txt",
1656 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1657 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1658 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1659 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1660 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1661 FILE_CREATE, /* create_disposition, */
1662 FILE_DELETE_ON_CLOSE, /* create_options, */
1663 NULL, /* smb2_create_blobs *blobs */
1666 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1667 printf("smb2cli_create %s\n", nt_errstr(status));
1671 status = smb2cli_create(cli->conn, cli->timeout, cli->smb2.session,
1673 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1674 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1675 SEC_STD_SYNCHRONIZE|
1677 SEC_DIR_READ_ATTRIBUTE, /* desired_access, */
1678 0, /* file_attributes, */
1679 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1680 FILE_OPEN, /* create_disposition, */
1681 FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, /* create_options, */
1682 NULL, /* smb2_create_blobs *blobs */
1685 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1686 printf("smb2cli_create returned %s\n", nt_errstr(status));
1690 saved_tid = cli->smb2.tid;
1691 status = cli_tree_connect(cli, share, "?????", "", 0);
1692 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1693 printf("cli_tree_connect returned %s\n", nt_errstr(status));
1696 cli->smb2.tid = saved_tid;
1698 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1703 SMB2_CAP_DFS, /* in_capabilities */
1705 0, /* in_previous_session_id */
1706 &in_blob); /* in_security_buffer */
1707 if (subreq == NULL) {
1708 printf("smb2cli_session_setup_send() returned NULL\n");
1712 ok = tevent_req_poll(subreq, ev);
1714 printf("tevent_req_poll() returned false\n");
1718 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1719 &recv_iov, &out_blob);
1720 if (!NT_STATUS_IS_OK(status)) {
1721 printf("smb2cli_session_setup_recv returned %s\n",
1726 status = smb2cli_flush(cli->conn, cli->timeout, cli->smb2.session,
1727 cli->smb2.tid, fid_persistent, fid_volatile);
1728 if (!NT_STATUS_IS_OK(status)) {
1729 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1733 status = smb2cli_query_info(cli->conn,
1737 SMB2_GETINFO_SECURITY,
1738 0, /* in_file_info_class */
1739 1024, /* in_max_output_length */
1740 NULL, /* in_input_buffer */
1741 SECINFO_OWNER, /* in_additional_info */
1746 &out_output_buffer);
1747 if (!NT_STATUS_IS_OK(status)) {
1748 printf("smb2cli_query_info (security) returned %s\n", nt_errstr(status));
1752 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1753 status = smb2cli_query_info(cli->conn,
1759 1024, /* in_max_output_length */
1760 NULL, /* in_input_buffer */
1761 0, /* in_additional_info */
1766 &out_output_buffer);
1767 if (!NT_STATUS_IS_OK(status)) {
1768 printf("smb2cli_query_info (position) returned %s\n", nt_errstr(status));
1772 in_input_buffer = data_blob_talloc(talloc_tos(), NULL, 8);
1773 SBVAL(in_input_buffer.data, 0, 512);
1775 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1776 status = smb2cli_set_info(cli->conn,
1783 0, /* in_additional_info */
1786 if (!NT_STATUS_IS_OK(status)) {
1787 printf("smb2cli_set_info (position) returned %s\n", nt_errstr(status));
1791 in_file_info_class = SMB_FILE_POSITION_INFORMATION - 1000;
1792 status = smb2cli_query_info(cli->conn,
1798 1024, /* in_max_output_length */
1799 NULL, /* in_input_buffer */
1800 0, /* in_additional_info */
1805 &out_output_buffer);
1806 if (!NT_STATUS_IS_OK(status)) {
1807 printf("smb2cli_query_info (position) returned %s\n", nt_errstr(status));
1811 status = smb2cli_close(cli->conn, cli->timeout, cli->smb2.session,
1812 cli->smb2.tid, 0, fid_persistent, fid_volatile);
1813 if (!NT_STATUS_IS_OK(status)) {
1814 printf("smb2cli_close returned %s\n", nt_errstr(status));
1818 status = smb2cli_create(cli->conn, cli->timeout, cli->smb2.session,
1819 cli->smb2.tid, "session-reauth.txt",
1820 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1821 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1822 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1823 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1824 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1825 FILE_CREATE, /* create_disposition, */
1826 FILE_DELETE_ON_CLOSE, /* create_options, */
1827 NULL, /* smb2_create_blobs *blobs */
1830 if (!NT_STATUS_IS_OK(status)) {
1831 printf("smb2cli_create %s\n", nt_errstr(status));
1835 status = smb2cli_query_directory(
1836 cli->conn, cli->timeout, cli->smb2.session, cli->smb2.tid,
1837 1, 0x3, 0, dir_persistent, dir_volatile,
1838 "session-reauth.txt", 0xffff,
1839 talloc_tos(), &dir_data, &dir_data_length);
1840 if (!NT_STATUS_IS_OK(status)) {
1841 printf("smb2cli_query_directory returned %s\n", nt_errstr(status));
1845 status = smb2cli_close(cli->conn, cli->timeout, cli->smb2.session,
1846 cli->smb2.tid, 0, dir_persistent, dir_volatile);
1847 if (!NT_STATUS_IS_OK(status)) {
1848 printf("smb2cli_close returned %s\n", nt_errstr(status));
1852 status = smb2cli_close(cli->conn, cli->timeout, cli->smb2.session,
1853 cli->smb2.tid, 0, fid_persistent, fid_volatile);
1854 if (!NT_STATUS_IS_OK(status)) {
1855 printf("smb2cli_close returned %s\n", nt_errstr(status));
1859 saved_tid = cli->smb2.tid;
1860 status = cli_tree_connect(cli, share, "?????", "", 0);
1861 if (!NT_STATUS_IS_OK(status)) {
1862 printf("cli_tree_connect returned %s\n", nt_errstr(status));
1865 cli->smb2.tid = saved_tid;