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 struct smbXcli_tcon
*saved_tcon
= NULL
;
45 uint64_t saved_uid
= 0;
47 printf("Starting SMB2-BASIC\n");
49 if (!torture_init_connection(&cli
)) {
52 cli
->smb2
.pid
= 0xFEFF;
54 status
= smbXcli_negprot(cli
->conn
, cli
->timeout
,
55 PROTOCOL_SMB2_02
, PROTOCOL_SMB2_02
);
56 if (!NT_STATUS_IS_OK(status
)) {
57 printf("smbXcli_negprot returned %s\n", nt_errstr(status
));
61 status
= cli_session_setup(cli
, username
,
62 password
, strlen(password
),
63 password
, strlen(password
),
65 if (!NT_STATUS_IS_OK(status
)) {
66 printf("cli_session_setup returned %s\n", nt_errstr(status
));
70 status
= cli_tree_connect(cli
, share
, "?????", "", 0);
71 if (!NT_STATUS_IS_OK(status
)) {
72 printf("cli_tree_connect returned %s\n", nt_errstr(status
));
76 status
= smb2cli_create(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
77 cli
->smb2
.tcon
, "smb2-basic.txt",
78 SMB2_OPLOCK_LEVEL_NONE
, /* oplock_level, */
79 SMB2_IMPERSONATION_IMPERSONATION
, /* impersonation_level, */
80 SEC_STD_ALL
| SEC_FILE_ALL
, /* desired_access, */
81 FILE_ATTRIBUTE_NORMAL
, /* file_attributes, */
82 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, /* share_access, */
83 FILE_CREATE
, /* create_disposition, */
84 FILE_DELETE_ON_CLOSE
, /* create_options, */
85 NULL
, /* smb2_create_blobs *blobs */
88 if (!NT_STATUS_IS_OK(status
)) {
89 printf("smb2cli_create returned %s\n", nt_errstr(status
));
93 status
= smb2cli_write(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
94 cli
->smb2
.tcon
, strlen(hello
), 0, fid_persistent
,
95 fid_volatile
, 0, 0, (const uint8_t *)hello
);
96 if (!NT_STATUS_IS_OK(status
)) {
97 printf("smb2cli_write returned %s\n", nt_errstr(status
));
101 status
= smb2cli_flush(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
102 cli
->smb2
.tcon
, fid_persistent
, fid_volatile
);
103 if (!NT_STATUS_IS_OK(status
)) {
104 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
108 status
= smb2cli_read(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
109 cli
->smb2
.tcon
, 0x10000, 0, fid_persistent
,
111 talloc_tos(), &result
, &nread
);
112 if (!NT_STATUS_IS_OK(status
)) {
113 printf("smb2cli_read returned %s\n", nt_errstr(status
));
117 if (nread
!= strlen(hello
)) {
118 printf("smb2cli_read returned %d bytes, expected %d\n",
119 (int)nread
, (int)strlen(hello
));
123 if (memcmp(hello
, result
, nread
) != 0) {
124 printf("smb2cli_read returned '%s', expected '%s'\n",
129 status
= smb2cli_close(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
130 cli
->smb2
.tcon
, 0, fid_persistent
, fid_volatile
);
131 if (!NT_STATUS_IS_OK(status
)) {
132 printf("smb2cli_close returned %s\n", nt_errstr(status
));
136 status
= smb2cli_create(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
138 SMB2_OPLOCK_LEVEL_NONE
, /* oplock_level, */
139 SMB2_IMPERSONATION_IMPERSONATION
, /* impersonation_level, */
142 SEC_DIR_READ_ATTRIBUTE
, /* desired_access, */
143 0, /* file_attributes, */
144 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, /* share_access, */
145 FILE_OPEN
, /* create_disposition, */
146 FILE_SYNCHRONOUS_IO_NONALERT
|FILE_DIRECTORY_FILE
, /* create_options, */
147 NULL
, /* smb2_create_blobs *blobs */
150 if (!NT_STATUS_IS_OK(status
)) {
151 printf("smb2cli_create returned %s\n", nt_errstr(status
));
155 status
= smb2cli_query_directory(
156 cli
->conn
, cli
->timeout
, cli
->smb2
.session
, cli
->smb2
.tcon
,
157 1, 0, 0, fid_persistent
, fid_volatile
, "*", 0xffff,
158 talloc_tos(), &dir_data
, &dir_data_length
);
160 if (!NT_STATUS_IS_OK(status
)) {
161 printf("smb2cli_query_directory returned %s\n", nt_errstr(status
));
165 status
= smb2cli_close(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
166 cli
->smb2
.tcon
, 0, fid_persistent
, fid_volatile
);
167 if (!NT_STATUS_IS_OK(status
)) {
168 printf("smb2cli_close returned %s\n", nt_errstr(status
));
172 saved_tid
= smb2cli_tcon_current_id(cli
->smb2
.tcon
);
173 saved_tcon
= cli
->smb2
.tcon
;
174 cli
->smb2
.tcon
= smbXcli_tcon_create(cli
);
175 smb2cli_tcon_set_values(cli
->smb2
.tcon
,
179 0, /* capabilities */
180 0 /* maximal_access */);
181 status
= smb2cli_tdis(cli
);
182 if (!NT_STATUS_IS_OK(status
)) {
183 printf("smb2cli_tdis returned %s\n", nt_errstr(status
));
186 talloc_free(cli
->smb2
.tcon
);
187 cli
->smb2
.tcon
= saved_tcon
;
189 status
= smb2cli_tdis(cli
);
190 if (!NT_STATUS_EQUAL(status
, NT_STATUS_NETWORK_NAME_DELETED
)) {
191 printf("2nd smb2cli_tdis returned %s\n", nt_errstr(status
));
195 saved_uid
= smb2cli_session_current_id(cli
->smb2
.session
);
196 status
= smb2cli_logoff(cli
->conn
, cli
->timeout
, cli
->smb2
.session
);
197 if (!NT_STATUS_IS_OK(status
)) {
198 printf("smb2cli_logoff returned %s\n", nt_errstr(status
));
202 cli
->smb2
.session
= smbXcli_session_create(cli
, cli
->conn
);
203 if (cli
->smb2
.session
== NULL
) {
204 printf("smbXcli_session_create() returned NULL\n");
208 smb2cli_session_set_id_and_flags(cli
->smb2
.session
, saved_uid
, 0);
210 status
= smb2cli_logoff(cli
->conn
, cli
->timeout
, cli
->smb2
.session
);
211 if (!NT_STATUS_EQUAL(status
, NT_STATUS_USER_SESSION_DELETED
)) {
212 printf("2nd smb2cli_logoff returned %s\n", nt_errstr(status
));
219 bool run_smb2_negprot(int dummy
)
221 struct cli_state
*cli
;
223 enum protocol_types protocol
;
224 const char *name
= NULL
;
226 printf("Starting SMB2-NEGPROT\n");
228 if (!torture_init_connection(&cli
)) {
231 cli
->smb2
.pid
= 0xFEFF;
233 status
= smbXcli_negprot(cli
->conn
, cli
->timeout
,
234 PROTOCOL_CORE
, PROTOCOL_LATEST
);
235 if (!NT_STATUS_IS_OK(status
)) {
236 printf("smbXcli_negprot returned %s\n", nt_errstr(status
));
240 protocol
= smbXcli_conn_protocol(cli
->conn
);
243 case PROTOCOL_SMB2_02
:
246 case PROTOCOL_SMB2_10
:
249 case PROTOCOL_SMB2_22
:
252 case PROTOCOL_SMB2_24
:
255 case PROTOCOL_SMB3_00
:
263 printf("Server supports %s\n", name
);
265 printf("Server DOES NOT support SMB2\n");
269 status
= smbXcli_negprot(cli
->conn
, cli
->timeout
,
271 if (!NT_STATUS_EQUAL(status
, NT_STATUS_CONNECTION_RESET
) &&
272 !NT_STATUS_EQUAL(status
, NT_STATUS_CONNECTION_DISCONNECTED
) &&
273 !NT_STATUS_EQUAL(status
, NT_STATUS_CONNECTION_ABORTED
)) {
274 printf("2nd smbXcli_negprot should disconnect - returned %s\n",
279 if (smbXcli_conn_is_connected(cli
->conn
)) {
280 printf("2nd smbXcli_negprot should disconnect "
281 "- still connected\n");
288 bool run_smb2_session_reconnect(int dummy
)
290 struct cli_state
*cli1
;
291 struct cli_state
*cli2
;
294 uint64_t fid_persistent
, fid_volatile
;
295 struct tevent_context
*ev
;
296 struct tevent_req
*subreq
;
297 DATA_BLOB in_blob
= data_blob_null
;
299 DATA_BLOB session_key
;
300 struct auth_generic_state
*auth_generic_state
;
301 struct iovec
*recv_iov
;
302 const char *hello
= "Hello, world\n";
306 printf("Starting SMB2-SESSION-RECONNECT\n");
308 if (!torture_init_connection(&cli1
)) {
311 cli1
->smb2
.pid
= 0xFEFF;
313 status
= smbXcli_negprot(cli1
->conn
, cli1
->timeout
,
314 PROTOCOL_SMB2_02
, PROTOCOL_LATEST
);
315 if (!NT_STATUS_IS_OK(status
)) {
316 printf("smbXcli_negprot returned %s\n", nt_errstr(status
));
320 status
= cli_session_setup(cli1
, username
,
321 password
, strlen(password
),
322 password
, strlen(password
),
324 if (!NT_STATUS_IS_OK(status
)) {
325 printf("cli_session_setup returned %s\n", nt_errstr(status
));
329 status
= cli_tree_connect(cli1
, share
, "?????", "", 0);
330 if (!NT_STATUS_IS_OK(status
)) {
331 printf("cli_tree_connect returned %s\n", nt_errstr(status
));
335 status
= smb2cli_create(cli1
->conn
, cli1
->timeout
, cli1
->smb2
.session
,
336 cli1
->smb2
.tcon
, "session-reconnect.txt",
337 SMB2_OPLOCK_LEVEL_NONE
, /* oplock_level, */
338 SMB2_IMPERSONATION_IMPERSONATION
, /* impersonation_level, */
339 SEC_STD_ALL
| SEC_FILE_ALL
, /* desired_access, */
340 FILE_ATTRIBUTE_NORMAL
, /* file_attributes, */
341 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, /* share_access, */
342 FILE_CREATE
, /* create_disposition, */
343 FILE_DELETE_ON_CLOSE
, /* create_options, */
344 NULL
, /* smb2_create_blobs *blobs */
347 if (!NT_STATUS_IS_OK(status
)) {
348 printf("smb2cli_create on cli1 %s\n", nt_errstr(status
));
352 status
= smb2cli_write(cli1
->conn
, cli1
->timeout
, cli1
->smb2
.session
,
353 cli1
->smb2
.tcon
, strlen(hello
), 0, fid_persistent
,
354 fid_volatile
, 0, 0, (const uint8_t *)hello
);
355 if (!NT_STATUS_IS_OK(status
)) {
356 printf("smb2cli_write returned %s\n", nt_errstr(status
));
360 status
= smb2cli_flush(cli1
->conn
, cli1
->timeout
, cli1
->smb2
.session
,
361 cli1
->smb2
.tcon
, fid_persistent
, fid_volatile
);
362 if (!NT_STATUS_IS_OK(status
)) {
363 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
367 status
= smb2cli_read(cli1
->conn
, cli1
->timeout
, cli1
->smb2
.session
,
368 cli1
->smb2
.tcon
, 0x10000, 0, fid_persistent
,
370 talloc_tos(), &result
, &nread
);
371 if (!NT_STATUS_IS_OK(status
)) {
372 printf("smb2cli_read returned %s\n", nt_errstr(status
));
376 if (nread
!= strlen(hello
)) {
377 printf("smb2cli_read returned %d bytes, expected %d\n",
378 (int)nread
, (int)strlen(hello
));
382 if (memcmp(hello
, result
, nread
) != 0) {
383 printf("smb2cli_read returned '%s', expected '%s'\n",
388 /* prepare second session */
390 if (!torture_init_connection(&cli2
)) {
393 cli2
->smb2
.pid
= 0xFEFF;
395 status
= smbXcli_negprot(cli2
->conn
, cli2
->timeout
,
396 PROTOCOL_SMB2_02
, PROTOCOL_LATEST
);
397 if (!NT_STATUS_IS_OK(status
)) {
398 printf("smbXcli_negprot returned %s\n", nt_errstr(status
));
402 status
= auth_generic_client_prepare(talloc_tos(), &auth_generic_state
);
403 if (!NT_STATUS_IS_OK(status
)) {
404 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status
));
408 gensec_want_feature(auth_generic_state
->gensec_security
,
409 GENSEC_FEATURE_SESSION_KEY
);
410 status
= auth_generic_set_username(auth_generic_state
, username
);
411 if (!NT_STATUS_IS_OK(status
)) {
412 printf("auth_generic_set_username returned %s\n", nt_errstr(status
));
416 status
= auth_generic_set_domain(auth_generic_state
, workgroup
);
417 if (!NT_STATUS_IS_OK(status
)) {
418 printf("auth_generic_set_domain returned %s\n", nt_errstr(status
));
422 status
= auth_generic_set_password(auth_generic_state
, password
);
423 if (!NT_STATUS_IS_OK(status
)) {
424 printf("auth_generic_set_password returned %s\n", nt_errstr(status
));
428 status
= auth_generic_client_start(auth_generic_state
, GENSEC_OID_NTLMSSP
);
429 if (!NT_STATUS_IS_OK(status
)) {
430 printf("auth_generic_client_start returned %s\n", nt_errstr(status
));
434 ev
= event_context_init(talloc_tos());
436 printf("event_context_init() returned NULL\n");
440 status
= gensec_update(auth_generic_state
->gensec_security
, talloc_tos(), ev
, data_blob_null
, &in_blob
);
441 if (!NT_STATUS_EQUAL(status
, NT_STATUS_MORE_PROCESSING_REQUIRED
)) {
442 printf("gensec_update returned %s\n", nt_errstr(status
));
446 cli2
->smb2
.session
= smbXcli_session_create(cli2
, cli2
->conn
);
448 subreq
= smb2cli_session_setup_send(talloc_tos(), ev
,
453 SMB2_CAP_DFS
, /* in_capabilities */
455 /* in_previous_session_id: */
456 smb2cli_session_current_id(cli1
->smb2
.session
),
457 &in_blob
); /* in_security_buffer */
458 if (subreq
== NULL
) {
459 printf("smb2cli_session_setup_send() returned NULL\n");
463 ok
= tevent_req_poll(subreq
, ev
);
465 printf("tevent_req_poll() returned false\n");
469 status
= smb2cli_session_setup_recv(subreq
, talloc_tos(),
471 if (!NT_STATUS_EQUAL(status
, NT_STATUS_MORE_PROCESSING_REQUIRED
)) {
472 printf("smb2cli_session_setup_recv returned %s\n",
477 status
= gensec_update(auth_generic_state
->gensec_security
, talloc_tos(), ev
, out_blob
, &in_blob
);
478 if (!NT_STATUS_IS_OK(status
)) {
479 printf("auth_generic_update returned %s\n", nt_errstr(status
));
483 subreq
= smb2cli_session_setup_send(talloc_tos(), ev
,
488 SMB2_CAP_DFS
, /* in_capabilities */
490 /* in_previous_session_id: */
491 smb2cli_session_current_id(cli1
->smb2
.session
),
492 &in_blob
); /* in_security_buffer */
493 if (subreq
== NULL
) {
494 printf("smb2cli_session_setup_send() returned NULL\n");
498 ok
= tevent_req_poll(subreq
, ev
);
500 printf("tevent_req_poll() returned false\n");
504 status
= smb2cli_session_setup_recv(subreq
, talloc_tos(),
505 &recv_iov
, &out_blob
);
506 if (!NT_STATUS_IS_OK(status
)) {
507 printf("smb2cli_session_setup_recv returned %s\n",
512 status
= gensec_session_key(auth_generic_state
->gensec_security
, talloc_tos(),
514 if (!NT_STATUS_IS_OK(status
)) {
515 printf("gensec_session_key returned %s\n",
520 /* check file operation on the old client */
522 status
= smb2cli_flush(cli1
->conn
, cli1
->timeout
, cli1
->smb2
.session
,
523 cli1
->smb2
.tcon
, fid_persistent
, fid_volatile
);
524 if (!NT_STATUS_EQUAL(status
, NT_STATUS_USER_SESSION_DELETED
)) {
525 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
529 status
= cli_tree_connect(cli1
, share
, "?????", "", 0);
530 if (!NT_STATUS_EQUAL(status
, NT_STATUS_USER_SESSION_DELETED
)) {
531 printf("cli_tree_connect returned %s\n", nt_errstr(status
));
536 * checking file operations without signing.
537 * on w2k8r2 at least, flush, read and write also work the same way,
538 * while create gives ACCESS_DENIED without signing
540 status
= smb2cli_flush(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
541 cli2
->smb2
.tcon
, fid_persistent
, fid_volatile
);
542 if (!NT_STATUS_EQUAL(status
, NT_STATUS_FILE_CLOSED
) &&
543 !NT_STATUS_EQUAL(status
, NT_STATUS_NETWORK_NAME_DELETED
))
545 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
549 status
= smb2cli_write(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
550 cli2
->smb2
.tcon
, strlen(hello
), 0, fid_persistent
,
551 fid_volatile
, 0, 0, (const uint8_t *)hello
);
552 if (!NT_STATUS_EQUAL(status
, NT_STATUS_FILE_CLOSED
) &&
553 !NT_STATUS_EQUAL(status
, NT_STATUS_NETWORK_NAME_DELETED
))
555 printf("smb2cli_write returned %s\n", nt_errstr(status
));
559 status
= smb2cli_read(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
560 cli2
->smb2
.tcon
, 0x10000, 0, fid_persistent
,
562 talloc_tos(), &result
, &nread
);
563 if (!NT_STATUS_EQUAL(status
, NT_STATUS_FILE_CLOSED
) &&
564 !NT_STATUS_EQUAL(status
, NT_STATUS_NETWORK_NAME_DELETED
))
566 printf("smb2cli_read returned %s\n", nt_errstr(status
));
570 status
= smb2cli_create(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
571 cli2
->smb2
.tcon
, "session-reconnect.txt",
572 SMB2_OPLOCK_LEVEL_NONE
, /* oplock_level, */
573 SMB2_IMPERSONATION_IMPERSONATION
, /* impersonation_level, */
574 SEC_STD_ALL
| SEC_FILE_ALL
, /* desired_access, */
575 FILE_ATTRIBUTE_NORMAL
, /* file_attributes, */
576 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, /* share_access, */
577 FILE_CREATE
, /* create_disposition, */
578 FILE_DELETE_ON_CLOSE
, /* create_options, */
579 NULL
, /* smb2_create_blobs *blobs */
582 if (!NT_STATUS_EQUAL(status
, NT_STATUS_ACCESS_DENIED
) &&
583 !NT_STATUS_EQUAL(status
, NT_STATUS_NETWORK_NAME_DELETED
)) {
584 printf("smb2cli_create on cli2 %s\n", nt_errstr(status
));
588 /* now grab the session key and try with signing */
590 status
= smb2cli_session_set_session_key(cli2
->smb2
.session
,
593 if (!NT_STATUS_IS_OK(status
)) {
594 printf("smb2cli_session_set_session_key %s\n", nt_errstr(status
));
598 /* the tid seems to be irrelevant at this stage */
600 status
= smb2cli_flush(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
601 cli1
->smb2
.tcon
, fid_persistent
, fid_volatile
);
602 if (!NT_STATUS_EQUAL(status
, NT_STATUS_FILE_CLOSED
) &&
603 !NT_STATUS_EQUAL(status
, NT_STATUS_NETWORK_NAME_DELETED
))
605 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
609 status
= smb2cli_write(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
610 cli1
->smb2
.tcon
, strlen(hello
), 0, fid_persistent
,
611 fid_volatile
, 0, 0, (const uint8_t *)hello
);
612 if (!NT_STATUS_EQUAL(status
, NT_STATUS_FILE_CLOSED
) &&
613 !NT_STATUS_EQUAL(status
, NT_STATUS_NETWORK_NAME_DELETED
))
615 printf("smb2cli_write returned %s\n", nt_errstr(status
));
619 status
= smb2cli_read(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
620 cli1
->smb2
.tcon
, 0x10000, 0, fid_persistent
,
622 talloc_tos(), &result
, &nread
);
623 if (!NT_STATUS_EQUAL(status
, NT_STATUS_FILE_CLOSED
) &&
624 !NT_STATUS_EQUAL(status
, NT_STATUS_NETWORK_NAME_DELETED
))
626 printf("smb2cli_read returned %s\n", nt_errstr(status
));
630 status
= smb2cli_create(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
631 cli1
->smb2
.tcon
, "session-reconnect.txt",
632 SMB2_OPLOCK_LEVEL_NONE
, /* oplock_level, */
633 SMB2_IMPERSONATION_IMPERSONATION
, /* impersonation_level, */
634 SEC_STD_ALL
| SEC_FILE_ALL
, /* desired_access, */
635 FILE_ATTRIBUTE_NORMAL
, /* file_attributes, */
636 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, /* share_access, */
637 FILE_CREATE
, /* create_disposition, */
638 FILE_DELETE_ON_CLOSE
, /* create_options, */
639 NULL
, /* smb2_create_blobs *blobs */
642 if (!NT_STATUS_EQUAL(status
, NT_STATUS_NETWORK_NAME_DELETED
) &&
643 !NT_STATUS_EQUAL(status
, NT_STATUS_NETWORK_NAME_DELETED
))
645 printf("smb2cli_create on cli2 %s\n", nt_errstr(status
));
649 /* now do a new tcon and test file calls again */
651 status
= cli_tree_connect(cli2
, share
, "?????", "", 0);
652 if (!NT_STATUS_IS_OK(status
)) {
653 printf("cli_tree_connect returned %s\n", nt_errstr(status
));
657 status
= smb2cli_create(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
658 cli2
->smb2
.tcon
, "session-reconnect.txt",
659 SMB2_OPLOCK_LEVEL_NONE
, /* oplock_level, */
660 SMB2_IMPERSONATION_IMPERSONATION
, /* impersonation_level, */
661 SEC_STD_ALL
| SEC_FILE_ALL
, /* desired_access, */
662 FILE_ATTRIBUTE_NORMAL
, /* file_attributes, */
663 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, /* share_access, */
664 FILE_CREATE
, /* create_disposition, */
665 FILE_DELETE_ON_CLOSE
, /* create_options, */
666 NULL
, /* smb2_create_blobs *blobs */
669 if (!NT_STATUS_IS_OK(status
)) {
670 printf("smb2cli_create on cli2 %s\n", nt_errstr(status
));
674 status
= smb2cli_write(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
675 cli2
->smb2
.tcon
, strlen(hello
), 0, fid_persistent
,
676 fid_volatile
, 0, 0, (const uint8_t *)hello
);
677 if (!NT_STATUS_IS_OK(status
)) {
678 printf("smb2cli_write returned %s\n", nt_errstr(status
));
682 status
= smb2cli_flush(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
683 cli2
->smb2
.tcon
, fid_persistent
, fid_volatile
);
684 if (!NT_STATUS_IS_OK(status
)) {
685 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
689 status
= smb2cli_read(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
690 cli2
->smb2
.tcon
, 0x10000, 0, fid_persistent
,
692 talloc_tos(), &result
, &nread
);
693 if (!NT_STATUS_IS_OK(status
)) {
694 printf("smb2cli_read returned %s\n", nt_errstr(status
));
698 if (nread
!= strlen(hello
)) {
699 printf("smb2cli_read returned %d bytes, expected %d\n",
700 (int)nread
, (int)strlen(hello
));
704 if (memcmp(hello
, result
, nread
) != 0) {
705 printf("smb2cli_read returned '%s', expected '%s'\n",
713 bool run_smb2_tcon_dependence(int dummy
)
715 struct cli_state
*cli
;
717 uint64_t fid_persistent
, fid_volatile
;
718 const char *hello
= "Hello, world\n";
721 struct smbXcli_tcon
*tcon2
;
724 printf("Starting SMB2-TCON-DEPENDENCE\n");
726 if (!torture_init_connection(&cli
)) {
729 cli
->smb2
.pid
= 0xFEFF;
731 status
= smbXcli_negprot(cli
->conn
, cli
->timeout
,
732 PROTOCOL_SMB2_02
, PROTOCOL_LATEST
);
733 if (!NT_STATUS_IS_OK(status
)) {
734 printf("smbXcli_negprot returned %s\n", nt_errstr(status
));
738 status
= cli_session_setup(cli
, username
,
739 password
, strlen(password
),
740 password
, strlen(password
),
742 if (!NT_STATUS_IS_OK(status
)) {
743 printf("cli_session_setup returned %s\n", nt_errstr(status
));
747 status
= cli_tree_connect(cli
, share
, "?????", "", 0);
748 if (!NT_STATUS_IS_OK(status
)) {
749 printf("cli_tree_connect returned %s\n", nt_errstr(status
));
753 status
= smb2cli_create(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
754 cli
->smb2
.tcon
, "tcon_depedence.txt",
755 SMB2_OPLOCK_LEVEL_NONE
, /* oplock_level, */
756 SMB2_IMPERSONATION_IMPERSONATION
, /* impersonation_level, */
757 SEC_STD_ALL
| SEC_FILE_ALL
, /* desired_access, */
758 FILE_ATTRIBUTE_NORMAL
, /* file_attributes, */
759 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, /* share_access, */
760 FILE_CREATE
, /* create_disposition, */
761 FILE_DELETE_ON_CLOSE
, /* create_options, */
762 NULL
, /* smb2_create_blobs *blobs */
765 if (!NT_STATUS_IS_OK(status
)) {
766 printf("smb2cli_create on cli %s\n", nt_errstr(status
));
770 status
= smb2cli_write(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
771 cli
->smb2
.tcon
, strlen(hello
), 0, fid_persistent
,
772 fid_volatile
, 0, 0, (const uint8_t *)hello
);
773 if (!NT_STATUS_IS_OK(status
)) {
774 printf("smb2cli_write returned %s\n", nt_errstr(status
));
778 status
= smb2cli_flush(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
779 cli
->smb2
.tcon
, fid_persistent
, fid_volatile
);
780 if (!NT_STATUS_IS_OK(status
)) {
781 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
785 status
= smb2cli_read(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
786 cli
->smb2
.tcon
, 0x10000, 0, fid_persistent
,
788 talloc_tos(), &result
, &nread
);
789 if (!NT_STATUS_IS_OK(status
)) {
790 printf("smb2cli_read returned %s\n", nt_errstr(status
));
794 if (nread
!= strlen(hello
)) {
795 printf("smb2cli_read returned %d bytes, expected %d\n",
796 (int)nread
, (int)strlen(hello
));
800 if (memcmp(hello
, result
, nread
) != 0) {
801 printf("smb2cli_read returned '%s', expected '%s'\n",
806 /* check behaviour with wrong tid... */
808 tcon2
= smbXcli_tcon_create(cli
);
809 tcon2_id
= smb2cli_tcon_current_id(cli
->smb2
.tcon
);
811 smb2cli_tcon_set_values(tcon2
,
815 0, /* capabilities */
816 0 /* maximal_access */);
818 status
= smb2cli_read(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
819 tcon2
, 0x10000, 0, fid_persistent
,
821 talloc_tos(), &result
, &nread
);
822 if (!NT_STATUS_EQUAL(status
, NT_STATUS_NETWORK_NAME_DELETED
)) {
823 printf("smb2cli_read returned %s\n", nt_errstr(status
));
832 bool run_smb2_multi_channel(int dummy
)
834 struct cli_state
*cli1
;
835 struct cli_state
*cli2
;
836 struct cli_state
*cli3
;
839 uint64_t fid_persistent
, fid_volatile
;
840 struct tevent_context
*ev
;
841 struct tevent_req
*subreq
;
842 DATA_BLOB in_blob
= data_blob_null
;
844 DATA_BLOB channel_session_key
;
845 struct auth_generic_state
*auth_generic_state
;
846 struct iovec
*recv_iov
;
847 const char *hello
= "Hello, world\n";
851 printf("Starting SMB2-MULTI-CHANNEL\n");
853 if (!torture_init_connection(&cli1
)) {
856 cli1
->smb2
.pid
= 0xFEFF;
858 if (!torture_init_connection(&cli2
)) {
861 cli2
->smb2
.pid
= 0xFEFF;
863 if (!torture_init_connection(&cli3
)) {
866 cli3
->smb2
.pid
= 0xFEFF;
868 status
= smbXcli_negprot(cli1
->conn
, cli1
->timeout
,
869 PROTOCOL_SMB2_22
, PROTOCOL_LATEST
);
870 if (!NT_STATUS_IS_OK(status
)) {
871 printf("smbXcli_negprot returned %s\n", nt_errstr(status
));
875 status
= smbXcli_negprot(cli2
->conn
, cli2
->timeout
,
876 PROTOCOL_SMB2_22
, PROTOCOL_LATEST
);
877 if (!NT_STATUS_IS_OK(status
)) {
878 printf("smbXcli_negprot returned %s\n", nt_errstr(status
));
882 status
= smbXcli_negprot(cli3
->conn
, cli3
->timeout
,
883 PROTOCOL_SMB2_22
, PROTOCOL_LATEST
);
884 if (!NT_STATUS_IS_OK(status
)) {
885 printf("smbXcli_negprot returned %s\n", nt_errstr(status
));
889 status
= cli_session_setup(cli1
, username
,
890 password
, strlen(password
),
891 password
, strlen(password
),
893 if (!NT_STATUS_IS_OK(status
)) {
894 printf("smb2cli_sesssetup returned %s\n", nt_errstr(status
));
898 status
= cli_tree_connect(cli1
, share
, "?????", "", 0);
899 if (!NT_STATUS_IS_OK(status
)) {
900 printf("cli_tree_connect returned %s\n", nt_errstr(status
));
904 status
= smb2cli_session_create_channel(cli2
,
907 &cli2
->smb2
.session
);
908 if (!NT_STATUS_IS_OK(status
)) {
909 printf("smb2cli_session_create_channel returned %s\n",
914 status
= auth_generic_client_prepare(talloc_tos(), &auth_generic_state
);
915 if (!NT_STATUS_IS_OK(status
)) {
916 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status
));
920 gensec_want_feature(auth_generic_state
->gensec_security
,
921 GENSEC_FEATURE_SESSION_KEY
);
922 status
= auth_generic_set_username(auth_generic_state
, username
);
923 if (!NT_STATUS_IS_OK(status
)) {
924 printf("auth_generic_set_username returned %s\n", nt_errstr(status
));
928 status
= auth_generic_set_domain(auth_generic_state
, workgroup
);
929 if (!NT_STATUS_IS_OK(status
)) {
930 printf("auth_generic_set_domain returned %s\n", nt_errstr(status
));
934 status
= auth_generic_set_password(auth_generic_state
, password
);
935 if (!NT_STATUS_IS_OK(status
)) {
936 printf("auth_generic_set_password returned %s\n", nt_errstr(status
));
940 status
= auth_generic_client_start(auth_generic_state
, GENSEC_OID_NTLMSSP
);
941 if (!NT_STATUS_IS_OK(status
)) {
942 printf("auth_generic_client_start returned %s\n", nt_errstr(status
));
946 ev
= event_context_init(talloc_tos());
948 printf("event_context_init() returned NULL\n");
952 status
= gensec_update(auth_generic_state
->gensec_security
, talloc_tos(), ev
, data_blob_null
, &in_blob
);
953 if (!NT_STATUS_EQUAL(status
, NT_STATUS_MORE_PROCESSING_REQUIRED
)) {
954 printf("gensec_update returned %s\n", nt_errstr(status
));
958 subreq
= smb2cli_session_setup_send(talloc_tos(), ev
,
963 SMB2_CAP_DFS
, /* in_capabilities */
965 0, /* in_previous_session_id */
966 &in_blob
); /* in_security_buffer */
967 if (subreq
== NULL
) {
968 printf("smb2cli_session_setup_send() returned NULL\n");
972 ok
= tevent_req_poll(subreq
, ev
);
974 printf("tevent_req_poll() returned false\n");
978 status
= smb2cli_session_setup_recv(subreq
, talloc_tos(),
980 if (!NT_STATUS_EQUAL(status
, NT_STATUS_MORE_PROCESSING_REQUIRED
)) {
981 printf("smb2cli_session_setup_recv returned %s\n",
986 status
= gensec_update(auth_generic_state
->gensec_security
, talloc_tos(), ev
, out_blob
, &in_blob
);
987 if (!NT_STATUS_IS_OK(status
)) {
988 printf("auth_generic_update returned %s\n", nt_errstr(status
));
992 subreq
= smb2cli_session_setup_send(talloc_tos(), ev
,
997 SMB2_CAP_DFS
, /* in_capabilities */
999 0, /* in_previous_session_id */
1000 &in_blob
); /* in_security_buffer */
1001 if (subreq
== NULL
) {
1002 printf("smb2cli_session_setup_send() returned NULL\n");
1006 ok
= tevent_req_poll(subreq
, ev
);
1008 printf("tevent_req_poll() returned false\n");
1012 status
= smb2cli_session_setup_recv(subreq
, talloc_tos(),
1013 &recv_iov
, &out_blob
);
1014 if (!NT_STATUS_IS_OK(status
)) {
1015 printf("smb2cli_session_setup_recv returned %s\n",
1020 status
= gensec_session_key(auth_generic_state
->gensec_security
, talloc_tos(),
1021 &channel_session_key
);
1022 if (!NT_STATUS_IS_OK(status
)) {
1023 printf("gensec_session_key returned %s\n",
1028 status
= smb2cli_session_set_channel_key(cli2
->smb2
.session
,
1029 channel_session_key
,
1031 if (!NT_STATUS_IS_OK(status
)) {
1032 printf("smb2cli_session_set_channel_key %s\n", nt_errstr(status
));
1036 status
= smb2cli_session_create_channel(cli3
,
1039 &cli3
->smb2
.session
);
1040 if (!NT_STATUS_IS_OK(status
)) {
1041 printf("smb2cli_session_create_channel returned %s\n",
1046 status
= auth_generic_client_prepare(talloc_tos(), &auth_generic_state
);
1047 if (!NT_STATUS_IS_OK(status
)) {
1048 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status
));
1052 gensec_want_feature(auth_generic_state
->gensec_security
,
1053 GENSEC_FEATURE_SESSION_KEY
);
1054 status
= auth_generic_set_username(auth_generic_state
, username
);
1055 if (!NT_STATUS_IS_OK(status
)) {
1056 printf("auth_generic_set_username returned %s\n", nt_errstr(status
));
1060 status
= auth_generic_set_domain(auth_generic_state
, workgroup
);
1061 if (!NT_STATUS_IS_OK(status
)) {
1062 printf("auth_generic_set_domain returned %s\n", nt_errstr(status
));
1066 status
= auth_generic_set_password(auth_generic_state
, password
);
1067 if (!NT_STATUS_IS_OK(status
)) {
1068 printf("auth_generic_set_password returned %s\n", nt_errstr(status
));
1072 status
= auth_generic_client_start(auth_generic_state
, GENSEC_OID_NTLMSSP
);
1073 if (!NT_STATUS_IS_OK(status
)) {
1074 printf("auth_generic_client_start returned %s\n", nt_errstr(status
));
1078 status
= gensec_update(auth_generic_state
->gensec_security
, talloc_tos(), ev
, data_blob_null
, &in_blob
);
1079 if (!NT_STATUS_EQUAL(status
, NT_STATUS_MORE_PROCESSING_REQUIRED
)) {
1080 printf("gensec_update returned %s\n", nt_errstr(status
));
1084 subreq
= smb2cli_session_setup_send(talloc_tos(), ev
,
1088 0x01, /* in_flags */
1089 SMB2_CAP_DFS
, /* in_capabilities */
1091 0, /* in_previous_session_id */
1092 &in_blob
); /* in_security_buffer */
1093 if (subreq
== NULL
) {
1094 printf("smb2cli_session_setup_send() returned NULL\n");
1098 ok
= tevent_req_poll(subreq
, ev
);
1100 printf("tevent_req_poll() returned false\n");
1104 status
= smb2cli_session_setup_recv(subreq
, talloc_tos(),
1106 if (!NT_STATUS_EQUAL(status
, NT_STATUS_MORE_PROCESSING_REQUIRED
)) {
1107 printf("smb2cli_session_setup_recv returned %s\n",
1112 status
= gensec_update(auth_generic_state
->gensec_security
, talloc_tos(), ev
, out_blob
, &in_blob
);
1113 if (!NT_STATUS_IS_OK(status
)) {
1114 printf("auth_generic_update returned %s\n", nt_errstr(status
));
1118 subreq
= smb2cli_session_setup_send(talloc_tos(), ev
,
1122 0x01, /* in_flags */
1123 SMB2_CAP_DFS
, /* in_capabilities */
1125 0, /* in_previous_session_id */
1126 &in_blob
); /* in_security_buffer */
1127 if (subreq
== NULL
) {
1128 printf("smb2cli_session_setup_send() returned NULL\n");
1132 ok
= tevent_req_poll(subreq
, ev
);
1134 printf("tevent_req_poll() returned false\n");
1138 status
= smb2cli_session_setup_recv(subreq
, talloc_tos(),
1139 &recv_iov
, &out_blob
);
1140 if (!NT_STATUS_IS_OK(status
)) {
1141 printf("smb2cli_session_setup_recv returned %s\n",
1146 status
= gensec_session_key(auth_generic_state
->gensec_security
, talloc_tos(),
1147 &channel_session_key
);
1148 if (!NT_STATUS_IS_OK(status
)) {
1149 printf("gensec_session_key returned %s\n",
1154 status
= smb2cli_session_set_channel_key(cli3
->smb2
.session
,
1155 channel_session_key
,
1157 if (!NT_STATUS_IS_OK(status
)) {
1158 printf("smb2cli_session_set_channel_key %s\n", nt_errstr(status
));
1162 status
= smb2cli_create(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
1163 cli1
->smb2
.tcon
, "multi-channel.txt",
1164 SMB2_OPLOCK_LEVEL_NONE
, /* oplock_level, */
1165 SMB2_IMPERSONATION_IMPERSONATION
, /* impersonation_level, */
1166 SEC_STD_ALL
| SEC_FILE_ALL
, /* desired_access, */
1167 FILE_ATTRIBUTE_NORMAL
, /* file_attributes, */
1168 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, /* share_access, */
1169 FILE_CREATE
, /* create_disposition, */
1170 FILE_DELETE_ON_CLOSE
, /* create_options, */
1171 NULL
, /* smb2_create_blobs *blobs */
1174 if (!NT_STATUS_IS_OK(status
)) {
1175 printf("smb2cli_create on cli2 %s\n", nt_errstr(status
));
1179 status
= smb2cli_write(cli1
->conn
, cli1
->timeout
, cli1
->smb2
.session
,
1180 cli1
->smb2
.tcon
, strlen(hello
), 0, fid_persistent
,
1181 fid_volatile
, 0, 0, (const uint8_t *)hello
);
1182 if (!NT_STATUS_IS_OK(status
)) {
1183 printf("smb2cli_write returned %s\n", nt_errstr(status
));
1187 status
= smb2cli_flush(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
1188 cli1
->smb2
.tcon
, fid_persistent
, fid_volatile
);
1189 if (!NT_STATUS_IS_OK(status
)) {
1190 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
1194 status
= smb2cli_flush(cli1
->conn
, cli1
->timeout
, cli1
->smb2
.session
,
1195 cli1
->smb2
.tcon
, fid_persistent
, fid_volatile
);
1196 if (!NT_STATUS_IS_OK(status
)) {
1197 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
1201 status
= smb2cli_flush(cli3
->conn
, cli3
->timeout
, cli3
->smb2
.session
,
1202 cli1
->smb2
.tcon
, fid_persistent
, fid_volatile
);
1203 if (!NT_STATUS_IS_OK(status
)) {
1204 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
1208 status
= smb2cli_read(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
1209 cli1
->smb2
.tcon
, 0x10000, 0, fid_persistent
,
1211 talloc_tos(), &result
, &nread
);
1212 if (!NT_STATUS_IS_OK(status
)) {
1213 printf("smb2cli_read returned %s\n", nt_errstr(status
));
1217 if (nread
!= strlen(hello
)) {
1218 printf("smb2cli_read returned %d bytes, expected %d\n",
1219 (int)nread
, (int)strlen(hello
));
1223 if (memcmp(hello
, result
, nread
) != 0) {
1224 printf("smb2cli_read returned '%s', expected '%s'\n",
1229 status
= auth_generic_client_prepare(talloc_tos(), &auth_generic_state
);
1230 if (!NT_STATUS_IS_OK(status
)) {
1231 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status
));
1235 gensec_want_feature(auth_generic_state
->gensec_security
,
1236 GENSEC_FEATURE_SESSION_KEY
);
1237 status
= auth_generic_set_username(auth_generic_state
, username
);
1238 if (!NT_STATUS_IS_OK(status
)) {
1239 printf("auth_generic_set_username returned %s\n", nt_errstr(status
));
1243 status
= auth_generic_set_domain(auth_generic_state
, workgroup
);
1244 if (!NT_STATUS_IS_OK(status
)) {
1245 printf("auth_generic_set_domain returned %s\n", nt_errstr(status
));
1249 status
= auth_generic_set_password(auth_generic_state
, password
);
1250 if (!NT_STATUS_IS_OK(status
)) {
1251 printf("auth_generic_set_password returned %s\n", nt_errstr(status
));
1255 status
= auth_generic_client_start(auth_generic_state
, GENSEC_OID_NTLMSSP
);
1256 if (!NT_STATUS_IS_OK(status
)) {
1257 printf("auth_generic_client_start returned %s\n", nt_errstr(status
));
1261 status
= gensec_update(auth_generic_state
->gensec_security
, talloc_tos(), ev
, data_blob_null
, &in_blob
);
1262 if (!NT_STATUS_EQUAL(status
, NT_STATUS_MORE_PROCESSING_REQUIRED
)) {
1263 printf("gensec_update returned %s\n", nt_errstr(status
));
1267 subreq
= smb2cli_session_setup_send(talloc_tos(), ev
,
1272 SMB2_CAP_DFS
, /* in_capabilities */
1274 0, /* in_previous_session_id */
1275 &in_blob
); /* in_security_buffer */
1276 if (subreq
== NULL
) {
1277 printf("smb2cli_session_setup_send() returned NULL\n");
1281 ok
= tevent_req_poll(subreq
, ev
);
1283 printf("tevent_req_poll() returned false\n");
1287 status
= smb2cli_session_setup_recv(subreq
, talloc_tos(),
1289 if (!NT_STATUS_EQUAL(status
, NT_STATUS_MORE_PROCESSING_REQUIRED
)) {
1290 printf("smb2cli_session_setup_recv returned %s\n",
1295 status
= gensec_update(auth_generic_state
->gensec_security
, talloc_tos(), ev
, out_blob
, &in_blob
);
1296 if (!NT_STATUS_IS_OK(status
)) {
1297 printf("auth_generic_update returned %s\n", nt_errstr(status
));
1301 status
= smb2cli_flush(cli1
->conn
, cli1
->timeout
, cli1
->smb2
.session
,
1302 cli1
->smb2
.tcon
, fid_persistent
, fid_volatile
);
1303 if (!NT_STATUS_IS_OK(status
)) {
1304 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
1308 status
= smb2cli_flush(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
1309 cli1
->smb2
.tcon
, fid_persistent
, fid_volatile
);
1310 if (!NT_STATUS_IS_OK(status
)) {
1311 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
1315 status
= smb2cli_flush(cli3
->conn
, cli3
->timeout
, cli3
->smb2
.session
,
1316 cli1
->smb2
.tcon
, fid_persistent
, fid_volatile
);
1317 if (!NT_STATUS_IS_OK(status
)) {
1318 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
1322 status
= smb2cli_create(cli1
->conn
, cli1
->timeout
, cli1
->smb2
.session
,
1323 cli1
->smb2
.tcon
, "multi-channel-invalid.txt",
1324 SMB2_OPLOCK_LEVEL_NONE
, /* oplock_level, */
1325 SMB2_IMPERSONATION_IMPERSONATION
, /* impersonation_level, */
1326 SEC_STD_ALL
| SEC_FILE_ALL
, /* desired_access, */
1327 FILE_ATTRIBUTE_NORMAL
, /* file_attributes, */
1328 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, /* share_access, */
1329 FILE_CREATE
, /* create_disposition, */
1330 FILE_DELETE_ON_CLOSE
, /* create_options, */
1331 NULL
, /* smb2_create_blobs *blobs */
1334 if (!NT_STATUS_EQUAL(status
, NT_STATUS_INVALID_HANDLE
)) {
1335 printf("smb2cli_create %s\n", nt_errstr(status
));
1339 status
= smb2cli_create(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
1340 cli1
->smb2
.tcon
, "multi-channel-invalid.txt",
1341 SMB2_OPLOCK_LEVEL_NONE
, /* oplock_level, */
1342 SMB2_IMPERSONATION_IMPERSONATION
, /* impersonation_level, */
1343 SEC_STD_ALL
| SEC_FILE_ALL
, /* desired_access, */
1344 FILE_ATTRIBUTE_NORMAL
, /* file_attributes, */
1345 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, /* share_access, */
1346 FILE_CREATE
, /* create_disposition, */
1347 FILE_DELETE_ON_CLOSE
, /* create_options, */
1348 NULL
, /* smb2_create_blobs *blobs */
1351 if (!NT_STATUS_EQUAL(status
, NT_STATUS_INVALID_HANDLE
)) {
1352 printf("smb2cli_create %s\n", nt_errstr(status
));
1356 status
= smb2cli_create(cli3
->conn
, cli3
->timeout
, cli3
->smb2
.session
,
1357 cli1
->smb2
.tcon
, "multi-channel-invalid.txt",
1358 SMB2_OPLOCK_LEVEL_NONE
, /* oplock_level, */
1359 SMB2_IMPERSONATION_IMPERSONATION
, /* impersonation_level, */
1360 SEC_STD_ALL
| SEC_FILE_ALL
, /* desired_access, */
1361 FILE_ATTRIBUTE_NORMAL
, /* file_attributes, */
1362 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, /* share_access, */
1363 FILE_CREATE
, /* create_disposition, */
1364 FILE_DELETE_ON_CLOSE
, /* create_options, */
1365 NULL
, /* smb2_create_blobs *blobs */
1368 if (!NT_STATUS_EQUAL(status
, NT_STATUS_INVALID_HANDLE
)) {
1369 printf("smb2cli_create %s\n", nt_errstr(status
));
1373 subreq
= smb2cli_session_setup_send(talloc_tos(), ev
,
1378 SMB2_CAP_DFS
, /* in_capabilities */
1380 0, /* in_previous_session_id */
1381 &in_blob
); /* in_security_buffer */
1382 if (subreq
== NULL
) {
1383 printf("smb2cli_session_setup_send() returned NULL\n");
1387 ok
= tevent_req_poll(subreq
, ev
);
1389 printf("tevent_req_poll() returned false\n");
1393 status
= smb2cli_session_setup_recv(subreq
, talloc_tos(),
1394 &recv_iov
, &out_blob
);
1395 if (!NT_STATUS_IS_OK(status
)) {
1396 printf("smb2cli_session_setup_recv returned %s\n",
1401 status
= smb2cli_close(cli3
->conn
, cli3
->timeout
, cli3
->smb2
.session
,
1402 cli1
->smb2
.tcon
, 0, fid_persistent
, fid_volatile
);
1403 if (!NT_STATUS_IS_OK(status
)) {
1404 printf("smb2cli_close returned %s\n", nt_errstr(status
));
1408 status
= smb2cli_flush(cli3
->conn
, cli3
->timeout
, cli3
->smb2
.session
,
1409 cli1
->smb2
.tcon
, fid_persistent
, fid_volatile
);
1410 if (!NT_STATUS_EQUAL(status
, NT_STATUS_FILE_CLOSED
)) {
1411 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
1415 status
= smb2cli_flush(cli2
->conn
, cli2
->timeout
, cli2
->smb2
.session
,
1416 cli1
->smb2
.tcon
, fid_persistent
, fid_volatile
);
1417 if (!NT_STATUS_EQUAL(status
, NT_STATUS_FILE_CLOSED
)) {
1418 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
1422 status
= smb2cli_flush(cli1
->conn
, cli1
->timeout
, cli1
->smb2
.session
,
1423 cli1
->smb2
.tcon
, fid_persistent
, fid_volatile
);
1424 if (!NT_STATUS_EQUAL(status
, NT_STATUS_FILE_CLOSED
)) {
1425 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
1432 bool run_smb2_session_reauth(int dummy
)
1434 struct cli_state
*cli
;
1437 uint64_t fid_persistent
, fid_volatile
;
1438 uint64_t dir_persistent
, dir_volatile
;
1440 uint32_t dir_data_length
;
1441 struct tevent_context
*ev
;
1442 struct tevent_req
*subreq
;
1443 DATA_BLOB in_blob
= data_blob_null
;
1445 DATA_BLOB in_input_buffer
;
1446 DATA_BLOB out_output_buffer
;
1447 uint8_t in_file_info_class
;
1448 struct auth_generic_state
*auth_generic_state
;
1449 struct iovec
*recv_iov
;
1451 struct smbXcli_tcon
*saved_tcon
;
1453 printf("Starting SMB2-SESSION_REAUTH\n");
1455 if (!torture_init_connection(&cli
)) {
1458 cli
->smb2
.pid
= 0xFEFF;
1461 * PROTOCOL_SMB2_22 has a bug in win8pre0
1462 * it behaves like PROTOCOL_SMB2_02
1463 * and returns NT_STATUS_REQUEST_NOT_ACCEPTED,
1464 * while it allows it on PROTOCOL_SMB2_02.
1466 status
= smbXcli_negprot(cli
->conn
, cli
->timeout
,
1467 PROTOCOL_SMB2_10
, PROTOCOL_SMB2_10
);
1468 if (!NT_STATUS_IS_OK(status
)) {
1469 printf("smbXcli_negprot returned %s\n", nt_errstr(status
));
1473 status
= cli_session_setup(cli
, username
,
1474 password
, strlen(password
),
1475 password
, strlen(password
),
1477 if (!NT_STATUS_IS_OK(status
)) {
1478 printf("smb2cli_sesssetup returned %s\n", nt_errstr(status
));
1482 status
= cli_tree_connect(cli
, share
, "?????", "", 0);
1483 if (!NT_STATUS_IS_OK(status
)) {
1484 printf("cli_tree_connect returned %s\n", nt_errstr(status
));
1488 status
= smb2cli_create(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
1489 cli
->smb2
.tcon
, "session-reauth.txt",
1490 SMB2_OPLOCK_LEVEL_NONE
, /* oplock_level, */
1491 SMB2_IMPERSONATION_IMPERSONATION
, /* impersonation_level, */
1492 SEC_STD_ALL
| SEC_FILE_ALL
, /* desired_access, */
1493 FILE_ATTRIBUTE_NORMAL
, /* file_attributes, */
1494 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, /* share_access, */
1495 FILE_CREATE
, /* create_disposition, */
1496 FILE_DELETE_ON_CLOSE
, /* create_options, */
1497 NULL
, /* smb2_create_blobs *blobs */
1500 if (!NT_STATUS_IS_OK(status
)) {
1501 printf("smb2cli_create %s\n", nt_errstr(status
));
1505 status
= smb2cli_create(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
1507 SMB2_OPLOCK_LEVEL_NONE
, /* oplock_level, */
1508 SMB2_IMPERSONATION_IMPERSONATION
, /* impersonation_level, */
1509 SEC_STD_SYNCHRONIZE
|
1511 SEC_DIR_READ_ATTRIBUTE
, /* desired_access, */
1512 0, /* file_attributes, */
1513 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, /* share_access, */
1514 FILE_OPEN
, /* create_disposition, */
1515 FILE_SYNCHRONOUS_IO_NONALERT
|FILE_DIRECTORY_FILE
, /* create_options, */
1516 NULL
, /* smb2_create_blobs *blobs */
1519 if (!NT_STATUS_IS_OK(status
)) {
1520 printf("smb2cli_create returned %s\n", nt_errstr(status
));
1524 status
= smb2cli_query_directory(
1525 cli
->conn
, cli
->timeout
, cli
->smb2
.session
, cli
->smb2
.tcon
,
1526 1, 0x3, 0, dir_persistent
, dir_volatile
,
1527 "session-reauth.txt", 0xffff,
1528 talloc_tos(), &dir_data
, &dir_data_length
);
1529 if (!NT_STATUS_IS_OK(status
)) {
1530 printf("smb2cli_query_directory returned %s\n", nt_errstr(status
));
1534 status
= auth_generic_client_prepare(talloc_tos(), &auth_generic_state
);
1535 if (!NT_STATUS_IS_OK(status
)) {
1536 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status
));
1540 gensec_want_feature(auth_generic_state
->gensec_security
,
1541 GENSEC_FEATURE_SESSION_KEY
);
1542 status
= auth_generic_set_username(auth_generic_state
, username
);
1543 if (!NT_STATUS_IS_OK(status
)) {
1544 printf("auth_generic_set_username returned %s\n", nt_errstr(status
));
1548 status
= auth_generic_set_domain(auth_generic_state
, workgroup
);
1549 if (!NT_STATUS_IS_OK(status
)) {
1550 printf("auth_generic_set_domain returned %s\n", nt_errstr(status
));
1554 status
= auth_generic_set_password(auth_generic_state
, password
);
1555 if (!NT_STATUS_IS_OK(status
)) {
1556 printf("auth_generic_set_password returned %s\n", nt_errstr(status
));
1560 status
= auth_generic_client_start(auth_generic_state
, GENSEC_OID_NTLMSSP
);
1561 if (!NT_STATUS_IS_OK(status
)) {
1562 printf("auth_generic_client_start returned %s\n", nt_errstr(status
));
1566 ev
= event_context_init(talloc_tos());
1568 printf("event_context_init() returned NULL\n");
1572 status
= gensec_update(auth_generic_state
->gensec_security
, talloc_tos(), ev
, data_blob_null
, &in_blob
);
1573 if (!NT_STATUS_EQUAL(status
, NT_STATUS_MORE_PROCESSING_REQUIRED
)) {
1574 printf("gensec_update returned %s\n", nt_errstr(status
));
1578 subreq
= smb2cli_session_setup_send(talloc_tos(), ev
,
1583 SMB2_CAP_DFS
, /* in_capabilities */
1585 0, /* in_previous_session_id */
1586 &in_blob
); /* in_security_buffer */
1587 if (subreq
== NULL
) {
1588 printf("smb2cli_session_setup_send() returned NULL\n");
1592 ok
= tevent_req_poll(subreq
, ev
);
1594 printf("tevent_req_poll() returned false\n");
1598 status
= smb2cli_session_setup_recv(subreq
, talloc_tos(),
1600 if (!NT_STATUS_EQUAL(status
, NT_STATUS_MORE_PROCESSING_REQUIRED
)) {
1601 printf("smb2cli_session_setup_recv returned %s\n",
1606 status
= gensec_update(auth_generic_state
->gensec_security
, talloc_tos(), ev
, out_blob
, &in_blob
);
1607 if (!NT_STATUS_IS_OK(status
)) {
1608 printf("auth_generic_update returned %s\n", nt_errstr(status
));
1612 status
= smb2cli_flush(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
1613 cli
->smb2
.tcon
, fid_persistent
, fid_volatile
);
1614 if (!NT_STATUS_IS_OK(status
)) {
1615 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
1619 status
= smb2cli_query_directory(
1620 cli
->conn
, cli
->timeout
, cli
->smb2
.session
, cli
->smb2
.tcon
,
1621 1, 0x3, 0, dir_persistent
, dir_volatile
,
1622 "session-reauth.txt", 0xffff,
1623 talloc_tos(), &dir_data
, &dir_data_length
);
1624 if (!NT_STATUS_IS_OK(status
)) {
1625 printf("smb2cli_query_directory returned %s\n", nt_errstr(status
));
1630 * query_info seems to be a path based operation on Windows...
1632 status
= smb2cli_query_info(cli
->conn
,
1636 SMB2_GETINFO_SECURITY
,
1637 0, /* in_file_info_class */
1638 1024, /* in_max_output_length */
1639 NULL
, /* in_input_buffer */
1640 SECINFO_OWNER
, /* in_additional_info */
1645 &out_output_buffer
);
1646 if (!NT_STATUS_EQUAL(status
, NT_STATUS_INVALID_HANDLE
)) {
1647 printf("smb2cli_query_info (security) returned %s\n", nt_errstr(status
));
1651 in_file_info_class
= SMB_FILE_POSITION_INFORMATION
- 1000;
1652 status
= smb2cli_query_info(cli
->conn
,
1658 1024, /* in_max_output_length */
1659 NULL
, /* in_input_buffer */
1660 0, /* in_additional_info */
1665 &out_output_buffer
);
1666 if (!NT_STATUS_EQUAL(status
, NT_STATUS_INVALID_HANDLE
)) {
1667 printf("smb2cli_query_info (position) returned %s\n", nt_errstr(status
));
1671 in_input_buffer
= data_blob_talloc(talloc_tos(), NULL
, 8);
1672 SBVAL(in_input_buffer
.data
, 0, 512);
1674 in_file_info_class
= SMB_FILE_POSITION_INFORMATION
- 1000;
1675 status
= smb2cli_set_info(cli
->conn
,
1682 0, /* in_additional_info */
1685 if (!NT_STATUS_EQUAL(status
, NT_STATUS_INVALID_HANDLE
)) {
1686 printf("smb2cli_set_info (position) returned %s\n", nt_errstr(status
));
1690 status
= smb2cli_create(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
1691 cli
->smb2
.tcon
, "session-reauth-invalid.txt",
1692 SMB2_OPLOCK_LEVEL_NONE
, /* oplock_level, */
1693 SMB2_IMPERSONATION_IMPERSONATION
, /* impersonation_level, */
1694 SEC_STD_ALL
| SEC_FILE_ALL
, /* desired_access, */
1695 FILE_ATTRIBUTE_NORMAL
, /* file_attributes, */
1696 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, /* share_access, */
1697 FILE_CREATE
, /* create_disposition, */
1698 FILE_DELETE_ON_CLOSE
, /* create_options, */
1699 NULL
, /* smb2_create_blobs *blobs */
1702 if (!NT_STATUS_EQUAL(status
, NT_STATUS_INVALID_HANDLE
)) {
1703 printf("smb2cli_create %s\n", nt_errstr(status
));
1707 status
= smb2cli_create(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
1709 SMB2_OPLOCK_LEVEL_NONE
, /* oplock_level, */
1710 SMB2_IMPERSONATION_IMPERSONATION
, /* impersonation_level, */
1711 SEC_STD_SYNCHRONIZE
|
1713 SEC_DIR_READ_ATTRIBUTE
, /* desired_access, */
1714 0, /* file_attributes, */
1715 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, /* share_access, */
1716 FILE_OPEN
, /* create_disposition, */
1717 FILE_SYNCHRONOUS_IO_NONALERT
|FILE_DIRECTORY_FILE
, /* create_options, */
1718 NULL
, /* smb2_create_blobs *blobs */
1721 if (!NT_STATUS_EQUAL(status
, NT_STATUS_INVALID_HANDLE
)) {
1722 printf("smb2cli_create returned %s\n", nt_errstr(status
));
1726 saved_tid
= smb2cli_tcon_current_id(cli
->smb2
.tcon
);
1727 saved_tcon
= cli
->smb2
.tcon
;
1728 cli
->smb2
.tcon
= smbXcli_tcon_create(cli
);
1729 smb2cli_tcon_set_values(cli
->smb2
.tcon
,
1733 0, /* capabilities */
1734 0 /* maximal_access */);
1735 status
= cli_tree_connect(cli
, share
, "?????", "", 0);
1736 if (!NT_STATUS_EQUAL(status
, NT_STATUS_INVALID_HANDLE
)) {
1737 printf("cli_tree_connect returned %s\n", nt_errstr(status
));
1740 talloc_free(cli
->smb2
.tcon
);
1741 cli
->smb2
.tcon
= saved_tcon
;
1743 subreq
= smb2cli_session_setup_send(talloc_tos(), ev
,
1748 SMB2_CAP_DFS
, /* in_capabilities */
1750 0, /* in_previous_session_id */
1751 &in_blob
); /* in_security_buffer */
1752 if (subreq
== NULL
) {
1753 printf("smb2cli_session_setup_send() returned NULL\n");
1757 ok
= tevent_req_poll(subreq
, ev
);
1759 printf("tevent_req_poll() returned false\n");
1763 status
= smb2cli_session_setup_recv(subreq
, talloc_tos(),
1764 &recv_iov
, &out_blob
);
1765 if (!NT_STATUS_IS_OK(status
)) {
1766 printf("smb2cli_session_setup_recv returned %s\n",
1771 status
= smb2cli_flush(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
1772 cli
->smb2
.tcon
, fid_persistent
, fid_volatile
);
1773 if (!NT_STATUS_IS_OK(status
)) {
1774 printf("smb2cli_flush returned %s\n", nt_errstr(status
));
1778 status
= smb2cli_query_info(cli
->conn
,
1782 SMB2_GETINFO_SECURITY
,
1783 0, /* in_file_info_class */
1784 1024, /* in_max_output_length */
1785 NULL
, /* in_input_buffer */
1786 SECINFO_OWNER
, /* in_additional_info */
1791 &out_output_buffer
);
1792 if (!NT_STATUS_IS_OK(status
)) {
1793 printf("smb2cli_query_info (security) returned %s\n", nt_errstr(status
));
1797 in_file_info_class
= SMB_FILE_POSITION_INFORMATION
- 1000;
1798 status
= smb2cli_query_info(cli
->conn
,
1804 1024, /* in_max_output_length */
1805 NULL
, /* in_input_buffer */
1806 0, /* in_additional_info */
1811 &out_output_buffer
);
1812 if (!NT_STATUS_IS_OK(status
)) {
1813 printf("smb2cli_query_info (position) returned %s\n", nt_errstr(status
));
1817 in_input_buffer
= data_blob_talloc(talloc_tos(), NULL
, 8);
1818 SBVAL(in_input_buffer
.data
, 0, 512);
1820 in_file_info_class
= SMB_FILE_POSITION_INFORMATION
- 1000;
1821 status
= smb2cli_set_info(cli
->conn
,
1828 0, /* in_additional_info */
1831 if (!NT_STATUS_IS_OK(status
)) {
1832 printf("smb2cli_set_info (position) returned %s\n", nt_errstr(status
));
1836 in_file_info_class
= SMB_FILE_POSITION_INFORMATION
- 1000;
1837 status
= smb2cli_query_info(cli
->conn
,
1843 1024, /* in_max_output_length */
1844 NULL
, /* in_input_buffer */
1845 0, /* in_additional_info */
1850 &out_output_buffer
);
1851 if (!NT_STATUS_IS_OK(status
)) {
1852 printf("smb2cli_query_info (position) returned %s\n", nt_errstr(status
));
1856 status
= smb2cli_close(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
1857 cli
->smb2
.tcon
, 0, fid_persistent
, fid_volatile
);
1858 if (!NT_STATUS_IS_OK(status
)) {
1859 printf("smb2cli_close returned %s\n", nt_errstr(status
));
1863 status
= smb2cli_create(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
1864 cli
->smb2
.tcon
, "session-reauth.txt",
1865 SMB2_OPLOCK_LEVEL_NONE
, /* oplock_level, */
1866 SMB2_IMPERSONATION_IMPERSONATION
, /* impersonation_level, */
1867 SEC_STD_ALL
| SEC_FILE_ALL
, /* desired_access, */
1868 FILE_ATTRIBUTE_NORMAL
, /* file_attributes, */
1869 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, /* share_access, */
1870 FILE_CREATE
, /* create_disposition, */
1871 FILE_DELETE_ON_CLOSE
, /* create_options, */
1872 NULL
, /* smb2_create_blobs *blobs */
1875 if (!NT_STATUS_IS_OK(status
)) {
1876 printf("smb2cli_create %s\n", nt_errstr(status
));
1880 status
= smb2cli_query_directory(
1881 cli
->conn
, cli
->timeout
, cli
->smb2
.session
, cli
->smb2
.tcon
,
1882 1, 0x3, 0, dir_persistent
, dir_volatile
,
1883 "session-reauth.txt", 0xffff,
1884 talloc_tos(), &dir_data
, &dir_data_length
);
1885 if (!NT_STATUS_IS_OK(status
)) {
1886 printf("smb2cli_query_directory returned %s\n", nt_errstr(status
));
1890 status
= smb2cli_close(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
1891 cli
->smb2
.tcon
, 0, dir_persistent
, dir_volatile
);
1892 if (!NT_STATUS_IS_OK(status
)) {
1893 printf("smb2cli_close returned %s\n", nt_errstr(status
));
1897 status
= smb2cli_close(cli
->conn
, cli
->timeout
, cli
->smb2
.session
,
1898 cli
->smb2
.tcon
, 0, fid_persistent
, fid_volatile
);
1899 if (!NT_STATUS_IS_OK(status
)) {
1900 printf("smb2cli_close returned %s\n", nt_errstr(status
));
1904 saved_tid
= smb2cli_tcon_current_id(cli
->smb2
.tcon
);
1905 saved_tcon
= cli
->smb2
.tcon
;
1906 cli
->smb2
.tcon
= smbXcli_tcon_create(cli
);
1907 smb2cli_tcon_set_values(cli
->smb2
.tcon
,
1911 0, /* capabilities */
1912 0 /* maximal_access */);
1913 status
= cli_tree_connect(cli
, share
, "?????", "", 0);
1914 if (!NT_STATUS_IS_OK(status
)) {
1915 printf("cli_tree_connect returned %s\n", nt_errstr(status
));
1918 talloc_free(cli
->smb2
.tcon
);
1919 cli
->smb2
.tcon
= saved_tcon
;