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,38 @@
1
+ RSpec.describe RubySMB::SMB1::BitField::ShareAccess do
2
+ subject(:flags) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :share_delete }
5
+ it { is_expected.to respond_to :share_write }
6
+ it { is_expected.to respond_to :share_read }
7
+
8
+ it 'is little endian' do
9
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
10
+ end
11
+
12
+ describe '#share_read' do
13
+ it 'should be a 1-bit field per the SMB spec' do
14
+ expect(flags.share_read).to be_a BinData::Bit1
15
+ end
16
+
17
+ it_behaves_like 'bit field with one flag set', :share_read, 'V', 0x00000001
18
+ end
19
+
20
+ describe '#share_write' do
21
+ it 'should be a 1-bit field per the SMB spec' do
22
+ expect(flags.share_write).to be_a BinData::Bit1
23
+ end
24
+
25
+ it_behaves_like 'bit field with one flag set', :share_write, 'V', 0x00000002
26
+ end
27
+
28
+ describe '#share_delete' do
29
+ it 'should be a 1-bit field per the SMB spec' do
30
+ expect(flags.share_delete).to be_a BinData::Bit1
31
+ end
32
+
33
+ it_behaves_like 'bit field with one flag set', :share_delete, 'V', 0x00000004
34
+ end
35
+
36
+
37
+
38
+ end
@@ -0,0 +1,144 @@
1
+ RSpec.describe RubySMB::SMB1::BitField::SmbExtFileAttributes do
2
+ subject(:attrs) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :archive }
5
+ it { is_expected.to respond_to :directory }
6
+ it { is_expected.to respond_to :normal }
7
+ it { is_expected.to respond_to :system }
8
+ it { is_expected.to respond_to :hidden }
9
+ it { is_expected.to respond_to :read_only }
10
+ it { is_expected.to respond_to :compressed }
11
+ it { is_expected.to respond_to :temporary }
12
+ it { is_expected.to respond_to :write_through }
13
+ it { is_expected.to respond_to :no_buffering }
14
+ it { is_expected.to respond_to :random_access }
15
+ it { is_expected.to respond_to :sequential_scan }
16
+ it { is_expected.to respond_to :delete_on_close }
17
+ it { is_expected.to respond_to :backup_semantics }
18
+ it { is_expected.to respond_to :posix_semantics }
19
+
20
+ it 'is little endian' do
21
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
22
+ end
23
+
24
+ describe 'read_only' do
25
+ it 'should be a 1-bit field per the SMB spec' do
26
+ expect(attrs.read_only).to be_a BinData::Bit1
27
+ end
28
+
29
+ it_behaves_like 'bit field with one flag set', :read_only, 'V', 0x00000001
30
+ end
31
+
32
+ describe 'hidden' do
33
+ it 'should be a 1-bit field per the SMB spec' do
34
+ expect(attrs.hidden).to be_a BinData::Bit1
35
+ end
36
+
37
+ it_behaves_like 'bit field with one flag set', :hidden, 'V', 0x00000002
38
+ end
39
+
40
+ describe 'system' do
41
+ it 'should be a 1-bit field per the SMB spec' do
42
+ expect(attrs.system).to be_a BinData::Bit1
43
+ end
44
+
45
+ it_behaves_like 'bit field with one flag set', :system, 'V', 0x00000004
46
+ end
47
+
48
+ describe 'directory' do
49
+ it 'should be a 1-bit field per the SMB spec' do
50
+ expect(attrs.directory).to be_a BinData::Bit1
51
+ end
52
+
53
+ it_behaves_like 'bit field with one flag set', :directory, 'V', 0x00000010
54
+ end
55
+
56
+ describe 'archive' do
57
+ it 'should be a 1-bit field per the SMB spec' do
58
+ expect(attrs.archive).to be_a BinData::Bit1
59
+ end
60
+
61
+ it_behaves_like 'bit field with one flag set', :archive, 'V', 0x00000020
62
+ end
63
+
64
+ describe 'normal' do
65
+ it 'should be a 1-bit field per the SMB spec' do
66
+ expect(attrs.normal).to be_a BinData::Bit1
67
+ end
68
+
69
+ it_behaves_like 'bit field with one flag set', :normal, 'V', 0x00000080
70
+ end
71
+
72
+ describe 'temporary' do
73
+ it 'should be a 1-bit field per the SMB spec' do
74
+ expect(attrs.temporary).to be_a BinData::Bit1
75
+ end
76
+
77
+ it_behaves_like 'bit field with one flag set', :temporary, 'V', 0x00000100
78
+ end
79
+
80
+ describe 'compressed' do
81
+ it 'should be a 1-bit field per the SMB spec' do
82
+ expect(attrs.compressed).to be_a BinData::Bit1
83
+ end
84
+
85
+ it_behaves_like 'bit field with one flag set', :compressed, 'V', 0x00000800
86
+ end
87
+
88
+ describe 'posix_semantics' do
89
+ it 'should be a 1-bit field per the SMB spec' do
90
+ expect(attrs.posix_semantics).to be_a BinData::Bit1
91
+ end
92
+
93
+ it_behaves_like 'bit field with one flag set', :posix_semantics, 'V', 0x01000000
94
+ end
95
+
96
+ describe 'backup_semantics' do
97
+ it 'should be a 1-bit field per the SMB spec' do
98
+ expect(attrs.backup_semantics).to be_a BinData::Bit1
99
+ end
100
+
101
+ it_behaves_like 'bit field with one flag set', :backup_semantics, 'V', 0x02000000
102
+ end
103
+
104
+ describe 'delete_on_close' do
105
+ it 'should be a 1-bit field per the SMB spec' do
106
+ expect(attrs.delete_on_close).to be_a BinData::Bit1
107
+ end
108
+
109
+ it_behaves_like 'bit field with one flag set', :delete_on_close, 'V', 0x04000000
110
+ end
111
+
112
+ describe 'sequential_scan' do
113
+ it 'should be a 1-bit field per the SMB spec' do
114
+ expect(attrs.sequential_scan).to be_a BinData::Bit1
115
+ end
116
+
117
+ it_behaves_like 'bit field with one flag set', :sequential_scan, 'V', 0x08000000
118
+ end
119
+
120
+ describe 'random_access' do
121
+ it 'should be a 1-bit field per the SMB spec' do
122
+ expect(attrs.random_access).to be_a BinData::Bit1
123
+ end
124
+
125
+ it_behaves_like 'bit field with one flag set', :random_access, 'V', 0x10000000
126
+ end
127
+
128
+ describe 'no_buffering' do
129
+ it 'should be a 1-bit field per the SMB spec' do
130
+ expect(attrs.no_buffering).to be_a BinData::Bit1
131
+ end
132
+
133
+ it_behaves_like 'bit field with one flag set', :no_buffering, 'V', 0x20000000
134
+ end
135
+
136
+ describe 'write_through' do
137
+ it 'should be a 1-bit field per the SMB spec' do
138
+ expect(attrs.write_through).to be_a BinData::Bit1
139
+ end
140
+
141
+ it_behaves_like 'bit field with one flag set', :write_through, 'V', 0x80000000
142
+ end
143
+
144
+ end
@@ -0,0 +1,113 @@
1
+ RSpec.describe RubySMB::SMB1::BitField::SmbFileAttributes do
2
+ subject(:attrs) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :archive }
5
+ it { is_expected.to respond_to :directory }
6
+ it { is_expected.to respond_to :volume }
7
+ it { is_expected.to respond_to :system }
8
+ it { is_expected.to respond_to :hidden }
9
+ it { is_expected.to respond_to :read_only }
10
+ it { is_expected.to respond_to :search_archive }
11
+ it { is_expected.to respond_to :search_directory }
12
+ it { is_expected.to respond_to :search_system }
13
+ it { is_expected.to respond_to :search_hidden }
14
+ it { is_expected.to respond_to :search_read_only }
15
+
16
+ it 'is little endian' do
17
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
18
+ end
19
+
20
+ describe 'read_only' do
21
+ it 'should be a 1-bit field per the SMB spec' do
22
+ expect(attrs.read_only).to be_a BinData::Bit1
23
+ end
24
+
25
+ it_behaves_like 'bit field with one flag set', :read_only, 'v', 0x0001
26
+ end
27
+
28
+ describe 'hidden' do
29
+ it 'should be a 1-bit field per the SMB spec' do
30
+ expect(attrs.hidden).to be_a BinData::Bit1
31
+ end
32
+
33
+ it_behaves_like 'bit field with one flag set', :hidden, 'v', 0x0002
34
+ end
35
+
36
+ describe 'system' do
37
+ it 'should be a 1-bit field per the SMB spec' do
38
+ expect(attrs.system).to be_a BinData::Bit1
39
+ end
40
+
41
+ it_behaves_like 'bit field with one flag set', :system, 'v', 0x0004
42
+ end
43
+
44
+ describe 'volume' do
45
+ it 'should be a 1-bit field per the SMB spec' do
46
+ expect(attrs.volume).to be_a BinData::Bit1
47
+ end
48
+
49
+ it_behaves_like 'bit field with one flag set', :volume, 'v', 0x0008
50
+ end
51
+
52
+ describe 'directory' do
53
+ it 'should be a 1-bit field per the SMB spec' do
54
+ expect(attrs.directory).to be_a BinData::Bit1
55
+ end
56
+
57
+ it_behaves_like 'bit field with one flag set', :directory, 'v', 0x0010
58
+ end
59
+
60
+ describe 'archive' do
61
+ it 'should be a 1-bit field per the SMB spec' do
62
+ expect(attrs.archive).to be_a BinData::Bit1
63
+ end
64
+
65
+ it_behaves_like 'bit field with one flag set', :archive, 'v', 0x0020
66
+ end
67
+
68
+ describe 'search_read_only' do
69
+ it 'should be a 1-bit field per the SMB spec' do
70
+ expect(attrs.search_read_only).to be_a BinData::Bit1
71
+ end
72
+
73
+ it_behaves_like 'bit field with one flag set', :search_read_only, 'v', 0x0100
74
+ end
75
+
76
+ describe 'search_hidden' do
77
+ it 'should be a 1-bit field per the SMB spec' do
78
+ expect(attrs.search_hidden).to be_a BinData::Bit1
79
+ end
80
+
81
+ it_behaves_like 'bit field with one flag set', :search_hidden, 'v', 0x0200
82
+ end
83
+
84
+ describe 'search_system' do
85
+ it 'should be a 1-bit field per the SMB spec' do
86
+ expect(attrs.search_system).to be_a BinData::Bit1
87
+ end
88
+
89
+ it_behaves_like 'bit field with one flag set', :search_system, 'v', 0x0400
90
+ end
91
+
92
+ describe 'search_directory' do
93
+ it 'should be a 1-bit field per the SMB spec' do
94
+ expect(attrs.search_directory).to be_a BinData::Bit1
95
+ end
96
+
97
+ it_behaves_like 'bit field with one flag set', :search_directory, 'v', 0x1000
98
+ end
99
+
100
+ describe 'search_archive' do
101
+ it 'should be a 1-bit field per the SMB spec' do
102
+ expect(attrs.search_archive).to be_a BinData::Bit1
103
+ end
104
+
105
+ it_behaves_like 'bit field with one flag set', :search_archive, 'v', 0x2000
106
+ end
107
+
108
+
109
+
110
+
111
+
112
+
113
+ end
@@ -0,0 +1,53 @@
1
+ RSpec.describe RubySMB::SMB1::BitField::SmbNmpipeStatus do
2
+ subject(:flags) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :icount }
5
+ it { is_expected.to respond_to :nonblocking }
6
+ it { is_expected.to respond_to :endpoint }
7
+ it { is_expected.to respond_to :nmpipe_type }
8
+ it { is_expected.to respond_to :read_mode }
9
+
10
+ it 'is little endian' do
11
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
12
+ end
13
+
14
+ describe 'icount' do
15
+ it 'should be a 8-bit field per the SMB spec' do
16
+ expect(flags.icount).to be_a BinData::Bit8
17
+ end
18
+ end
19
+
20
+ describe 'read_mode' do
21
+ it 'should be a 1-bit field per the SMB spec' do
22
+ expect(flags.read_mode).to be_a BinData::Bit1
23
+ end
24
+
25
+ it_behaves_like 'bit field with one flag set', :read_mode, 'v', 0x0100
26
+ end
27
+
28
+ describe 'nmpipe_type' do
29
+ it 'should be a 1-bit field per the SMB spec' do
30
+ expect(flags.nmpipe_type).to be_a BinData::Bit1
31
+ end
32
+
33
+ it_behaves_like 'bit field with one flag set', :nmpipe_type, 'v', 0x0400
34
+ end
35
+
36
+ describe 'endpoint' do
37
+ it 'should be a 1-bit field per the SMB spec' do
38
+ expect(flags.endpoint).to be_a BinData::Bit1
39
+ end
40
+
41
+ it_behaves_like 'bit field with one flag set', :endpoint, 'v', 0x4000
42
+ end
43
+
44
+ describe 'nonblocking' do
45
+ it 'should be a 1-bit field per the SMB spec' do
46
+ expect(flags.nonblocking).to be_a BinData::Bit1
47
+ end
48
+
49
+ it_behaves_like 'bit field with one flag set', :nonblocking, 'v', 0x8000
50
+ end
51
+
52
+
53
+ end
@@ -0,0 +1,28 @@
1
+ RSpec.describe RubySMB::SMB1::BitField::Trans2Flags do
2
+ subject(:flags) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :no_response }
5
+ it { is_expected.to respond_to :disconnect }
6
+
7
+ it 'is little endian' do
8
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
9
+ end
10
+
11
+ describe '#no_response' do
12
+ it 'should be a 1-bit field per the SMB spec' do
13
+ expect(flags.no_response).to be_a BinData::Bit1
14
+ end
15
+
16
+ it_behaves_like 'bit field with one flag set', :no_response, 'C', 0x02
17
+ end
18
+
19
+ describe '#disconnect' do
20
+ it 'should be a 1-bit field per the SMB spec' do
21
+ expect(flags.disconnect).to be_a BinData::Bit1
22
+ end
23
+
24
+ it_behaves_like 'bit field with one flag set', :disconnect, 'C', 0x01
25
+ end
26
+
27
+
28
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB1::Packet::EchoRequest 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_ECHO
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_expected.to respond_to :echo_count }
27
+
28
+ it 'is a standard ParameterBlock' do
29
+ expect(parameter_block).to be_a RubySMB::SMB1::ParameterBlock
30
+ end
31
+ end
32
+
33
+ describe '#data_block' do
34
+ subject(:data_block) { packet.data_block }
35
+
36
+ it { is_expected.to respond_to :data }
37
+
38
+ it 'is a standard DataBlock' do
39
+ expect(data_block).to be_a RubySMB::SMB1::DataBlock
40
+ end
41
+ end
42
+
43
+
44
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB1::Packet::EchoResponse 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_ECHO
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_expected.to respond_to :sequence_number }
27
+
28
+ it 'is a standard ParameterBlock' do
29
+ expect(parameter_block).to be_a RubySMB::SMB1::ParameterBlock
30
+ end
31
+ end
32
+
33
+ describe '#data_block' do
34
+ subject(:data_block) { packet.data_block }
35
+
36
+ it { is_expected.to respond_to :data }
37
+
38
+ it 'is a standard DataBlock' do
39
+ expect(data_block).to be_a RubySMB::SMB1::DataBlock
40
+ end
41
+ end
42
+
43
+
44
+ end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- RSpec.describe RubySMB::SMB1::Packet::ErrorPacket do
3
+ RSpec.describe RubySMB::SMB1::Packet::EmptyPacket do
4
4
  subject(:packet) { described_class.new }
5
5
 
6
6
  describe '#smb_header' do
@@ -0,0 +1,194 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB1::Packet::NtTrans::CreateRequest do
4
+ subject(:packet) { described_class.new }
5
+
6
+ describe '#smb_header' do
7
+ subject(:header) { packet.smb_header }
8
+
9
+ it 'is a standard SMB Header' do
10
+ expect(header).to be_a RubySMB::SMB1::SMBHeader
11
+ end
12
+
13
+ it 'should have the command set to SMB_COM_NEGOTIATE' do
14
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_NT_TRANSACT
15
+ end
16
+
17
+ it 'should not have the response flag set' do
18
+ expect(header.flags.reply).to eq 0
19
+ end
20
+ end
21
+
22
+ describe '#parameter_block' do
23
+ subject(:parameter_block) { packet.parameter_block }
24
+
25
+ it 'is a NtTrans Request ParameterBlock' do
26
+ expect(parameter_block).to be_a RubySMB::SMB1::Packet::NtTrans::Request::ParameterBlock
27
+ end
28
+
29
+ describe 'parameter_count' do
30
+ it 'is a count of bytes in the data_block trans2_parameters field' do
31
+ expect(parameter_block.parameter_count).to eq packet.data_block.trans2_parameters.do_num_bytes
32
+ end
33
+ end
34
+
35
+ describe 'parameter_offset' do
36
+ it ' contains the absolute_offset to the data_block trans2_parameters field' do
37
+ expect(parameter_block.parameter_offset).to eq packet.data_block.trans2_parameters.abs_offset
38
+ end
39
+ end
40
+
41
+ describe 'data_count' do
42
+ it 'is a count of bytes in the data_block trans2_data field' do
43
+ expect(parameter_block.data_count).to eq packet.data_block.trans2_data.do_num_bytes
44
+ end
45
+ end
46
+
47
+ describe 'data_offset' do
48
+ it 'contains the absolute_offset to the data_block trans2_data field' do
49
+ expect(parameter_block.data_offset).to eq packet.data_block.trans2_data.abs_offset
50
+ end
51
+ end
52
+
53
+ describe '#function' do
54
+ it 'should be a CREATE' do
55
+ expect(parameter_block.function).to eq RubySMB::SMB1::Packet::NtTrans::Subcommands::CREATE
56
+ end
57
+ end
58
+ end
59
+
60
+ describe '#data_block' do
61
+ subject(:data_block) { packet.data_block }
62
+
63
+ it 'is a Trans2 style DataBlock' do
64
+ expect(data_block).to be_a RubySMB::SMB1::Packet::Trans2::DataBlock
65
+ end
66
+
67
+ it { is_expected.to respond_to :trans2_parameters }
68
+ it { is_expected.to respond_to :trans2_data }
69
+
70
+ it 'should keep #trans2_parameters 4-byte aligned' do
71
+ expect(data_block.trans2_parameters.abs_offset % 4).to eq 0
72
+ end
73
+
74
+ it 'should keep #trans2_data 4-byte aligned' do
75
+ expect(data_block.trans2_data.abs_offset % 4).to eq 0
76
+ end
77
+
78
+ describe '#trans2_parameters' do
79
+ subject(:parameters) { data_block.trans2_parameters }
80
+ it { is_expected.to respond_to :flags }
81
+ it { is_expected.to respond_to :root_directory_fid }
82
+ it { is_expected.to respond_to :desired_access }
83
+ it { is_expected.to respond_to :allocation_size }
84
+ it { is_expected.to respond_to :ext_file_attribute }
85
+ it { is_expected.to respond_to :share_access }
86
+ it { is_expected.to respond_to :create_disposition }
87
+ it { is_expected.to respond_to :create_options }
88
+ it { is_expected.to respond_to :security_descriptor_length }
89
+ it { is_expected.to respond_to :ea_length }
90
+ it { is_expected.to respond_to :impersonation_level }
91
+ it { is_expected.to respond_to :security_flags }
92
+ it { is_expected.to respond_to :name }
93
+
94
+ describe '#desired_access' do
95
+ it 'is a File Access Mask' do
96
+ expect(parameters.desired_access).to be_a RubySMB::SMB1::BitField::FileAccessMask
97
+ end
98
+ end
99
+
100
+ describe '#ext_file_attribute' do
101
+ it 'is a SMB Extended File Attributes struct' do
102
+ expect(parameters.ext_file_attribute).to be_a RubySMB::SMB1::BitField::SmbExtFileAttributes
103
+ end
104
+ end
105
+
106
+ describe '#share_access' do
107
+ it 'is a ShareAcess bitfield' do
108
+ expect(parameters.share_access).to be_a RubySMB::SMB1::BitField::ShareAccess
109
+ end
110
+ end
111
+
112
+ describe '#create_options' do
113
+ it 'is a CreateOptions bit field' do
114
+ expect(parameters.create_options).to be_a RubySMB::SMB1::BitField::CreateOptions
115
+ end
116
+ end
117
+
118
+ describe '#flags' do
119
+ subject(:flags) { parameters.flags }
120
+
121
+ it { is_expected.to respond_to :open_target_dir }
122
+ it { is_expected.to respond_to :request_opbatch }
123
+ it { is_expected.to respond_to :request_oplock }
124
+
125
+ describe '#open_target_dir' do
126
+ it 'is a 1-bit flag' do
127
+ expect(flags.open_target_dir).to be_a BinData::Bit1
128
+ end
129
+
130
+ it_behaves_like 'bit field with one flag set', :open_target_dir, 'V', 0x00000008
131
+ end
132
+
133
+ describe '#request_opbatch' do
134
+ it 'is a 1-bit flag' do
135
+ expect(flags.request_opbatch).to be_a BinData::Bit1
136
+ end
137
+
138
+ it_behaves_like 'bit field with one flag set', :request_opbatch, 'V', 0x00000004
139
+ end
140
+
141
+ describe '#request_oplock' do
142
+ it 'is a 1-bit flag' do
143
+ expect(flags.request_oplock).to be_a BinData::Bit1
144
+ end
145
+
146
+ it_behaves_like 'bit field with one flag set', :request_oplock, 'V', 0x00000002
147
+ end
148
+ end
149
+
150
+ describe '#security_flags' do
151
+ subject(:sec_flags) { parameters.security_flags }
152
+
153
+ it { is_expected.to respond_to :effective_only }
154
+ it { is_expected.to respond_to :context_tracking }
155
+
156
+ describe '#effective_only' do
157
+ it 'is a 1-bit flag' do
158
+ expect(sec_flags.effective_only).to be_a BinData::Bit1
159
+ end
160
+
161
+ it_behaves_like 'bit field with one flag set', :effective_only, 'C', 0x02
162
+ end
163
+
164
+ describe '#context_tracking' do
165
+ it 'is a 1-bit flag' do
166
+ expect(sec_flags.context_tracking).to be_a BinData::Bit1
167
+ end
168
+
169
+ it_behaves_like 'bit field with one flag set', :context_tracking, 'C', 0x01
170
+ end
171
+ end
172
+ end
173
+
174
+ describe '#trans2_data' do
175
+ subject(:data) { data_block.trans2_data}
176
+
177
+ it { is_expected.to respond_to :security_descriptor }
178
+ it { is_expected.to respond_to :extended_attributes }
179
+
180
+ describe '#security_descriptor' do
181
+ it 'is a Security Descriptor struct' do
182
+ expect(data.security_descriptor).to be_a RubySMB::Field::SecurityDescriptor
183
+ end
184
+ end
185
+
186
+ describe '#extended_attributes' do
187
+ it 'is a FileFullEAInfo struct' do
188
+ expect(data.extended_attributes).to be_a RubySMB::Field::FileFullEaInfo
189
+ end
190
+ end
191
+ end
192
+
193
+ end
194
+ end