ruby_smb 0.0.18 → 0.0.19

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 (298) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +247 -7
  5. data/examples/anonymous_auth.rb +6 -3
  6. data/examples/append_file.rb +40 -0
  7. data/examples/authenticate.rb +12 -7
  8. data/examples/delete_file.rb +40 -0
  9. data/examples/list_directory.rb +45 -0
  10. data/examples/negotiate.rb +0 -1
  11. data/examples/negotiate_with_netbios_service.rb +36 -0
  12. data/examples/net_share_enum_all.rb +30 -0
  13. data/examples/read_file.rb +39 -0
  14. data/examples/rename_file.rb +41 -0
  15. data/examples/tree_connect.rb +2 -4
  16. data/examples/write_file.rb +40 -0
  17. data/lib/ruby_smb.rb +5 -0
  18. data/lib/ruby_smb/client.rb +196 -43
  19. data/lib/ruby_smb/client/authentication.rb +89 -48
  20. data/lib/ruby_smb/client/echo.rb +1 -4
  21. data/lib/ruby_smb/client/negotiation.rb +46 -45
  22. data/lib/ruby_smb/client/signing.rb +9 -16
  23. data/lib/ruby_smb/client/tree_connect.rb +8 -13
  24. data/lib/ruby_smb/client/utils.rb +79 -0
  25. data/lib/ruby_smb/dcerpc.rb +30 -0
  26. data/lib/ruby_smb/dcerpc/bind.rb +60 -0
  27. data/lib/ruby_smb/dcerpc/handle.rb +60 -0
  28. data/lib/ruby_smb/dcerpc/ndr.rb +41 -0
  29. data/lib/ruby_smb/dcerpc/request.rb +43 -0
  30. data/lib/ruby_smb/dcerpc/response.rb +46 -0
  31. data/lib/ruby_smb/dcerpc/srvsvc.rb +17 -0
  32. data/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all.rb +93 -0
  33. data/lib/ruby_smb/dcerpc/uuid.rb +28 -0
  34. data/lib/ruby_smb/dispatcher.rb +7 -3
  35. data/lib/ruby_smb/dispatcher/base.rb +23 -14
  36. data/lib/ruby_smb/dispatcher/socket.rb +71 -51
  37. data/lib/ruby_smb/dispositions.rb +32 -0
  38. data/lib/ruby_smb/error.rb +24 -18
  39. data/lib/ruby_smb/field.rb +5 -2
  40. data/lib/ruby_smb/field/extended_attribute_flag.rb +1 -1
  41. data/lib/ruby_smb/field/file_time.rb +3 -1
  42. data/lib/ruby_smb/field/security_descriptor.rb +6 -6
  43. data/lib/ruby_smb/field/smb2_fileid.rb +11 -0
  44. data/lib/ruby_smb/field/smb_fea.rb +3 -3
  45. data/lib/ruby_smb/field/smb_fea_list.rb +3 -3
  46. data/lib/ruby_smb/field/smb_gea.rb +12 -0
  47. data/lib/ruby_smb/field/smb_gea_list.rb +13 -0
  48. data/lib/ruby_smb/field/string16.rb +14 -0
  49. data/lib/ruby_smb/field/stringz16.rb +3 -7
  50. data/lib/ruby_smb/field/utime.rb +11 -10
  51. data/lib/ruby_smb/fscc.rb +12 -0
  52. data/lib/ruby_smb/fscc/control_codes.rb +26 -0
  53. data/lib/ruby_smb/{field → fscc}/ea_info_array.rb +12 -14
  54. data/lib/ruby_smb/fscc/file_attributes.rb +29 -0
  55. data/lib/ruby_smb/{field → fscc}/file_full_ea_info.rb +5 -5
  56. data/lib/ruby_smb/fscc/file_information.rb +60 -0
  57. data/lib/ruby_smb/fscc/file_information/file_both_directory_information.rb +29 -0
  58. data/lib/ruby_smb/fscc/file_information/file_directory_information.rb +25 -0
  59. data/lib/ruby_smb/fscc/file_information/file_disposition_information.rb +15 -0
  60. data/lib/ruby_smb/fscc/file_information/file_full_directory_information.rb +26 -0
  61. data/lib/ruby_smb/fscc/file_information/file_id_both_directory_information.rb +31 -0
  62. data/lib/ruby_smb/fscc/file_information/file_id_full_directory_information.rb +28 -0
  63. data/lib/ruby_smb/fscc/file_information/file_names_information.rb +18 -0
  64. data/lib/ruby_smb/fscc/file_information/file_rename_information.rb +44 -0
  65. data/lib/ruby_smb/generic_packet.rb +40 -18
  66. data/lib/ruby_smb/gss.rb +49 -56
  67. data/lib/ruby_smb/impersonation_levels.rb +7 -2
  68. data/lib/ruby_smb/nbss.rb +16 -0
  69. data/lib/ruby_smb/nbss/negative_session_response.rb +30 -0
  70. data/lib/ruby_smb/nbss/session_header.rb +13 -0
  71. data/lib/ruby_smb/nbss/session_request.rb +13 -0
  72. data/lib/ruby_smb/smb1.rb +20 -17
  73. data/lib/ruby_smb/smb1/bit_field.rb +3 -0
  74. data/lib/ruby_smb/smb1/bit_field/create_options.rb +5 -5
  75. data/lib/ruby_smb/smb1/bit_field/file_status_flags.rb +18 -0
  76. data/lib/ruby_smb/smb1/bit_field/open2_access_mode.rb +11 -11
  77. data/lib/ruby_smb/smb1/bit_field/open2_open_mode.rb +1 -1
  78. data/lib/ruby_smb/smb1/bit_field/optional_support.rb +0 -1
  79. data/lib/ruby_smb/smb1/bit_field/security_flags.rb +15 -0
  80. data/lib/ruby_smb/smb1/bit_field/share_access.rb +2 -3
  81. data/lib/ruby_smb/smb1/bit_field/smb_ext_file_attributes.rb +21 -24
  82. data/lib/ruby_smb/smb1/bit_field/smb_file_attributes.rb +1 -1
  83. data/lib/ruby_smb/smb1/commands.rb +5 -0
  84. data/lib/ruby_smb/smb1/create_actions.rb +3 -5
  85. data/lib/ruby_smb/smb1/file.rb +289 -0
  86. data/lib/ruby_smb/smb1/oplock_levels.rb +2 -4
  87. data/lib/ruby_smb/smb1/packet.rb +10 -0
  88. data/lib/ruby_smb/smb1/packet/close_request.rb +31 -0
  89. data/lib/ruby_smb/smb1/packet/close_response.rb +28 -0
  90. data/lib/ruby_smb/smb1/packet/echo_request.rb +5 -7
  91. data/lib/ruby_smb/smb1/packet/echo_response.rb +5 -7
  92. data/lib/ruby_smb/smb1/packet/empty_packet.rb +1 -2
  93. data/lib/ruby_smb/smb1/packet/logoff_request.rb +1 -4
  94. data/lib/ruby_smb/smb1/packet/logoff_response.rb +1 -4
  95. data/lib/ruby_smb/smb1/packet/negotiate_response.rb +22 -0
  96. data/lib/ruby_smb/smb1/packet/negotiate_response_extended.rb +22 -0
  97. data/lib/ruby_smb/smb1/packet/nt_create_andx_request.rb +62 -0
  98. data/lib/ruby_smb/smb1/packet/nt_create_andx_response.rb +66 -0
  99. data/lib/ruby_smb/smb1/packet/nt_trans.rb +1 -2
  100. data/lib/ruby_smb/smb1/packet/nt_trans/create_request.rb +19 -13
  101. data/lib/ruby_smb/smb1/packet/nt_trans/create_response.rb +8 -10
  102. data/lib/ruby_smb/smb1/packet/nt_trans/request.rb +11 -11
  103. data/lib/ruby_smb/smb1/packet/nt_trans/response.rb +10 -10
  104. data/lib/ruby_smb/smb1/packet/nt_trans/subcommands.rb +8 -1
  105. data/lib/ruby_smb/smb1/packet/read_andx_request.rb +84 -0
  106. data/lib/ruby_smb/smb1/packet/read_andx_response.rb +47 -0
  107. data/lib/ruby_smb/smb1/packet/session_setup_legacy_request.rb +2 -6
  108. data/lib/ruby_smb/smb1/packet/session_setup_legacy_response.rb +1 -4
  109. data/lib/ruby_smb/smb1/packet/session_setup_request.rb +1 -6
  110. data/lib/ruby_smb/smb1/packet/session_setup_response.rb +2 -4
  111. data/lib/ruby_smb/smb1/packet/trans2.rb +8 -2
  112. data/lib/ruby_smb/smb1/packet/trans2/data_block.rb +6 -7
  113. data/lib/ruby_smb/smb1/packet/trans2/find_first2_request.rb +77 -0
  114. data/lib/ruby_smb/smb1/packet/trans2/find_first2_response.rb +87 -0
  115. data/lib/ruby_smb/smb1/packet/trans2/find_information_level.rb +32 -0
  116. data/lib/ruby_smb/smb1/packet/trans2/find_information_level/find_file_full_directory_info.rb +45 -0
  117. data/lib/ruby_smb/smb1/packet/trans2/find_next2_request.rb +77 -0
  118. data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +86 -0
  119. data/lib/ruby_smb/smb1/packet/trans2/open2_request.rb +10 -10
  120. data/lib/ruby_smb/smb1/packet/trans2/open2_response.rb +10 -12
  121. data/lib/ruby_smb/smb1/packet/trans2/request.rb +15 -17
  122. data/lib/ruby_smb/smb1/packet/trans2/request_secondary.rb +8 -10
  123. data/lib/ruby_smb/smb1/packet/trans2/response.rb +11 -13
  124. data/lib/ruby_smb/smb1/packet/trans2/set_file_information_request.rb +66 -0
  125. data/lib/ruby_smb/smb1/packet/trans2/set_file_information_response.rb +57 -0
  126. data/lib/ruby_smb/smb1/packet/trans2/subcommands.rb +5 -2
  127. data/lib/ruby_smb/smb1/packet/tree_connect_request.rb +4 -6
  128. data/lib/ruby_smb/smb1/packet/tree_connect_response.rb +5 -7
  129. data/lib/ruby_smb/smb1/packet/tree_disconnect_request.rb +2 -4
  130. data/lib/ruby_smb/smb1/packet/tree_disconnect_response.rb +2 -4
  131. data/lib/ruby_smb/smb1/packet/write_andx_request.rb +68 -0
  132. data/lib/ruby_smb/smb1/packet/write_andx_response.rb +35 -0
  133. data/lib/ruby_smb/smb1/resource_type.rb +18 -0
  134. data/lib/ruby_smb/smb1/tree.rb +188 -5
  135. data/lib/ruby_smb/smb2.rb +16 -11
  136. data/lib/ruby_smb/smb2/bit_field.rb +1 -0
  137. data/lib/ruby_smb/smb2/bit_field/file_access_mask.rb +1 -1
  138. data/lib/ruby_smb/smb2/bit_field/session_flags.rb +1 -2
  139. data/lib/ruby_smb/smb2/bit_field/share_flags.rb +4 -6
  140. data/lib/ruby_smb/smb2/create_context.rb +29 -0
  141. data/lib/ruby_smb/smb2/file.rb +251 -0
  142. data/lib/ruby_smb/smb2/info_type.rb +21 -0
  143. data/lib/ruby_smb/smb2/packet.rb +16 -0
  144. data/lib/ruby_smb/smb2/packet/close_request.rb +22 -0
  145. data/lib/ruby_smb/smb2/packet/close_response.rb +29 -0
  146. data/lib/ruby_smb/smb2/packet/create_request.rb +54 -0
  147. data/lib/ruby_smb/smb2/packet/create_response.rb +35 -0
  148. data/lib/ruby_smb/smb2/packet/echo_request.rb +1 -3
  149. data/lib/ruby_smb/smb2/packet/echo_response.rb +1 -3
  150. data/lib/ruby_smb/smb2/packet/error_packet.rb +1 -3
  151. data/lib/ruby_smb/smb2/packet/ioctl_request.rb +54 -0
  152. data/lib/ruby_smb/smb2/packet/ioctl_response.rb +39 -0
  153. data/lib/ruby_smb/smb2/packet/logoff_request.rb +1 -4
  154. data/lib/ruby_smb/smb2/packet/logoff_response.rb +1 -4
  155. data/lib/ruby_smb/smb2/packet/negotiate_request.rb +1 -1
  156. data/lib/ruby_smb/smb2/packet/negotiate_response.rb +1 -1
  157. data/lib/ruby_smb/smb2/packet/query_directory_request.rb +35 -0
  158. data/lib/ruby_smb/smb2/packet/query_directory_response.rb +45 -0
  159. data/lib/ruby_smb/smb2/packet/read_request.rb +30 -0
  160. data/lib/ruby_smb/smb2/packet/read_response.rb +26 -0
  161. data/lib/ruby_smb/smb2/packet/session_setup_request.rb +2 -5
  162. data/lib/ruby_smb/smb2/packet/session_setup_response.rb +4 -7
  163. data/lib/ruby_smb/smb2/packet/set_info_request.rb +58 -0
  164. data/lib/ruby_smb/smb2/packet/set_info_response.rb +20 -0
  165. data/lib/ruby_smb/smb2/packet/tree_connect_request.rb +3 -4
  166. data/lib/ruby_smb/smb2/packet/tree_connect_response.rb +5 -9
  167. data/lib/ruby_smb/smb2/packet/tree_disconnect_request.rb +1 -4
  168. data/lib/ruby_smb/smb2/packet/tree_disconnect_response.rb +1 -4
  169. data/lib/ruby_smb/smb2/packet/write_request.rb +29 -0
  170. data/lib/ruby_smb/smb2/packet/write_response.rb +26 -0
  171. data/lib/ruby_smb/smb2/tree.rb +163 -7
  172. data/lib/ruby_smb/version.rb +1 -1
  173. data/spec/lib/ruby_smb/client_spec.rb +459 -120
  174. data/spec/lib/ruby_smb/dcerpc/bind_spec.rb +14 -0
  175. data/spec/lib/ruby_smb/dcerpc/handle_spec.rb +31 -0
  176. data/spec/lib/ruby_smb/dcerpc/request_spec.rb +21 -0
  177. data/spec/lib/ruby_smb/dcerpc/response_spec.rb +15 -0
  178. data/spec/lib/ruby_smb/dcerpc/srvsvc_spec.rb +13 -0
  179. data/spec/lib/ruby_smb/dcerpc/uuid_spec.rb +12 -0
  180. data/spec/lib/ruby_smb/dispatcher/base_spec.rb +26 -0
  181. data/spec/lib/ruby_smb/dispatcher/socket_spec.rb +118 -18
  182. data/spec/lib/ruby_smb/field/extended_attribute_flag_spec.rb +0 -3
  183. data/spec/lib/ruby_smb/field/file_time_spec.rb +4 -2
  184. data/spec/lib/ruby_smb/field/security_descriptor.rb +0 -1
  185. data/spec/lib/ruby_smb/field/smb2_fileid_spec.rb +10 -0
  186. data/spec/lib/ruby_smb/field/smb_fea_list_spec.rb +3 -5
  187. data/spec/lib/ruby_smb/field/smb_gea_list_spec.rb +37 -0
  188. data/spec/lib/ruby_smb/field/smb_gea_spec.rb +22 -0
  189. data/spec/lib/ruby_smb/field/stringz16_spec.rb +7 -9
  190. data/spec/lib/ruby_smb/field/utime_spec.rb +4 -2
  191. data/spec/lib/ruby_smb/{field → fscc}/ea_info_array_spec.rb +7 -9
  192. data/spec/lib/ruby_smb/{field → fscc}/file_full_ea_info_spec.rb +2 -3
  193. data/spec/lib/ruby_smb/fscc/file_information/file_both_directory_information_spec.rb +71 -0
  194. data/spec/lib/ruby_smb/fscc/file_information/file_directory_information_spec.rb +68 -0
  195. data/spec/lib/ruby_smb/fscc/file_information/file_disposition_information_spec.rb +26 -0
  196. data/spec/lib/ruby_smb/fscc/file_information/file_full_directory_information_spec.rb +69 -0
  197. data/spec/lib/ruby_smb/fscc/file_information/file_id_both_directory_information_spec.rb +72 -0
  198. data/spec/lib/ruby_smb/fscc/file_information/file_id_full_directory_information_spec.rb +70 -0
  199. data/spec/lib/ruby_smb/fscc/file_information/file_names_information_spec.rb +41 -0
  200. data/spec/lib/ruby_smb/fscc/file_information/file_rename_information_spec.rb +133 -0
  201. data/spec/lib/ruby_smb/fscc/fscc_file_attributes_spec.rb +143 -0
  202. data/spec/lib/ruby_smb/generic_packet_spec.rb +46 -21
  203. data/spec/lib/ruby_smb/nbss/negative_session_response_spec.rb +29 -0
  204. data/spec/lib/ruby_smb/nbss/session_header_spec.rb +30 -0
  205. data/spec/lib/ruby_smb/nbss/session_request_spec.rb +30 -0
  206. data/spec/lib/ruby_smb/smb1/bit_field/create_options_spec.rb +9 -1
  207. data/spec/lib/ruby_smb/smb1/bit_field/directory_access_mask_spec.rb +0 -2
  208. data/spec/lib/ruby_smb/smb1/bit_field/file_access_mask_spec.rb +0 -2
  209. data/spec/lib/ruby_smb/smb1/bit_field/file_status_flags_spec.rb +35 -0
  210. data/spec/lib/ruby_smb/smb1/bit_field/open2_access_mode_spec.rb +1 -3
  211. data/spec/lib/ruby_smb/smb1/bit_field/open2_flags_spec.rb +0 -2
  212. data/spec/lib/ruby_smb/smb1/bit_field/open2_open_mode_spec.rb +0 -1
  213. data/spec/lib/ruby_smb/smb1/bit_field/optional_support_spec.rb +0 -1
  214. data/spec/lib/ruby_smb/smb1/bit_field/security_flags_spec.rb +26 -0
  215. data/spec/lib/ruby_smb/smb1/bit_field/share_access_spec.rb +0 -3
  216. data/spec/lib/ruby_smb/smb1/bit_field/smb_ext_file_attributes_spec.rb +20 -39
  217. data/spec/lib/ruby_smb/smb1/bit_field/smb_file_attributes_spec.rb +0 -6
  218. data/spec/lib/ruby_smb/smb1/bit_field/smb_nmpipe_status_spec.rb +0 -2
  219. data/spec/lib/ruby_smb/smb1/bit_field/trans2_flags_spec.rb +0 -2
  220. data/spec/lib/ruby_smb/smb1/bit_field/tree_connect_flags_spec.rb +0 -2
  221. data/spec/lib/ruby_smb/smb1/file_spec.rb +469 -0
  222. data/spec/lib/ruby_smb/smb1/packet/close_request_spec.rb +54 -0
  223. data/spec/lib/ruby_smb/smb1/packet/close_response_spec.rb +45 -0
  224. data/spec/lib/ruby_smb/smb1/packet/echo_request_spec.rb +1 -4
  225. data/spec/lib/ruby_smb/smb1/packet/echo_response_spec.rb +1 -4
  226. data/spec/lib/ruby_smb/smb1/packet/error_packet_spec.rb +1 -3
  227. data/spec/lib/ruby_smb/smb1/packet/logoff_request_spec.rb +1 -4
  228. data/spec/lib/ruby_smb/smb1/packet/logoff_response_spec.rb +1 -4
  229. data/spec/lib/ruby_smb/smb1/packet/negotiate_request_spec.rb +1 -1
  230. data/spec/lib/ruby_smb/smb1/packet/negotiate_response_extended_spec.rb +37 -0
  231. data/spec/lib/ruby_smb/smb1/packet/negotiate_response_spec.rb +37 -0
  232. data/spec/lib/ruby_smb/smb1/packet/nt_create_andx_request_spec.rb +151 -0
  233. data/spec/lib/ruby_smb/smb1/packet/nt_create_andx_response_spec.rb +157 -0
  234. data/spec/lib/ruby_smb/smb1/packet/nt_trans/create_request_spec.rb +13 -6
  235. data/spec/lib/ruby_smb/smb1/packet/nt_trans/create_response_spec.rb +1 -7
  236. data/spec/lib/ruby_smb/smb1/packet/nt_trans/request_spec.rb +1 -6
  237. data/spec/lib/ruby_smb/smb1/packet/nt_trans/response_spec.rb +1 -5
  238. data/spec/lib/ruby_smb/smb1/packet/read_andx_request_spec.rb +149 -0
  239. data/spec/lib/ruby_smb/smb1/packet/read_andx_response_spec.rb +93 -0
  240. data/spec/lib/ruby_smb/smb1/packet/session_setup_legacy_request_spec.rb +1 -5
  241. data/spec/lib/ruby_smb/smb1/packet/session_setup_legacy_response_spec.rb +1 -5
  242. data/spec/lib/ruby_smb/smb1/packet/session_setup_request_spec.rb +3 -8
  243. data/spec/lib/ruby_smb/smb1/packet/session_setup_response_spec.rb +2 -4
  244. data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_request_spec.rb +180 -0
  245. data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_response_spec.rb +104 -0
  246. data/spec/lib/ruby_smb/smb1/packet/trans2/find_information_level/find_file_full_directory_info_spec.rb +128 -0
  247. data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_request_spec.rb +174 -0
  248. data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_response_spec.rb +102 -0
  249. data/spec/lib/ruby_smb/smb1/packet/trans2/open2_request_spec.rb +1 -6
  250. data/spec/lib/ruby_smb/smb1/packet/trans2/open2_response_spec.rb +2 -7
  251. data/spec/lib/ruby_smb/smb1/packet/trans2/request_secondary_spec.rb +1 -5
  252. data/spec/lib/ruby_smb/smb1/packet/trans2/request_spec.rb +1 -5
  253. data/spec/lib/ruby_smb/smb1/packet/trans2/response_spec.rb +1 -4
  254. data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_request_spec.rb +98 -0
  255. data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_response_spec.rb +56 -0
  256. data/spec/lib/ruby_smb/smb1/packet/tree_connect_request_spec.rb +1 -5
  257. data/spec/lib/ruby_smb/smb1/packet/tree_connect_response_spec.rb +1 -6
  258. data/spec/lib/ruby_smb/smb1/packet/tree_disconnect_request_spec.rb +1 -4
  259. data/spec/lib/ruby_smb/smb1/packet/tree_disconnect_response_spec.rb +1 -4
  260. data/spec/lib/ruby_smb/smb1/packet/write_andx_request_spec.rb +148 -0
  261. data/spec/lib/ruby_smb/smb1/packet/write_andx_response_spec.rb +54 -0
  262. data/spec/lib/ruby_smb/smb1/tree_spec.rb +409 -7
  263. data/spec/lib/ruby_smb/smb2/bit_field/directory_access_mask_spec.rb +0 -2
  264. data/spec/lib/ruby_smb/smb2/bit_field/file_access_mask_spec.rb +0 -2
  265. data/spec/lib/ruby_smb/smb2/bit_field/session_flags_spec.rb +1 -1
  266. data/spec/lib/ruby_smb/smb2/bit_field/share_capabilities_spec.rb +0 -1
  267. data/spec/lib/ruby_smb/smb2/bit_field/share_flags_spec.rb +0 -2
  268. data/spec/lib/ruby_smb/smb2/create_context_spec.rb +42 -0
  269. data/spec/lib/ruby_smb/smb2/file_spec.rb +233 -0
  270. data/spec/lib/ruby_smb/smb2/packet/close_request_spec.rb +40 -0
  271. data/spec/lib/ruby_smb/smb2/packet/close_response_spec.rb +40 -0
  272. data/spec/lib/ruby_smb/smb2/packet/create_request_spec.rb +101 -0
  273. data/spec/lib/ruby_smb/smb2/packet/create_response_spec.rb +64 -0
  274. data/spec/lib/ruby_smb/smb2/packet/echo_request_spec.rb +1 -3
  275. data/spec/lib/ruby_smb/smb2/packet/echo_response_spec.rb +1 -3
  276. data/spec/lib/ruby_smb/smb2/packet/ioctl_request_spec.rb +48 -0
  277. data/spec/lib/ruby_smb/smb2/packet/logoff_request_spec.rb +1 -3
  278. data/spec/lib/ruby_smb/smb2/packet/logoff_response_spec.rb +1 -3
  279. data/spec/lib/ruby_smb/smb2/packet/query_directory_request_spec.rb +80 -0
  280. data/spec/lib/ruby_smb/smb2/packet/query_directory_response_spec.rb +64 -0
  281. data/spec/lib/ruby_smb/smb2/packet/read_request_spec.rb +43 -0
  282. data/spec/lib/ruby_smb/smb2/packet/read_response_spec.rb +50 -0
  283. data/spec/lib/ruby_smb/smb2/packet/session_setup_request_spec.rb +3 -4
  284. data/spec/lib/ruby_smb/smb2/packet/session_setup_response_spec.rb +2 -3
  285. data/spec/lib/ruby_smb/smb2/packet/set_info_request_spec.rb +205 -0
  286. data/spec/lib/ruby_smb/smb2/packet/set_info_response_spec.rb +32 -0
  287. data/spec/lib/ruby_smb/smb2/packet/tree_connect_request_spec.rb +3 -5
  288. data/spec/lib/ruby_smb/smb2/packet/tree_connect_response_spec.rb +1 -2
  289. data/spec/lib/ruby_smb/smb2/packet/tree_disconnect_request_spec.rb +1 -3
  290. data/spec/lib/ruby_smb/smb2/packet/tree_disconnect_response_spec.rb +1 -3
  291. data/spec/lib/ruby_smb/smb2/packet/write_request_spec.rb +51 -0
  292. data/spec/lib/ruby_smb/smb2/packet/write_response_spec.rb +38 -0
  293. data/spec/lib/ruby_smb/smb2/tree_spec.rb +191 -5
  294. data/spec/spec_helper.rb +1 -1
  295. metadata +195 -12
  296. metadata.gz.sig +0 -0
  297. data/lib/ruby_smb/smb1/dispositions.rb +0 -36
  298. data/spec/lib/ruby_smb/dispatcher/dispatcher_base_spec.rb +0 -22
@@ -3,8 +3,7 @@ module RubySMB
3
3
  # This module holds the OPLock Levels used in NT_TRANSACT_CREATE and
4
4
  # SMB_COM_NT_CREATE_ANDX responses. The definitions for these values can be found at
5
5
  # [2.2.7.1.2 Response](https://msdn.microsoft.com/en-us/library/ee441961.aspx)
6
- module CreateActions
7
-
6
+ module OplockLevels
8
7
  # No OpLock Granted
9
8
  NO_OPLOCK = 0x00
10
9
  # Exclusive OpLock Granted
@@ -13,7 +12,6 @@ module RubySMB
13
12
  BATCH_OPLOCK = 0x02
14
13
  # Level 2 OpLock Granted
15
14
  LEVEL2_OPLOCK = 0x03
16
-
17
15
  end
18
16
  end
19
- end
17
+ end
@@ -1,5 +1,7 @@
1
1
  module RubySMB
2
2
  module SMB1
3
+ # Namespace for all SMB1 packet definitions
4
+ # see [2.2 Message Syntax](https://msdn.microsoft.com/en-us/library/ee441466.aspx)
3
5
  module Packet
4
6
  require 'ruby_smb/smb1/packet/empty_packet'
5
7
  require 'ruby_smb/smb1/packet/negotiate_request'
@@ -19,6 +21,14 @@ module RubySMB
19
21
  require 'ruby_smb/smb1/packet/echo_response'
20
22
  require 'ruby_smb/smb1/packet/trans2'
21
23
  require 'ruby_smb/smb1/packet/nt_trans'
24
+ require 'ruby_smb/smb1/packet/nt_create_andx_request'
25
+ require 'ruby_smb/smb1/packet/nt_create_andx_response'
26
+ require 'ruby_smb/smb1/packet/read_andx_request'
27
+ require 'ruby_smb/smb1/packet/read_andx_response'
28
+ require 'ruby_smb/smb1/packet/write_andx_request'
29
+ require 'ruby_smb/smb1/packet/write_andx_response'
30
+ require 'ruby_smb/smb1/packet/close_request'
31
+ require 'ruby_smb/smb1/packet/close_response'
22
32
  end
23
33
  end
24
34
  end
@@ -0,0 +1,31 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ # A SMB1 SMB_COM_CLOSE Request Packet as defined in
5
+ # [2.2.4.5.1 Request](https://msdn.microsoft.com/en-us/library/ee442151.aspx)
6
+ class CloseRequest < RubySMB::GenericPacket
7
+ # A SMB1 Parameter Block as defined by the {CloseRequest}
8
+ class ParameterBlock < RubySMB::SMB1::ParameterBlock
9
+ endian :little
10
+
11
+ uint16 :fid, label: 'FID'
12
+ uint32 :last_time_modified, label: 'Last Time Modified', initial_value: 0xFFFFFFFF
13
+ end
14
+
15
+ # Represents the specific layout of the DataBlock for a {CloseRequest} Packet.
16
+ class DataBlock < RubySMB::SMB1::DataBlock
17
+ end
18
+
19
+ smb_header :smb_header
20
+ parameter_block :parameter_block
21
+ data_block :data_block
22
+
23
+ def initialize_instance
24
+ super
25
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_CLOSE
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,28 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ # A SMB1 SMB_COM_CLOSE Response Packet as defined in
5
+ # [2.2.4.5.2 Response](https://msdn.microsoft.com/en-us/library/ee441667.aspx)
6
+ class CloseResponse < RubySMB::GenericPacket
7
+ # A SMB1 Parameter Block as defined by the {CloseResponse}
8
+ class ParameterBlock < RubySMB::SMB1::ParameterBlock
9
+ end
10
+
11
+ # Represents the specific layout of the DataBlock for a {CloseResponse} Packet.
12
+ class DataBlock < RubySMB::SMB1::DataBlock
13
+ end
14
+
15
+ smb_header :smb_header
16
+ parameter_block :parameter_block
17
+ data_block :data_block
18
+
19
+ def initialize_instance
20
+ super
21
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_CLOSE
22
+ smb_header.flags.reply = 1
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,18 +1,17 @@
1
1
  module RubySMB
2
2
  module SMB1
3
3
  module Packet
4
-
5
4
  # This class represents an SMB1 Echo Request Packet as defined in
6
5
  # [2.2.4.39.1 Request](https://msdn.microsoft.com/en-us/library/ee441746.aspx)
7
6
  class EchoRequest < RubySMB::GenericPacket
8
-
9
-
7
+ # The {RubySMB::SMB1::ParameterBlock} specific to this packet type.
10
8
  class ParameterBlock < RubySMB::SMB1::ParameterBlock
11
- uint16 :echo_count, label: 'Echo Count', initial_value: 1
9
+ uint16 :echo_count, label: 'Echo Count', initial_value: 1
12
10
  end
13
11
 
12
+ # The {RubySMB::SMB1::DataBlock} specific to this packet type.
14
13
  class DataBlock < RubySMB::SMB1::DataBlock
15
- string :data, label: 'Data'
14
+ string :data, label: 'Data'
16
15
  end
17
16
 
18
17
  smb_header :smb_header
@@ -23,8 +22,7 @@ module RubySMB
23
22
  super
24
23
  smb_header.command = RubySMB::SMB1::Commands::SMB_COM_ECHO
25
24
  end
26
-
27
25
  end
28
26
  end
29
27
  end
30
- end
28
+ end
@@ -1,18 +1,17 @@
1
1
  module RubySMB
2
2
  module SMB1
3
3
  module Packet
4
-
5
4
  # This class represents an SMB1 Echo Request Packet as defined in
6
5
  # [2.2.4.39.2 Response](https://msdn.microsoft.com/en-us/library/ee441626.aspx)
7
6
  class EchoResponse < RubySMB::GenericPacket
8
-
9
-
7
+ # The {RubySMB::SMB1::ParameterBlock} specific to this packet type.
10
8
  class ParameterBlock < RubySMB::SMB1::ParameterBlock
11
- uint16 :sequence_number, label: 'Sequence Number'
9
+ uint16 :sequence_number, label: 'Sequence Number'
12
10
  end
13
11
 
12
+ # The {RubySMB::SMB1::DataBlock} specific to this packet type.
14
13
  class DataBlock < RubySMB::SMB1::DataBlock
15
- string :data, label: 'Data'
14
+ string :data, label: 'Data'
16
15
  end
17
16
 
18
17
  smb_header :smb_header
@@ -24,8 +23,7 @@ module RubySMB
24
23
  smb_header.command = RubySMB::SMB1::Commands::SMB_COM_ECHO
25
24
  smb_header.flags.reply = 1
26
25
  end
27
-
28
26
  end
29
27
  end
30
28
  end
31
- end
29
+ end
@@ -1,7 +1,6 @@
1
1
  module RubySMB
2
2
  module SMB1
3
3
  module Packet
4
-
5
4
  # This packet represent an SMB1 Response Packet when the parameter and
6
5
  # data blocks will be empty.
7
6
  class EmptyPacket < RubySMB::GenericPacket
@@ -11,4 +10,4 @@ module RubySMB
11
10
  end
12
11
  end
13
12
  end
14
- end
13
+ end
@@ -1,11 +1,9 @@
1
1
  module RubySMB
2
2
  module SMB1
3
3
  module Packet
4
-
5
4
  # This class represents an SMB1 LOGOFF Request Packet as defined in
6
5
  # [2.2.4.54.1 Request](https://msdn.microsoft.com/en-us/library/ee442167.aspx)
7
6
  class LogoffRequest < RubySMB::GenericPacket
8
-
9
7
  # The Parameter Block for this packet is empty save the Word Count and ANDX Block
10
8
  class ParameterBlock < RubySMB::SMB1::ParameterBlock
11
9
  and_x_block :andx_block
@@ -23,8 +21,7 @@ module RubySMB
23
21
  super
24
22
  smb_header.command = RubySMB::SMB1::Commands::SMB_COM_LOGOFF
25
23
  end
26
-
27
24
  end
28
25
  end
29
26
  end
30
- end
27
+ end
@@ -1,11 +1,9 @@
1
1
  module RubySMB
2
2
  module SMB1
3
3
  module Packet
4
-
5
4
  # This class represents an SMB1 LOGOFF Response Packet as defined in
6
5
  # [2.2.4.54.2 Response](https://msdn.microsoft.com/en-us/library/ee441488.aspx)
7
6
  class LogoffResponse < RubySMB::GenericPacket
8
-
9
7
  # The Parameter Block for this packet is empty save the Word Count and ANDX Block
10
8
  class ParameterBlock < RubySMB::SMB1::ParameterBlock
11
9
  and_x_block :andx_block
@@ -24,8 +22,7 @@ module RubySMB
24
22
  smb_header.command = RubySMB::SMB1::Commands::SMB_COM_LOGOFF
25
23
  smb_header.flags.reply = 1
26
24
  end
27
-
28
25
  end
29
26
  end
30
27
  end
31
- end
28
+ end
@@ -40,6 +40,28 @@ module RubySMB
40
40
  def valid?
41
41
  smb_header.command == RubySMB::SMB1::Commands::SMB_COM_NEGOTIATE
42
42
  end
43
+
44
+ # Stores the list of {RubySMB::SMB1::Dialect} that were sent to the
45
+ # peer/server in the related Negotiate Request. This will be used by
46
+ # the {#negotiated_dialect} method.
47
+ #
48
+ # @param dialects [Array] array of {RubySMB::SMB1::Dialect}
49
+ # @return dialects [Array] array of {RubySMB::SMB1::Dialect}
50
+ # @raise [ArgumentError] if dialects is not an array of {RubySMB::SMB1::Dialect}
51
+ def dialects=(dialects)
52
+ unless dialects.all? { |dialect| dialect.is_a? Dialect }
53
+ raise ArgumentError, 'Dialects must be an array of Dialect objects'
54
+ end
55
+ @dialects = dialects
56
+ end
57
+
58
+ # Returns the negotiated dialect identifier
59
+ #
60
+ # @return [String] the negotiated dialect identifier or an empty string if the list of {RubySMB::SMB1::Dialect} was not provided.
61
+ def negotiated_dialect
62
+ return '' if @dialects.nil? || @dialects.empty?
63
+ @dialects[parameter_block.dialect_index].dialect_string
64
+ end
43
65
  end
44
66
  end
45
67
  end
@@ -41,6 +41,28 @@ module RubySMB
41
41
  return false unless parameter_block.capabilities.extended_security == 1
42
42
  true
43
43
  end
44
+
45
+ # Stores the list of {RubySMB::SMB1::Dialect} that were sent to the
46
+ # peer/server in the related Negotiate Request. This will be used by
47
+ # the {#negotiated_dialect} method.
48
+ #
49
+ # @param dialects [Array] array of {RubySMB::SMB1::Dialect}
50
+ # @return dialects [Array] array of {RubySMB::SMB1::Dialect}
51
+ # @raise [ArgumentError] if dialects is not an array of {RubySMB::SMB1::Dialect}
52
+ def dialects=(dialects)
53
+ unless dialects.all? { |dialect| dialect.is_a? Dialect }
54
+ raise ArgumentError, 'Dialects must be an array of Dialect objects'
55
+ end
56
+ @dialects = dialects
57
+ end
58
+
59
+ # Returns the negotiated dialect identifier
60
+ #
61
+ # @return [String] the negotiated dialect identifier or an empty string if the list of {RubySMB::SMB1::Dialect} was not provided.
62
+ def negotiated_dialect
63
+ return '' if @dialects.nil? || @dialects.empty?
64
+ @dialects[parameter_block.dialect_index].dialect_string
65
+ end
44
66
  end
45
67
  end
46
68
  end
@@ -0,0 +1,62 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ # A SMB1 SMB_COM_NT_CREATE_ANDX Request Packet as defined in
5
+ # [2.2.4.64.1 Request](https://msdn.microsoft.com/en-us/library/ee442175.aspx) and
6
+ # [2.2.4.9.1 Client Request Extensions](https://msdn.microsoft.com/en-us/library/cc246332.aspx)
7
+ class NtCreateAndxRequest < RubySMB::GenericPacket
8
+ # A SMB1 Parameter Block as defined by the {NtCreateAndxRequest}
9
+ class ParameterBlock < RubySMB::SMB1::ParameterBlock
10
+ endian :little
11
+ and_x_block :andx_block
12
+ uint8 :reserved, label: 'Reserved'
13
+ uint16 :name_length, label: 'Name Length(bytes)', value: -> { parent.data_block.file_name.length }
14
+
15
+ struct :flags, label: 'Flags' do
16
+ bit3 :reserved, label: 'Reserved Space'
17
+ bit1 :request_extended_response, label: 'Request Extended Response'
18
+ bit1 :open_target_dir, label: 'Open Target Directory'
19
+ bit1 :request_opbatch, label: 'Request Batch OpLock'
20
+ bit1 :request_oplock, label: 'Request OpLock'
21
+ bit1 :reserved2, label: 'Reserved Space'
22
+ # Byte boundary
23
+ bit8 :reserved3, label: 'Reserved Space'
24
+ bit8 :reserved4, label: 'Reserved Space'
25
+ bit8 :reserved5, label: 'Reserved Space'
26
+ end
27
+
28
+ uint32 :root_directory_fid, label: 'Root Directory FID'
29
+
30
+ choice :desired_access, selection: -> { ext_file_attributes.directory } do
31
+ file_access_mask 0, label: 'Desired Access'
32
+ directory_access_mask 1, label: 'Desired Access'
33
+ end
34
+
35
+ uint64 :allocation_size, label: 'Allocation Size'
36
+ smb_ext_file_attributes :ext_file_attributes, label: 'Extented File Attributes'
37
+ share_access :share_access, label: 'Share Access'
38
+ # The following constants are defined in RubySMB::Dispositions
39
+ uint32 :create_disposition, label: 'Create Disposition'
40
+ create_options :create_options, label: 'Create Options'
41
+ # The following constants are defined in RubySMB::ImpersonationLevels
42
+ uint32 :impersonation_level, label: 'Impersonation Level'
43
+ security_flags :security_flags, label: 'Security Flags'
44
+ end
45
+
46
+ # Represents the specific layout of the DataBlock for a {NtCreateAndxRequest} Packet.
47
+ class DataBlock < RubySMB::SMB1::DataBlock
48
+ string :file_name, label: 'File Name'
49
+ end
50
+
51
+ smb_header :smb_header
52
+ parameter_block :parameter_block
53
+ data_block :data_block
54
+
55
+ def initialize_instance
56
+ super
57
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_NT_CREATE_ANDX
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,66 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ # A SMB1 SMB_COM_NT_CREATE_ANDX Response Packet as defined in
5
+ # [2.2.4.64.2 Response](https://msdn.microsoft.com/en-us/library/ee441612.aspx) and
6
+ # [2.2.4.9.2 Server Response Extensions](https://msdn.microsoft.com/en-us/library/cc246334.aspx)
7
+ class NtCreateAndxResponse < RubySMB::GenericPacket
8
+ # A SMB1 Parameter Block as defined by the {NtCreateAndxResponse}
9
+ class ParameterBlock < RubySMB::SMB1::ParameterBlock
10
+ endian :little
11
+
12
+ and_x_block :andx_block
13
+ # Constants defined in RubySMB::SMB1::OplockLevels
14
+ uint8 :oplock_level, label: 'OpLock Level'
15
+ uint16 :fid, label: 'FID'
16
+ # Constants defined in RubySMB::Dispositions
17
+ uint32 :create_disposition, label: 'Create Disposition'
18
+ file_time :create_time, label: 'Create Time'
19
+ file_time :last_access_time, label: 'Last Access Time'
20
+ file_time :last_write_time, label: 'Last Write Time'
21
+ file_time :last_change_time, label: 'Last Change Time'
22
+ smb_ext_file_attributes :ext_file_attributes, label: 'Extented File Attributes'
23
+ uint64 :allocation_size, label: 'Allocation Size'
24
+ uint64 :end_of_file, label: 'End of File Offset'
25
+ # Constants defined in RubySMB::SMB1::ResourceType
26
+ uint16 :resource_type, label: 'Resource Type'
27
+
28
+ choice :status_flags, selection: -> { resource_type } do
29
+ smb_nmpipe_status RubySMB::SMB1::ResourceType::BYTE_MODE_PIPE, label: 'Status Flags'
30
+ smb_nmpipe_status RubySMB::SMB1::ResourceType::MESSAGE_MODE_PIPE, label: 'Status Flags'
31
+ file_status_flags RubySMB::SMB1::ResourceType::DISK, label: 'Status Flags'
32
+ uint16 :default, label: 'Status Flags'
33
+ end
34
+
35
+ uint8 :directory, label: 'Directory'
36
+ string :volume_guid, label: 'Volume GUID', length: 16
37
+ uint64 :file_id, label: 'File ID'
38
+
39
+ choice :maximal_access_rights, selection: -> { ext_file_attributes.directory } do
40
+ file_access_mask 0, label: 'Maximal Access Rights'
41
+ directory_access_mask 1, label: 'Maximal Access Rights'
42
+ end
43
+
44
+ choice :guest_maximal_access_rights, selection: -> { ext_file_attributes.directory } do
45
+ file_access_mask 0, label: 'Guest Maximal Access Rights'
46
+ directory_access_mask 1, label: 'Guest Maximal Access Rights'
47
+ end
48
+ end
49
+
50
+ # Represents the specific layout of the DataBlock for a {SessionSetupResponse} Packet.
51
+ class DataBlock < RubySMB::SMB1::DataBlock
52
+ end
53
+
54
+ smb_header :smb_header
55
+ parameter_block :parameter_block
56
+ data_block :data_block
57
+
58
+ def initialize_instance
59
+ super
60
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_NT_CREATE_ANDX
61
+ smb_header.flags.reply = 1
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -1,7 +1,6 @@
1
1
  module RubySMB
2
2
  module SMB1
3
3
  module Packet
4
-
5
4
  # Namespace for the NT Transaction sub-protocol documented in
6
5
  # [2.2.4.62 SMB_COM_NT_TRANSACT (0xA0)](https://msdn.microsoft.com/en-us/library/ee441720.aspx)
7
6
  module NtTrans
@@ -13,4 +12,4 @@ module RubySMB
13
12
  end
14
13
  end
15
14
  end
16
- end
15
+ end
@@ -2,16 +2,15 @@ module RubySMB
2
2
  module SMB1
3
3
  module Packet
4
4
  module NtTrans
5
-
6
5
  # Class representing a generic NT Transaction request packet as defined in
7
6
  # [2.2.4.62.1 Request](https://msdn.microsoft.com/en-us/library/ee441534.aspx)
8
7
  class CreateRequest < RubySMB::GenericPacket
9
-
10
8
  class ParameterBlock < RubySMB::SMB1::Packet::NtTrans::Request::ParameterBlock
11
9
  end
12
10
 
11
+ # The Trans2 Parameter Block for this particular Subcommand
13
12
  class Trans2Parameters < BinData::Record
14
- endian :little
13
+ endian :little
15
14
 
16
15
  struct :flags do
17
16
  bit4 :reserved
@@ -25,15 +24,20 @@ module RubySMB
25
24
  bit8 :reserved5, label: 'Reserved Space'
26
25
  end
27
26
 
28
- uint32 :root_directory_fid, label: 'Root Directory FID'
29
- file_access_mask :desired_access
30
- uint64 :allocation_size, label: 'Allocation Size'
27
+ uint32 :root_directory_fid, label: 'Root Directory FID'
28
+
29
+ choice :desired_access, selection: -> { ext_file_attribute.directory } do
30
+ file_access_mask 0, label: 'Desired Access'
31
+ directory_access_mask 1, label: 'Desired Access'
32
+ end
33
+
34
+ uint64 :allocation_size, label: 'Allocation Size'
31
35
  smb_ext_file_attributes :ext_file_attribute
32
36
  share_access :share_access, label: 'Share Access'
33
37
  uint32 :create_disposition, label: 'Create Disposition'
34
38
  create_options :create_options
35
- uint32 :security_descriptor_length, label: 'Security Descriptor Length', initial_value: lambda { self.parent.trans2_data.security_descriptor.length }
36
- uint32 :ea_length, label: 'Extended Attributes Length', initial_value: lambda { self.parent.trans2_data.extended_attributes.length }
39
+ uint32 :security_descriptor_length, label: 'Security Descriptor Length', initial_value: -> { parent.trans2_data.security_descriptor.length }
40
+ uint32 :ea_length, label: 'Extended Attributes Length', initial_value: -> { parent.trans2_data.extended_attributes.length }
37
41
  uint32 :impersonation_level, label: 'Impersonation Level'
38
42
 
39
43
  struct :security_flags do
@@ -47,10 +51,11 @@ module RubySMB
47
51
  # Returns the length of the Trans2Parameters struct
48
52
  # in number of bytes
49
53
  def length
50
- self.do_num_bytes
54
+ do_num_bytes
51
55
  end
52
56
  end
53
57
 
58
+ # The Trans2 Data Blcok for this particular Subcommand
54
59
  class Trans2Data < BinData::Record
55
60
  security_descriptor :security_descriptor
56
61
  file_full_ea_info :extended_attributes
@@ -58,14 +63,15 @@ module RubySMB
58
63
  # Returns the length of the Trans2Data struct
59
64
  # in number of bytes
60
65
  def length
61
- self.do_num_bytes
66
+ do_num_bytes
62
67
  end
63
68
  end
64
69
 
70
+ # The {RubySMB::SMB1::DataBlock} specific to this packet type.
65
71
  class DataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
66
- string :pad1, length: lambda { pad1_length }
72
+ string :pad1, length: -> { pad1_length }
67
73
  trans2_parameters :trans2_parameters, label: 'Trans2 Parameters'
68
- string :pad2, length: lambda { pad2_length }
74
+ string :pad2, length: -> { pad2_length }
69
75
  trans2_data :trans2_data, label: 'Trans2 Data'
70
76
  end
71
77
 
@@ -82,4 +88,4 @@ module RubySMB
82
88
  end
83
89
  end
84
90
  end
85
- end
91
+ end