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,11 @@
1
+ module RubySMB
2
+ module Field
3
+ # Class representing an SMB2 FileID as defined in
4
+ # [2.2.14.1 SMB2_FILEID](https://msdn.microsoft.com/en-us/library/cc246513.aspx)
5
+ class Smb2Fileid < BinData::Record
6
+ endian :little
7
+ uint64 :persistent, label: 'Persistent File Handle'
8
+ uint64 :volatile, label: 'Volatile File handle'
9
+ end
10
+ end
11
+ end
@@ -5,10 +5,10 @@ module RubySMB
5
5
  class SmbFea < BinData::Record
6
6
  endian :little
7
7
  extended_attribute_flag :ea_flag, label: 'Extended Attribute Flag'
8
- uint8 :attribute_name_length, label: 'Attribute Name Length', initial_value: lambda { attribute_name.length}
9
- uint16 :attribute_value_length, label: 'Attribute Value Length', initial_value: lambda { attribute_value.length}
8
+ uint8 :attribute_name_length, label: 'Attribute Name Length', initial_value: -> { attribute_name.length }
9
+ uint16 :attribute_value_length, label: 'Attribute Value Length', initial_value: -> { attribute_value.length }
10
10
  string :attribute_name, label: 'Attribute Name'
11
11
  string :attribute_value, label: 'Attribute Value'
12
12
  end
13
13
  end
14
- end
14
+ end
@@ -4,10 +4,10 @@ module RubySMB
4
4
  # [2.2.1.2.2.1 SMB_FEA_LIST](https://msdn.microsoft.com/en-us/library/ff359296.aspx)
5
5
  class SmbFeaList < BinData::Record
6
6
  endian :little
7
- uint32 :size_of_list, label: 'Size of List in Bytes', initial_value: lambda { fea_list.do_num_bytes }
8
- array :fea_list, initial_length: 0 do
7
+ uint32 :size_of_list, label: 'Size of List in Bytes', initial_value: -> { fea_list.do_num_bytes }
8
+ array :fea_list, initial_length: 0 do
9
9
  smb_fea
10
10
  end
11
11
  end
12
12
  end
13
- end
13
+ end
@@ -0,0 +1,12 @@
1
+ module RubySMB
2
+ module Field
3
+ # Class representing an SMB Get Extended Attribute structure as defined in
4
+ # [2.2.1.2.1 SMB_GEA](https://msdn.microsoft.com/en-us/library/ee442131.aspx?f=255&MSPPError=-2147217396)
5
+ class SmbGea < BinData::Record
6
+ endian :little
7
+ uint8 :attribute_name_length, label: 'Attribute Name Length', initial_value: -> { attribute_name.do_num_bytes }
8
+ string :attribute_name, label: 'Attribute Name'
9
+ uint8 :null_pad, label: 'Null-Padding', initial_value: 0x00
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ module RubySMB
2
+ module Field
3
+ # Class representing an SMB Get Extended Attribute List as defined in
4
+ # [2.2.1.2.1.1 SMB_GEA_LIST](https://msdn.microsoft.com/en-us/library/ff359447.aspx)
5
+ class SmbGeaList < BinData::Record
6
+ endian :little
7
+ uint32 :size_of_list, label: 'Size of List in Bytes', initial_value: -> { self.do_num_bytes }
8
+ array :gea_list, initial_length: 0 do
9
+ smb_gea
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ module RubySMB
2
+ module Field
3
+ # Represents a String in UTF-16LE
4
+ class String16 < BinData::String
5
+ def assign(val)
6
+ super(val.encode('utf-16le'))
7
+ end
8
+
9
+ def snapshot
10
+ super.force_encoding('utf-16le')
11
+ end
12
+ end
13
+ end
14
+ end
@@ -2,25 +2,21 @@ module RubySMB
2
2
  module Field
3
3
  # Represents a NULL-Terminated String in UTF-16
4
4
  class Stringz16 < BinData::Stringz
5
-
6
5
  def assign(val)
7
- super(binary_string(val.encode("utf-16le")))
6
+ super(binary_string(val.encode('utf-16le')))
8
7
  end
9
8
 
10
9
  def snapshot
11
10
  # override to always remove trailing zero bytes
12
11
  result = _value
13
- result
14
12
  result = trim_and_zero_terminate(result)
15
- result.chomp("\0\0").force_encoding("utf-16le")
13
+ result.chomp("\0\0").force_encoding('utf-16le')
16
14
  end
17
15
 
18
16
  private
19
17
 
20
18
  def append_zero_byte_if_needed!(str)
21
- if str.length == 0 || !(str.end_with?("\0\0"))
22
- str << "\0\0"
23
- end
19
+ str << "\0\0" if str.empty? || !str.end_with?("\0\0")
24
20
  end
25
21
 
26
22
  # Override parent on {BinData::Stringz} to use
@@ -1,6 +1,7 @@
1
+ require 'date'
2
+
1
3
  module RubySMB
2
4
  module Field
3
-
4
5
  # Conveneince class for dealing with 32-bit unsigned UTIME
5
6
  # fields in SMB, as defined in
6
7
  # [2.2.1.4.3 UTIME](https://msdn.microsoft.com/en-us/library/ee441907.aspx)
@@ -23,14 +24,14 @@ module RubySMB
23
24
  # @return
24
25
  def set(value)
25
26
  case value
26
- when DateTime
27
- set(value.to_time)
28
- when Time
29
- set(value.to_i)
30
- when Fixnum
31
- self.val = value
32
- else
33
- self.val = value.to_i
27
+ when DateTime
28
+ set(value.to_time)
29
+ when Time
30
+ set(value.to_i)
31
+ when Integer
32
+ self.val = value
33
+ else
34
+ self.val = value.to_i
34
35
  end
35
36
  val
36
37
  end
@@ -51,4 +52,4 @@ module RubySMB
51
52
  end
52
53
  end
53
54
  end
54
- end
55
+ end
@@ -0,0 +1,12 @@
1
+ module RubySMB
2
+ # Namespace for structures and classes from File System
3
+ # Control Codes as defined in
4
+ # [[MS-FSCC]: File System Control Codes](https://msdn.microsoft.com/en-us/library/cc231987.aspx)
5
+ module Fscc
6
+ require 'ruby_smb/fscc/file_attributes'
7
+ require 'ruby_smb/fscc/file_full_ea_info'
8
+ require 'ruby_smb/fscc/ea_info_array'
9
+ require 'ruby_smb/fscc/file_information'
10
+ require 'ruby_smb/fscc/control_codes'
11
+ end
12
+ end
@@ -0,0 +1,26 @@
1
+ module RubySMB
2
+ module Fscc
3
+
4
+ # Defines the FSCTL/IOCTL control codes as defined in
5
+ # [2.2.31 SMB2 IOCTL Request](https://msdn.microsoft.com/en-us/library/cc246545.aspx)
6
+ module ControlCodes
7
+
8
+ FSCTL_DFS_GET_REFERRALS = 0x00060194
9
+ FSCTL_PIPE_PEEK = 0x0011400C
10
+ FSCTL_PIPE_WAIT = 0x00110018
11
+ FSCTL_PIPE_TRANSCEIVE = 0x0011C017
12
+ FSCTL_SRV_COPYCHUNK = 0x001440F2
13
+ FSCTL_SRV_ENUMERATE_SNAPSHOTS = 0x00144064
14
+ FSCTL_SRV_REQUEST_RESUME_KEY = 0x00140078
15
+ FSCTL_SRV_READ_HASH = 0x001441bb
16
+ FSCTL_SRV_COPYCHUNK_WRITE = 0x001480F2
17
+ FSCTL_LMR_REQUEST_RESILIENCY = 0x001401D4
18
+ FSCTL_QUERY_NETWORK_INTERFACE_INFO = 0x001401FC
19
+ FSCTL_SET_REPARSE_POINT = 0x000900A4
20
+ FSCTL_DFS_GET_REFERRALS_EX = 0x000601B0
21
+ FSCTL_FILE_LEVEL_TRIM = 0x00098208
22
+ FSCTL_VALIDATE_NEGOTIATE_INFO = 0x00140204
23
+
24
+ end
25
+ end
26
+ end
@@ -1,19 +1,18 @@
1
1
  module RubySMB
2
- module Field
2
+ module Fscc
3
3
  # Convenience class that extend the normal {BinData::Array} for use
4
- # with {RubySMB::Field::FileFullEaInfo}. This array will automatically
5
- # updates the {RubySMB::Field::FileFullEaInfo#next_entry_offset} of
4
+ # with {RubySMB::Fscc::FileFullEaInfo}. This array will automatically
5
+ # updates the {RubySMB::Fscc::FileFullEaInfo#next_entry_offset} of
6
6
  # each element in the array.
7
7
  class EaInfoArray < BinData::Array
8
-
9
8
  # Overrides the method from {BinData::Array} to
10
9
  # call #update_offsets
11
- # @raise [ArgumentError] if the inserted element is not a {RubySMB::Field::FileFullEaInfo}
10
+ # @raise [ArgumentError] if the inserted element is not a {RubySMB::Fscc::FileFullEaInfo}
12
11
  def []=(index, value)
13
- unless value.is_a? RubySMB::Field::FileFullEaInfo
14
- raise ArgumentError, "This array can only contain RubySMB::Field::FileFullEaInfo objects"
12
+ unless value.is_a? RubySMB::Fscc::FileFullEaInfo
13
+ raise ArgumentError, 'This array can only contain RubySMB::Fscc::FileFullEaInfo objects'
15
14
  end
16
- retval = super(index,value)
15
+ retval = super(index, value)
17
16
  update_offsets
18
17
  retval
19
18
  end
@@ -23,12 +22,12 @@ module RubySMB
23
22
  #
24
23
  # @param index [Integer] the index to insert into the array at
25
24
  # @param objs [Array<Object>] the objects to be inserted
26
- # @raise [ArgumentError] if the inserted element is not a {RubySMB::Field::FileFullEaInfo}
25
+ # @raise [ArgumentError] if the inserted element is not a {RubySMB::Fscc::FileFullEaInfo}
27
26
  # @return [self]
28
27
  def insert(index, *objs)
29
28
  objs.each do |x|
30
- unless x.is_a? RubySMB::Field::FileFullEaInfo
31
- raise ArgumentError, "This array can only contain RubySMB::Field::FileFullEaInfo objects"
29
+ unless x.is_a? RubySMB::Fscc::FileFullEaInfo
30
+ raise ArgumentError, 'This array can only contain RubySMB::Fscc::FileFullEaInfo objects'
32
31
  end
33
32
  end
34
33
  super(index, *objs)
@@ -41,8 +40,8 @@ module RubySMB
41
40
  #
42
41
  # @return [self]
43
42
  def update_offsets
44
- self.each do |element|
45
- if element == self.last
43
+ each do |element|
44
+ if element == last
46
45
  # If this is the end of our array, the offset must be 0
47
46
  element.next_entry_offset = 0
48
47
  else
@@ -52,7 +51,6 @@ module RubySMB
52
51
  end
53
52
  self
54
53
  end
55
-
56
54
  end
57
55
  end
58
56
  end
@@ -0,0 +1,29 @@
1
+ module RubySMB
2
+ module Fscc
3
+ # The bit-field for File System Control Code File Attributes as defined in
4
+ # [2.6 File Attributes](https://msdn.microsoft.com/en-us/library/cc232110.aspx)
5
+ class FileAttributes < BinData::Record
6
+ endian :little
7
+ bit1 :normal, label: 'Normal File/Directory'
8
+ bit1 :device, label: 'Device'
9
+ bit1 :archive, label: 'Archive'
10
+ bit1 :directory, label: 'Directory'
11
+ bit1 :volume, label: 'Volume Label'
12
+ bit1 :system, label: 'System File'
13
+ bit1 :hidden, label: 'Hidden File'
14
+ bit1 :read_only, label: 'Read Only'
15
+ # Byte boundary
16
+ bit1 :reserved, label: 'Reserved Space'
17
+ bit1 :encrypted, label: 'File is Encrypted'
18
+ bit1 :content_indexed, label: 'Content Indexed'
19
+ bit1 :offline, label: 'Offline Storage'
20
+ bit1 :compressed, label: 'Compressed File'
21
+ bit1 :reparse_point, label: 'Reparse Point'
22
+ bit1 :sparse, label: 'Sparse File'
23
+ bit1 :temp, label: 'Temporary File'
24
+ # Byte boundary
25
+ bit8 :reserved2, label: 'Reserved Space'
26
+ bit8 :reserved3, label: 'Reserved Space'
27
+ end
28
+ end
29
+ end
@@ -1,15 +1,15 @@
1
1
  module RubySMB
2
- module Field
2
+ module Fscc
3
3
  # Class representing a FillFullEaInformation structure as defined in
4
4
  # [2.4.15 FileFullEaInformation](https://msdn.microsoft.com/en-us/library/cc232069.aspx)
5
5
  class FileFullEaInfo < BinData::Record
6
- endian :little
6
+ endian :little
7
7
  uint32 :next_entry_offset, label: 'Next Entry Offset'
8
8
  extended_attribute_flag :flags
9
- uint8 :ea_name_length, label: 'EA Name Length', initial_value: lambda { ea_name.do_num_bytes }
10
- uint8 :ea_value_length, label: 'EA Value Length', initial_value: lambda { ea_value.do_num_bytes }
9
+ uint8 :ea_name_length, label: 'EA Name Length', initial_value: -> { ea_name.do_num_bytes }
10
+ uint8 :ea_value_length, label: 'EA Value Length', initial_value: -> { ea_value.do_num_bytes }
11
11
  string :ea_name, label: 'EA Name'
12
12
  string :ea_value, label: 'EA Value'
13
13
  end
14
14
  end
15
- end
15
+ end
@@ -0,0 +1,60 @@
1
+ module RubySMB
2
+ module Fscc
3
+ # Namespace and constant values for File Information Classes, as defined in
4
+ # [2.4 File Information Classes](https://msdn.microsoft.com/en-us/library/cc232064.aspx)
5
+ module FileInformation
6
+ # Information class used in directory enumeration to return detailed
7
+ # information about the contents of a directory.
8
+ FILE_DIRECTORY_INFORMATION = 0x01
9
+
10
+ # Information class used in directory enumeration to return detailed
11
+ # information (with extended attributes size) about the contents of a
12
+ # directory.
13
+ FILE_FULL_DIRECTORY_INFORMATION = 0x02
14
+
15
+ # Information class used in directory enumeration to return detailed
16
+ # information (with extended attributes size and short names) about the
17
+ # contents of a directory.
18
+ FILE_BOTH_DIRECTORY_INFORMATION = 0x03
19
+
20
+ # Information class used to rename a file.
21
+ FILE_RENAME_INFORMATION = 0x0A
22
+
23
+ # Information class used in directory enumeration to return detailed
24
+ # information (with only filenames) about the contents of a directory.
25
+ FILE_NAMES_INFORMATION = 0x0C
26
+
27
+ # Information class used to mark a file for deletion.
28
+ FILE_DISPOSITION_INFORMATION = 0x0D
29
+
30
+ # Information class used in directory enumeration to return detailed
31
+ # information (with extended attributes size, short names and file ID)
32
+ # about the contents of a directory.
33
+ FILE_ID_BOTH_DIRECTORY_INFORMATION = 0x25
34
+
35
+ # Information class used in directory enumeration to return detailed
36
+ # information (with extended attributes size and file ID) about the
37
+ # contents of a directory.
38
+ FILE_ID_FULL_DIRECTORY_INFORMATION = 0x26
39
+
40
+
41
+ # These Information Classes can be used by SMB1 using the pass-through
42
+ # Information Levels when available on the server (CAP_INFOLEVEL_PASSTHRU
43
+ # capability flag in an SMB_COM_NEGOTIATE server response). The constant
44
+ # SMB_INFO_PASSTHROUGH needs to be added to access these Information
45
+ # Levels. This is documented in
46
+ # [2.2.2.3.5 Pass-through Information Level Codes](https://msdn.microsoft.com/en-us/library/ff470158.aspx)
47
+ SMB_INFO_PASSTHROUGH = 0x03e8
48
+
49
+
50
+ require 'ruby_smb/fscc/file_information/file_directory_information'
51
+ require 'ruby_smb/fscc/file_information/file_full_directory_information'
52
+ require 'ruby_smb/fscc/file_information/file_disposition_information'
53
+ require 'ruby_smb/fscc/file_information/file_id_full_directory_information'
54
+ require 'ruby_smb/fscc/file_information/file_both_directory_information'
55
+ require 'ruby_smb/fscc/file_information/file_id_both_directory_information'
56
+ require 'ruby_smb/fscc/file_information/file_names_information'
57
+ require 'ruby_smb/fscc/file_information/file_rename_information'
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,29 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FileBothDirectoryInformation Class as defined in
5
+ # [2.4.8 FileBothDirectoryInformation](https://msdn.microsoft.com/en-us/library/cc232095.aspx)
6
+ class FileBothDirectoryInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_BOTH_DIRECTORY_INFORMATION
8
+
9
+ endian :little
10
+
11
+ uint32 :next_offset, label: 'Next Entry Offset'
12
+ uint32 :file_index, label: 'File Index'
13
+ file_time :create_time, label: 'Create Time'
14
+ file_time :last_access, label: 'Last Accessed Time'
15
+ file_time :last_write, label: 'Last Write Time'
16
+ file_time :last_change, label: 'Last Modified Time'
17
+ uint64 :end_of_file, label: 'End of File'
18
+ uint64 :allocation_size, label: 'Allocated Size'
19
+ file_attributes :file_attributes, label: 'File Attributes'
20
+ uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
21
+ uint32 :ea_size, label: 'Extended Attributes Size'
22
+ uint8 :short_name_length, label: 'Short Name Length'
23
+ uint8 :reserved, label: 'Reserved Space'
24
+ string16 :short_name, label: 'File Short Name', length: 24
25
+ string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,25 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FileDirectoryInformation Class as defined in
5
+ # [2.4.10 FileDirectoryInformation](https://msdn.microsoft.com/en-us/library/cc232097.aspx)
6
+ class FileDirectoryInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_DIRECTORY_INFORMATION
8
+
9
+ endian :little
10
+
11
+ uint32 :next_offset, label: 'Next Entry Offset'
12
+ uint32 :file_index, label: 'File Index'
13
+ file_time :create_time, label: 'Create Time'
14
+ file_time :last_access, label: 'Last Accessed Time'
15
+ file_time :last_write, label: 'Last Write Time'
16
+ file_time :last_change, label: 'Last Modified Time'
17
+ uint64 :end_of_file, label: 'End of File'
18
+ uint64 :allocation_size, label: 'Allocated Size'
19
+ file_attributes :file_attributes, label: 'File Attributes'
20
+ uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
21
+ string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,15 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FileDispositionInformation Class as defined in
5
+ # [2.4.11 FileDispositionInformation](https://msdn.microsoft.com/en-us/library/cc232098.aspx)
6
+ class FileDispositionInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_DISPOSITION_INFORMATION
8
+
9
+ endian :little
10
+
11
+ uint8 :delete_pending, label: 'Delete Pending', initial_value: 0
12
+ end
13
+ end
14
+ end
15
+ end