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
@@ -0,0 +1,77 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans2
5
+ # A Trans2 FIND_FIRST2 Request Packet as defined in
6
+ # [2.2.6.2.1](https://msdn.microsoft.com/en-us/library/ee441987.aspx)
7
+ class FindFirst2Request < RubySMB::GenericPacket
8
+ class ParameterBlock < RubySMB::SMB1::Packet::Trans2::Request::ParameterBlock
9
+ end
10
+
11
+ # The Trans2 Parameter Block for this particular Subcommand
12
+ class Trans2Parameters < BinData::Record
13
+ endian :little
14
+ smb_file_attributes :search_attributes, label: 'File Attributes'
15
+ uint16 :search_count, label: 'Search Count'
16
+
17
+ struct :flags do
18
+ bit3 :reserved, label: 'Reserved Space'
19
+ bit1 :backup, label: 'With Backup Intent'
20
+ bit1 :continue, label: 'Continue From Last'
21
+ bit1 :resume_keys, label: 'Return Resume Keys'
22
+ bit1 :close_eos, label: 'Close at End of Search'
23
+ bit1 :close, label: 'Close Search After This Request'
24
+
25
+ bit8 :reserved2, label: 'Reserved Space'
26
+ end
27
+
28
+ uint16 :information_level, label: 'Information Level'
29
+ uint32 :storage_type, label: 'Search Storage type'
30
+
31
+ choice :filename, :copy_on_change => true, selection: -> { self.smb_header.flags2.unicode } do
32
+ stringz16 1, label: 'FileName'
33
+ stringz 0, label: 'FileName'
34
+ end
35
+
36
+ # Returns the length of the Trans2Parameters struct
37
+ # in number of bytes
38
+ def length
39
+ do_num_bytes
40
+ end
41
+ end
42
+
43
+ # The Trans2 Data Blcok for this particular Subcommand
44
+ class Trans2Data < BinData::Record
45
+ smb_gea_list :extended_attribute_list, label: 'Get Extended Attribute List',
46
+ onlyif: -> { parent.trans2_parameters.information_level == FindInformationLevel::SMB_INFO_QUERY_EAS_FROM_LIST}
47
+
48
+ # Returns the length of the Trans2Data struct
49
+ # in number of bytes
50
+ def length
51
+ do_num_bytes
52
+ end
53
+ end
54
+
55
+ # The {RubySMB::SMB1::DataBlock} specific to this packet type.
56
+ class DataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
57
+ uint8 :name, label: 'Name', initial_value: 0x00
58
+ string :pad1, length: -> { pad1_length }
59
+ trans2_parameters :trans2_parameters, label: 'Trans2 Parameters'
60
+ string :pad2, length: -> { pad2_length }
61
+ trans2_data :trans2_data, label: 'Trans2 Data'
62
+ end
63
+
64
+ smb_header :smb_header
65
+ parameter_block :parameter_block
66
+ data_block :data_block
67
+
68
+ def initialize_instance
69
+ super
70
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
71
+ parameter_block.setup << RubySMB::SMB1::Packet::Trans2::Subcommands::FIND_FIRST2
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,87 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans2
5
+ # This class represents an SMB1 Trans2 FIND_FIRST2 Response Packet as defined in
6
+ # [2.2.6.2.2 Response](https://msdn.microsoft.com/en-us/library/ee441704.aspx)
7
+ class FindFirst2Response < RubySMB::GenericPacket
8
+ class ParameterBlock < RubySMB::SMB1::Packet::Trans2::Response::ParameterBlock
9
+ end
10
+
11
+ # The Trans2 Parameter Block for this particular Subcommand
12
+ class Trans2Parameters < BinData::Record
13
+ endian :little
14
+
15
+ uint16 :sid, label: 'Search ID'
16
+ uint16 :search_count, label: 'Search Count'
17
+ uint16 :eos, label: 'End of Search'
18
+ uint16 :ea_error_offset, label: 'Offset to EA Error'
19
+ uint16 :last_name_offset, label: 'Last Name Offset'
20
+
21
+ # Returns the length of the Trans2Parameters struct
22
+ # in number of bytes
23
+ def length
24
+ do_num_bytes
25
+ end
26
+ end
27
+
28
+ # The Trans2 Data Blcok for this particular Subcommand
29
+ class Trans2Data < BinData::Record
30
+ rest :buffer, label: 'Results Buffer'
31
+
32
+ # Returns the length of the Trans2Data struct
33
+ # in number of bytes
34
+ def length
35
+ do_num_bytes
36
+ end
37
+ end
38
+
39
+ # The {RubySMB::SMB1::DataBlock} specific to this packet type.
40
+ class DataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
41
+ uint8 :name, label: 'Name', initial_value: 0x00
42
+ string :pad1, length: -> { pad1_length }
43
+ trans2_parameters :trans2_parameters, label: 'Trans2 Parameters'
44
+ string :pad2, length: -> { pad2_length }
45
+ trans2_data :trans2_data, label: 'Trans2 Data', length: 0
46
+ end
47
+
48
+ smb_header :smb_header
49
+ parameter_block :parameter_block
50
+ data_block :data_block
51
+
52
+ def initialize_instance
53
+ super
54
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
55
+ parameter_block.setup << RubySMB::SMB1::Packet::Trans2::Subcommands::FIND_FIRST2
56
+ smb_header.flags.reply = 1
57
+ end
58
+
59
+ # Returns the File Information in an array of appropriate
60
+ # structs for the given FileInformationClass. Pulled out of
61
+ # the string buffer.
62
+ #
63
+ # @param klass [Class] the FileInformationClass class to read the data as
64
+ # @return [array<BinData::Record>] An array of structs holding the requested information
65
+ def results(klass, unicode:)
66
+ information_classes = []
67
+ blob = data_block.trans2_data.buffer.to_binary_s.dup
68
+ until blob.empty?
69
+ length = blob[0, 4].unpack('V').first
70
+
71
+ data = if length.zero?
72
+ blob.slice!(0, blob.length)
73
+ else
74
+ blob.slice!(0, length)
75
+ end
76
+
77
+ file_info = klass.new
78
+ file_info.unicode = unicode
79
+ information_classes << file_info.read(data)
80
+ end
81
+ information_classes
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,32 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans2
5
+ # FIND information levels are used in TRANS2_FIND_FIRST2 (section 2.2.6.2) and
6
+ # TRANS2_FIND_NEXT2 (section 2.2.6.3) subcommand requests to indicate the level
7
+ # of information that a server MUST respond with for each file matching the
8
+ # request's search criteria.
9
+ module FindInformationLevel
10
+ # Return creation, access, and last write timestamps, size and file attributes along with the file name.
11
+ SMB_INFO_STANDARD = 0x0001
12
+ # Return the SMB_INFO_STANDARD data along with the size of a file's extended attributes (EAs).
13
+ SMB_INFO_QUERY_EA_SIZE = 0x0002
14
+ # Return the SMB_INFO_QUERY_EA_SIZE data along with a specific list of a file's EAs. The requested EAs are provided in the Trans2_Data block of the request.
15
+ SMB_INFO_QUERY_EAS_FROM_LIST = 0x0003
16
+ # Return 64-bit format versions of: creation, access, last write, and last attribute change timestamps; size. In addition, return extended file attributes and file name.
17
+ SMB_FIND_FILE_DIRECTORY_INFO = 0x0101
18
+ # Returns the SMB_FIND_FILE_DIRECTORY_INFO data along with the size of a file's EAs.
19
+ SMB_FIND_FILE_FULL_DIRECTORY_INFO = 0x0102
20
+ # Returns the name(s) of the file(s).
21
+ SMB_FIND_FILE_NAMES_INFO = 0x0103
22
+ # Returns a combination of the data from SMB_FIND_FILE_FULL_DIRECTORY_INFO and SMB_FIND_FILE_NAMES_INFO.
23
+ SMB_FIND_FILE_BOTH_DIRECTORY_INFO = 0x0104
24
+
25
+
26
+ require 'ruby_smb/smb1/packet/trans2/find_information_level/find_file_full_directory_info'
27
+
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,45 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans2
5
+ module FindInformationLevel
6
+ # The SMB_FIND_FILE_FULL_DIRECTORY_INFO class as defined in
7
+ # [2.2.8.1.5 SMB_FIND_FILE_FULL_DIRECTORY_INFO](https://msdn.microsoft.com/en-us/library/ff470042.aspx)
8
+ class FindFileFullDirectoryInfo < BinData::Record
9
+ CLASS_LEVEL = FindInformationLevel::SMB_FIND_FILE_FULL_DIRECTORY_INFO
10
+
11
+ endian :little
12
+
13
+ uint32 :next_offset, label: 'Next Entry Offset'
14
+ uint32 :file_index, label: 'File Index'
15
+ file_time :create_time, label: 'Create Time'
16
+ file_time :last_access, label: 'Last Accessed Time'
17
+ file_time :last_write, label: 'Last Write Time'
18
+ file_time :last_change, label: 'Last Attribute Change Time'
19
+ uint64 :end_of_file, label: 'End of File'
20
+ uint64 :allocation_size, label: 'Allocated Size'
21
+ smb_ext_file_attributes :ext_file_attributes, label: 'Extended File Attributes'
22
+ uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
23
+ uint32 :ea_size, label: 'Extended Attributes Size'
24
+
25
+ choice :file_name, :copy_on_change => true, selection: -> { unicode } do
26
+ string16 true, label: 'File Name', read_length: -> { file_name_length }
27
+ stringz false, label: 'File Name', read_length: -> { file_name_length }
28
+ end
29
+
30
+ # Set unicode encoding for filename
31
+ # @!attribute [rw] unicode
32
+ # @return [Boolean]
33
+ attr_accessor :unicode
34
+
35
+ def initialize_instance
36
+ super
37
+ @unicode = false
38
+ end
39
+
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,77 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans2
5
+ # A Trans2 FIND_NEXT2 Request Packet as defined in
6
+ # [2.2.6.3.1 Request](https://msdn.microsoft.com/en-us/library/ee441844.aspx)
7
+ class FindNext2Request < RubySMB::GenericPacket
8
+ class ParameterBlock < RubySMB::SMB1::Packet::Trans2::Request::ParameterBlock
9
+ end
10
+
11
+ # The Trans2 Parameter Block for this particular Subcommand
12
+ class Trans2Parameters < BinData::Record
13
+ endian :little
14
+
15
+ uint16 :sid, label: 'Search ID'
16
+ uint16 :search_count, label: 'Search Count'
17
+ uint16 :information_level, label: 'Information Level'
18
+ uint32 :resume_key, label: 'Resume Key'
19
+
20
+ struct :flags do
21
+ bit3 :reserved, label: 'Reserved Space'
22
+ bit1 :backup, label: 'With Backup Intent'
23
+ bit1 :continue, label: 'Continue From Last'
24
+ bit1 :resume_keys, label: 'Return Resume Keys'
25
+ bit1 :close_eos, label: 'Close at End of Search'
26
+ bit1 :close, label: 'Close Search After This Request'
27
+
28
+ bit8 :reserved2, label: 'Reserved Space'
29
+ end
30
+
31
+ choice :filename, :copy_on_change => true, selection: -> { @obj.parent.parent.parent.smb_header.flags2.unicode } do
32
+ stringz16 1, label: 'FileName'
33
+ stringz 0, label: 'FileName'
34
+ end
35
+
36
+ # Returns the length of the Trans2Parameters struct
37
+ # in number of bytes
38
+ def length
39
+ do_num_bytes
40
+ end
41
+ end
42
+
43
+ # The Trans2 Data Blcok for this particular Subcommand
44
+ class Trans2Data < BinData::Record
45
+ smb_gea_list :extended_attribute_list, label: 'Get Extended Attribute List',
46
+ onlyif: -> { parent.trans2_parameters.information_level == FindInformationLevel::SMB_INFO_QUERY_EAS_FROM_LIST}
47
+
48
+ # Returns the length of the Trans2Data struct
49
+ # in number of bytes
50
+ def length
51
+ do_num_bytes
52
+ end
53
+ end
54
+
55
+ # The {RubySMB::SMB1::DataBlock} specific to this packet type.
56
+ class DataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
57
+ uint8 :name, label: 'Name', initial_value: 0x00
58
+ string :pad1, length: -> { pad1_length }
59
+ trans2_parameters :trans2_parameters, label: 'Trans2 Parameters'
60
+ string :pad2, length: -> { pad2_length }
61
+ trans2_data :trans2_data, label: 'Trans2 Data'
62
+ end
63
+
64
+ smb_header :smb_header
65
+ parameter_block :parameter_block
66
+ data_block :data_block
67
+
68
+ def initialize_instance
69
+ super
70
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
71
+ parameter_block.setup << RubySMB::SMB1::Packet::Trans2::Subcommands::FIND_NEXT2
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,86 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans2
5
+ # This class represents an SMB1 Trans2 FIND_NEXT2 Response Packet as defined in
6
+ # [2.2.6.3.2 Response](https://msdn.microsoft.com/en-us/library/ee441871.aspx)
7
+ class FindNext2Response < RubySMB::GenericPacket
8
+ class ParameterBlock < RubySMB::SMB1::Packet::Trans2::Response::ParameterBlock
9
+ end
10
+
11
+ # The Trans2 Parameter Block for this particular Subcommand
12
+ class Trans2Parameters < BinData::Record
13
+ endian :little
14
+
15
+ uint16 :search_count, label: 'Search Count'
16
+ uint16 :eos, label: 'End of Search'
17
+ uint16 :ea_error_offset, label: 'Offset to EA Error'
18
+ uint16 :last_name_offset, label: 'Last Name Offset'
19
+
20
+ # Returns the length of the Trans2Parameters struct
21
+ # in number of bytes
22
+ def length
23
+ do_num_bytes
24
+ end
25
+ end
26
+
27
+ # The Trans2 Data Blcok for this particular Subcommand
28
+ class Trans2Data < BinData::Record
29
+ rest :buffer, label: 'Results Buffer'
30
+
31
+ # Returns the length of the Trans2Data struct
32
+ # in number of bytes
33
+ def length
34
+ do_num_bytes
35
+ end
36
+ end
37
+
38
+ # The {RubySMB::SMB1::DataBlock} specific to this packet type.
39
+ class DataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
40
+ uint8 :name, label: 'Name', initial_value: 0x00
41
+ string :pad1, length: -> { pad1_length }
42
+ trans2_parameters :trans2_parameters, label: 'Trans2 Parameters'
43
+ string :pad2, length: -> { pad2_length }
44
+ trans2_data :trans2_data, label: 'Trans2 Data', length: 0
45
+ end
46
+
47
+ smb_header :smb_header
48
+ parameter_block :parameter_block
49
+ data_block :data_block
50
+
51
+ def initialize_instance
52
+ super
53
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
54
+ parameter_block.setup << RubySMB::SMB1::Packet::Trans2::Subcommands::FIND_NEXT2
55
+ smb_header.flags.reply = 1
56
+ end
57
+
58
+ # Returns the File Information in an array of appropriate
59
+ # structs for the given FileInformationClass. Pulled out of
60
+ # the string buffer.
61
+ #
62
+ # @param klass [Class] the FileInformationClass class to read the data as
63
+ # @return [array<BinData::Record>] An array of structs holding the requested information
64
+ def results(klass, unicode:)
65
+ information_classes = []
66
+ blob = data_block.trans2_data.buffer.to_binary_s.dup
67
+ until blob.empty?
68
+ length = blob[0, 4].unpack('V').first
69
+
70
+ data = if length.zero?
71
+ blob.slice!(0, blob.length)
72
+ else
73
+ blob.slice!(0, length)
74
+ end
75
+
76
+ file_info = klass.new
77
+ file_info.unicode = unicode
78
+ information_classes << file_info.read(data)
79
+ end
80
+ information_classes
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -2,14 +2,13 @@ module RubySMB
2
2
  module SMB1
3
3
  module Packet
4
4
  module Trans2
5
-
6
5
  # A Trans2 OPEN2 Request Packet as defined in
7
6
  # [2.2.6.1.1 Request](https://msdn.microsoft.com/en-us/library/ee441733.aspx)
8
7
  class Open2Request < RubySMB::GenericPacket
9
-
10
8
  class ParameterBlock < RubySMB::SMB1::Packet::Trans2::Request::ParameterBlock
11
9
  end
12
10
 
11
+ # The Trans2 Parameter Block for this particular Subcommand
13
12
  class Trans2Parameters < BinData::Record
14
13
  endian :little
15
14
  open2_flags :flags, label: 'Flags'
@@ -19,27 +18,29 @@ module RubySMB
19
18
  utime :creation_time, label: 'Creation Time'
20
19
  open2_open_mode :open_mode, label: 'Open Mode'
21
20
  uint32 :allocation_size, label: 'Allocation Size'
22
- array :reserved2, initial_length: 5 do
21
+ array :reserved2, initial_length: 5 do
23
22
  uint16 initial_value: 0x0000
24
23
  end
25
- stringz :filename, label: 'Filename'
24
+ stringz :filename, label: 'Filename'
26
25
 
27
26
  # Returns the length of the Trans2Parameters struct
28
27
  # in number of bytes
29
28
  def length
30
- self.do_num_bytes
29
+ do_num_bytes
31
30
  end
32
31
  end
33
32
 
33
+ # The Trans2 Data Blcok for this particular Subcommand
34
34
  class Trans2Data < BinData::Record
35
- smb_fea_list :extended_attribute_list, label: 'Extended Attribute List'
35
+ smb_fea_list :extended_attribute_list, label: 'Extended Attribute List'
36
36
  end
37
37
 
38
+ # The {RubySMB::SMB1::DataBlock} specific to this packet type.
38
39
  class DataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
39
- uint8 :name, label: 'Name', initial_value: 0x00
40
- string :pad1, length: lambda { pad1_length }
40
+ uint8 :name, label: 'Name', initial_value: 0x00
41
+ string :pad1, length: -> { pad1_length }
41
42
  trans2_parameters :trans2_parameters, label: 'Trans2 Parameters'
42
- string :pad2, length: lambda { pad2_length }
43
+ string :pad2, length: -> { pad2_length }
43
44
  trans2_data :trans2_data, label: 'Trans2 Data'
44
45
  end
45
46
 
@@ -47,7 +48,6 @@ module RubySMB
47
48
  parameter_block :parameter_block
48
49
  data_block :data_block
49
50
 
50
-
51
51
  def initialize_instance
52
52
  super
53
53
  smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2