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
@@ -1,7 +1,6 @@
1
1
  module RubySMB
2
2
  module SMB2
3
3
  module Packet
4
-
5
4
  # An SMB2 Echo Request Packet as defined in
6
5
  # [2.2.28 SMB2 ECHO Request](https://msdn.microsoft.com/en-us/library/cc246540.aspx)
7
6
  class EchoRequest < RubySMB::GenericPacket
@@ -14,8 +13,7 @@ module RubySMB
14
13
  super
15
14
  smb2_header.command = RubySMB::SMB2::Commands::ECHO
16
15
  end
17
-
18
16
  end
19
17
  end
20
18
  end
21
- end
19
+ end
@@ -1,7 +1,6 @@
1
1
  module RubySMB
2
2
  module SMB2
3
3
  module Packet
4
-
5
4
  # An SMB2 Echo response Packet as defined in
6
5
  # [2.2.29 SMB2 ECHO Response](https://msdn.microsoft.com/en-us/library/cc246541.aspx)
7
6
  class EchoResponse < RubySMB::GenericPacket
@@ -15,8 +14,7 @@ module RubySMB
15
14
  smb2_header.command = RubySMB::SMB2::Commands::ECHO
16
15
  smb2_header.flags.reply = 1
17
16
  end
18
-
19
17
  end
20
18
  end
21
19
  end
22
- end
20
+ end
@@ -1,9 +1,7 @@
1
1
  module RubySMB
2
2
  module SMB2
3
3
  module Packet
4
-
5
4
  # An SMB2 Error packet for when an incomplete response comes back
6
-
7
5
  class ErrorPacket < RubySMB::GenericPacket
8
6
  endian :little
9
7
  smb2_header :smb2_header
@@ -12,4 +10,4 @@ module RubySMB
12
10
  end
13
11
  end
14
12
  end
15
- end
13
+ end
@@ -0,0 +1,54 @@
1
+ module RubySMB
2
+ module SMB2
3
+ module Packet
4
+ # An SMB2 Ioctl Request Packet as defined in
5
+ # [2.2.31 SMB2 IOCTL Request](https://msdn.microsoft.com/en-us/library/cc246545.aspx)
6
+ class IoctlRequest < RubySMB::GenericPacket
7
+ endian :little
8
+
9
+ smb2_header :smb2_header
10
+ uint16 :structure_size, label: 'Structure Size', initial_value: 57
11
+ uint16 :reserved1, label: 'Reserved Space'
12
+ uint32 :ctl_code, label: 'Control Code'
13
+ smb2_fileid :file_id, label: 'File Id'
14
+ uint32 :input_offset, label: 'Input Offset', initial_value: -> { calc_input_offset }
15
+ uint32 :input_count, label: 'Input Count', initial_value: -> { buffer.do_num_bytes }
16
+ uint32 :max_input_response, label: 'Max Input Response'
17
+ uint32 :output_offset, label: 'Output Offset', initial_value: -> { input_offset + output_count }
18
+ uint32 :output_count, label: 'Output Count'
19
+ uint32 :max_output_response, label: 'Max Output response', initial_value: 65536
20
+
21
+ struct :flags do
22
+ bit7 :reserved1, label: 'Reserved Space'
23
+ bit1 :is_fsctl, label: 'FSCTL not IOCTL'
24
+
25
+ bit8 :reserved2, label: 'Reserved Space'
26
+ bit8 :reserved3, label: 'Reserved Space'
27
+ bit8 :reserved4, label: 'Reserved Space'
28
+ end
29
+
30
+ uint32 :reserved2, label: 'Reserved Space'
31
+ string :buffer, label: 'Input Buffer', read_length: -> { input_count + output_count }
32
+
33
+ def initialize_instance
34
+ super
35
+ smb2_header.command = RubySMB::SMB2::Commands::IOCTL
36
+ end
37
+
38
+ # Calculates the value for the input_offset field.
39
+ # If the input buffer is empty then this should be set to 0,
40
+ # otherwise it should return the absolute offset of the input buffer.
41
+ #
42
+ # @return [Integer] the value to store in #input_offset
43
+ def calc_input_offset
44
+ if input_count.zero?
45
+ 0
46
+ else
47
+ buffer.abs_offset
48
+ end
49
+ end
50
+
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,39 @@
1
+ module RubySMB
2
+ module SMB2
3
+ module Packet
4
+ # An SMB2 Ioctl Response Packet as defined in
5
+ # [2.2.32 SMB2 IOCTL Response](https://msdn.microsoft.com/en-us/library/cc246548.aspx)
6
+ class IoctlResponse < RubySMB::GenericPacket
7
+ endian :little
8
+
9
+ smb2_header :smb2_header
10
+ uint16 :structure_size, label: 'Structure Size', initial_value: 49
11
+ uint16 :reserved1, label: 'Reserved Space'
12
+ uint32 :ctl_code, label: 'Control Code'
13
+ smb2_fileid :file_id, label: 'File Id'
14
+ uint32 :input_offset, label: 'Input Offset'
15
+ uint32 :input_count, label: 'Input Count'
16
+ uint32 :output_offset, label: 'Output Offset'
17
+ uint32 :output_count, label: 'Output Count'
18
+ uint32 :flags, label: 'Flags'
19
+ uint32 :reserved2, label: 'Reserved Space'
20
+ string :buffer, label: 'Input Buffer', read_length: -> { input_count + output_count }
21
+
22
+ def initialize_instance
23
+ super
24
+ smb2_header.flags.reply = 1
25
+ smb2_header.command = RubySMB::SMB2::Commands::IOCTL
26
+ end
27
+
28
+ def input_data
29
+ to_binary_s[input_offset, input_count]
30
+ end
31
+
32
+ def output_data
33
+ to_binary_s[output_offset, output_count]
34
+ end
35
+
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,7 +1,6 @@
1
1
  module RubySMB
2
2
  module SMB2
3
3
  module Packet
4
-
5
4
  # An SMB2 LOGOFF Request Packet as defined in
6
5
  # [2.2.7 SMB2 LOGOFF Request](https://msdn.microsoft.com/en-us/library/cc246565.aspx)
7
6
  class LogoffRequest < RubySMB::GenericPacket
@@ -10,13 +9,11 @@ module RubySMB
10
9
  uint16 :structure_size, label: 'Structure Size', initial_value: 4
11
10
  uint16 :reserved, label: 'Reserved Space'
12
11
 
13
-
14
12
  def initialize_instance
15
13
  super
16
14
  smb2_header.command = RubySMB::SMB2::Commands::LOGOFF
17
15
  end
18
-
19
16
  end
20
17
  end
21
18
  end
22
- end
19
+ end
@@ -1,7 +1,6 @@
1
1
  module RubySMB
2
2
  module SMB2
3
3
  module Packet
4
-
5
4
  # An SMB2 LOGOFF Response Packet as defined in
6
5
  # [2.2.8 SMB2 LOGOFF Response](https://msdn.microsoft.com/en-us/library/cc246566.aspx)
7
6
  class LogoffResponse < RubySMB::GenericPacket
@@ -10,14 +9,12 @@ module RubySMB
10
9
  uint16 :structure_size, label: 'Structure Size', initial_value: 4
11
10
  uint16 :reserved, label: 'Reserved Space'
12
11
 
13
-
14
12
  def initialize_instance
15
13
  super
16
14
  smb2_header.command = RubySMB::SMB2::Commands::LOGOFF
17
15
  smb2_header.flags.reply = 1
18
16
  end
19
-
20
17
  end
21
18
  end
22
19
  end
23
- end
20
+ end
@@ -25,7 +25,7 @@ module RubySMB
25
25
  # @param [Fixnum] the numeric code for the dialect you wish to add
26
26
  # @return [Array<Fixnum>] the array of all currently selected dialects
27
27
  def add_dialect(dialect)
28
- return ArgumentError, 'Must be a number' unless dialect.is_a? Fixnum
28
+ return ArgumentError, 'Must be a number' unless dialect.is_a? Integer
29
29
  self.dialect_count += 1
30
30
  dialects << dialect
31
31
  end
@@ -6,7 +6,7 @@ module RubySMB
6
6
  class NegotiateResponse < RubySMB::GenericPacket
7
7
  endian :little
8
8
  smb2_header :smb2_header
9
- uint16 :structure_size, label: 'Structure Size', initial_value: 65
9
+ uint16 :structure_size, label: 'Structure Size', initial_value: 65
10
10
  smb2_security_mode :security_mode
11
11
  uint16 :dialect_revision, label: 'Dialect Revision'
12
12
  uint16 :negotiate_context_count, label: 'Negotiate Context Count', initial_value: 0
@@ -0,0 +1,35 @@
1
+ module RubySMB
2
+ module SMB2
3
+ module Packet
4
+ # An SMB2 Query Directory Request Packet as defined in
5
+ # [2.2.33 SMB2 QUERY_DIRECTORY Request](https://msdn.microsoft.com/en-us/library/cc246551.aspx)
6
+ class QueryDirectoryRequest < RubySMB::GenericPacket
7
+ endian :little
8
+ smb2_header :smb2_header
9
+ uint16 :structure_size, label: 'Structure Size', initial_value: 33
10
+ uint8 :file_information_class, label: 'File Information Class'
11
+
12
+ struct :flags do
13
+ bit3 :reserved2, label: 'Reserved Space'
14
+ bit1 :reopen, label: 'Reopen Search'
15
+ bit1 :reserved, label: 'Reserved Space'
16
+ bit1 :index_specified, label: 'Start at Specified Index'
17
+ bit1 :return_single, label: 'Return Single Entry'
18
+ bit1 :restart_scans, label: 'Restart Enumeration from Start'
19
+ end
20
+
21
+ uint32 :file_index, label: 'File Index'
22
+ smb2_fileid :file_id, label: 'File ID'
23
+ uint16 :name_offset, label: 'File Name Offset', initial_value: -> { name.abs_offset }
24
+ uint16 :name_length, label: 'File Name Length', initial_value: -> { name.do_num_bytes }
25
+ uint32 :output_length, label: 'Output Buffer Length'
26
+ string16 :name, label: 'Name/Search Pattern'
27
+
28
+ def initialize_instance
29
+ super
30
+ smb2_header.command = RubySMB::SMB2::Commands::QUERY_DIRECTORY
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,45 @@
1
+ module RubySMB
2
+ module SMB2
3
+ module Packet
4
+ # An SMB2 Query Directory Response Packet as defined in
5
+ # [2.2.34 SMB2 QUERY_DIRECTORY Response](https://msdn.microsoft.com/en-us/library/cc246552.aspx)
6
+ class QueryDirectoryResponse < RubySMB::GenericPacket
7
+ endian :little
8
+ smb2_header :smb2_header
9
+ uint16 :structure_size, label: 'Structure Size', initial_value: 9
10
+ uint16 :buffer_offset, label: 'Output Buffer Offset', initial_value: -> { buffer.abs_offset }
11
+ uint32 :buffer_length, label: 'Output Buffer Length', initial_value: -> { buffer.do_num_bytes }
12
+ string :buffer, read_length: -> { buffer_length }
13
+
14
+ def initialize_instance
15
+ super
16
+ smb2_header.command = RubySMB::SMB2::Commands::QUERY_DIRECTORY
17
+ smb2_header.flags.reply = 1
18
+ end
19
+
20
+ # Returns the File Information in an array of appropriate
21
+ # structs for the given FileInformationClass. Pulled out of
22
+ # the string buffer.
23
+ #
24
+ # @param klass [Class] the FileInformationClass class to read the data as
25
+ # @return [array<BinData::Record>] An array of structs holding the requested information
26
+ def results(klass)
27
+ information_classes = []
28
+ blob = buffer.to_binary_s.dup
29
+ until blob.empty?
30
+ length = blob[0, 4].unpack('V').first
31
+
32
+ data = if length.zero?
33
+ blob.slice!(0, blob.length)
34
+ else
35
+ blob.slice!(0, length)
36
+ end
37
+
38
+ information_classes << klass.read(data)
39
+ end
40
+ information_classes
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,30 @@
1
+ module RubySMB
2
+ module SMB2
3
+ module Packet
4
+ # An SMB2 Read Request Packet as defined in
5
+ # [2.2.19 SMB2 READ Request](https://msdn.microsoft.com/en-us/library/cc246527.aspx)
6
+ class ReadRequest < RubySMB::GenericPacket
7
+ endian :little
8
+
9
+ smb2_header :smb2_header
10
+ uint16 :structure_size, label: 'Structure Size', initial_value: 49
11
+ uint8 :padding, label: 'Padding', initial_value: 0x50
12
+ uint8 :flags, label: 'Flags'
13
+ uint32 :read_length, label: 'Read Length'
14
+ uint64 :offset, label: 'Read Offset'
15
+ smb2_fileid :file_id, label: 'File ID'
16
+ uint32 :min_bytes, label: 'Minimum Count'
17
+ uint32 :channel, label: 'Channel'
18
+ uint32 :remaining_bytes, label: 'Remaining Bytes'
19
+ uint16 :channel_offset, label: 'Read Channel Info Offset'
20
+ uint16 :channel_length, label: 'Read Channel Info Length'
21
+ string :buffer, label: 'Read Channel info Buffer', initial_value: 0x00
22
+
23
+ def initialize_instance
24
+ super
25
+ smb2_header.command = RubySMB::SMB2::Commands::READ
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+ module RubySMB
2
+ module SMB2
3
+ module Packet
4
+ # An SMB2 Read Response Packet as defined in
5
+ # [2.2.20 SMB2 READ Response](https://msdn.microsoft.com/en-us/library/cc246531.aspx)
6
+ class ReadResponse < RubySMB::GenericPacket
7
+ endian :little
8
+
9
+ smb2_header :smb2_header
10
+ uint16 :structure_size, label: 'Structure Size', initial_value: 17
11
+ uint8 :data_offset, label: 'Data Buffer Offset', initial_value: -> { buffer.abs_offset }
12
+ uint8 :reserved, label: 'Reserved Space'
13
+ uint32 :data_length, label: 'Data Buffer Length'
14
+ uint32 :data_remaining, label: 'Data Remaining'
15
+ uint32 :reserved2, label: 'Reserved Space'
16
+ string :buffer, label: 'Data Buffer', length: -> { data_length }
17
+
18
+ def initialize_instance
19
+ super
20
+ smb2_header.command = RubySMB::SMB2::Commands::READ
21
+ smb2_header.flags.reply = 1
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,7 +1,6 @@
1
1
  module RubySMB
2
2
  module SMB2
3
3
  module Packet
4
-
5
4
  # An SMB2 SessionSetupRequest Packet as defined in
6
5
  # [2.2.5 SMB2 SESSION_SETUP Request](https://msdn.microsoft.com/en-us/library/cc246563.aspx)
7
6
  class SessionSetupRequest < RubySMB::GenericPacket
@@ -15,8 +14,7 @@ module RubySMB
15
14
  uint16 :security_buffer_offset, label: 'Security Buffer Offset', initial_value: 0x58
16
15
  uint16 :security_buffer_length, label: 'Security Buffer Length'
17
16
  uint64 :previous_session_id, label: 'Previous Session ID'
18
- string :buffer, label: 'Security Buffer', length: lambda { self.security_buffer_length }
19
-
17
+ string :buffer, label: 'Security Buffer', length: -> { security_buffer_length }
20
18
 
21
19
  def initialize_instance
22
20
  super
@@ -46,8 +44,7 @@ module RubySMB
46
44
  self.security_buffer_length = gss_blob.length
47
45
  self.buffer = gss_blob
48
46
  end
49
-
50
47
  end
51
48
  end
52
49
  end
53
- end
50
+ end
@@ -1,18 +1,16 @@
1
1
  module RubySMB
2
2
  module SMB2
3
3
  module Packet
4
-
5
4
  # An SMB2 SessionSetupResponse Packet as defined in
6
5
  # [2.2.6 SMB2 SESSION_SETUP Response](https://msdn.microsoft.com/en-us/library/cc246564.aspx)
7
6
  class SessionSetupResponse < RubySMB::GenericPacket
8
7
  endian :little
9
8
  smb2_header :smb2_header
10
- uint16 :structure_size, label: 'Structure Size', initial_value: 9
9
+ uint16 :structure_size, label: 'Structure Size', initial_value: 9
11
10
  session_flags :session_flags
12
- uint16 :security_buffer_offset, label: 'Security Buffer Offset', initial_value: 0x48
11
+ uint16 :security_buffer_offset, label: 'Security Buffer Offset', initial_value: 0x48
13
12
  uint16 :security_buffer_length, label: 'Security Buffer Length'
14
- string :buffer, label: 'Security Buffer', length: lambda { self.security_buffer_length }
15
-
13
+ string :buffer, label: 'Security Buffer', length: -> { security_buffer_length }
16
14
 
17
15
  def initialize_instance
18
16
  super
@@ -31,8 +29,7 @@ module RubySMB
31
29
  self.security_buffer_length = gss_blob.length
32
30
  self.buffer = gss_blob
33
31
  end
34
-
35
32
  end
36
33
  end
37
34
  end
38
- end
35
+ end
@@ -0,0 +1,58 @@
1
+ module RubySMB
2
+ module SMB2
3
+ module Packet
4
+ # An SMB2 Set Info Request Packet as defined in
5
+ # [2.2.39 SMB2 SET_INFO Request](https://msdn.microsoft.com/en-us/library/cc246560.aspx)
6
+ class SetInfoRequest < RubySMB::GenericPacket
7
+ include RubySMB::Fscc::FileInformation
8
+
9
+ endian :little
10
+
11
+ smb2_header :smb2_header
12
+ uint16 :structure_size, label: 'Structure Size', initial_value: 33
13
+ # Constants defined in RubySMB::SMB2::InfoType
14
+ uint8 :info_type, label: 'Info Type', initial_value: RubySMB::SMB2::InfoType::SMB2_0_INFO_FILE
15
+ uint8 :file_info_class, label: 'File Info Class'
16
+ uint32 :buffer_length, label: 'Buffer Length', initial_value: -> { buffer.do_num_bytes }
17
+ uint16 :buffer_offset, label: 'Buffer Offset', initial_value: -> { buffer.abs_offset }
18
+ uint16 :reserved, label: 'Reserved', initial_value: 0
19
+
20
+ struct :additional_information do
21
+ bit1 :reserved, label: 'Reserved Space'
22
+ bit1 :scope_security_information, label: 'Scope Security Information'
23
+ bit1 :attribute_security_information, label: 'Attribute Security Information'
24
+ bit1 :label_security_information, label: 'Label Security Information'
25
+ bit1 :sacl_security_information, label: 'SACL Security Information'
26
+ bit1 :dacl_security_information, label: 'DACL Security Information'
27
+ bit1 :group_security_information, label: 'Group Security Information'
28
+ bit1 :owner_security_information, label: 'Owner Security Information'
29
+ # byte boundary
30
+ bit8 :reserved2, label: 'Reserved Space'
31
+ # byte boundary
32
+ bit7 :reserved3, label: 'Reserved Space'
33
+ bit1 :backup_security_information, label: 'Backup Security Information'
34
+ # byte boundary
35
+ bit8 :reserved4, label: 'Reserved Space'
36
+ end
37
+
38
+ smb2_fileid :file_id, label: 'File ID'
39
+
40
+ choice :buffer, label: 'Buffer', selection: -> { file_info_class } do
41
+ file_directory_information FILE_DIRECTORY_INFORMATION, label: 'File Directory Information'
42
+ file_full_directory_information FILE_FULL_DIRECTORY_INFORMATION, label: 'File Full Directory Information'
43
+ file_both_directory_information FILE_BOTH_DIRECTORY_INFORMATION, label: 'File Both Directory Information'
44
+ file_rename_information FILE_RENAME_INFORMATION, label: 'File Rename Information'
45
+ file_names_information FILE_NAMES_INFORMATION, label: 'File Names Information'
46
+ file_disposition_information FILE_DISPOSITION_INFORMATION, label: 'File Disposition Information'
47
+ file_id_both_directory_information FILE_ID_BOTH_DIRECTORY_INFORMATION, label: 'File Id Both Directory Information'
48
+ file_id_full_directory_information FILE_ID_FULL_DIRECTORY_INFORMATION, label: 'File Id Full Directory Information'
49
+ end
50
+
51
+ def initialize_instance
52
+ super
53
+ smb2_header.command = RubySMB::SMB2::Commands::SET_INFO
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end