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,65 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans2
5
+
6
+ # This class represents an SMB1 Trans2 Open2 Response Packet as defined in
7
+ # [2.2.6.1.2 Response](https://msdn.microsoft.com/en-us/library/ee441545.aspx)
8
+ class Open2Response < RubySMB::GenericPacket
9
+
10
+ class ParameterBlock < RubySMB::SMB1::Packet::Trans2::Response::ParameterBlock
11
+ end
12
+
13
+ class Trans2Parameters < BinData::Record
14
+ endian :little
15
+ uint8 :fid, label: 'File ID'
16
+ smb_file_attributes :file_attributes, label: 'File Attributes'
17
+ utime :creation_time, label: 'Creation Time'
18
+ open2_access_mode :access_mode, label: 'AccessMode'
19
+ uint16 :resource_type, label: 'Resource Type'
20
+ smb_nmpipe_status :nmpipe_status, label: 'Named Pipe Status'
21
+
22
+ struct :action_taken do
23
+ endian :little
24
+ bit6 :reserved, label: 'Reserved Space'
25
+ bit2 :open_result, label: 'Open Result'
26
+ # byte boundary
27
+ bit1 :lock_status, label: 'Lock Status'
28
+ resume_byte_alignment
29
+ end
30
+
31
+ uint32 :reserved, label: 'Reserved Space'
32
+ uint16 :extended_attribute_offset, label: 'Extended Attribute Offset'
33
+ uint32 :extended_attribute_length, label: 'Extended Attribute Length'
34
+
35
+ # Returns the length of the Trans2Parameters struct
36
+ # in number of bytes
37
+ def length
38
+ self.do_num_bytes
39
+ end
40
+ end
41
+
42
+ class DataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
43
+ string :pad1, length: lambda { pad1_length }
44
+ trans2_parameters :trans2_parameters, label: 'Trans2 Parameters'
45
+ string :pad2, length: lambda { pad2_length }
46
+ string :trans2_data, label: 'Trans2 Data', length: 0
47
+ end
48
+
49
+ smb_header :smb_header
50
+ parameter_block :parameter_block
51
+ data_block :data_block
52
+
53
+ def initialize_instance
54
+ super
55
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
56
+ parameter_block.setup << RubySMB::SMB1::Packet::Trans2::Subcommands::OPEN2
57
+ smb_header.flags.reply = 1
58
+ end
59
+
60
+
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,52 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans2
5
+
6
+ # This class represents a generic SMB1 Trans2 Request Packet as defined in
7
+ # [2.2.4.46.1 Request](https://msdn.microsoft.com/en-us/library/ee442192.aspx)
8
+ class Request < RubySMB::GenericPacket
9
+
10
+ class ParameterBlock < RubySMB::SMB1::ParameterBlock
11
+ uint16 :total_parameter_count, label: 'Total Parameter Count(bytes)'
12
+ uint16 :total_data_count, label: 'Total Data Count(bytes)'
13
+ uint16 :max_parameter_count, label: 'Max Parameter Count(bytes)'
14
+ uint16 :max_data_count, label: 'Max Data Count(bytes)'
15
+ uint8 :max_setup_count, label: 'Max Setup Count'
16
+ uint8 :reserved, label: 'Reserved Space', value: 0x00
17
+ trans2_flags :flags
18
+ uint32 :timeout, label: 'Timeout', initial_value: 0x00000000
19
+ uint16 :reserved2, label: 'Reserved Space', value: 0x00
20
+ uint16 :parameter_count, label: 'Parameter Count(bytes)', value: lambda {self.parent.data_block.trans2_parameters.length}
21
+ uint16 :parameter_offset, label: 'Parameter Offset', value: lambda {self.parent.data_block.trans2_parameters.abs_offset}
22
+ uint16 :data_count, label: 'Data Count(bytes)', value: lambda {self.parent.data_block.trans2_data.length}
23
+ uint16 :data_offset, label: 'Data Offset', value: lambda {self.parent.data_block.trans2_data.abs_offset}
24
+ uint8 :setup_count, label: 'Setup Count', value: lambda {setup.length}
25
+ uint8 :reserved3, label: 'Reserved Space', value: 0x00
26
+
27
+ array :setup, type: :uint16, initial_length: 0
28
+ end
29
+
30
+ class DataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
31
+ uint8 :name, label: 'Name', initial_value: 0x00
32
+ string :pad1, length: lambda { pad1_length }
33
+ string :trans2_parameters, label: 'Trans2 Parameters'
34
+ string :pad2, length: lambda { pad2_length }
35
+ string :trans2_data, label: 'Trans2 Data'
36
+ end
37
+
38
+ smb_header :smb_header
39
+ parameter_block :parameter_block
40
+ data_block :data_block
41
+
42
+ def initialize_instance
43
+ super
44
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
45
+ end
46
+
47
+
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,39 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans2
5
+
6
+ # This class represents a generic SMB1 Trans2 Secondary Request Packet as defined in
7
+ # [2.2.4.47.1 Request](https://msdn.microsoft.com/en-us/library/ee442105.aspx)
8
+ class RequestSecondary < RubySMB::GenericPacket
9
+
10
+ class ParameterBlock < RubySMB::SMB1::ParameterBlock
11
+ uint16 :total_parameter_count, label: 'Total Parameter Count(bytes)'
12
+ uint16 :total_data_count, label: 'Total Data Count(bytes)'
13
+ uint16 :parameter_count, label: 'Parameter Count(bytes)', value: lambda {self.parent.data_block.trans2_parameters.length}
14
+ uint16 :parameter_offset, label: 'Parameter Offset', value: lambda {self.parent.data_block.trans2_parameters.abs_offset}
15
+ uint16 :parameter_displacement, label: 'Parameter Displacement'
16
+ uint16 :data_count, label: 'Data Count(bytes)', value: lambda {self.parent.data_block.trans2_data.length}
17
+ uint16 :data_offset, label: 'Data Offset', value: lambda {self.parent.data_block.trans2_data.abs_offset}
18
+ uint16 :data_displacement, label: 'Data Displacement'
19
+ uint16 :fid, label: 'FileID'
20
+ end
21
+
22
+ class DataBlock < RubySMB::SMB1::Packet::Trans2::Request::DataBlock
23
+ end
24
+
25
+ smb_header :smb_header
26
+ parameter_block :parameter_block
27
+ data_block :data_block
28
+
29
+ def initialize_instance
30
+ super
31
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2_SECONDARY
32
+ end
33
+
34
+
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,48 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans2
5
+
6
+ # This class represents a generic SMB1 Trans2 Response Packet as defined in
7
+ # [2.2.4.46.2 Response](https://msdn.microsoft.com/en-us/library/ee441550.aspx)
8
+ class Response < RubySMB::GenericPacket
9
+
10
+ class ParameterBlock < RubySMB::SMB1::ParameterBlock
11
+ uint16 :total_parameter_count, label: 'Total Parameter Count(bytes)'
12
+ uint16 :total_data_count, label: 'Total Data Count(bytes)'
13
+ uint16 :reserved, label: 'Reserved Space', value: 0x00
14
+ uint16 :parameter_count, label: 'Parameter Count(bytes)', value: lambda {self.parent.data_block.trans2_parameters.length}
15
+ uint16 :parameter_offset, label: 'Parameter Offset', value: lambda {self.parent.data_block.trans2_parameters.abs_offset}
16
+ uint16 :parameter_displacement, label: 'Parameter Displacement'
17
+ uint16 :data_count, label: 'Data Count(bytes)', value: lambda {self.parent.data_block.trans2_data.length}
18
+ uint16 :data_offset, label: 'Data Offset', value: lambda {self.parent.data_block.trans2_data.abs_offset}
19
+ uint16 :data_displacement, label: 'Data Displacement'
20
+ uint8 :setup_count, label: 'Setup Count', value: lambda {setup.length}
21
+ uint8 :reserved2, label: 'Reserved Space', value: 0x00
22
+
23
+ array :setup, type: :uint16, initial_length: 0
24
+ end
25
+
26
+ class DataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
27
+ string :pad1, length: lambda { pad1_length }
28
+ string :trans2_parameters, label: 'Trans2 Parameters'
29
+ string :pad2, length: lambda { pad2_length }
30
+ string :trans2_data, label: 'Trans2 Data'
31
+ end
32
+
33
+ smb_header :smb_header
34
+ parameter_block :parameter_block
35
+ data_block :data_block
36
+
37
+ def initialize_instance
38
+ super
39
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
40
+ smb_header.flags.reply = 1
41
+ end
42
+
43
+
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,12 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans2
5
+ module Subcommands
6
+ OPEN2 = 0x0000
7
+ SESSION_SETUP = 0x000E
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+
5
+ # Namespace for the Transaction2 sub-protocol documented in
6
+ # [2.2.4.46 SMB_COM_TRANSACTION2 (0x32)](https://msdn.microsoft.com/en-us/library/ee441652.aspx)
7
+ module Trans2
8
+ require 'ruby_smb/smb1/packet/trans2/data_block'
9
+ require 'ruby_smb/smb1/packet/trans2/subcommands'
10
+ require 'ruby_smb/smb1/packet/trans2/request'
11
+ require 'ruby_smb/smb1/packet/trans2/request_secondary'
12
+ require 'ruby_smb/smb1/packet/trans2/response'
13
+ require 'ruby_smb/smb1/packet/trans2/open2_request'
14
+ require 'ruby_smb/smb1/packet/trans2/open2_response'
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,7 +1,7 @@
1
1
  module RubySMB
2
2
  module SMB1
3
3
  module Packet
4
- require 'ruby_smb/smb1/packet/error_packet'
4
+ require 'ruby_smb/smb1/packet/empty_packet'
5
5
  require 'ruby_smb/smb1/packet/negotiate_request'
6
6
  require 'ruby_smb/smb1/packet/negotiate_response'
7
7
  require 'ruby_smb/smb1/packet/negotiate_response_extended'
@@ -13,6 +13,10 @@ module RubySMB
13
13
  require 'ruby_smb/smb1/packet/tree_disconnect_response'
14
14
  require 'ruby_smb/smb1/packet/logoff_request'
15
15
  require 'ruby_smb/smb1/packet/logoff_response'
16
+ require 'ruby_smb/smb1/packet/echo_request'
17
+ require 'ruby_smb/smb1/packet/echo_response'
18
+ require 'ruby_smb/smb1/packet/trans2'
19
+ require 'ruby_smb/smb1/packet/nt_trans'
16
20
  end
17
21
  end
18
22
  end
data/lib/ruby_smb/smb1.rb CHANGED
@@ -4,6 +4,9 @@ module RubySMB::SMB1
4
4
  # Protocol ID value. Translates to \xFFSMB
5
5
  SMB_PROTOCOL_ID = 0xFF534D42
6
6
 
7
+ require 'ruby_smb/smb1/dispositions'
8
+ require 'ruby_smb/smb1/create_actions'
9
+ require 'ruby_smb/smb1/oplock_levels'
7
10
  require 'ruby_smb/smb1/commands'
8
11
  require 'ruby_smb/smb1/andx_block'
9
12
  require 'ruby_smb/smb1/bit_field'
@@ -4,12 +4,12 @@ module RubySMB
4
4
  require 'ruby_smb/smb2/bit_field/smb2_header_flags'
5
5
  require 'ruby_smb/smb2/bit_field/smb2_security_mode'
6
6
  require 'ruby_smb/smb2/bit_field/smb2_security_mode_single'
7
- require 'ruby_smb/smb2/bit_field/smb2_capabailities'
7
+ require 'ruby_smb/smb2/bit_field/smb2_capabilities'
8
8
  require 'ruby_smb/smb2/bit_field/session_flags'
9
9
  require 'ruby_smb/smb2/bit_field/directory_access_mask'
10
10
  require 'ruby_smb/smb2/bit_field/file_access_mask'
11
11
  require 'ruby_smb/smb2/bit_field/share_flags'
12
- require 'ruby_smb/smb2/bit_field/share_capabailities'
12
+ require 'ruby_smb/smb2/bit_field/share_capabilities'
13
13
  end
14
14
  end
15
15
  end
@@ -0,0 +1,21 @@
1
+ module RubySMB
2
+ module SMB2
3
+ module Packet
4
+
5
+ # An SMB2 Echo Request Packet as defined in
6
+ # [2.2.28 SMB2 ECHO Request](https://msdn.microsoft.com/en-us/library/cc246540.aspx)
7
+ class EchoRequest < RubySMB::GenericPacket
8
+ endian :little
9
+ smb2_header :smb2_header
10
+ uint16 :structure_size, label: 'Structure Size', initial_value: 4
11
+ uint16 :reserved
12
+
13
+ def initialize_instance
14
+ super
15
+ smb2_header.command = RubySMB::SMB2::Commands::ECHO
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,22 @@
1
+ module RubySMB
2
+ module SMB2
3
+ module Packet
4
+
5
+ # An SMB2 Echo response Packet as defined in
6
+ # [2.2.29 SMB2 ECHO Response](https://msdn.microsoft.com/en-us/library/cc246541.aspx)
7
+ class EchoResponse < RubySMB::GenericPacket
8
+ endian :little
9
+ smb2_header :smb2_header
10
+ uint16 :structure_size, label: 'Structure Size', initial_value: 4
11
+ uint16 :reserved
12
+
13
+ def initialize_instance
14
+ super
15
+ smb2_header.command = RubySMB::SMB2::Commands::ECHO
16
+ smb2_header.flags.reply = 1
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
@@ -12,6 +12,8 @@ module RubySMB
12
12
  require 'ruby_smb/smb2/packet/tree_disconnect_response'
13
13
  require 'ruby_smb/smb2/packet/logoff_request'
14
14
  require 'ruby_smb/smb2/packet/logoff_response'
15
+ require 'ruby_smb/smb2/packet/echo_request'
16
+ require 'ruby_smb/smb2/packet/echo_response'
15
17
  end
16
18
  end
17
19
  end
@@ -1,3 +1,3 @@
1
1
  module RubySMB
2
- VERSION = '0.0.12'
2
+ VERSION = '0.0.13'
3
3
  end
data/ruby_smb.gemspec CHANGED
@@ -26,6 +26,8 @@ Gem::Specification.new do |spec|
26
26
  spec.platform = Gem::Platform::RUBY
27
27
  end
28
28
 
29
+ spec.required_ruby_version = '>= 2.2.0'
30
+
29
31
  spec.add_development_dependency 'bundler'
30
32
  spec.add_development_dependency 'fivemat'
31
33
  spec.add_development_dependency 'rake'
@@ -745,4 +745,50 @@ RSpec.describe RubySMB::Client do
745
745
 
746
746
  end
747
747
  end
748
+
749
+ context 'Echo command' do
750
+ context 'with SMB1' do
751
+ let(:echo_request) { RubySMB::SMB1::Packet::EchoRequest.new }
752
+ let(:echo_response) {
753
+ packet = RubySMB::SMB1::Packet::EchoResponse.new
754
+ packet.smb_header.nt_status = 0x00000080
755
+ packet
756
+ }
757
+
758
+ before(:each) do
759
+ allow(RubySMB::SMB2::Packet::EchoRequest).to receive(:new).and_return(echo_request)
760
+ end
761
+
762
+ it 'sets the echo_count on the request packet' do
763
+ modified_request = echo_request
764
+ modified_request.parameter_block.echo_count = 5
765
+ expect(smb1_client).to receive(:send_recv).with(modified_request).and_return(echo_response.to_binary_s)
766
+ expect(dispatcher).to receive(:recv_packet).exactly(4).times.and_return(echo_response.to_binary_s)
767
+ smb1_client.smb1_echo(count: 5)
768
+ end
769
+
770
+ it 'sets the data on the request packet' do
771
+ modified_request = echo_request
772
+ modified_request.data_block.data = "DEADBEEF"
773
+ expect(smb1_client).to receive(:send_recv).with(modified_request).and_return(echo_response.to_binary_s)
774
+ smb1_client.smb1_echo(data: "DEADBEEF")
775
+ end
776
+
777
+ it 'returns the NT status code' do
778
+ expect(smb1_client).to receive(:send_recv).and_return(echo_response.to_binary_s)
779
+ expect(smb1_client.echo).to eq WindowsError::NTStatus::STATUS_ABANDONED
780
+ end
781
+ end
782
+
783
+ context 'with SMB2' do
784
+ let(:echo_request) { RubySMB::SMB2::Packet::EchoRequest.new }
785
+ let(:echo_response) { RubySMB::SMB2::Packet::EchoResponse.new }
786
+
787
+ it '#smb2_echo sends an Echo Request and returns a response' do
788
+ allow(RubySMB::SMB2::Packet::EchoRequest).to receive(:new).and_return(echo_request)
789
+ expect(smb2_client).to receive(:send_recv).with(echo_request).and_return(echo_response.to_binary_s)
790
+ expect(smb2_client.smb2_echo).to eq echo_response
791
+ end
792
+ end
793
+ end
748
794
  end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::Field::EaInfoArray do
4
+ subject(:info_array) { described_class.new(type: :file_full_ea_info) }
5
+ let(:first_ea) {
6
+ ea = RubySMB::Field::FileFullEaInfo.new
7
+ ea.ea_name = 'First'
8
+ ea.ea_value = 'First Value'
9
+ ea
10
+ }
11
+ let(:second_ea) {
12
+ ea = RubySMB::Field::FileFullEaInfo.new
13
+ ea.ea_name = 'Second'
14
+ ea.ea_value = 'Second Value'
15
+ ea
16
+ }
17
+ let(:additional_ea) {
18
+ ea = RubySMB::Field::FileFullEaInfo.new
19
+ ea.ea_name = 'Additional'
20
+ ea.ea_value = 'Additional Value'
21
+ ea
22
+ }
23
+
24
+ it 'updates the offset of the first element when a second is appended' do
25
+ info_array << first_ea
26
+ info_array << second_ea
27
+ expect(info_array[0].next_entry_offset).to eq info_array[1].rel_offset
28
+ end
29
+
30
+ it 'sets the last offset to 0' do
31
+ info_array << first_ea
32
+ expect(info_array[0].next_entry_offset).to eq 0
33
+ end
34
+
35
+ it 'updates offset when setting a particular element' do
36
+ info_array << first_ea
37
+ info_array << second_ea
38
+ info_array[0] = additional_ea
39
+ expect(info_array[0].next_entry_offset).to eq info_array[1].rel_offset
40
+ end
41
+
42
+ it 'raises an error when inserting an invalid object' do
43
+ expect{ info_array << "Foo" }.to raise_error(ArgumentError)
44
+ end
45
+
46
+ it 'raises an error when setting an invalid value' do
47
+ expect{ info_array[0] = "Foo" }.to raise_error(ArgumentError)
48
+ end
49
+
50
+
51
+ end
@@ -0,0 +1,16 @@
1
+ RSpec.describe RubySMB::Field::ExtendedAttributeFlag do
2
+ subject(:flag) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :file_need_ea }
5
+
6
+
7
+ describe 'file_need_ea' do
8
+ it 'should be a 1-bit field per the SMB spec' do
9
+ expect(flag.file_need_ea).to be_a BinData::Bit1
10
+ end
11
+
12
+
13
+ it_behaves_like 'bit field with one flag set', :file_need_ea, 'C', 0x80
14
+ end
15
+
16
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::Field::FileFullEaInfo do
4
+ subject(:info) { described_class.new }
5
+
6
+ it { is_expected.to respond_to :next_entry_offset }
7
+ it { is_expected.to respond_to :flags }
8
+ it { is_expected.to respond_to :ea_name_length }
9
+ it { is_expected.to respond_to :ea_value_length }
10
+ it { is_expected.to respond_to :ea_name }
11
+ it { is_expected.to respond_to :ea_value }
12
+
13
+ it 'is little endian' do
14
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
15
+ end
16
+
17
+ describe '#flags' do
18
+ it 'is an extended_attribute_flag' do
19
+ expect(info.flags).to be_a RubySMB::Field::ExtendedAttributeFlag
20
+ end
21
+ end
22
+
23
+ describe '#ea_name_length' do
24
+ it 'stores the length of the #ea_name field' do
25
+ expect(info.ea_name_length).to eq info.ea_name.do_num_bytes
26
+ end
27
+ end
28
+
29
+ describe '#ea_value_length' do
30
+ it 'stores the length of the #ea_value field' do
31
+ expect(info.ea_value_length).to eq info.ea_value.do_num_bytes
32
+ end
33
+ end
34
+
35
+ end