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,22 @@
1
+ RSpec.describe RubySMB::Field::SmbGea do
2
+ subject(:gea) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :attribute_name_length }
5
+ it { is_expected.to respond_to :attribute_name }
6
+ it { is_expected.to respond_to :null_pad }
7
+
8
+ it 'is little endian' do
9
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
10
+ end
11
+
12
+ describe '#attribute_name_length' do
13
+ it 'reflects the size of the attribute_name field' do
14
+ gea.attribute_name = 'TEST'
15
+ expect(gea.attribute_name_length).to eq 4
16
+ end
17
+ end
18
+
19
+ it 'always has a null pad at the end' do
20
+ expect(gea.null_pad).to eq 0x00
21
+ end
22
+ end
@@ -4,14 +4,14 @@ RSpec.describe RubySMB::Field::Stringz16 do
4
4
  subject(:stringz16) { described_class.new }
5
5
 
6
6
  it 'starts as an empty string' do
7
- expect(stringz16).to eq ""
7
+ expect(stringz16).to eq ''
8
8
  end
9
9
 
10
10
  context 'with a value already set' do
11
- let(:abcd) { described_class.new("ABCD") }
11
+ let(:abcd) { described_class.new('ABCD') }
12
12
 
13
13
  it 'should be UTF-16le' do
14
- expect(abcd).to eq "ABCD".encode("utf-16le")
14
+ expect(abcd).to eq 'ABCD'.encode('utf-16le')
15
15
  end
16
16
 
17
17
  it 'should include the NULL terminator on binary output' do
@@ -23,12 +23,11 @@ RSpec.describe RubySMB::Field::Stringz16 do
23
23
  let(:null_terminator) { described_class.new("ABCD\x00EFG") }
24
24
 
25
25
  it 'drops everything after the null terminator' do
26
- expect(null_terminator).to eq "ABCD".encode("utf-16le")
26
+ expect(null_terminator).to eq 'ABCD'.encode('utf-16le')
27
27
  end
28
28
  end
29
29
 
30
30
  context 'when reading data in' do
31
-
32
31
  it 'stops at the first double null byte' do
33
32
  io = StringIO.new("A\x00B\x00C\x00D\x00\x00\x00E\x00F\x00")
34
33
  stringz16.read(io)
@@ -38,13 +37,12 @@ RSpec.describe RubySMB::Field::Stringz16 do
38
37
  it 'handles a zero length string' do
39
38
  io = StringIO.new("\x00\x00A\x00")
40
39
  stringz16.read(io)
41
- expect(stringz16).to eq ""
40
+ expect(stringz16).to eq ''
42
41
  end
43
42
 
44
43
  it 'fails if no null terminator is found' do
45
44
  io = StringIO.new("A\x00B\x00C\x00D\x00")
46
- expect{ stringz16.read(io) }.to raise_error(EOFError)
45
+ expect { stringz16.read(io) }.to raise_error(EOFError)
47
46
  end
48
47
  end
49
-
50
- end
48
+ end
@@ -1,3 +1,5 @@
1
+ require 'date'
2
+
1
3
  RSpec.describe RubySMB::Field::Utime do
2
4
  subject(:time) { described_class.read(binary_filetime) }
3
5
 
@@ -42,13 +44,13 @@ RSpec.describe RubySMB::Field::Utime do
42
44
  it 'will take a Time object correctly but lose Nanoseconds' do
43
45
  empty_filetime.set time_filetime
44
46
  val = empty_filetime.get
45
- expect(val / 10_000_000).to eq (int_filetime / 10_000_000)
47
+ expect(val / 10_000_000).to eq(int_filetime / 10_000_000)
46
48
  end
47
49
 
48
50
  it 'will take a DateTime object correctly but lose Nanoseconds' do
49
51
  empty_filetime.set datetime_filetime
50
52
  val = empty_filetime.get
51
- expect(val / 10_000_000).to eq (int_filetime / 10_000_000)
53
+ expect(val / 10_000_000).to eq(int_filetime / 10_000_000)
52
54
  end
53
55
 
54
56
  it 'will accept a raw integer value and set it' do
@@ -1,21 +1,21 @@
1
1
  require 'spec_helper'
2
2
 
3
- RSpec.describe RubySMB::Field::EaInfoArray do
3
+ RSpec.describe RubySMB::Fscc::EaInfoArray do
4
4
  subject(:info_array) { described_class.new(type: :file_full_ea_info) }
5
5
  let(:first_ea) {
6
- ea = RubySMB::Field::FileFullEaInfo.new
6
+ ea = RubySMB::Fscc::FileFullEaInfo.new
7
7
  ea.ea_name = 'First'
8
8
  ea.ea_value = 'First Value'
9
9
  ea
10
10
  }
11
11
  let(:second_ea) {
12
- ea = RubySMB::Field::FileFullEaInfo.new
12
+ ea = RubySMB::Fscc::FileFullEaInfo.new
13
13
  ea.ea_name = 'Second'
14
14
  ea.ea_value = 'Second Value'
15
15
  ea
16
16
  }
17
17
  let(:additional_ea) {
18
- ea = RubySMB::Field::FileFullEaInfo.new
18
+ ea = RubySMB::Fscc::FileFullEaInfo.new
19
19
  ea.ea_name = 'Additional'
20
20
  ea.ea_value = 'Additional Value'
21
21
  ea
@@ -40,12 +40,10 @@ RSpec.describe RubySMB::Field::EaInfoArray do
40
40
  end
41
41
 
42
42
  it 'raises an error when inserting an invalid object' do
43
- expect{ info_array << "Foo" }.to raise_error(ArgumentError)
43
+ expect { info_array << 'Foo' }.to raise_error(ArgumentError)
44
44
  end
45
45
 
46
46
  it 'raises an error when setting an invalid value' do
47
- expect{ info_array[0] = "Foo" }.to raise_error(ArgumentError)
47
+ expect { info_array[0] = 'Foo' }.to raise_error(ArgumentError)
48
48
  end
49
-
50
-
51
- end
49
+ end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- RSpec.describe RubySMB::Field::FileFullEaInfo do
3
+ RSpec.describe RubySMB::Fscc::FileFullEaInfo do
4
4
  subject(:info) { described_class.new }
5
5
 
6
6
  it { is_expected.to respond_to :next_entry_offset }
@@ -31,5 +31,4 @@ RSpec.describe RubySMB::Field::FileFullEaInfo do
31
31
  expect(info.ea_value_length).to eq info.ea_value.do_num_bytes
32
32
  end
33
33
  end
34
-
35
- end
34
+ end
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::Fscc::FileInformation::FileBothDirectoryInformation do
4
+ it 'references the correct class level' do
5
+ expect(described_class).to be_const_defined(:CLASS_LEVEL)
6
+ expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_BOTH_DIRECTORY_INFORMATION
7
+ end
8
+
9
+ subject(:struct) { described_class.new }
10
+
11
+ it { should respond_to :next_offset }
12
+ it { should respond_to :file_index }
13
+ it { should respond_to :create_time }
14
+ it { should respond_to :last_access }
15
+ it { should respond_to :last_write }
16
+ it { should respond_to :last_change }
17
+ it { should respond_to :end_of_file }
18
+ it { should respond_to :allocation_size }
19
+ it { should respond_to :file_attributes }
20
+ it { should respond_to :file_name_length }
21
+ it { should respond_to :ea_size }
22
+ it { should respond_to :short_name }
23
+ it { should respond_to :short_name_length }
24
+ it { should respond_to :file_name }
25
+
26
+ it 'is little endian' do
27
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
28
+ end
29
+
30
+ it 'tracks the creation time in a Filetime field' do
31
+ expect(struct.create_time).to be_a RubySMB::Field::FileTime
32
+ end
33
+
34
+ it 'tracks the last access time in a Filetime field' do
35
+ expect(struct.last_access).to be_a RubySMB::Field::FileTime
36
+ end
37
+
38
+ it 'tracks the last write time in a Filetime field' do
39
+ expect(struct.last_write).to be_a RubySMB::Field::FileTime
40
+ end
41
+
42
+ it 'tracks the last modified time in a Filetime field' do
43
+ expect(struct.last_change).to be_a RubySMB::Field::FileTime
44
+ end
45
+
46
+ it 'contains the file attributes of the file' do
47
+ expect(struct.file_attributes).to be_a RubySMB::Fscc::FileAttributes
48
+ end
49
+
50
+ it 'tracks the length of the file_name field' do
51
+ struct.file_name = 'Hello.txt'
52
+ expect(struct.file_name_length).to eq struct.file_name.do_num_bytes
53
+ end
54
+
55
+ it 'automatically encodes the file name in UTF-16LE' do
56
+ name = 'Hello_world.txt'
57
+ struct.file_name = name
58
+ expect(struct.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
59
+ end
60
+
61
+ describe 'reading in from a blob' do
62
+ it 'uses the file_name_length to know when to stop reading' do
63
+ name = 'Hello_world.txt'
64
+ struct.file_name = name
65
+ blob = struct.to_binary_s
66
+ blob << 'AAAA'
67
+ new_from_blob = described_class.read(blob)
68
+ expect(new_from_blob.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::Fscc::FileInformation::FileDirectoryInformation do
4
+ it 'references the correct class level' do
5
+ expect(described_class).to be_const_defined(:CLASS_LEVEL)
6
+ expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_DIRECTORY_INFORMATION
7
+ end
8
+
9
+ subject(:struct) { described_class.new }
10
+
11
+ it { should respond_to :next_offset }
12
+ it { should respond_to :file_index }
13
+ it { should respond_to :create_time }
14
+ it { should respond_to :last_access }
15
+ it { should respond_to :last_write }
16
+ it { should respond_to :last_change }
17
+ it { should respond_to :end_of_file }
18
+ it { should respond_to :allocation_size }
19
+ it { should respond_to :file_attributes }
20
+ it { should respond_to :file_name_length }
21
+ it { should respond_to :file_name }
22
+
23
+ it 'is little endian' do
24
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
25
+ end
26
+
27
+ it 'tracks the creation time in a Filetime field' do
28
+ expect(struct.create_time).to be_a RubySMB::Field::FileTime
29
+ end
30
+
31
+ it 'tracks the last access time in a Filetime field' do
32
+ expect(struct.last_access).to be_a RubySMB::Field::FileTime
33
+ end
34
+
35
+ it 'tracks the last write time in a Filetime field' do
36
+ expect(struct.last_write).to be_a RubySMB::Field::FileTime
37
+ end
38
+
39
+ it 'tracks the last modified time in a Filetime field' do
40
+ expect(struct.last_change).to be_a RubySMB::Field::FileTime
41
+ end
42
+
43
+ it 'contains the file attributes of the file' do
44
+ expect(struct.file_attributes).to be_a RubySMB::Fscc::FileAttributes
45
+ end
46
+
47
+ it 'tracks the length of the file_name field' do
48
+ struct.file_name = 'Hello.txt'
49
+ expect(struct.file_name_length).to eq struct.file_name.do_num_bytes
50
+ end
51
+
52
+ it 'automatically encodes the file name in UTF-16LE' do
53
+ name = 'Hello_world.txt'
54
+ struct.file_name = name
55
+ expect(struct.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
56
+ end
57
+
58
+ describe 'reading in from a blob' do
59
+ it 'uses the file_name_length to know when to stop reading' do
60
+ name = 'Hello_world.txt'
61
+ struct.file_name = name
62
+ blob = struct.to_binary_s
63
+ blob << 'AAAA'
64
+ new_from_blob = described_class.read(blob)
65
+ expect(new_from_blob.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::Fscc::FileInformation::FileDispositionInformation do
4
+ it 'references the correct class level' do
5
+ expect(described_class).to be_const_defined(:CLASS_LEVEL)
6
+ expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_DISPOSITION_INFORMATION
7
+ end
8
+
9
+ subject(:struct) { described_class.new }
10
+
11
+ it { should respond_to :delete_pending }
12
+
13
+ it 'is little endian' do
14
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
15
+ end
16
+
17
+ describe '#delete_pending' do
18
+ it 'is a 8-bit field' do
19
+ expect(struct.delete_pending).to be_a BinData::Uint8
20
+ end
21
+
22
+ it 'should have a default value of 0' do
23
+ expect(struct.delete_pending).to eq 0
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::Fscc::FileInformation::FileFullDirectoryInformation do
4
+ it 'references the correct class level' do
5
+ expect(described_class).to be_const_defined(:CLASS_LEVEL)
6
+ expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_FULL_DIRECTORY_INFORMATION
7
+ end
8
+
9
+ subject(:struct) { described_class.new }
10
+
11
+ it { should respond_to :next_offset }
12
+ it { should respond_to :file_index }
13
+ it { should respond_to :create_time }
14
+ it { should respond_to :last_access }
15
+ it { should respond_to :last_write }
16
+ it { should respond_to :last_change }
17
+ it { should respond_to :end_of_file }
18
+ it { should respond_to :allocation_size }
19
+ it { should respond_to :file_attributes }
20
+ it { should respond_to :file_name_length }
21
+ it { should respond_to :ea_size }
22
+ it { should respond_to :file_name }
23
+
24
+ it 'is little endian' do
25
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
26
+ end
27
+
28
+ it 'tracks the creation time in a Filetime field' do
29
+ expect(struct.create_time).to be_a RubySMB::Field::FileTime
30
+ end
31
+
32
+ it 'tracks the last access time in a Filetime field' do
33
+ expect(struct.last_access).to be_a RubySMB::Field::FileTime
34
+ end
35
+
36
+ it 'tracks the last write time in a Filetime field' do
37
+ expect(struct.last_write).to be_a RubySMB::Field::FileTime
38
+ end
39
+
40
+ it 'tracks the last modified time in a Filetime field' do
41
+ expect(struct.last_change).to be_a RubySMB::Field::FileTime
42
+ end
43
+
44
+ it 'contains the file attributes of the file' do
45
+ expect(struct.file_attributes).to be_a RubySMB::Fscc::FileAttributes
46
+ end
47
+
48
+ it 'tracks the length of the file_name field' do
49
+ struct.file_name = 'Hello.txt'
50
+ expect(struct.file_name_length).to eq struct.file_name.do_num_bytes
51
+ end
52
+
53
+ it 'automatically encodes the file name in UTF-16LE' do
54
+ name = 'Hello_world.txt'
55
+ struct.file_name = name
56
+ expect(struct.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
57
+ end
58
+
59
+ describe 'reading in from a blob' do
60
+ it 'uses the file_name_length to know when to stop reading' do
61
+ name = 'Hello_world.txt'
62
+ struct.file_name = name
63
+ blob = struct.to_binary_s
64
+ blob << 'AAAA'
65
+ new_from_blob = described_class.read(blob)
66
+ expect(new_from_blob.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::Fscc::FileInformation::FileIdBothDirectoryInformation do
4
+ it 'references the correct class level' do
5
+ expect(described_class).to be_const_defined(:CLASS_LEVEL)
6
+ expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_ID_BOTH_DIRECTORY_INFORMATION
7
+ end
8
+
9
+ subject(:struct) { described_class.new }
10
+
11
+ it { should respond_to :next_offset }
12
+ it { should respond_to :file_index }
13
+ it { should respond_to :create_time }
14
+ it { should respond_to :last_access }
15
+ it { should respond_to :last_write }
16
+ it { should respond_to :last_change }
17
+ it { should respond_to :end_of_file }
18
+ it { should respond_to :allocation_size }
19
+ it { should respond_to :file_attributes }
20
+ it { should respond_to :file_name_length }
21
+ it { should respond_to :ea_size }
22
+ it { should respond_to :short_name }
23
+ it { should respond_to :short_name_length }
24
+ it { should respond_to :file_id }
25
+ it { should respond_to :file_name }
26
+
27
+ it 'is little endian' do
28
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
29
+ end
30
+
31
+ it 'tracks the creation time in a Filetime field' do
32
+ expect(struct.create_time).to be_a RubySMB::Field::FileTime
33
+ end
34
+
35
+ it 'tracks the last access time in a Filetime field' do
36
+ expect(struct.last_access).to be_a RubySMB::Field::FileTime
37
+ end
38
+
39
+ it 'tracks the last write time in a Filetime field' do
40
+ expect(struct.last_write).to be_a RubySMB::Field::FileTime
41
+ end
42
+
43
+ it 'tracks the last modified time in a Filetime field' do
44
+ expect(struct.last_change).to be_a RubySMB::Field::FileTime
45
+ end
46
+
47
+ it 'contains the file attributes of the file' do
48
+ expect(struct.file_attributes).to be_a RubySMB::Fscc::FileAttributes
49
+ end
50
+
51
+ it 'tracks the length of the file_name field' do
52
+ struct.file_name = 'Hello.txt'
53
+ expect(struct.file_name_length).to eq struct.file_name.do_num_bytes
54
+ end
55
+
56
+ it 'automatically encodes the file name in UTF-16LE' do
57
+ name = 'Hello_world.txt'
58
+ struct.file_name = name
59
+ expect(struct.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
60
+ end
61
+
62
+ describe 'reading in from a blob' do
63
+ it 'uses the file_name_length to know when to stop reading' do
64
+ name = 'Hello_world.txt'
65
+ struct.file_name = name
66
+ blob = struct.to_binary_s
67
+ blob << 'AAAA'
68
+ new_from_blob = described_class.read(blob)
69
+ expect(new_from_blob.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
70
+ end
71
+ end
72
+ end