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
@@ -92,8 +92,16 @@ RSpec.describe RubySMB::SMB1::Packet::NtTrans::CreateRequest do
92
92
  it { is_expected.to respond_to :name }
93
93
 
94
94
  describe '#desired_access' do
95
- it 'is a File Access Mask' do
96
- expect(parameters.desired_access).to be_a RubySMB::SMB1::BitField::FileAccessMask
95
+ it 'should be a DirectoryAccessMask when the file is a directory' do
96
+ parameters.ext_file_attribute.directory = 1
97
+ access_mask = parameters.desired_access.send(:current_choice)
98
+ expect(access_mask.class).to eq RubySMB::SMB1::BitField::DirectoryAccessMask
99
+ end
100
+
101
+ it 'should be a FileAccessMask when the file is not a directory' do
102
+ parameters.ext_file_attribute.directory = 0
103
+ access_mask = parameters.desired_access.send(:current_choice)
104
+ expect(access_mask.class).to eq RubySMB::SMB1::BitField::FileAccessMask
97
105
  end
98
106
  end
99
107
 
@@ -172,7 +180,7 @@ RSpec.describe RubySMB::SMB1::Packet::NtTrans::CreateRequest do
172
180
  end
173
181
 
174
182
  describe '#trans2_data' do
175
- subject(:data) { data_block.trans2_data}
183
+ subject(:data) { data_block.trans2_data }
176
184
 
177
185
  it { is_expected.to respond_to :security_descriptor }
178
186
  it { is_expected.to respond_to :extended_attributes }
@@ -185,10 +193,9 @@ RSpec.describe RubySMB::SMB1::Packet::NtTrans::CreateRequest do
185
193
 
186
194
  describe '#extended_attributes' do
187
195
  it 'is a FileFullEAInfo struct' do
188
- expect(data.extended_attributes).to be_a RubySMB::Field::FileFullEaInfo
196
+ expect(data.extended_attributes).to be_a RubySMB::Fscc::FileFullEaInfo
189
197
  end
190
198
  end
191
199
  end
192
-
193
200
  end
194
- end
201
+ end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe RubySMB::SMB1::Packet::NtTrans::CreateResponse do
4
-
5
4
  subject(:packet) { described_class.new }
6
5
 
7
6
  describe '#smb_header' do
@@ -55,8 +54,6 @@ RSpec.describe RubySMB::SMB1::Packet::NtTrans::CreateResponse do
55
54
  describe '#data_block' do
56
55
  subject(:data_block) { packet.data_block }
57
56
 
58
- it { is_expected.to be_a RubySMB::SMB1::Packet::Trans2::DataBlock }
59
-
60
57
  describe '#trans2_data' do
61
58
  it 'should be a 0-byte string' do
62
59
  expect(data_block.trans2_data.length).to eq 0
@@ -116,9 +113,6 @@ RSpec.describe RubySMB::SMB1::Packet::NtTrans::CreateResponse do
116
113
  expect(parameters.nmpipe_status).to be_a RubySMB::SMB1::BitField::SmbNmpipeStatus
117
114
  end
118
115
  end
119
-
120
116
  end
121
117
  end
122
-
123
-
124
- end
118
+ end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe RubySMB::SMB1::Packet::NtTrans::Request do
4
-
5
4
  subject(:packet) { described_class.new }
6
5
 
7
6
  describe '#smb_header' do
@@ -39,7 +38,6 @@ RSpec.describe RubySMB::SMB1::Packet::NtTrans::Request do
39
38
  it { is_expected.to respond_to :data_offset }
40
39
  it { is_expected.to respond_to :setup_count }
41
40
 
42
-
43
41
  describe 'parameter_count' do
44
42
  it 'is a count of bytes in the data_block trans2_parameters field' do
45
43
  packet.data_block.trans2_parameters = "\x00\x01\x02\x03"
@@ -84,8 +82,5 @@ RSpec.describe RubySMB::SMB1::Packet::NtTrans::Request do
84
82
  it 'should keep #trans2_data 4-byte aligned' do
85
83
  expect(data_block.trans2_data.abs_offset % 4).to eq 0
86
84
  end
87
-
88
85
  end
89
-
90
-
91
- end
86
+ end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe RubySMB::SMB1::Packet::NtTrans::Response do
4
-
5
4
  subject(:packet) { described_class.new }
6
5
 
7
6
  describe '#smb_header' do
@@ -35,7 +34,6 @@ RSpec.describe RubySMB::SMB1::Packet::NtTrans::Response do
35
34
  it { is_expected.to respond_to :data_offset }
36
35
  it { is_expected.to respond_to :setup_count }
37
36
 
38
-
39
37
  describe 'parameter_count' do
40
38
  it 'is a count of bytes in the data_block trans2_parameters field' do
41
39
  packet.data_block.trans2_parameters = "\x00\x01\x02\x03"
@@ -70,6 +68,4 @@ RSpec.describe RubySMB::SMB1::Packet::NtTrans::Response do
70
68
  expect(data_block).to be_a RubySMB::SMB1::Packet::NtTrans::Request::DataBlock
71
69
  end
72
70
  end
73
-
74
-
75
- end
71
+ end
@@ -0,0 +1,149 @@
1
+ RSpec.describe RubySMB::SMB1::Packet::ReadAndxRequest do
2
+ subject(:packet) { described_class.new }
3
+
4
+ describe '#smb_header' do
5
+ subject(:header) { packet.smb_header }
6
+
7
+ it 'is a standard SMB Header' do
8
+ expect(header).to be_a RubySMB::SMB1::SMBHeader
9
+ end
10
+
11
+ it 'should have the command set to SMB_COM_READ_ANDX' do
12
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_READ_ANDX
13
+ end
14
+
15
+ it 'should not have the response flag set' do
16
+ expect(header.flags.reply).to eq 0
17
+ end
18
+ end
19
+
20
+ describe '#parameter_block' do
21
+ subject(:parameter_block) { packet.parameter_block }
22
+
23
+ it 'is a standard ParameterBlock' do
24
+ expect(parameter_block).to be_a RubySMB::SMB1::ParameterBlock
25
+ end
26
+
27
+ it 'is little endian' do
28
+ expect(parameter_block.get_parameter(:endian).endian).to eq :little
29
+ end
30
+
31
+ describe '#word_count' do
32
+ it 'is set to the correct default value' do
33
+ expect(parameter_block.word_count).to eq(0x0A)
34
+ end
35
+ end
36
+
37
+ it { is_expected.to respond_to :andx_block }
38
+ it { is_expected.to respond_to :fid }
39
+ it { is_expected.to respond_to :offset }
40
+ it { is_expected.to respond_to :max_count_of_bytes_to_return }
41
+ it { is_expected.to respond_to :min_count_of_bytes_to_return }
42
+ it { is_expected.to respond_to :timeout_or_max_count_high }
43
+ it { is_expected.to respond_to :remaining }
44
+ it { is_expected.to respond_to :offset_high }
45
+ it { is_expected.to respond_to :read_from_named_pipe }
46
+
47
+ describe '#andx_block' do
48
+ it 'is a AndXBlock struct' do
49
+ expect(parameter_block.andx_block).to be_a RubySMB::SMB1::AndXBlock
50
+ end
51
+ end
52
+
53
+ describe '#timeout_or_max_count_high' do
54
+ it 'is a #timeout field when the target is a named pipe' do
55
+ parameter_block.read_from_named_pipe = true
56
+ expect(parameter_block.timeout_or_max_count_high).to respond_to :timeout
57
+ expect(parameter_block.timeout_or_max_count_high).not_to respond_to :max_count_high
58
+ end
59
+
60
+ it 'is a #max_count_high field when the target is a file or a directory' do
61
+ parameter_block.read_from_named_pipe = false
62
+ expect(parameter_block.timeout_or_max_count_high).not_to respond_to :timeout
63
+ expect(parameter_block.timeout_or_max_count_high).to respond_to :max_count_high
64
+ end
65
+ end
66
+
67
+ describe '#offset_high' do
68
+ it 'exists when word_count is 0x0C' do
69
+ parameter_block.word_count = 0x0C
70
+ expect(parameter_block.offset_high?).to be true
71
+ end
72
+
73
+ it 'does not exist when word_count is 0x0A' do
74
+ parameter_block.word_count = 0x0A
75
+ expect(parameter_block.offset_high?).to be false
76
+ end
77
+ end
78
+
79
+ describe '#read_from_named_pipe' do
80
+ it 'is set to the correct default value' do
81
+ expect(parameter_block.read_from_named_pipe).to eq(false)
82
+ end
83
+ end
84
+ end
85
+
86
+ describe '#data_block' do
87
+ subject(:data_block) { packet.data_block }
88
+
89
+ it 'is a standard DataBlock' do
90
+ expect(data_block).to be_a RubySMB::SMB1::DataBlock
91
+ end
92
+
93
+ it 'should be empty' do
94
+ expect(data_block.byte_count).to eq(0)
95
+ end
96
+ end
97
+
98
+ describe '#set_read_from_named_pipe' do
99
+ it 'sets the #read_from_named_pipe variable to true' do
100
+ packet.parameter_block.read_from_named_pipe = false
101
+ packet.set_read_from_named_pipe(true)
102
+ expect(packet.parameter_block.read_from_named_pipe).to be true
103
+ end
104
+
105
+ it 'sets the #read_from_named_pipe variable to false' do
106
+ packet.parameter_block.read_from_named_pipe = true
107
+ packet.set_read_from_named_pipe(false)
108
+ expect(packet.parameter_block.read_from_named_pipe).to be false
109
+ end
110
+
111
+ it 'raises an exception when the value is a String' do
112
+ expect { packet.set_read_from_named_pipe('true') }.to raise_error(ArgumentError)
113
+ end
114
+
115
+ it 'raises an exception when the value is a Numeric' do
116
+ expect { packet.set_read_from_named_pipe(1) }.to raise_error(ArgumentError)
117
+ end
118
+
119
+ it 'raises an exception when the value is a Symbol' do
120
+ expect { packet.set_read_from_named_pipe(:true) }.to raise_error(ArgumentError)
121
+ end
122
+ end
123
+
124
+ describe '#set_64_bit_offset' do
125
+ it 'sets the #word_count field to 0x0C when passing true' do
126
+ packet.parameter_block.word_count = 0
127
+ packet.set_64_bit_offset(true)
128
+ expect(packet.parameter_block.word_count).to eq(0x0C)
129
+ end
130
+
131
+ it 'sets the #word_count field to 0x0A when passing false' do
132
+ packet.parameter_block.word_count = 0
133
+ packet.set_64_bit_offset(false)
134
+ expect(packet.parameter_block.word_count).to eq(0x0A)
135
+ end
136
+
137
+ it 'raises an exception when the value is a String' do
138
+ expect { packet.set_64_bit_offset('true') }.to raise_error(ArgumentError)
139
+ end
140
+
141
+ it 'raises an exception when the value is a Numeric' do
142
+ expect { packet.set_64_bit_offset(1) }.to raise_error(ArgumentError)
143
+ end
144
+
145
+ it 'raises an exception when the value is a Symbol' do
146
+ expect { packet.set_64_bit_offset(:true) }.to raise_error(ArgumentError)
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,93 @@
1
+ RSpec.describe RubySMB::SMB1::Packet::ReadAndxResponse do
2
+ subject(:packet) { described_class.new }
3
+
4
+ describe '#smb_header' do
5
+ subject(:header) { packet.smb_header }
6
+
7
+ it 'is a standard SMB Header' do
8
+ expect(header).to be_a RubySMB::SMB1::SMBHeader
9
+ end
10
+
11
+ it 'should have the command set to SMB_COM_READ_ANDX' do
12
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_READ_ANDX
13
+ end
14
+
15
+ it 'should have the response flag set' do
16
+ expect(header.flags.reply).to eq 1
17
+ end
18
+ end
19
+
20
+ describe '#parameter_block' do
21
+ subject(:parameter_block) { packet.parameter_block }
22
+
23
+ it 'is a standard ParameterBlock' do
24
+ expect(parameter_block).to be_a RubySMB::SMB1::ParameterBlock
25
+ end
26
+
27
+ it 'is little endian' do
28
+ expect(parameter_block.get_parameter(:endian).endian).to eq :little
29
+ end
30
+
31
+ it { is_expected.to respond_to :andx_block }
32
+ it { is_expected.to respond_to :available }
33
+ it { is_expected.to respond_to :data_compaction_mode }
34
+ it { is_expected.to respond_to :data_length }
35
+ it { is_expected.to respond_to :data_offset }
36
+ it { is_expected.to respond_to :data_length_high }
37
+
38
+ describe '#andx_block' do
39
+ it 'is a AndXBlock struct' do
40
+ expect(parameter_block.andx_block).to be_a RubySMB::SMB1::AndXBlock
41
+ end
42
+ end
43
+
44
+ describe '#data_compaction_mode' do
45
+ it 'is set to the correct default value' do
46
+ expect(parameter_block.data_compaction_mode).to eq(0x0000)
47
+ end
48
+ end
49
+ end
50
+
51
+ describe '#data_block' do
52
+ subject(:data_block) { packet.data_block }
53
+
54
+ it 'is a standard DataBlock' do
55
+ expect(data_block).to be_a RubySMB::SMB1::DataBlock
56
+ end
57
+
58
+ it 'is little endian' do
59
+ expect(data_block.get_parameter(:endian).endian).to eq :little
60
+ end
61
+
62
+ it { is_expected.to respond_to :pad }
63
+ it { is_expected.to respond_to :data }
64
+
65
+ describe '#pad' do
66
+ it 'does not exist if byte_count is zero (no data in the data_block)' do
67
+ data_block.byte_count = 0
68
+ expect(data_block.pad?).to be false
69
+ end
70
+
71
+ it 'does not exist if the data_length is equal to byte_count' do
72
+ packet.parameter_block.data_length = 5
73
+ data_block.byte_count = 5
74
+ expect(data_block.pad?).to be false
75
+ end
76
+
77
+ it 'exists if the data_length is one byte less than byte_count' do
78
+ packet.parameter_block.data_length = 4
79
+ data_block.byte_count = 5
80
+ expect(data_block.pad?).to be true
81
+ end
82
+ end
83
+
84
+ describe '#data' do
85
+ it 'reads the number of bytes specified in the data_length field' do
86
+ data = 'Testing...'
87
+ packet.parameter_block.data_length = 4
88
+ data_block.data.read(data)
89
+ expect(data_block.data).to eq(data[0, 4])
90
+ end
91
+ end
92
+ end
93
+ end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe RubySMB::SMB1::Packet::SessionSetupLegacyRequest do
4
-
5
4
  subject(:packet) { described_class.new }
6
5
 
7
6
  describe '#smb_header' do
@@ -55,8 +54,5 @@ RSpec.describe RubySMB::SMB1::Packet::SessionSetupLegacyRequest do
55
54
  it { is_expected.to respond_to :primary_domain }
56
55
  it { is_expected.to respond_to :native_os }
57
56
  it { is_expected.to respond_to :native_lan_man }
58
-
59
57
  end
60
-
61
-
62
- end
58
+ end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe RubySMB::SMB1::Packet::SessionSetupLegacyResponse do
4
-
5
4
  subject(:packet) { described_class.new }
6
5
 
7
6
  describe '#smb_header' do
@@ -30,7 +29,6 @@ RSpec.describe RubySMB::SMB1::Packet::SessionSetupLegacyResponse do
30
29
  it { is_expected.to respond_to :andx_block }
31
30
  it { is_expected.to respond_to :action }
32
31
 
33
-
34
32
  it 'has an AndXBlock' do
35
33
  expect(parameter_block.andx_block).to be_a RubySMB::SMB1::AndXBlock
36
34
  end
@@ -47,6 +45,4 @@ RSpec.describe RubySMB::SMB1::Packet::SessionSetupLegacyResponse do
47
45
  it { is_expected.to respond_to :native_os }
48
46
  it { is_expected.to respond_to :native_lan_man }
49
47
  end
50
-
51
-
52
- end
48
+ end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe RubySMB::SMB1::Packet::SessionSetupRequest do
4
-
5
4
  subject(:packet) { described_class.new }
6
5
 
7
6
  describe '#smb_header' do
@@ -50,11 +49,10 @@ RSpec.describe RubySMB::SMB1::Packet::SessionSetupRequest do
50
49
  it { is_expected.to respond_to :security_blob }
51
50
  it { is_expected.to respond_to :native_os }
52
51
  it { is_expected.to respond_to :native_lan_man }
53
-
54
52
  end
55
53
 
56
54
  describe '#set_type1_blob' do
57
- let(:fake_message) { "foo" }
55
+ let(:fake_message) { 'foo' }
58
56
 
59
57
  it 'calls the #gss_type1 method to create a blob' do
60
58
  expect(RubySMB::Gss).to receive(:gss_type1).with(fake_message).and_return(fake_message)
@@ -75,7 +73,7 @@ RSpec.describe RubySMB::SMB1::Packet::SessionSetupRequest do
75
73
  end
76
74
 
77
75
  describe '#set_type3_blob' do
78
- let(:fake_message) { "foo" }
76
+ let(:fake_message) { 'foo' }
79
77
 
80
78
  it 'calls the #gss_type3 method to create a blob' do
81
79
  expect(RubySMB::Gss).to receive(:gss_type3).with(fake_message).and_return(fake_message)
@@ -94,7 +92,4 @@ RSpec.describe RubySMB::SMB1::Packet::SessionSetupRequest do
94
92
  expect(packet.parameter_block.security_blob_length).to eq fake_message.length
95
93
  end
96
94
  end
97
-
98
-
99
-
100
- end
95
+ end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe RubySMB::SMB1::Packet::SessionSetupResponse do
4
-
5
4
  subject(:packet) { described_class.new }
6
5
 
7
6
  describe '#smb_header' do
@@ -49,7 +48,7 @@ RSpec.describe RubySMB::SMB1::Packet::SessionSetupResponse do
49
48
  end
50
49
 
51
50
  describe '#set_type2_blob' do
52
- let(:fake_message) { "foo" }
51
+ let(:fake_message) { 'foo' }
53
52
 
54
53
  it 'calls the #gss_type2 method to create a blob' do
55
54
  expect(RubySMB::Gss).to receive(:gss_type2).with(fake_message).and_return(fake_message)
@@ -68,5 +67,4 @@ RSpec.describe RubySMB::SMB1::Packet::SessionSetupResponse do
68
67
  expect(packet.parameter_block.security_blob_length).to eq fake_message.length
69
68
  end
70
69
  end
71
-
72
- end
70
+ end