Skip to content

Commit 8858a01

Browse files
committed
add query file+dir for integration tests
1 parent 7dbf3a0 commit 8858a01

File tree

7 files changed

+104
-77
lines changed

7 files changed

+104
-77
lines changed

smb-cli/src/info.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ pub async fn info(info: &InfoCmd, cli: &Cli) -> Result<(), Box<dyn Error>> {
2323
let security = file.query_security_info().await?;
2424
log::info!("Security info: {:?}", security);
2525
}
26-
Resource::Directory(mut dir) => {
26+
Resource::Directory(dir) => {
2727
let infos = dir.query::<FileIdBothDirectoryInformation>("*").await?;
2828
for item in infos.iter() {
2929
log::info!(

smb/src/packets/smb2/fscc/common_info.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,5 +93,5 @@ pub struct FileNameInformation {
9393
#[bw(try_calc = file_name.size().try_into())]
9494
file_name_length: u32,
9595
#[br(args(file_name_length as u64))]
96-
file_name: SizedWideString,
96+
pub file_name: SizedWideString,
9797
}

smb/src/packets/smb2/fscc/query_file_info.rs

Lines changed: 46 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -51,21 +51,21 @@ pub type QueryFileFullEaInformation = FileFullEaInformation;
5151
#[binrw::binrw]
5252
#[derive(Debug, PartialEq, Eq)]
5353
pub struct FileAccessInformation {
54-
access_flags: FileAccessMask,
54+
pub access_flags: FileAccessMask,
5555
}
5656

5757
#[binrw::binrw]
5858
#[derive(Debug, PartialEq, Eq)]
5959
pub struct FileAllInformation {
60-
basic: FileBasicInformation,
61-
standard: FileStandardInformation,
62-
internal: FileInternalInformation,
63-
ea: FileEaInformation,
64-
access: FileAccessInformation,
65-
position: FilePositionInformation,
66-
mode: FileModeInformation,
67-
alignment: FileAlignmentInformation,
68-
name: FileNameInformation,
60+
pub basic: FileBasicInformation,
61+
pub standard: FileStandardInformation,
62+
pub internal: FileInternalInformation,
63+
pub ea: FileEaInformation,
64+
pub access: FileAccessInformation,
65+
pub position: FilePositionInformation,
66+
pub mode: FileModeInformation,
67+
pub alignment: FileAlignmentInformation,
68+
pub name: FileNameInformation,
6969
}
7070

7171
#[binrw::binrw]
@@ -101,18 +101,18 @@ impl Deref for FileAlternateNameInformation {
101101
#[binrw::binrw]
102102
#[derive(Debug, PartialEq, Eq)]
103103
pub struct FileAttributeTagInformation {
104-
file_attributes: u32,
105-
reparse_tag: u32,
104+
pub file_attributes: u32,
105+
pub reparse_tag: u32,
106106
}
107107

108108
#[binrw::binrw]
109109
#[derive(Debug, PartialEq, Eq)]
110110
pub struct FileCompressionInformation {
111-
compressed_file_size: u64,
112-
compression_format: FileCompressionFormat,
113-
compression_unit: u8,
114-
chunk_shift: u8,
115-
cluster_shift: u8,
111+
pub compressed_file_size: u64,
112+
pub compression_format: FileCompressionFormat,
113+
pub compression_unit: u8,
114+
pub chunk_shift: u8,
115+
pub cluster_shift: u8,
116116
#[br(parse_with = binrw::helpers::read_u24)]
117117
#[br(assert(reserved == 0))]
118118
#[bw(align_before = 4)]
@@ -131,32 +131,32 @@ pub enum FileCompressionFormat {
131131
#[binrw::binrw]
132132
#[derive(Debug, PartialEq, Eq)]
133133
pub struct FileEaInformation {
134-
ea_size: u32,
134+
pub ea_size: u32,
135135
}
136136

137137
#[binrw::binrw]
138138
#[derive(Debug, PartialEq, Eq)]
139139
pub struct FileIdInformation {
140-
volume_serial_number: u64,
141-
file_id: u128,
140+
pub volume_serial_number: u64,
141+
pub file_id: u128,
142142
}
143143

144144
#[binrw::binrw]
145145
#[derive(Debug, PartialEq, Eq)]
146146
pub struct FileInternalInformation {
147-
index_number: u64,
147+
pub index_number: u64,
148148
}
149149

150150
#[binrw::binrw]
151151
#[derive(Debug, PartialEq, Eq)]
152152
pub struct FileNetworkOpenInformation {
153-
creation_time: FileTime,
154-
last_access_time: FileTime,
155-
last_write_time: FileTime,
156-
change_time: FileTime,
157-
allocation_size: u64,
158-
end_of_file: u64,
159-
file_attributes: FileAttributes,
153+
pub creation_time: FileTime,
154+
pub last_access_time: FileTime,
155+
pub last_write_time: FileTime,
156+
pub change_time: FileTime,
157+
pub allocation_size: u64,
158+
pub end_of_file: u64,
159+
pub file_attributes: FileAttributes,
160160
#[bw(calc = 0)]
161161
_reserved: u32,
162162
}
@@ -178,15 +178,15 @@ impl Deref for FileNormalizedNameInformation {
178178
#[binrw::binrw]
179179
#[derive(Debug, PartialEq, Eq)]
180180
pub struct FilePipeLocalInformation {
181-
named_pipe_type: NamedPipeType,
182-
named_pipe_configuration: NamedPipeConfiguration,
183-
maximum_instances: u32,
184-
current_instances: u32,
185-
inbound_quota: u32,
186-
outbound_quota: u32,
187-
write_quota: u32,
188-
named_pipe_state: NamedPipeState,
189-
named_pipe_end: NamedPipeEnd,
181+
pub named_pipe_type: NamedPipeType,
182+
pub named_pipe_configuration: NamedPipeConfiguration,
183+
pub maximum_instances: u32,
184+
pub current_instances: u32,
185+
pub inbound_quota: u32,
186+
pub outbound_quota: u32,
187+
pub write_quota: u32,
188+
pub named_pipe_state: NamedPipeState,
189+
pub named_pipe_end: NamedPipeEnd,
190190
}
191191

192192
#[binrw::binrw]
@@ -227,18 +227,18 @@ pub enum NamedPipeEnd {
227227
#[binrw::binrw]
228228
#[derive(Debug, PartialEq, Eq)]
229229
pub struct FilePipeRemoteInformation {
230-
collect_data_time: FileTime,
231-
maximum_collection_count: u32,
230+
pub collect_data_time: FileTime,
231+
pub maximum_collection_count: u32,
232232
}
233233

234234
#[binrw::binrw]
235235
#[derive(Debug, PartialEq, Eq)]
236236
pub struct FileStandardInformation {
237-
allocation_size: u64,
238-
end_of_file: u64,
239-
number_of_links: u32,
240-
delete_pending: Boolean,
241-
directory: Boolean,
237+
pub allocation_size: u64,
238+
pub end_of_file: u64,
239+
pub number_of_links: u32,
240+
pub delete_pending: Boolean,
241+
pub directory: Boolean,
242242
#[bw(calc = 0)]
243243
#[br(assert(reserved == 0))]
244244
reserved: u16,
@@ -249,8 +249,8 @@ pub struct FileStandardInformation {
249249
pub struct FileStreamInformation {
250250
#[bw(try_calc = stream_name.size().try_into())]
251251
stream_name_length: u32,
252-
stream_size: u64,
253-
stream_allocation_size: u64,
252+
pub stream_size: u64,
253+
pub stream_allocation_size: u64,
254254
#[br(args(stream_name_length as u64))]
255255
stream_name: SizedWideString,
256256
}

smb/src/packets/smb2/info/query.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,9 @@ mod tests {
276276
.with_dacl_security_information(true)
277277
.with_sacl_security_information(true),
278278
flags: QueryInfoFlags::new(),
279-
file_id: Guid::from_str("0000002b-000d-0000-3100-00000d000000").unwrap().into(),
279+
file_id: Guid::from_str("0000002b-000d-0000-3100-00000d000000")
280+
.unwrap()
281+
.into(),
280282
data: GetInfoRequestData::None(()),
281283
}));
282284
assert_eq!(

smb/src/packets/smb2/info/set.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@ use crate::{packets::smb2::SecurityDescriptor, query_info_data};
55

66
use super::common::*;
77
use super::{
8-
super::{
9-
super::binrw_util::prelude::*,
10-
fscc::*,
11-
},
8+
super::{super::binrw_util::prelude::*, fscc::*},
129
QueryQuotaInfo,
1310
};
1411
use binrw::io::TakeSeekExt;

smb/src/resource/directory.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ impl Directory {
1515

1616
// Query the directory for it's contents.
1717
#[maybe_async]
18-
pub async fn query<T>(&mut self, pattern: &str) -> crate::Result<Vec<T>>
18+
pub async fn query<T>(&self, pattern: &str) -> crate::Result<Vec<T>>
1919
where
2020
T: QueryDirectoryInfoValue,
2121
{

smb/tests/integration_tests.rs

Lines changed: 51 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,43 +2,41 @@ use log::info;
22
use serial_test::serial;
33
use smb::{
44
connection::EncryptionMode,
5-
packets::smb2::{CreateDisposition, Dialect, FileAccessMask},
5+
packets::smb2::{
6+
CreateDisposition, Dialect, FileAccessMask, FileAllInformation, FileDirectoryInformation,
7+
},
68
Connection, ConnectionConfig,
79
};
810
use std::env::var;
911

1012
macro_rules! parametrize_dialect {
11-
($($dialect:ident),*) => {
13+
([$dialect:ident], [$($encrypt_mode:ident),*]) => {
1214
$(
1315
paste::paste! {
1416
#[maybe_async::test(
1517
feature = "sync",
1618
async(feature = "async", tokio::test(flavor = "multi_thread"))
1719
)]
1820
#[serial]
19-
pub async fn [<test_smb_integration_ $dialect:lower>]() -> Result<(), Box<dyn std::error::Error>> {
20-
test_smb_integration_basic(Dialect::$dialect).await
21+
pub async fn [<test_smbint_ $dialect:lower _e $encrypt_mode:lower>]() -> Result<(), Box<dyn std::error::Error>> {
22+
test_smb_integration_basic(Dialect::$dialect, EncryptionMode::$encrypt_mode).await
2123
}
2224
}
2325
)*
2426
};
25-
}
2627

27-
parametrize_dialect!(Smb030, Smb0302, Smb0311);
28+
([$($dialect:ident),*], $encrypt_modes:tt) => {
29+
$(
30+
parametrize_dialect!([$dialect], $encrypt_modes);
31+
)*
32+
};
2833

29-
#[maybe_async::maybe_async]
30-
pub async fn test_smb_integration_basic(
31-
force_dialect: Dialect,
32-
) -> Result<(), Box<dyn std::error::Error>> {
33-
for encryption_mode in &[EncryptionMode::Required, EncryptionMode::Disabled] {
34-
info!("Testing with encryption mode: {:?}", encryption_mode);
35-
test_smb_integration_basic_with_encryption(force_dialect, *encryption_mode).await?;
36-
}
37-
Ok(())
3834
}
3935

36+
parametrize_dialect!([Smb030, Smb0302, Smb0311], [Disabled, Required]);
37+
4038
#[maybe_async::maybe_async]
41-
async fn test_smb_integration_basic_with_encryption(
39+
async fn test_smb_integration_basic(
4240
force_dialect: Dialect,
4341
encryption_mode: EncryptionMode,
4442
) -> Result<(), Box<dyn std::error::Error>> {
@@ -77,11 +75,14 @@ async fn test_smb_integration_basic_with_encryption(
7775
.await?;
7876
info!("Connected to share, start test basic");
7977

78+
const TEST_FILE: &str = "test.txt";
79+
const TEST_DATA: &[u8] = b"Hello, World!";
80+
8081
// Hello, World! > test.txt
8182
{
8283
let mut file = tree
8384
.create(
84-
"test.txt",
85+
TEST_FILE,
8586
CreateDisposition::Create,
8687
FileAccessMask::new()
8788
.with_generic_read(true)
@@ -90,13 +91,31 @@ async fn test_smb_integration_basic_with_encryption(
9091
.await?
9192
.unwrap_file();
9293

93-
file.write(b"Hello, World!").await?;
94+
file.write(TEST_DATA).await?;
95+
}
96+
97+
// Query directory and make sure our file exists there:
98+
{
99+
let dir_info = tree
100+
.create(
101+
"",
102+
CreateDisposition::Open,
103+
FileAccessMask::new().with_generic_read(true),
104+
)
105+
.await?
106+
.unwrap_dir();
107+
dir_info
108+
.query::<FileDirectoryInformation>("*")
109+
.await?
110+
.iter()
111+
.find(|info| info.file_name.to_string() == TEST_FILE)
112+
.expect("File not found in directory");
94113
}
95114

96115
{
97116
let file = tree
98117
.create(
99-
"test.txt",
118+
TEST_FILE,
100119
CreateDisposition::Open,
101120
FileAccessMask::new()
102121
.with_generic_read(true)
@@ -105,14 +124,23 @@ async fn test_smb_integration_basic_with_encryption(
105124
.await?
106125
.unwrap_file();
107126

108-
let mut buf = [0u8; 15];
109-
let read_length = file.read_block(&mut buf, 0).await?;
110-
assert_eq!(read_length, 13);
111-
assert_eq!(&buf[..13], b"Hello, World!");
127+
// So anyway it will be deleted at the end.
112128
file.set_file_info(FileDispositionInformation {
113129
delete_pending: true.into(),
114130
})
115131
.await?;
132+
133+
let mut buf = [0u8; TEST_DATA.len() + 2];
134+
let read_length = file.read_block(&mut buf, 0).await?;
135+
assert_eq!(read_length, TEST_DATA.len());
136+
assert_eq!(&buf[..read_length], TEST_DATA);
137+
138+
let all_info = file.query_info::<FileAllInformation>().await?;
139+
assert_eq!(
140+
all_info.name.file_name.to_string(),
141+
"\\".to_string() + TEST_FILE
142+
);
143+
assert_eq!(all_info.standard.end_of_file, TEST_DATA.len() as u64);
116144
}
117145

118146
Ok(())

0 commit comments

Comments
 (0)