2 Unix SMB/CIFS implementation.
3 test suite for session setup operations
4 Copyright (C) Gregor Beck 2012
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/>.
23 #include "torture/raw/proto.h"
24 #include "smb_composite/smb_composite.h"
25 #include "lib/cmdline/popt_common.h"
26 #include "param/param.h"
27 #include "torture/util.h"
28 #include "auth/credentials/credentials.h"
31 static bool test_session_reauth1(struct torture_context
*tctx
,
32 struct smbcli_state
*cli
)
35 struct smb_composite_sesssetup io
;
42 uint16_t vuid1
= cli
->session
->vuid
;
44 data
= generate_random_str(tctx
, dlen
);
45 torture_assert(tctx
, (data
!= NULL
), "memory allocation failed");
46 snprintf(fname
, sizeof(fname
), "raw_session_reconnect_%.8s.dat", data
);
48 fnum
= smbcli_nt_create_full(cli
->tree
, fname
, 0,
50 FILE_ATTRIBUTE_NORMAL
,
51 NTCREATEX_SHARE_ACCESS_NONE
,
52 NTCREATEX_DISP_OPEN_IF
,
53 NTCREATEX_OPTIONS_DELETE_ON_CLOSE
,
55 torture_assert_ntstatus_ok_goto(tctx
, smbcli_nt_error(cli
->tree
), ok
,
57 torture_assert_goto(tctx
, fnum
> 0, ok
, done
, "create file");
59 num
= smbcli_smbwrite(cli
->tree
, fnum
, data
, 0, dlen
);
60 torture_assert_int_equal_goto(tctx
, num
, dlen
, ok
, done
, "write file");
63 io
.in
.sesskey
= cli
->transport
->negotiate
.sesskey
;
64 io
.in
.capabilities
= cli
->transport
->negotiate
.capabilities
;
65 io
.in
.credentials
= cmdline_credentials
;
66 io
.in
.workgroup
= lpcfg_workgroup(tctx
->lp_ctx
);
67 io
.in
.gensec_settings
= lpcfg_gensec_settings(tctx
, tctx
->lp_ctx
);
68 status
= smb_composite_sesssetup(cli
->session
, &io
);
69 torture_assert_ntstatus_ok_goto(tctx
, status
, ok
, done
, "setup2");
70 torture_assert_int_equal_goto(tctx
, io
.out
.vuid
, vuid1
, ok
, done
, "setup2");
72 num
= smbcli_read(cli
->tree
, fnum
, &buf
, 0, dlen
);
73 torture_assert_int_equal_goto(tctx
, num
, dlen
, ok
, done
, "read file");
74 torture_assert_str_equal_goto(tctx
, buf
, data
, ok
, done
, "read file");
80 status
= smbcli_close(cli
->tree
, fnum
);
81 torture_assert_ntstatus_ok(tctx
, status
, "close");
86 static bool test_session_reauth2_oplock_timeout(
87 struct smbcli_transport
*transport
, uint16_t tid
, uint16_t fnum
,
88 uint8_t level
, void *private_data
)
93 static bool test_session_reauth2(struct torture_context
*tctx
,
94 struct smbcli_state
*cli
)
98 union smb_open io_open
;
99 struct smb_composite_sesssetup io_sesssetup
;
100 union smb_fileinfo io_qsecdesc
;
101 struct smbcli_request
*req
;
102 struct cli_credentials
*anon_creds
;
106 uint16_t vuid1
= cli
->session
->vuid
;
108 random_string
= generate_random_str(tctx
, 8);
109 torture_assert(tctx
, (random_string
!= NULL
),
110 "memory allocation failed");
111 fname
= talloc_asprintf(tctx
, "raw_session_reauth2_%s.dat",
113 talloc_free(random_string
);
114 torture_assert(tctx
, (fname
!= NULL
), "memory allocation failed");
116 smbcli_unlink(cli
->tree
, fname
);
117 smbcli_oplock_handler(cli
->transport
,
118 test_session_reauth2_oplock_timeout
,
124 ZERO_STRUCT(io_open
);
125 io_open
.generic
.level
= RAW_OPEN_NTCREATEX
;
126 io_open
.ntcreatex
.in
.root_fid
.fnum
= 0;
127 io_open
.ntcreatex
.in
.access_mask
= SEC_RIGHTS_FILE_READ
|
128 SEC_RIGHTS_FILE_WRITE
| SEC_STD_DELETE
;
129 io_open
.ntcreatex
.in
.alloc_size
= 0;
130 io_open
.ntcreatex
.in
.file_attr
= FILE_ATTRIBUTE_NORMAL
;
131 io_open
.ntcreatex
.in
.share_access
= NTCREATEX_SHARE_ACCESS_READ
|
132 NTCREATEX_SHARE_ACCESS_WRITE
;
133 io_open
.ntcreatex
.in
.open_disposition
= NTCREATEX_DISP_OPEN_IF
;
134 io_open
.ntcreatex
.in
.create_options
= 0;
135 io_open
.ntcreatex
.in
.impersonation
= NTCREATEX_IMPERSONATION_ANONYMOUS
;
136 io_open
.ntcreatex
.in
.security_flags
= 0;
137 io_open
.ntcreatex
.in
.fname
= fname
;
139 torture_comment(tctx
, "open with batch oplock\n");
140 io_open
.ntcreatex
.in
.flags
= NTCREATEX_FLAGS_EXTENDED
|
141 NTCREATEX_FLAGS_REQUEST_OPLOCK
|
142 NTCREATEX_FLAGS_REQUEST_BATCH_OPLOCK
;
144 status
= smb_raw_open(cli
->tree
, tctx
, &io_open
);
145 torture_assert_ntstatus_ok(tctx
, status
, "smb_raw_open failed");
147 fnum
= io_open
.ntcreatex
.out
.file
.fnum
;
150 (io_open
.ntcreatex
.out
.oplock_level
== BATCH_OPLOCK_RETURN
),
151 "did not get batch oplock");
153 io_open
.ntcreatex
.in
.flags
= NTCREATEX_FLAGS_EXTENDED
;
154 req
= smb_raw_open_send(cli
->tree
, &io_open
);
155 torture_assert(tctx
, (req
!= NULL
), "memory allocation failed");
158 * Make sure the open went through
160 status
= smbcli_chkpath(cli
->tree
, "\\");
161 torture_assert_ntstatus_ok(tctx
, status
, "smb_chkpath failed");
163 status
= smbcli_nt_delete_on_close(cli
->tree
, fnum
, true);
164 torture_assert_ntstatus_ok(tctx
, status
, "could not set delete on "
167 anon_creds
= cli_credentials_init_anon(tctx
);
168 torture_assert(tctx
, (anon_creds
!= NULL
), "memory allocation failed");
170 ZERO_STRUCT(io_sesssetup
);
171 io_sesssetup
.in
.sesskey
= cli
->transport
->negotiate
.sesskey
;
172 io_sesssetup
.in
.capabilities
= cli
->transport
->negotiate
.capabilities
;
173 io_sesssetup
.in
.credentials
= anon_creds
;
174 io_sesssetup
.in
.workgroup
= lpcfg_workgroup(tctx
->lp_ctx
);
175 io_sesssetup
.in
.gensec_settings
= lpcfg_gensec_settings(
177 status
= smb_composite_sesssetup(cli
->session
, &io_sesssetup
);
178 torture_assert_ntstatus_ok(tctx
, status
, "setup2 failed");
179 torture_assert_int_equal(tctx
, io_sesssetup
.out
.vuid
, vuid1
, "setup2");
181 status
= smbcli_close(cli
->tree
, fnum
);
182 torture_assert_ntstatus_ok(tctx
, status
, "close failed");
184 status
= smb_raw_open_recv(req
, tctx
, &io_open
);
185 torture_assert_ntstatus_ok(tctx
, status
, "2nd open failed");
187 fnum
= io_open
.ntcreatex
.out
.file
.fnum
;
189 nwritten
= smbcli_write(cli
->tree
, fnum
, 0, fname
, 0, strlen(fname
));
190 torture_assert(tctx
, (nwritten
== strlen(fname
)),
191 "smbcli_write failed");
193 ZERO_STRUCT(io_qsecdesc
);
194 io_qsecdesc
.query_secdesc
.level
= RAW_FILEINFO_SEC_DESC
;
195 io_qsecdesc
.query_secdesc
.in
.file
.fnum
= fnum
;
196 io_qsecdesc
.query_secdesc
.in
.secinfo_flags
= SECINFO_OWNER
;
197 status
= smb_raw_fileinfo(cli
->tree
, tctx
, &io_qsecdesc
);
198 torture_assert_ntstatus_equal(
199 tctx
, status
, NT_STATUS_ACCESS_DENIED
,
200 "anon qsecdesc did not return ACCESS_DENIED");
202 ZERO_STRUCT(io_sesssetup
);
203 io_sesssetup
.in
.sesskey
= cli
->transport
->negotiate
.sesskey
;
204 io_sesssetup
.in
.capabilities
= cli
->transport
->negotiate
.capabilities
;
205 io_sesssetup
.in
.credentials
= cmdline_credentials
;
206 io_sesssetup
.in
.workgroup
= lpcfg_workgroup(tctx
->lp_ctx
);
207 io_sesssetup
.in
.gensec_settings
= lpcfg_gensec_settings(
209 status
= smb_composite_sesssetup(cli
->session
, &io_sesssetup
);
210 torture_assert_ntstatus_ok(tctx
, status
, "setup3 failed");
211 torture_assert_int_equal(tctx
, io_sesssetup
.out
.vuid
, vuid1
, "setup2");
213 status
= smb_raw_fileinfo(cli
->tree
, tctx
, &io_qsecdesc
);
214 torture_assert_ntstatus_ok(tctx
, status
, "2nd qsecdesc failed");
216 status
= smbcli_nt_delete_on_close(cli
->tree
, fnum
, true);
217 torture_assert_ntstatus_ok(tctx
, status
, "could not set delete on "
220 status
= smbcli_close(cli
->tree
, fnum
);
221 torture_assert_ntstatus_ok(tctx
, status
, "close failed");
226 struct torture_suite
*torture_raw_session(TALLOC_CTX
*mem_ctx
)
228 struct torture_suite
*suite
= torture_suite_create(mem_ctx
, "session");
229 suite
->description
= talloc_strdup(suite
, "RAW-SESSION tests");
231 torture_suite_add_1smb_test(suite
, "reauth1", test_session_reauth1
);
232 torture_suite_add_1smb_test(suite
, "reauth2", test_session_reauth2
);