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