ruby_smb 3.0.6 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/examples/file_server.rb +8 -1
  4. data/examples/virtual_file_server.rb +143 -0
  5. data/lib/ruby_smb/client/encryption.rb +16 -4
  6. data/lib/ruby_smb/client/negotiation.rb +10 -8
  7. data/lib/ruby_smb/fscc/file_information/file_access_information.rb +15 -0
  8. data/lib/ruby_smb/fscc/file_information/file_alignment_information.rb +45 -0
  9. data/lib/ruby_smb/fscc/file_information/file_all_information.rb +23 -0
  10. data/lib/ruby_smb/fscc/file_information/file_basic_information.rb +20 -0
  11. data/lib/ruby_smb/fscc/file_information/file_both_directory_information.rb +3 -3
  12. data/lib/ruby_smb/fscc/file_information/file_directory_information.rb +3 -3
  13. data/lib/ruby_smb/fscc/file_information/file_ea_information.rb +1 -0
  14. data/lib/ruby_smb/fscc/file_information/file_full_directory_information.rb +3 -3
  15. data/lib/ruby_smb/fscc/file_information/file_id_both_directory_information.rb +3 -3
  16. data/lib/ruby_smb/fscc/file_information/file_id_full_directory_information.rb +3 -3
  17. data/lib/ruby_smb/fscc/file_information/file_internal_information.rb +15 -0
  18. data/lib/ruby_smb/fscc/file_information/file_mode_information.rb +29 -0
  19. data/lib/ruby_smb/fscc/file_information/file_name_information.rb +16 -0
  20. data/lib/ruby_smb/fscc/file_information/file_names_information.rb +1 -1
  21. data/lib/ruby_smb/fscc/file_information/file_normalized_name_information.rb +16 -0
  22. data/lib/ruby_smb/fscc/file_information/file_position_information.rb +15 -0
  23. data/lib/ruby_smb/fscc/file_information/file_rename_information.rb +1 -1
  24. data/lib/ruby_smb/fscc/file_information/file_standard_information.rb +20 -0
  25. data/lib/ruby_smb/fscc/file_information/file_stream_information.rb +3 -0
  26. data/lib/ruby_smb/fscc/file_information.rb +43 -6
  27. data/lib/ruby_smb/fscc/file_system_information/file_fs_attribute_information.rb +1 -0
  28. data/lib/ruby_smb/fscc/file_system_information/file_fs_volume_information.rb +1 -0
  29. data/lib/ruby_smb/fscc/file_system_information.rb +4 -0
  30. data/lib/ruby_smb/gss/provider/ntlm.rb +20 -3
  31. data/lib/ruby_smb/gss/provider.rb +10 -1
  32. data/lib/ruby_smb/server/server_client/encryption.rb +66 -0
  33. data/lib/ruby_smb/server/server_client/negotiation.rb +14 -3
  34. data/lib/ruby_smb/server/server_client/session_setup.rb +21 -4
  35. data/lib/ruby_smb/server/server_client/share_io.rb +17 -0
  36. data/lib/ruby_smb/server/server_client/tree_connect.rb +40 -3
  37. data/lib/ruby_smb/server/server_client.rb +156 -38
  38. data/lib/ruby_smb/server/session.rb +5 -1
  39. data/lib/ruby_smb/server/share/provider/disk/file_system.rb +28 -0
  40. data/lib/ruby_smb/server/share/provider/disk/processor/close.rb +46 -0
  41. data/lib/ruby_smb/server/share/provider/disk/processor/create.rb +143 -0
  42. data/lib/ruby_smb/server/share/provider/disk/processor/query.rb +359 -0
  43. data/lib/ruby_smb/server/share/provider/disk/processor/read.rb +70 -0
  44. data/lib/ruby_smb/server/share/provider/disk/processor.rb +223 -0
  45. data/lib/ruby_smb/server/share/provider/disk.rb +12 -418
  46. data/lib/ruby_smb/server/share/provider/pipe.rb +2 -2
  47. data/lib/ruby_smb/server/share/provider/processor.rb +16 -0
  48. data/lib/ruby_smb/server/share/provider/virtual_disk/virtual_file.rb +85 -0
  49. data/lib/ruby_smb/server/share/provider/virtual_disk/virtual_pathname.rb +196 -0
  50. data/lib/ruby_smb/server/share/provider/virtual_disk/virtual_stat.rb +175 -0
  51. data/lib/ruby_smb/server/share/provider/virtual_disk.rb +116 -0
  52. data/lib/ruby_smb/server/share/provider.rb +1 -0
  53. data/lib/ruby_smb/server.rb +13 -3
  54. data/lib/ruby_smb/signing.rb +18 -4
  55. data/lib/ruby_smb/smb1/commands.rb +1 -0
  56. data/lib/ruby_smb/smb1/packet/nt_create_andx_request.rb +11 -1
  57. data/lib/ruby_smb/smb1/packet/nt_trans/create_request.rb +1 -1
  58. data/lib/ruby_smb/smb1/packet/read_andx_response.rb +5 -4
  59. data/lib/ruby_smb/smb1/packet/session_setup_request.rb +12 -4
  60. data/lib/ruby_smb/smb1/packet/trans2/data_block.rb +9 -1
  61. data/lib/ruby_smb/smb1/packet/trans2/find_first2_request.rb +52 -51
  62. data/lib/ruby_smb/smb1/packet/trans2/find_first2_response.rb +37 -37
  63. data/lib/ruby_smb/smb1/packet/trans2/find_information_level/find_file_both_directory_info.rb +48 -0
  64. data/lib/ruby_smb/smb1/packet/trans2/find_information_level.rb +28 -15
  65. data/lib/ruby_smb/smb1/packet/trans2/find_next2_request.rb +51 -51
  66. data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +36 -36
  67. data/lib/ruby_smb/smb1/packet/trans2/open2_request.rb +40 -39
  68. data/lib/ruby_smb/smb1/packet/trans2/open2_response.rb +40 -40
  69. data/lib/ruby_smb/smb1/packet/trans2/query_file_information_request.rb +60 -0
  70. data/lib/ruby_smb/smb1/packet/trans2/query_file_information_response.rb +59 -0
  71. data/lib/ruby_smb/smb1/packet/trans2/query_fs_information_level/query_fs_attribute_info.rb +31 -0
  72. data/lib/ruby_smb/smb1/packet/trans2/query_fs_information_level.rb +40 -0
  73. data/lib/ruby_smb/smb1/packet/trans2/query_fs_information_request.rb +46 -0
  74. data/lib/ruby_smb/smb1/packet/trans2/query_fs_information_response.rb +59 -0
  75. data/lib/ruby_smb/smb1/packet/trans2/query_information_level/query_file_basic_info.rb +23 -0
  76. data/lib/ruby_smb/smb1/packet/trans2/query_information_level/query_file_standard_info.rb +22 -0
  77. data/lib/ruby_smb/smb1/packet/trans2/query_information_level.rb +62 -0
  78. data/lib/ruby_smb/smb1/packet/trans2/query_path_information_request.rb +65 -0
  79. data/lib/ruby_smb/smb1/packet/trans2/query_path_information_response.rb +59 -0
  80. data/lib/ruby_smb/smb1/packet/trans2/request.rb +24 -8
  81. data/lib/ruby_smb/smb1/packet/trans2/request_secondary.rb +4 -4
  82. data/lib/ruby_smb/smb1/packet/trans2/response.rb +29 -20
  83. data/lib/ruby_smb/smb1/packet/trans2/set_file_information_request.rb +42 -42
  84. data/lib/ruby_smb/smb1/packet/trans2/set_file_information_response.rb +23 -23
  85. data/lib/ruby_smb/smb1/packet/trans2/subcommands.rb +23 -5
  86. data/lib/ruby_smb/smb1/packet/trans2.rb +4 -0
  87. data/lib/ruby_smb/smb1/packet/tree_connect_request.rb +4 -1
  88. data/lib/ruby_smb/smb2/negotiate_context.rb +10 -1
  89. data/lib/ruby_smb/smb2/packet/transform_header.rb +7 -7
  90. data/lib/ruby_smb/smb2/tree.rb +1 -0
  91. data/lib/ruby_smb/smb2.rb +1 -0
  92. data/lib/ruby_smb/version.rb +1 -1
  93. data/spec/lib/ruby_smb/client_spec.rb +31 -8
  94. data/spec/lib/ruby_smb/fscc/file_information/file_access_information_spec.rb +21 -0
  95. data/spec/lib/ruby_smb/fscc/file_information/file_alignment_information_spec.rb +21 -0
  96. data/spec/lib/ruby_smb/fscc/file_information/file_all_information_spec.rb +61 -0
  97. data/spec/lib/ruby_smb/fscc/file_information/file_basic_information_spec.rb +41 -0
  98. data/spec/lib/ruby_smb/fscc/file_information/file_both_directory_information_spec.rb +59 -10
  99. data/spec/lib/ruby_smb/fscc/file_information/file_directory_information_spec.rb +30 -12
  100. data/spec/lib/ruby_smb/fscc/file_information/file_ea_information_spec.rb +21 -0
  101. data/spec/lib/ruby_smb/fscc/file_information/file_full_directory_information_spec.rb +30 -12
  102. data/spec/lib/ruby_smb/fscc/file_information/file_id_both_directory_information_spec.rb +63 -10
  103. data/spec/lib/ruby_smb/fscc/file_information/file_id_full_directory_information_spec.rb +30 -12
  104. data/spec/lib/ruby_smb/fscc/file_information/file_internal_information_spec.rb +21 -0
  105. data/spec/lib/ruby_smb/fscc/file_information/file_mode_information_spec.rb +21 -0
  106. data/spec/lib/ruby_smb/fscc/file_information/file_name_information_spec.rb +44 -0
  107. data/spec/lib/ruby_smb/fscc/file_information/file_names_information_spec.rb +30 -12
  108. data/spec/lib/ruby_smb/fscc/file_information/file_network_open_information_spec.rb +51 -0
  109. data/spec/lib/ruby_smb/fscc/file_information/file_normalized_name_information_spec.rb +44 -0
  110. data/spec/lib/ruby_smb/fscc/file_information/file_position_information_spec.rb +21 -0
  111. data/spec/lib/ruby_smb/fscc/file_information/file_rename_information_spec.rb +1 -1
  112. data/spec/lib/ruby_smb/fscc/file_information/file_standard_information_spec.rb +41 -0
  113. data/spec/lib/ruby_smb/fscc/file_information/file_stream_information_spec.rb +51 -0
  114. data/spec/lib/ruby_smb/fscc/file_information_spec.rb +14 -0
  115. data/spec/lib/ruby_smb/fscc/file_system_information/file_fs_attribute_information_spec.rb +46 -0
  116. data/spec/lib/ruby_smb/fscc/file_system_information/file_fs_volume_information_spec.rb +51 -0
  117. data/spec/lib/ruby_smb/fscc/file_system_information_spec.rb +14 -0
  118. data/spec/lib/ruby_smb/server/server_client_spec.rb +15 -0
  119. data/spec/lib/ruby_smb/server/share/provider/virtual_disk/virtual_pathname_spec.rb +581 -0
  120. data/spec/lib/ruby_smb/server/share/provider/virtual_disk/virtual_stat_spec.rb +207 -0
  121. data/spec/lib/ruby_smb/server/share/provider/virtual_disk_spec.rb +122 -0
  122. data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_request_spec.rb +2 -2
  123. data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_response_spec.rb +36 -2
  124. data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_request_spec.rb +2 -2
  125. data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_response_spec.rb +35 -1
  126. data/spec/lib/ruby_smb/smb1/packet/trans2/query_file_information_request_spec.rb +74 -0
  127. data/spec/lib/ruby_smb/smb1/packet/trans2/query_file_information_response_spec.rb +96 -0
  128. data/spec/lib/ruby_smb/smb1/packet/trans2/query_fs_information_request_spec.rb +62 -0
  129. data/spec/lib/ruby_smb/smb1/packet/trans2/query_fs_information_response_spec.rb +88 -0
  130. data/spec/lib/ruby_smb/smb1/packet/trans2/query_path_information_request_spec.rb +79 -0
  131. data/spec/lib/ruby_smb/smb1/packet/trans2/query_path_information_response_spec.rb +96 -0
  132. data/spec/lib/ruby_smb/smb1/packet/trans2/request_spec.rb +2 -2
  133. data/spec/lib/ruby_smb/smb1/packet/trans2/response_spec.rb +3 -3
  134. data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_request_spec.rb +3 -2
  135. data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_response_spec.rb +7 -2
  136. data/spec/lib/ruby_smb/smb1/tree_spec.rb +3 -3
  137. data/spec/lib/ruby_smb/smb2/packet/transform_header_spec.rb +2 -2
  138. data.tar.gz.sig +0 -0
  139. metadata +88 -2
  140. metadata.gz.sig +0 -0
@@ -17,25 +17,43 @@ RSpec.describe RubySMB::Fscc::FileInformation::FileNamesInformation do
17
17
  expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
18
18
  end
19
19
 
20
+ it 'tracks the next offset in a Uint32 field' do
21
+ expect(struct.next_offset).to be_a BinData::Uint32le
22
+ end
23
+
24
+ it 'tracks the file index in a Uint32 field' do
25
+ expect(struct.file_index).to be_a BinData::Uint32le
26
+ end
27
+
28
+ it 'tracks the file name length in a Uint32 field' do
29
+ expect(struct.file_name_length).to be_a BinData::Uint32le
30
+ end
31
+
32
+ it 'tracks the file name in a String16 field' do
33
+ expect(struct.file_name).to be_a RubySMB::Field::String16
34
+ end
35
+
20
36
  it 'tracks the length of the file_name field' do
21
37
  struct.file_name = 'Hello.txt'
22
38
  expect(struct.file_name_length).to eq struct.file_name.do_num_bytes
23
39
  end
24
40
 
25
- it 'automatically encodes the file name in UTF-16LE' do
26
- name = 'Hello_world.txt'
27
- struct.file_name = name
28
- expect(struct.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
29
- end
30
-
31
- describe 'reading in from a blob' do
32
- it 'uses the file_name_length to know when to stop reading' do
41
+ describe '#file_name' do
42
+ it 'automatically encodes the file name in UTF-16LE' do
33
43
  name = 'Hello_world.txt'
34
44
  struct.file_name = name
35
- blob = struct.to_binary_s
36
- blob << 'AAAA'
37
- new_from_blob = described_class.read(blob)
38
- expect(new_from_blob.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
45
+ expect(struct.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
46
+ end
47
+
48
+ describe 'reading in from a blob' do
49
+ it 'uses the file_name_length to know when to stop reading' do
50
+ name = 'Hello_world.txt'
51
+ struct.file_name = name
52
+ blob = struct.to_binary_s
53
+ blob << 'AAAA'
54
+ new_from_blob = described_class.read(blob)
55
+ expect(new_from_blob.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
56
+ end
39
57
  end
40
58
  end
41
59
  end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::Fscc::FileInformation::FileNetworkOpenInformation do
4
+ it 'references the correct class level' do
5
+ expect(described_class).to be_const_defined(:CLASS_LEVEL)
6
+ expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_NETWORK_OPEN_INFORMATION
7
+ end
8
+
9
+ subject(:struct) { described_class.new }
10
+
11
+ it { should respond_to :create_time }
12
+ it { should respond_to :last_access }
13
+ it { should respond_to :last_write }
14
+ it { should respond_to :last_change }
15
+ it { should respond_to :allocation_size }
16
+ it { should respond_to :end_of_file }
17
+ it { should respond_to :file_attributes }
18
+
19
+ it 'is little endian' do
20
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
21
+ end
22
+
23
+ it 'tracks the create time in a FileTime field' do
24
+ expect(struct.create_time).to be_a RubySMB::Field::FileTime
25
+ end
26
+
27
+ it 'tracks the last access time in a FileTime field' do
28
+ expect(struct.last_access).to be_a RubySMB::Field::FileTime
29
+ end
30
+
31
+ it 'tracks the last write time in a FileTime field' do
32
+ expect(struct.last_write).to be_a RubySMB::Field::FileTime
33
+ end
34
+
35
+ it 'tracks the last modified time in a FileTime field' do
36
+ expect(struct.last_change).to be_a RubySMB::Field::FileTime
37
+ end
38
+
39
+ it 'tracks the file size in a Int64 field' do
40
+ expect(struct.end_of_file).to be_a BinData::Int64le
41
+ end
42
+
43
+ it 'tracks the allocation size in a Int64 field' do
44
+ expect(struct.allocation_size).to be_a BinData::Int64le
45
+ end
46
+
47
+ it 'tracks the file attributes in a FileAttributes field' do
48
+ expect(struct.file_attributes).to be_a RubySMB::Fscc::FileAttributes
49
+ end
50
+
51
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::Fscc::FileInformation::FileNormalizedNameInformation do
4
+ it 'references the correct class level' do
5
+ expect(described_class).to be_const_defined(:CLASS_LEVEL)
6
+ expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_NORMALIZED_NAME_INFORMATION
7
+ end
8
+
9
+ subject(:struct) { described_class.new }
10
+
11
+ it { should respond_to :file_name_length }
12
+ it { should respond_to :file_name }
13
+
14
+ it 'is little endian' do
15
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
16
+ end
17
+
18
+ it 'tracks the file name length in a Uint32 field' do
19
+ expect(struct.file_name_length).to be_a BinData::Uint32le
20
+ end
21
+
22
+ it 'tracks the file name in a String16 field' do
23
+ expect(struct.file_name).to be_a RubySMB::Field::String16
24
+ end
25
+
26
+ describe '#file_name' do
27
+ it 'automatically encodes the file name in UTF-16LE' do
28
+ name = 'Hello_world.txt'
29
+ struct.file_name = name
30
+ expect(struct.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
31
+ end
32
+
33
+ describe 'reading in from a blob' do
34
+ it 'uses the file_name_length to know when to stop reading' do
35
+ name = 'Hello_world.txt'
36
+ struct.file_name = name
37
+ blob = struct.to_binary_s
38
+ blob << 'AAAA'
39
+ new_from_blob = described_class.read(blob)
40
+ expect(new_from_blob.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::Fscc::FileInformation::FilePositionInformation do
4
+ it 'references the correct class level' do
5
+ expect(described_class).to be_const_defined(:CLASS_LEVEL)
6
+ expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_POSITION_INFORMATION
7
+ end
8
+
9
+ subject(:struct) { described_class.new }
10
+
11
+ it { should respond_to :current_byte_offset }
12
+
13
+ it 'is little endian' do
14
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
15
+ end
16
+
17
+ it 'tracks the current byte offset in a Int64 field' do
18
+ expect(struct.current_byte_offset).to be_a BinData::Int64le
19
+ end
20
+
21
+ end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  RSpec.describe RubySMB::Fscc::FileInformation::FileRenameInformation do
4
4
  it 'references the correct class level' do
5
5
  expect(described_class).to be_const_defined(:CLASS_LEVEL)
6
- expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_ID_FULL_DIRECTORY_INFORMATION
6
+ expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_RENAME_INFORMATION
7
7
  end
8
8
 
9
9
  subject(:struct) { described_class.new }
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::Fscc::FileInformation::FileStandardInformation do
4
+ it 'references the correct class level' do
5
+ expect(described_class).to be_const_defined(:CLASS_LEVEL)
6
+ expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_STANDARD_INFORMATION
7
+ end
8
+
9
+ subject(:struct) { described_class.new }
10
+
11
+ it { should respond_to :allocation_size }
12
+ it { should respond_to :end_of_file }
13
+ it { should respond_to :number_of_links }
14
+ it { should respond_to :delete_pending }
15
+ it { should respond_to :directory }
16
+
17
+ it 'is little endian' do
18
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
19
+ end
20
+
21
+ it 'tracks the allocation size in a Int64 field' do
22
+ expect(struct.allocation_size).to be_a BinData::Int64le
23
+ end
24
+
25
+ it 'tracks the file size in a Int64 field' do
26
+ expect(struct.end_of_file).to be_a BinData::Int64le
27
+ end
28
+
29
+ it 'tracks the number of links in a Uint32 field' do
30
+ expect(struct.number_of_links).to be_a BinData::Uint32le
31
+ end
32
+
33
+ it 'tracks if a delete is pending in a Int8 field' do
34
+ expect(struct.delete_pending).to be_a BinData::Int8
35
+ end
36
+
37
+ it 'tracks if it is a directory in a Int8 field' do
38
+ expect(struct.directory).to be_a BinData::Int8
39
+ end
40
+
41
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::Fscc::FileInformation::FileStreamInformation do
4
+ it 'references the correct class level' do
5
+ expect(described_class).to be_const_defined(:CLASS_LEVEL)
6
+ expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_STREAM_INFORMATION
7
+ end
8
+
9
+ subject(:struct) { described_class.new }
10
+
11
+ it { should respond_to :next_entry_offset }
12
+ it { should respond_to :stream_name_length }
13
+ it { should respond_to :stream_size }
14
+ it { should respond_to :stream_allocation_size }
15
+ it { should respond_to :stream_name }
16
+
17
+ it 'is little endian' do
18
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
19
+ end
20
+
21
+ it 'tracks the next entry offset in a Uint32 field' do
22
+ expect(struct.next_entry_offset).to be_a BinData::Uint32le
23
+ end
24
+
25
+ it 'tracks the stream name length in a Uint32 field' do
26
+ expect(struct.stream_name_length).to be_a BinData::Uint32le
27
+ end
28
+
29
+ it 'tracks the stream size in a Int64 field' do
30
+ expect(struct.stream_size).to be_a BinData::Int64le
31
+ end
32
+
33
+ it 'tracks the stream allocation size in a Int64 field' do
34
+ expect(struct.stream_allocation_size).to be_a BinData::Int64le
35
+ end
36
+
37
+ it 'tracks the stream name in a String16 field' do
38
+ expect(struct.stream_name).to be_a RubySMB::Field::String16
39
+ end
40
+
41
+ it 'tracks the length of the stream_name field' do
42
+ struct.stream_name = 'Hello.txt'
43
+ expect(struct.stream_name_length).to eq struct.stream_name.do_num_bytes
44
+ end
45
+
46
+ it 'automatically encodes the stream name in UTF-16LE' do
47
+ name = 'Hello_world.txt'
48
+ struct.stream_name = name
49
+ expect(struct.stream_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
50
+ end
51
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::Fscc::FileInformation do
4
+
5
+ describe '#name' do
6
+ it 'maps constant names to their value' do
7
+ expect(described_class.name(RubySMB::Fscc::FileInformation::FILE_DIRECTORY_INFORMATION)).to eq :FILE_DIRECTORY_INFORMATION
8
+ end
9
+
10
+ it 'returns nil for values that do not exist' do
11
+ expect(described_class.name(-1)).to be_nil
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::Fscc::FileSystemInformation::FileFsAttributeInformation do
4
+ it 'references the correct class level' do
5
+ expect(described_class).to be_const_defined(:CLASS_LEVEL)
6
+ expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileSystemInformation::FILE_FS_ATTRIBUTE_INFORMATION
7
+ end
8
+
9
+ subject(:struct) { described_class.new }
10
+
11
+ it { should respond_to :file_system_attributes }
12
+ it { should respond_to :maximum_component_name_length }
13
+ it { should respond_to :file_system_name_length }
14
+ it { should respond_to :file_system_name }
15
+
16
+ it 'is little endian' do
17
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
18
+ end
19
+
20
+ it 'tracks the file system attributes in a struct field' do
21
+ expect(struct.file_system_attributes).to be_a BinData::Struct
22
+ end
23
+
24
+ it 'tracks the maximum component name length in a Int32 field' do
25
+ expect(struct.maximum_component_name_length).to be_a BinData::Int32le
26
+ end
27
+
28
+ it 'tracks the file system name length in a Uint32 field' do
29
+ expect(struct.file_system_name_length).to be_a BinData::Uint32le
30
+ end
31
+
32
+ it 'tracks the file system name in a String16 field' do
33
+ expect(struct.file_system_name).to be_a RubySMB::Field::String16
34
+ end
35
+
36
+ it 'tracks the length of the file_system_name field' do
37
+ struct.file_system_name = 'NTFS'
38
+ expect(struct.file_system_name_length).to eq struct.file_system_name.do_num_bytes
39
+ end
40
+
41
+ it 'automatically encodes the file system name in UTF-16LE' do
42
+ name = 'NTFS'
43
+ struct.file_system_name = name
44
+ expect(struct.file_system_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
45
+ end
46
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::Fscc::FileSystemInformation::FileFsVolumeInformation do
4
+ it 'references the correct class level' do
5
+ expect(described_class).to be_const_defined(:CLASS_LEVEL)
6
+ expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileSystemInformation::FILE_FS_VOLUME_INFORMATION
7
+ end
8
+
9
+ subject(:struct) { described_class.new }
10
+
11
+ it { should respond_to :volume_creation_time }
12
+ it { should respond_to :volume_serial_number }
13
+ it { should respond_to :volume_label_length }
14
+ it { should respond_to :supports_objects }
15
+ it { should respond_to :volume_label }
16
+
17
+ it 'is little endian' do
18
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
19
+ end
20
+
21
+ it 'tracks the volume creation time in a FileTime field' do
22
+ expect(struct.volume_creation_time).to be_a RubySMB::Field::FileTime
23
+ end
24
+
25
+ it 'tracks the volume serial number in a Uint32 field' do
26
+ expect(struct.volume_serial_number).to be_a BinData::Uint32le
27
+ end
28
+
29
+ it 'tracks the volume label length in a Uint32 field' do
30
+ expect(struct.volume_label_length).to be_a BinData::Uint32le
31
+ end
32
+
33
+ it 'tracks if it supports objects in a Uint8 field' do
34
+ expect(struct.supports_objects).to be_a BinData::Uint8
35
+ end
36
+
37
+ it 'tracks the volume label in a String16 field' do
38
+ expect(struct.volume_label).to be_a RubySMB::Field::String16
39
+ end
40
+
41
+ it 'tracks the length of the volume_label field' do
42
+ struct.volume_label = 'NTFS'
43
+ expect(struct.volume_label_length).to eq struct.volume_label.do_num_bytes
44
+ end
45
+
46
+ it 'automatically encodes the file system name in UTF-16LE' do
47
+ name = 'NTFS'
48
+ struct.volume_label = name
49
+ expect(struct.volume_label.force_encoding('utf-16le')).to eq name.encode('utf-16le')
50
+ end
51
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::Fscc::FileSystemInformation do
4
+
5
+ describe '#name' do
6
+ it 'maps constant names to their value' do
7
+ expect(described_class.name(RubySMB::Fscc::FileSystemInformation::FILE_FS_VOLUME_INFORMATION)).to eq :FILE_FS_VOLUME_INFORMATION
8
+ end
9
+
10
+ it 'returns nil for values that do not exist' do
11
+ expect(described_class.name(-1)).to be_nil
12
+ end
13
+ end
14
+ end
@@ -5,6 +5,7 @@ RSpec.describe RubySMB::Server::ServerClient do
5
5
  subject(:server_client) { described_class.new(server, dispatcher) }
6
6
 
7
7
  it { is_expected.to respond_to :dialect }
8
+ it { is_expected.to respond_to :dispatcher }
8
9
  it { is_expected.to respond_to :session_table }
9
10
 
10
11
  describe '#disconnect!' do
@@ -31,6 +32,20 @@ RSpec.describe RubySMB::Server::ServerClient do
31
32
  end
32
33
  end
33
34
 
35
+ describe '#peerhost' do
36
+ it 'returns the peer IP address' do
37
+ expect(server_client).to receive(:getpeername).and_return(Socket.sockaddr_in(4444, '127.0.0.1'))
38
+ expect(server_client.peerhost).to eq '127.0.0.1'
39
+ end
40
+ end
41
+
42
+ describe '#peerport' do
43
+ it 'returns the peer IP port' do
44
+ expect(server_client).to receive(:getpeername).and_return(Socket.sockaddr_in(4444, '127.0.0.1'))
45
+ expect(server_client.peerport).to eq 4444
46
+ end
47
+ end
48
+
34
49
  describe '#process_gss' do
35
50
  before(:each) do
36
51
  expect(server_client.instance_eval { @gss_authenticator }).to receive(:process).and_call_original