ruby_smb 0.0.12 → 0.0.13

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 (97) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -2
  3. data/lib/ruby_smb/client/authentication.rb +1 -1
  4. data/lib/ruby_smb/client/echo.rb +36 -0
  5. data/lib/ruby_smb/client/tree_connect.rb +1 -1
  6. data/lib/ruby_smb/client.rb +17 -0
  7. data/lib/ruby_smb/dispatcher/socket.rb +21 -14
  8. data/lib/ruby_smb/error.rb +3 -0
  9. data/lib/ruby_smb/field/ea_info_array.rb +58 -0
  10. data/lib/ruby_smb/field/extended_attribute_flag.rb +10 -0
  11. data/lib/ruby_smb/field/file_full_ea_info.rb +15 -0
  12. data/lib/ruby_smb/field/security_descriptor.rb +42 -0
  13. data/lib/ruby_smb/field/smb_fea.rb +14 -0
  14. data/lib/ruby_smb/field/smb_fea_list.rb +13 -0
  15. data/lib/ruby_smb/field/utime.rb +54 -0
  16. data/lib/ruby_smb/field.rb +7 -0
  17. data/lib/ruby_smb/generic_packet.rb +8 -4
  18. data/lib/ruby_smb/impersonation_levels.rb +22 -0
  19. data/lib/ruby_smb/smb1/bit_field/create_options.rb +38 -0
  20. data/lib/ruby_smb/smb1/bit_field/file_access_mask.rb +1 -1
  21. data/lib/ruby_smb/smb1/bit_field/open2_access_mode.rb +42 -0
  22. data/lib/ruby_smb/smb1/bit_field/open2_flags.rb +18 -0
  23. data/lib/ruby_smb/smb1/bit_field/open2_open_mode.rb +17 -0
  24. data/lib/ruby_smb/smb1/bit_field/share_access.rb +20 -0
  25. data/lib/ruby_smb/smb1/bit_field/smb_ext_file_attributes.rb +35 -0
  26. data/lib/ruby_smb/smb1/bit_field/smb_file_attributes.rb +26 -0
  27. data/lib/ruby_smb/smb1/bit_field/smb_nmpipe_status.rb +19 -0
  28. data/lib/ruby_smb/smb1/bit_field/trans2_flags.rb +15 -0
  29. data/lib/ruby_smb/smb1/bit_field.rb +9 -0
  30. data/lib/ruby_smb/smb1/commands.rb +10 -6
  31. data/lib/ruby_smb/smb1/create_actions.rb +22 -0
  32. data/lib/ruby_smb/smb1/dispositions.rb +36 -0
  33. data/lib/ruby_smb/smb1/oplock_levels.rb +19 -0
  34. data/lib/ruby_smb/smb1/packet/echo_request.rb +30 -0
  35. data/lib/ruby_smb/smb1/packet/echo_response.rb +31 -0
  36. data/lib/ruby_smb/smb1/packet/empty_packet.rb +14 -0
  37. data/lib/ruby_smb/smb1/packet/nt_trans/create_request.rb +85 -0
  38. data/lib/ruby_smb/smb1/packet/nt_trans/create_response.rb +61 -0
  39. data/lib/ruby_smb/smb1/packet/nt_trans/request.rb +47 -0
  40. data/lib/ruby_smb/smb1/packet/nt_trans/response.rb +44 -0
  41. data/lib/ruby_smb/smb1/packet/nt_trans/subcommands.rb +11 -0
  42. data/lib/ruby_smb/smb1/packet/nt_trans.rb +16 -0
  43. data/lib/ruby_smb/smb1/packet/trans2/data_block.rb +32 -0
  44. data/lib/ruby_smb/smb1/packet/trans2/open2_request.rb +60 -0
  45. data/lib/ruby_smb/smb1/packet/trans2/open2_response.rb +65 -0
  46. data/lib/ruby_smb/smb1/packet/trans2/request.rb +52 -0
  47. data/lib/ruby_smb/smb1/packet/trans2/request_secondary.rb +39 -0
  48. data/lib/ruby_smb/smb1/packet/trans2/response.rb +48 -0
  49. data/lib/ruby_smb/smb1/packet/trans2/subcommands.rb +12 -0
  50. data/lib/ruby_smb/smb1/packet/trans2.rb +18 -0
  51. data/lib/ruby_smb/smb1/packet.rb +5 -1
  52. data/lib/ruby_smb/smb1.rb +3 -0
  53. data/lib/ruby_smb/smb2/bit_field/{share_capabailities.rb → share_capabilities.rb} +0 -0
  54. data/lib/ruby_smb/smb2/bit_field/{smb2_capabailities.rb → smb2_capabilities.rb} +0 -0
  55. data/lib/ruby_smb/smb2/bit_field.rb +2 -2
  56. data/lib/ruby_smb/smb2/packet/echo_request.rb +21 -0
  57. data/lib/ruby_smb/smb2/packet/echo_response.rb +22 -0
  58. data/lib/ruby_smb/smb2/packet.rb +2 -0
  59. data/lib/ruby_smb/version.rb +1 -1
  60. data/ruby_smb.gemspec +2 -0
  61. data/spec/lib/ruby_smb/client_spec.rb +46 -0
  62. data/spec/lib/ruby_smb/field/ea_info_array_spec.rb +51 -0
  63. data/spec/lib/ruby_smb/field/extended_attribute_flag_spec.rb +16 -0
  64. data/spec/lib/ruby_smb/field/file_full_ea_info_spec.rb +35 -0
  65. data/spec/lib/ruby_smb/field/security_descriptor.rb +194 -0
  66. data/spec/lib/ruby_smb/field/smb_fea_list_spec.rb +38 -0
  67. data/spec/lib/ruby_smb/field/smb_fea_spec.rb +27 -0
  68. data/spec/lib/ruby_smb/field/utime_spec.rb +59 -0
  69. data/spec/lib/ruby_smb/smb1/bit_field/create_options_spec.rb +181 -0
  70. data/spec/lib/ruby_smb/smb1/bit_field/open2_access_mode_spec.rb +81 -0
  71. data/spec/lib/ruby_smb/smb1/bit_field/open2_flags_spec.rb +62 -0
  72. data/spec/lib/ruby_smb/smb1/bit_field/open2_open_mode_spec.rb +27 -0
  73. data/spec/lib/ruby_smb/smb1/bit_field/share_access_spec.rb +38 -0
  74. data/spec/lib/ruby_smb/smb1/bit_field/smb_ext_file_attributes_spec.rb +144 -0
  75. data/spec/lib/ruby_smb/smb1/bit_field/smb_file_attributes_spec.rb +113 -0
  76. data/spec/lib/ruby_smb/smb1/bit_field/smb_nmpipe_status_spec.rb +53 -0
  77. data/spec/lib/ruby_smb/smb1/bit_field/trans2_flags_spec.rb +28 -0
  78. data/spec/lib/ruby_smb/smb1/packet/echo_request_spec.rb +44 -0
  79. data/spec/lib/ruby_smb/smb1/packet/echo_response_spec.rb +44 -0
  80. data/spec/lib/ruby_smb/smb1/packet/error_packet_spec.rb +1 -1
  81. data/spec/lib/ruby_smb/smb1/packet/nt_trans/create_request_spec.rb +194 -0
  82. data/spec/lib/ruby_smb/smb1/packet/nt_trans/create_response_spec.rb +124 -0
  83. data/spec/lib/ruby_smb/smb1/packet/nt_trans/request_spec.rb +91 -0
  84. data/spec/lib/ruby_smb/smb1/packet/nt_trans/response_spec.rb +75 -0
  85. data/spec/lib/ruby_smb/smb1/packet/trans2/open2_request_spec.rb +112 -0
  86. data/spec/lib/ruby_smb/smb1/packet/trans2/open2_response_spec.rb +107 -0
  87. data/spec/lib/ruby_smb/smb1/packet/trans2/request_secondary_spec.rb +77 -0
  88. data/spec/lib/ruby_smb/smb1/packet/trans2/request_spec.rb +98 -0
  89. data/spec/lib/ruby_smb/smb1/packet/trans2/response_spec.rb +88 -0
  90. data/spec/lib/ruby_smb/smb2/packet/echo_request_spec.rb +30 -0
  91. data/spec/lib/ruby_smb/smb2/packet/echo_response_spec.rb +30 -0
  92. data/spec/lib/ruby_smb/smb2/packet/negotiate_request_spec.rb +1 -1
  93. data/spec/lib/ruby_smb/smb2/packet/negotiate_response_spec.rb +1 -1
  94. data.tar.gz.sig +0 -0
  95. metadata +104 -7
  96. metadata.gz.sig +0 -0
  97. data/lib/ruby_smb/smb1/packet/error_packet.rb +0 -14
@@ -0,0 +1,124 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB1::Packet::NtTrans::CreateResponse do
4
+
5
+ subject(:packet) { described_class.new }
6
+
7
+ describe '#smb_header' do
8
+ subject(:header) { packet.smb_header }
9
+
10
+ it 'is a standard SMB Header' do
11
+ expect(header).to be_a RubySMB::SMB1::SMBHeader
12
+ end
13
+
14
+ it 'should have the command set to SMB_COM_NEGOTIATE' do
15
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_NT_TRANSACT
16
+ end
17
+
18
+ it 'should have the response flag set' do
19
+ expect(header.flags.reply).to eq 1
20
+ end
21
+ end
22
+
23
+ describe '#parameter_block' do
24
+ subject(:parameter_block) { packet.parameter_block }
25
+
26
+ it 'is a NTTrans Response ParameterBlock' do
27
+ expect(parameter_block).to be_a RubySMB::SMB1::Packet::NtTrans::Response::ParameterBlock
28
+ end
29
+
30
+ describe 'parameter_count' do
31
+ it 'is a count of bytes in the data_block trans2_parameters field' do
32
+ expect(parameter_block.parameter_count).to eq packet.data_block.trans2_parameters.do_num_bytes
33
+ end
34
+ end
35
+
36
+ describe 'parameter_offset' do
37
+ it ' contains the absolute_offset to the data_block trans2_parameters field' do
38
+ expect(parameter_block.parameter_offset).to eq packet.data_block.trans2_parameters.abs_offset
39
+ end
40
+ end
41
+
42
+ describe 'data_count' do
43
+ it 'is a count of bytes in the data_block trans2_data field' do
44
+ expect(parameter_block.data_count).to eq packet.data_block.trans2_data.do_num_bytes
45
+ end
46
+ end
47
+
48
+ describe 'data_offset' do
49
+ it 'contains the absolute_offset to the data_block trans2_data field' do
50
+ expect(parameter_block.data_offset).to eq packet.data_block.trans2_data.abs_offset
51
+ end
52
+ end
53
+ end
54
+
55
+ describe '#data_block' do
56
+ subject(:data_block) { packet.data_block }
57
+
58
+ it { is_expected.to be_a RubySMB::SMB1::Packet::Trans2::DataBlock }
59
+
60
+ describe '#trans2_data' do
61
+ it 'should be a 0-byte string' do
62
+ expect(data_block.trans2_data.length).to eq 0
63
+ end
64
+ end
65
+
66
+ describe '#trans2_parameters' do
67
+ subject(:parameters) { data_block.trans2_parameters }
68
+
69
+ it { is_expected.to respond_to :oplock_level }
70
+ it { is_expected.to respond_to :fid }
71
+ it { is_expected.to respond_to :create_action }
72
+ it { is_expected.to respond_to :ea_error_offset }
73
+ it { is_expected.to respond_to :creation_time }
74
+ it { is_expected.to respond_to :last_access_time }
75
+ it { is_expected.to respond_to :last_write_time }
76
+ it { is_expected.to respond_to :last_change_time }
77
+ it { is_expected.to respond_to :ext_file_attributes }
78
+ it { is_expected.to respond_to :allocation_size }
79
+ it { is_expected.to respond_to :end_of_file }
80
+ it { is_expected.to respond_to :resource_type }
81
+ it { is_expected.to respond_to :nmpipe_status }
82
+ it { is_expected.to respond_to :directory }
83
+
84
+ describe '#creation_time' do
85
+ it 'is a FileTime field' do
86
+ expect(parameters.creation_time).to be_a RubySMB::Field::FileTime
87
+ end
88
+ end
89
+
90
+ describe '#last_access_time' do
91
+ it 'is a FileTime field' do
92
+ expect(parameters.last_access_time).to be_a RubySMB::Field::FileTime
93
+ end
94
+ end
95
+
96
+ describe '#last_write_time' do
97
+ it 'is a FileTime field' do
98
+ expect(parameters.last_write_time).to be_a RubySMB::Field::FileTime
99
+ end
100
+ end
101
+
102
+ describe '#last_change_time' do
103
+ it 'is a FileTime field' do
104
+ expect(parameters.last_change_time).to be_a RubySMB::Field::FileTime
105
+ end
106
+ end
107
+
108
+ describe '#ext_file_attributes' do
109
+ it 'is a SmbExtFileAttributes field' do
110
+ expect(parameters.ext_file_attributes).to be_a RubySMB::SMB1::BitField::SmbExtFileAttributes
111
+ end
112
+ end
113
+
114
+ describe '#nmpipe_status' do
115
+ it 'is a SmbnmpipeStatus field' do
116
+ expect(parameters.nmpipe_status).to be_a RubySMB::SMB1::BitField::SmbNmpipeStatus
117
+ end
118
+ end
119
+
120
+ end
121
+ end
122
+
123
+
124
+ end
@@ -0,0 +1,91 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB1::Packet::NtTrans::Request do
4
+
5
+ subject(:packet) { described_class.new }
6
+
7
+ describe '#smb_header' do
8
+ subject(:header) { packet.smb_header }
9
+
10
+ it 'is a standard SMB Header' do
11
+ expect(header).to be_a RubySMB::SMB1::SMBHeader
12
+ end
13
+
14
+ it 'should have the command set to SMB_COM_NEGOTIATE' do
15
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_NT_TRANSACT
16
+ end
17
+
18
+ it 'should not have the response flag set' do
19
+ expect(header.flags.reply).to eq 0
20
+ end
21
+ end
22
+
23
+ describe '#parameter_block' do
24
+ subject(:parameter_block) { packet.parameter_block }
25
+
26
+ it 'is a standard ParameterBlock' do
27
+ expect(parameter_block).to be_a RubySMB::SMB1::ParameterBlock
28
+ end
29
+
30
+ it { is_expected.to respond_to :total_parameter_count }
31
+ it { is_expected.to respond_to :total_data_count }
32
+ it { is_expected.to respond_to :max_parameter_count }
33
+ it { is_expected.to respond_to :max_data_count }
34
+ it { is_expected.to respond_to :max_setup_count }
35
+ it { is_expected.to respond_to :function }
36
+ it { is_expected.to respond_to :parameter_count }
37
+ it { is_expected.to respond_to :parameter_offset }
38
+ it { is_expected.to respond_to :data_count }
39
+ it { is_expected.to respond_to :data_offset }
40
+ it { is_expected.to respond_to :setup_count }
41
+
42
+
43
+ describe 'parameter_count' do
44
+ it 'is a count of bytes in the data_block trans2_parameters field' do
45
+ packet.data_block.trans2_parameters = "\x00\x01\x02\x03"
46
+ expect(parameter_block.parameter_count).to eq 4
47
+ end
48
+ end
49
+
50
+ describe 'parameter_offset' do
51
+ it ' contains the absolute_offset to the data_block trans2_parameters field' do
52
+ expect(parameter_block.parameter_offset).to eq packet.data_block.trans2_parameters.abs_offset
53
+ end
54
+ end
55
+
56
+ describe 'data_count' do
57
+ it 'is a count of bytes in the data_block trans2_data field' do
58
+ packet.data_block.trans2_data = "\x00\x01\x02\x03"
59
+ expect(parameter_block.data_count).to eq 4
60
+ end
61
+ end
62
+
63
+ describe 'data_offset' do
64
+ it 'contains the absolute_offset to the data_block trans2_data field' do
65
+ expect(parameter_block.data_offset).to eq packet.data_block.trans2_data.abs_offset
66
+ end
67
+ end
68
+ end
69
+
70
+ describe '#data_block' do
71
+ subject(:data_block) { packet.data_block }
72
+
73
+ it 'is a Trans2 style DataBlock' do
74
+ expect(data_block).to be_a RubySMB::SMB1::Packet::Trans2::DataBlock
75
+ end
76
+
77
+ it { is_expected.to respond_to :trans2_parameters }
78
+ it { is_expected.to respond_to :trans2_data }
79
+
80
+ it 'should keep #trans2_parameters 4-byte aligned' do
81
+ expect(data_block.trans2_parameters.abs_offset % 4).to eq 0
82
+ end
83
+
84
+ it 'should keep #trans2_data 4-byte aligned' do
85
+ expect(data_block.trans2_data.abs_offset % 4).to eq 0
86
+ end
87
+
88
+ end
89
+
90
+
91
+ end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB1::Packet::NtTrans::Response do
4
+
5
+ subject(:packet) { described_class.new }
6
+
7
+ describe '#smb_header' do
8
+ subject(:header) { packet.smb_header }
9
+
10
+ it 'is a standard SMB Header' do
11
+ expect(header).to be_a RubySMB::SMB1::SMBHeader
12
+ end
13
+
14
+ it 'should have the command set to SMB_COM_NEGOTIATE' do
15
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_NT_TRANSACT
16
+ end
17
+
18
+ it 'should have the response flag set' do
19
+ expect(header.flags.reply).to eq 1
20
+ end
21
+ end
22
+
23
+ describe '#parameter_block' do
24
+ subject(:parameter_block) { packet.parameter_block }
25
+
26
+ it 'is a standard ParameterBlock' do
27
+ expect(parameter_block).to be_a RubySMB::SMB1::ParameterBlock
28
+ end
29
+
30
+ it { is_expected.to respond_to :total_parameter_count }
31
+ it { is_expected.to respond_to :total_data_count }
32
+ it { is_expected.to respond_to :parameter_count }
33
+ it { is_expected.to respond_to :parameter_offset }
34
+ it { is_expected.to respond_to :data_count }
35
+ it { is_expected.to respond_to :data_offset }
36
+ it { is_expected.to respond_to :setup_count }
37
+
38
+
39
+ describe 'parameter_count' do
40
+ it 'is a count of bytes in the data_block trans2_parameters field' do
41
+ packet.data_block.trans2_parameters = "\x00\x01\x02\x03"
42
+ expect(parameter_block.parameter_count).to eq 4
43
+ end
44
+ end
45
+
46
+ describe 'parameter_offset' do
47
+ it ' contains the absolute_offset to the data_block trans2_parameters field' do
48
+ expect(parameter_block.parameter_offset).to eq packet.data_block.trans2_parameters.abs_offset
49
+ end
50
+ end
51
+
52
+ describe 'data_count' do
53
+ it 'is a count of bytes in the data_block trans2_data field' do
54
+ packet.data_block.trans2_data = "\x00\x01\x02\x03"
55
+ expect(parameter_block.data_count).to eq 4
56
+ end
57
+ end
58
+
59
+ describe 'data_offset' do
60
+ it 'contains the absolute_offset to the data_block trans2_data field' do
61
+ expect(parameter_block.data_offset).to eq packet.data_block.trans2_data.abs_offset
62
+ end
63
+ end
64
+ end
65
+
66
+ describe '#data_block' do
67
+ subject(:data_block) { packet.data_block }
68
+
69
+ it 'is the same as a NtTrans Request DataBlocjk' do
70
+ expect(data_block).to be_a RubySMB::SMB1::Packet::NtTrans::Request::DataBlock
71
+ end
72
+ end
73
+
74
+
75
+ end
@@ -0,0 +1,112 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB1::Packet::Trans2::Open2Request do
4
+
5
+ subject(:packet) { described_class.new }
6
+
7
+ describe '#smb_header' do
8
+ subject(:header) { packet.smb_header }
9
+
10
+ it 'is a standard SMB Header' do
11
+ expect(header).to be_a RubySMB::SMB1::SMBHeader
12
+ end
13
+
14
+ it 'should have the command set to SMB_COM_NEGOTIATE' do
15
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
16
+ end
17
+
18
+ it 'should not have the response flag set' do
19
+ expect(header.flags.reply).to eq 0
20
+ end
21
+ end
22
+
23
+ describe '#parameter_block' do
24
+ subject(:parameter_block) { packet.parameter_block }
25
+
26
+ it 'is a standard ParameterBlock' do
27
+ expect(parameter_block).to be_a RubySMB::SMB1::Packet::Trans2::Request::ParameterBlock
28
+ end
29
+
30
+ it 'should have the setup set to the OPEN2 subcommand' do
31
+ expect(parameter_block.setup).to include RubySMB::SMB1::Packet::Trans2::Subcommands::OPEN2
32
+ end
33
+
34
+ end
35
+
36
+ describe '#data_block' do
37
+ subject(:data_block) { packet.data_block }
38
+
39
+ it 'is a standard DataBlock' do
40
+ expect(data_block).to be_a RubySMB::SMB1::DataBlock
41
+ end
42
+
43
+ it { is_expected.to respond_to :name }
44
+ it { is_expected.to respond_to :trans2_parameters }
45
+ it { is_expected.to respond_to :trans2_data }
46
+
47
+ it 'should keep #trans2_parameters 4-byte aligned' do
48
+ expect(data_block.trans2_parameters.abs_offset % 4).to eq 0
49
+ end
50
+
51
+ it 'should keep #trans2_data 4-byte aligned' do
52
+ expect(data_block.trans2_data.abs_offset % 4).to eq 0
53
+ end
54
+
55
+ describe '#trans2_parameters' do
56
+ subject(:parameters) { data_block.trans2_parameters }
57
+
58
+ it { is_expected.to respond_to :flags }
59
+ it { is_expected.to respond_to :access_mode }
60
+ it { is_expected.to respond_to :file_attributes }
61
+ it { is_expected.to respond_to :creation_time }
62
+ it { is_expected.to respond_to :open_mode }
63
+ it { is_expected.to respond_to :allocation_size }
64
+ it { is_expected.to respond_to :filename }
65
+
66
+ describe '#flags' do
67
+ it 'is an open2_flags field' do
68
+ expect(parameters.flags).to be_a RubySMB::SMB1::BitField::Open2Flags
69
+ end
70
+ end
71
+
72
+ describe '#access_mode' do
73
+ it 'is an open2_access_mode field' do
74
+ expect(parameters.access_mode).to be_a RubySMB::SMB1::BitField::Open2AccessMode
75
+ end
76
+ end
77
+
78
+ describe '#file_attributes' do
79
+ it 'is a smb_file_attributes field' do
80
+ expect(parameters.file_attributes).to be_a RubySMB::SMB1::BitField::SmbFileAttributes
81
+ end
82
+ end
83
+
84
+ describe '#creation_time' do
85
+ it 'is a utime field' do
86
+ expect(parameters.creation_time).to be_a RubySMB::Field::Utime
87
+ end
88
+ end
89
+
90
+ describe '#open_mode' do
91
+ it 'is an open2_open_mode field' do
92
+ expect(parameters.open_mode).to be_a RubySMB::SMB1::BitField::Open2OpenMode
93
+ end
94
+ end
95
+ end
96
+
97
+ describe '#trans2_data' do
98
+ subject(:data) { data_block.trans2_data }
99
+
100
+ it { is_expected.to respond_to :extended_attribute_list }
101
+
102
+ describe '#extended_attribute_list' do
103
+ it 'is an smb_fea_list' do
104
+ expect(data.extended_attribute_list).to be_a RubySMB::Field::SmbFeaList
105
+ end
106
+ end
107
+ end
108
+
109
+ end
110
+
111
+
112
+ end
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB1::Packet::Trans2::Open2Response do
4
+
5
+ subject(:packet) { described_class.new }
6
+
7
+ describe '#smb_header' do
8
+ subject(:header) { packet.smb_header }
9
+
10
+ it 'is a standard SMB Header' do
11
+ expect(header).to be_a RubySMB::SMB1::SMBHeader
12
+ end
13
+
14
+ it 'should have the command set to SMB_COM_NEGOTIATE' do
15
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
16
+ end
17
+
18
+ it 'should have the response flag set' do
19
+ expect(header.flags.reply).to eq 1
20
+ end
21
+ end
22
+
23
+ describe '#parameter_block' do
24
+ subject(:parameter_block) { packet.parameter_block }
25
+
26
+ it 'is a standard Trans2 ParameterBlock' do
27
+ expect(parameter_block).to be_a RubySMB::SMB1::Packet::Trans2::Response::ParameterBlock
28
+ end
29
+ end
30
+
31
+ describe '#data_block' do
32
+ subject(:data_block) { packet.data_block }
33
+
34
+ it 'is a Trans2 DataBlock' do
35
+ expect(data_block).to be_a RubySMB::SMB1::Packet::Trans2::DataBlock
36
+ end
37
+
38
+ it { is_expected.to respond_to :trans2_parameters }
39
+ it { is_expected.to respond_to :trans2_data }
40
+
41
+ it 'should keep #trans2_parameters 4-byte aligned' do
42
+ expect(data_block.trans2_parameters.abs_offset % 4).to eq 0
43
+ end
44
+
45
+ it 'should keep #trans2_data 4-byte aligned' do
46
+ expect(data_block.trans2_data.abs_offset % 4).to eq 0
47
+ end
48
+
49
+ describe '#trans2_parameters' do
50
+ subject(:parameters) { data_block.trans2_parameters }
51
+
52
+ it { is_expected.to be_a RubySMB::SMB1::Packet::Trans2::Open2Response::Trans2Parameters }
53
+
54
+ it { is_expected.to respond_to :fid }
55
+ it { is_expected.to respond_to :file_attributes }
56
+ it { is_expected.to respond_to :creation_time }
57
+ it { is_expected.to respond_to :access_mode }
58
+ it { is_expected.to respond_to :resource_type }
59
+ it { is_expected.to respond_to :nmpipe_status }
60
+ it { is_expected.to respond_to :action_taken }
61
+ it { is_expected.to respond_to :extended_attribute_offset }
62
+ it { is_expected.to respond_to :extended_attribute_length }
63
+
64
+ describe '#access_mode' do
65
+ it 'is an open2_access_mode field' do
66
+ expect(parameters.access_mode).to be_a RubySMB::SMB1::BitField::Open2AccessMode
67
+ end
68
+ end
69
+
70
+ describe '#file_attributes' do
71
+ it 'is a smb_file_attributes field' do
72
+ expect(parameters.file_attributes).to be_a RubySMB::SMB1::BitField::SmbFileAttributes
73
+ end
74
+ end
75
+
76
+ describe '#creation_time' do
77
+ it 'is a utime field' do
78
+ expect(parameters.creation_time).to be_a RubySMB::Field::Utime
79
+ end
80
+ end
81
+
82
+ describe '#smb_nmpipe_status' do
83
+ it 'is a Named Pipe Status field' do
84
+ expect(parameters.nmpipe_status).to be_a RubySMB::SMB1::BitField::SmbNmpipeStatus
85
+ end
86
+ end
87
+
88
+ describe '#action_taken' do
89
+ subject(:action) { parameters.action_taken}
90
+
91
+ it 'is 2-bytes' do
92
+ expect(action.do_num_bytes).to eq 2
93
+ end
94
+
95
+ describe '#open_result' do
96
+ it_behaves_like 'bit field with one flag set', :open_result, 'v', 0x0001
97
+ end
98
+
99
+ describe '#lock_status' do
100
+ it_behaves_like 'bit field with one flag set', :lock_status, 'v', 0x8000
101
+ end
102
+ end
103
+ end
104
+ end
105
+
106
+
107
+ end
@@ -0,0 +1,77 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB1::Packet::Trans2::RequestSecondary do
4
+
5
+ subject(:packet) { described_class.new }
6
+
7
+ describe '#smb_header' do
8
+ subject(:header) { packet.smb_header }
9
+
10
+ it 'is a standard SMB Header' do
11
+ expect(header).to be_a RubySMB::SMB1::SMBHeader
12
+ end
13
+
14
+ it 'should have the command set to SMB_COM_NEGOTIATE' do
15
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2_SECONDARY
16
+ end
17
+
18
+ it 'should not have the response flag set' do
19
+ expect(header.flags.reply).to eq 0
20
+ end
21
+ end
22
+
23
+ describe '#parameter_block' do
24
+ subject(:parameter_block) { packet.parameter_block }
25
+
26
+ it 'is a standard ParameterBlock' do
27
+ expect(parameter_block).to be_a RubySMB::SMB1::ParameterBlock
28
+ end
29
+
30
+ it { is_expected.to respond_to :total_parameter_count }
31
+ it { is_expected.to respond_to :total_data_count }
32
+ it { is_expected.to respond_to :parameter_count }
33
+ it { is_expected.to respond_to :parameter_offset }
34
+ it { is_expected.to respond_to :parameter_displacement }
35
+ it { is_expected.to respond_to :data_count }
36
+ it { is_expected.to respond_to :data_offset }
37
+ it { is_expected.to respond_to :data_displacement }
38
+ it { is_expected.to respond_to :fid }
39
+
40
+ describe 'parameter_count' do
41
+ it 'is a count of bytes in the data_block trans2_parameters field' do
42
+ packet.data_block.trans2_parameters = "\x00\x01\x02\x03"
43
+ expect(parameter_block.parameter_count).to eq 4
44
+ end
45
+ end
46
+
47
+ describe 'parameter_offset' do
48
+ it ' contains the absolute_offset to the data_block trans2_parameters field' do
49
+ expect(parameter_block.parameter_offset).to eq packet.data_block.trans2_parameters.abs_offset
50
+ end
51
+ end
52
+
53
+ describe 'data_count' do
54
+ it 'is a count of bytes in the data_block trans2_data field' do
55
+ packet.data_block.trans2_data = "\x00\x01\x02\x03"
56
+ expect(parameter_block.data_count).to eq 4
57
+ end
58
+ end
59
+
60
+ describe 'data_offset' do
61
+ it 'contains the absolute_offset to the data_block trans2_data field' do
62
+ expect(parameter_block.data_offset).to eq packet.data_block.trans2_data.abs_offset
63
+ end
64
+ end
65
+ end
66
+
67
+ describe '#data_block' do
68
+ subject(:data_block) { packet.data_block }
69
+
70
+ it 'is a standard DataBlock' do
71
+ expect(data_block).to be_a RubySMB::SMB1::Packet::Trans2::Request::DataBlock
72
+ end
73
+
74
+ end
75
+
76
+
77
+ end
@@ -0,0 +1,98 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB1::Packet::Trans2::Request do
4
+
5
+ subject(:packet) { described_class.new }
6
+
7
+ describe '#smb_header' do
8
+ subject(:header) { packet.smb_header }
9
+
10
+ it 'is a standard SMB Header' do
11
+ expect(header).to be_a RubySMB::SMB1::SMBHeader
12
+ end
13
+
14
+ it 'should have the command set to SMB_COM_NEGOTIATE' do
15
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
16
+ end
17
+
18
+ it 'should not have the response flag set' do
19
+ expect(header.flags.reply).to eq 0
20
+ end
21
+ end
22
+
23
+ describe '#parameter_block' do
24
+ subject(:parameter_block) { packet.parameter_block }
25
+
26
+ it 'is a standard ParameterBlock' do
27
+ expect(parameter_block).to be_a RubySMB::SMB1::ParameterBlock
28
+ end
29
+
30
+ it { is_expected.to respond_to :total_parameter_count }
31
+ it { is_expected.to respond_to :total_data_count }
32
+ it { is_expected.to respond_to :max_parameter_count }
33
+ it { is_expected.to respond_to :max_data_count }
34
+ it { is_expected.to respond_to :max_setup_count }
35
+ it { is_expected.to respond_to :timeout }
36
+ it { is_expected.to respond_to :parameter_count }
37
+ it { is_expected.to respond_to :parameter_offset }
38
+ it { is_expected.to respond_to :data_count }
39
+ it { is_expected.to respond_to :data_offset }
40
+ it { is_expected.to respond_to :setup_count }
41
+
42
+ describe 'flags' do
43
+ it 'is a trans2_flags BitField' do
44
+ expect(parameter_block.flags).to be_a RubySMB::SMB1::BitField::Trans2Flags
45
+ end
46
+ end
47
+
48
+ describe 'parameter_count' do
49
+ it 'is a count of bytes in the data_block trans2_parameters field' do
50
+ packet.data_block.trans2_parameters = "\x00\x01\x02\x03"
51
+ expect(parameter_block.parameter_count).to eq 4
52
+ end
53
+ end
54
+
55
+ describe 'parameter_offset' do
56
+ it ' contains the absolute_offset to the data_block trans2_parameters field' do
57
+ expect(parameter_block.parameter_offset).to eq packet.data_block.trans2_parameters.abs_offset
58
+ end
59
+ end
60
+
61
+ describe 'data_count' do
62
+ it 'is a count of bytes in the data_block trans2_data field' do
63
+ packet.data_block.trans2_data = "\x00\x01\x02\x03"
64
+ expect(parameter_block.data_count).to eq 4
65
+ end
66
+ end
67
+
68
+ describe 'data_offset' do
69
+ it 'contains the absolute_offset to the data_block trans2_data field' do
70
+ expect(parameter_block.data_offset).to eq packet.data_block.trans2_data.abs_offset
71
+ end
72
+ end
73
+ end
74
+
75
+ describe '#data_block' do
76
+ subject(:data_block) { packet.data_block }
77
+
78
+ it 'is a standard DataBlock' do
79
+ expect(data_block).to be_a RubySMB::SMB1::DataBlock
80
+ end
81
+
82
+ it { is_expected.to respond_to :name }
83
+ it { is_expected.to respond_to :trans2_parameters }
84
+ it { is_expected.to respond_to :trans2_data }
85
+
86
+ it 'should keep #trans2_parameters 4-byte aligned' do
87
+ expect(data_block.trans2_parameters.abs_offset % 4).to eq 0
88
+ end
89
+
90
+ it 'should keep #trans2_data 4-byte aligned' do
91
+ data_block.trans2_parameters = 'a'
92
+ expect(data_block.trans2_data.abs_offset % 4).to eq 0
93
+ end
94
+
95
+ end
96
+
97
+
98
+ end