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,54 @@
1
+ RSpec.describe RubySMB::SMB1::Packet::CloseRequest 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_CLOSE' do
12
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_CLOSE
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
+ it { is_expected.to respond_to :fid }
32
+ it { is_expected.to respond_to :last_time_modified }
33
+
34
+ describe '#last_time_modified' do
35
+ it 'has the correct initial value' do
36
+ expect(parameter_block.last_time_modified).to eq(0xFFFFFFFF)
37
+ end
38
+ end
39
+ end
40
+
41
+ describe '#data_block' do
42
+ subject(:data_block) { packet.data_block }
43
+
44
+ it 'is a standard DataBlock' do
45
+ expect(data_block).to be_a RubySMB::SMB1::DataBlock
46
+ end
47
+
48
+ it 'should be empty' do
49
+ expect(data_block.byte_count).to eq(0)
50
+ end
51
+ end
52
+
53
+ end
54
+
@@ -0,0 +1,45 @@
1
+ RSpec.describe RubySMB::SMB1::Packet::CloseResponse 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_CLOSE' do
12
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_CLOSE
13
+ end
14
+
15
+ it 'should not 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 'should be empty' do
28
+ expect(parameter_block.word_count).to eq(0)
29
+ end
30
+ end
31
+
32
+ describe '#data_block' do
33
+ subject(:data_block) { packet.data_block }
34
+
35
+ it 'is a standard DataBlock' do
36
+ expect(data_block).to be_a RubySMB::SMB1::DataBlock
37
+ end
38
+
39
+ it 'should be empty' do
40
+ expect(data_block.byte_count).to eq(0)
41
+ end
42
+ end
43
+
44
+ end
45
+
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe RubySMB::SMB1::Packet::EchoRequest do
4
-
5
4
  subject(:packet) { described_class.new }
6
5
 
7
6
  describe '#smb_header' do
@@ -39,6 +38,4 @@ RSpec.describe RubySMB::SMB1::Packet::EchoRequest do
39
38
  expect(data_block).to be_a RubySMB::SMB1::DataBlock
40
39
  end
41
40
  end
42
-
43
-
44
- end
41
+ end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe RubySMB::SMB1::Packet::EchoResponse do
4
-
5
4
  subject(:packet) { described_class.new }
6
5
 
7
6
  describe '#smb_header' do
@@ -39,6 +38,4 @@ RSpec.describe RubySMB::SMB1::Packet::EchoResponse do
39
38
  expect(data_block).to be_a RubySMB::SMB1::DataBlock
40
39
  end
41
40
  end
42
-
43
-
44
- end
41
+ end
@@ -9,7 +9,6 @@ RSpec.describe RubySMB::SMB1::Packet::EmptyPacket do
9
9
  it 'is a standard SMB Header' do
10
10
  expect(header).to be_a RubySMB::SMB1::SMBHeader
11
11
  end
12
-
13
12
  end
14
13
 
15
14
  describe '#parameter_block' do
@@ -35,5 +34,4 @@ RSpec.describe RubySMB::SMB1::Packet::EmptyPacket do
35
34
  expect(data_block.to_binary_s).to eq "\x00\x00"
36
35
  end
37
36
  end
38
-
39
- end
37
+ end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe RubySMB::SMB1::Packet::LogoffRequest do
4
-
5
4
  subject(:packet) { described_class.new }
6
5
 
7
6
  describe '#smb_header' do
@@ -41,6 +40,4 @@ RSpec.describe RubySMB::SMB1::Packet::LogoffRequest do
41
40
  expect(data_block).to be_a RubySMB::SMB1::DataBlock
42
41
  end
43
42
  end
44
-
45
-
46
- end
43
+ end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe RubySMB::SMB1::Packet::LogoffResponse do
4
-
5
4
  subject(:packet) { described_class.new }
6
5
 
7
6
  describe '#smb_header' do
@@ -41,6 +40,4 @@ RSpec.describe RubySMB::SMB1::Packet::LogoffResponse do
41
40
  expect(data_block).to be_a RubySMB::SMB1::DataBlock
42
41
  end
43
42
  end
44
-
45
-
46
- end
43
+ end
@@ -71,7 +71,7 @@ RSpec.describe RubySMB::SMB1::Packet::NegotiateRequest do
71
71
 
72
72
  describe '#dialects' do
73
73
  it 'returns a ruby array of the dialect hashes' do
74
- expect(packet.dialects).to eq [{:buffer_format=>2, :dialect_string=>"NT LM 0.12"}]
74
+ expect(packet.dialects).to eq [{ buffer_format: 2, dialect_string: 'NT LM 0.12' }]
75
75
  end
76
76
  end
77
77
  end
@@ -146,4 +146,41 @@ RSpec.describe RubySMB::SMB1::Packet::NegotiateResponseExtended do
146
146
  expect(packet.valid?).to be false
147
147
  end
148
148
  end
149
+
150
+ context 'with dialects' do
151
+ let(:dialects) do
152
+ dialects = []
153
+ dialects << RubySMB::SMB1::Dialect.read("\x02\x4e\x54\x20\x4c\x4d\x20\x30\x2e\x31\x32\x00")
154
+ dialects << RubySMB::SMB1::Dialect.read("\x02\x53\x4d\x42\x20\x32\x2e\x30\x30\x32\x00")
155
+ dialects
156
+ end
157
+
158
+ describe '#dialects=' do
159
+ it 'sets #dialects to the array of Dialects passed as argument' do
160
+ packet.dialects = dialects
161
+ expect(packet.instance_variable_get(:@dialects)).to eq dialects
162
+ end
163
+
164
+ it 'returns #dialects' do
165
+ expect(packet.dialects = dialects).to eq dialects
166
+ end
167
+
168
+ it 'raises an exception when one of the element of dialects is not a Dialect object' do
169
+ dialects << 'My Dialect'
170
+ expect { packet.dialects = dialects }.to raise_error(ArgumentError)
171
+ end
172
+ end
173
+
174
+ describe '#negotiated_dialect' do
175
+ it 'returns an empty string if #dialects is empty' do
176
+ expect(packet.negotiated_dialect).to eq ''
177
+ end
178
+
179
+ it 'returns the negotiated dialect' do
180
+ packet.parameter_block.dialect_index = 1
181
+ packet.dialects = dialects
182
+ expect(packet.negotiated_dialect).to eq 'SMB 2.002'
183
+ end
184
+ end
185
+ end
149
186
  end
@@ -147,4 +147,41 @@ RSpec.describe RubySMB::SMB1::Packet::NegotiateResponse do
147
147
  expect(packet.valid?).to be false
148
148
  end
149
149
  end
150
+
151
+ context 'with dialects' do
152
+ let(:dialects) do
153
+ dialects = []
154
+ dialects << RubySMB::SMB1::Dialect.read("\x02\x4e\x54\x20\x4c\x4d\x20\x30\x2e\x31\x32\x00")
155
+ dialects << RubySMB::SMB1::Dialect.read("\x02\x53\x4d\x42\x20\x32\x2e\x30\x30\x32\x00")
156
+ dialects
157
+ end
158
+
159
+ describe '#dialects=' do
160
+ it 'sets #dialects to the array of Dialects passed as argument' do
161
+ packet.dialects = dialects
162
+ expect(packet.instance_variable_get(:@dialects)).to eq dialects
163
+ end
164
+
165
+ it 'returns #dialects' do
166
+ expect(packet.dialects = dialects).to eq dialects
167
+ end
168
+
169
+ it 'raises an exception when one of the element of dialects is not a Dialect object' do
170
+ dialects << 'My Dialect'
171
+ expect { packet.dialects = dialects }.to raise_error(ArgumentError)
172
+ end
173
+ end
174
+
175
+ describe '#negotiated_dialect' do
176
+ it 'returns an empty string if #dialects is empty' do
177
+ expect(packet.negotiated_dialect).to eq ''
178
+ end
179
+
180
+ it 'returns the negotiated dialect' do
181
+ packet.parameter_block.dialect_index = 1
182
+ packet.dialects = dialects
183
+ expect(packet.negotiated_dialect).to eq 'SMB 2.002'
184
+ end
185
+ end
186
+ end
150
187
  end
@@ -0,0 +1,151 @@
1
+ RSpec.describe RubySMB::SMB1::Packet::NtCreateAndxRequest 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_NT_CREATE_ANDX' do
12
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_NT_CREATE_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
+ it { is_expected.to respond_to :andx_block }
32
+ it { is_expected.to respond_to :name_length }
33
+ it { is_expected.to respond_to :flags }
34
+ it { is_expected.to respond_to :root_directory_fid }
35
+ it { is_expected.to respond_to :desired_access }
36
+ it { is_expected.to respond_to :allocation_size }
37
+ it { is_expected.to respond_to :ext_file_attributes }
38
+ it { is_expected.to respond_to :share_access }
39
+ it { is_expected.to respond_to :create_disposition }
40
+ it { is_expected.to respond_to :create_options }
41
+ it { is_expected.to respond_to :impersonation_level }
42
+ it { is_expected.to respond_to :security_flags }
43
+
44
+ describe '#andx_block' do
45
+ it 'is a AndXBlock struct' do
46
+ expect(parameter_block.andx_block).to be_a RubySMB::SMB1::AndXBlock
47
+ end
48
+ end
49
+
50
+ describe '#name_length' do
51
+ it 'is updated according to the #file_name length' do
52
+ file_name = 'test_name'
53
+ packet.data_block.file_name = file_name
54
+ expect(parameter_block.name_length).to eq(file_name.length)
55
+ end
56
+ end
57
+
58
+ describe '#flags' do
59
+ subject(:flags) { parameter_block.flags }
60
+
61
+ it { is_expected.to respond_to :request_extended_response }
62
+ it { is_expected.to respond_to :open_target_dir }
63
+ it { is_expected.to respond_to :request_opbatch }
64
+ it { is_expected.to respond_to :request_oplock }
65
+
66
+ it 'is little endian' do
67
+ expect(flags.get_parameter(:endian).endian).to eq :little
68
+ end
69
+
70
+ describe '#request_extended_response' do
71
+ it 'is a 1-bit flag' do
72
+ expect(flags.request_extended_response).to be_a BinData::Bit1
73
+ end
74
+
75
+ it_behaves_like 'bit field with one flag set', :request_extended_response, 'V', 0x00000010
76
+ end
77
+
78
+ describe '#open_target_dir' do
79
+ it 'is a 1-bit flag' do
80
+ expect(flags.open_target_dir).to be_a BinData::Bit1
81
+ end
82
+
83
+ it_behaves_like 'bit field with one flag set', :open_target_dir, 'V', 0x00000008
84
+ end
85
+
86
+ describe '#request_opbatch' do
87
+ it 'is a 1-bit flag' do
88
+ expect(flags.request_opbatch).to be_a BinData::Bit1
89
+ end
90
+
91
+ it_behaves_like 'bit field with one flag set', :request_opbatch, 'V', 0x00000004
92
+ end
93
+
94
+ describe '#request_oplock' do
95
+ it 'is a 1-bit flag' do
96
+ expect(flags.request_oplock).to be_a BinData::Bit1
97
+ end
98
+
99
+ it_behaves_like 'bit field with one flag set', :request_oplock, 'V', 0x00000002
100
+ end
101
+ end
102
+
103
+ describe '#desired_access' do
104
+ it 'should be a DirectoryAccessMask when the file is a directory' do
105
+ parameter_block.ext_file_attributes.directory = 1
106
+ access_mask = parameter_block.desired_access.send(:current_choice)
107
+ expect(access_mask.class).to eq RubySMB::SMB1::BitField::DirectoryAccessMask
108
+ end
109
+
110
+ it 'should be a FileAccessMask when the file is not a directory' do
111
+ parameter_block.ext_file_attributes.directory = 0
112
+ access_mask = parameter_block.desired_access.send(:current_choice)
113
+ expect(access_mask.class).to eq RubySMB::SMB1::BitField::FileAccessMask
114
+ end
115
+ end
116
+
117
+ describe '#ext_file_attributes' do
118
+ it 'is a SmbExtFileAttributes bit-field' do
119
+ expect(parameter_block.ext_file_attributes).to be_a RubySMB::SMB1::BitField::SmbExtFileAttributes
120
+ end
121
+ end
122
+
123
+ describe '#share_access' do
124
+ it 'is a ShareAccess bit-field' do
125
+ expect(parameter_block.share_access).to be_a RubySMB::SMB1::BitField::ShareAccess
126
+ end
127
+ end
128
+
129
+ describe '#create_options' do
130
+ it 'is a CreateOptions bit-field' do
131
+ expect(parameter_block.create_options).to be_a RubySMB::SMB1::BitField::CreateOptions
132
+ end
133
+ end
134
+
135
+ describe '#security_flags' do
136
+ it 'is a SecurityFlags bit-field' do
137
+ expect(parameter_block.security_flags).to be_a RubySMB::SMB1::BitField::SecurityFlags
138
+ end
139
+ end
140
+ end
141
+
142
+ describe '#data_block' do
143
+ subject(:data_block) { packet.data_block }
144
+
145
+ it 'is a standard DataBlock' do
146
+ expect(data_block).to be_a RubySMB::SMB1::DataBlock
147
+ end
148
+
149
+ it { is_expected.to respond_to :file_name }
150
+ end
151
+ end
@@ -0,0 +1,157 @@
1
+ RSpec.describe RubySMB::SMB1::Packet::NtCreateAndxResponse 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_NT_CREATE_ANDX' do
12
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_NT_CREATE_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 :oplock_level }
33
+ it { is_expected.to respond_to :fid }
34
+ it { is_expected.to respond_to :create_disposition }
35
+ it { is_expected.to respond_to :create_time }
36
+ it { is_expected.to respond_to :last_access_time }
37
+ it { is_expected.to respond_to :last_write_time }
38
+ it { is_expected.to respond_to :last_change_time }
39
+ it { is_expected.to respond_to :ext_file_attributes }
40
+ it { is_expected.to respond_to :allocation_size }
41
+ it { is_expected.to respond_to :end_of_file }
42
+ it { is_expected.to respond_to :resource_type }
43
+ it { is_expected.to respond_to :status_flags }
44
+ it { is_expected.to respond_to :directory }
45
+ it { is_expected.to respond_to :volume_guid }
46
+ it { is_expected.to respond_to :file_id }
47
+ it { is_expected.to respond_to :maximal_access_rights }
48
+ it { is_expected.to respond_to :guest_maximal_access_rights }
49
+
50
+ describe '#andx_block' do
51
+ it 'is a AndXBlock struct' do
52
+ expect(parameter_block.andx_block).to be_a RubySMB::SMB1::AndXBlock
53
+ end
54
+ end
55
+
56
+ describe '#create_time' do
57
+ it 'is as a FileTime struct' do
58
+ expect(parameter_block.create_time).to be_a RubySMB::Field::FileTime
59
+ end
60
+ end
61
+
62
+ describe '#last_access_time' do
63
+ it 'is as a FileTime struct' do
64
+ expect(parameter_block.last_access_time).to be_a RubySMB::Field::FileTime
65
+ end
66
+ end
67
+
68
+ describe '#last_write_time' do
69
+ it 'is as a FileTime struct' do
70
+ expect(parameter_block.last_write_time).to be_a RubySMB::Field::FileTime
71
+ end
72
+ end
73
+
74
+ describe '#last_change_time' do
75
+ it 'is as a FileTime struct' do
76
+ expect(parameter_block.last_change_time).to be_a RubySMB::Field::FileTime
77
+ end
78
+ end
79
+
80
+ describe '#ext_file_attributes' do
81
+ it 'is a SmbExtFileAttributes bit-field' do
82
+ expect(parameter_block.ext_file_attributes).to be_a RubySMB::SMB1::BitField::SmbExtFileAttributes
83
+ end
84
+ end
85
+
86
+ describe '#volume_guid' do
87
+ it 'has the correct length' do
88
+ expect(parameter_block.volume_guid.length).to eq 16
89
+ end
90
+ end
91
+
92
+ describe '#status_flag' do
93
+ it 'should be a SmbNmpipeStatus when the ResourceType is BYTE_MODE_PIPE' do
94
+ parameter_block.resource_type = RubySMB::SMB1::ResourceType::BYTE_MODE_PIPE
95
+ access_mask = parameter_block.status_flags.send(:current_choice)
96
+ expect(access_mask.class).to eq RubySMB::SMB1::BitField::SmbNmpipeStatus
97
+ end
98
+
99
+ it 'should be a SmbNmpipeStatus when the ResourceType is MESSAGE_MODE_PIPE' do
100
+ parameter_block.resource_type = RubySMB::SMB1::ResourceType::MESSAGE_MODE_PIPE
101
+ access_mask = parameter_block.status_flags.send(:current_choice)
102
+ expect(access_mask.class).to eq RubySMB::SMB1::BitField::SmbNmpipeStatus
103
+ end
104
+
105
+ it 'should be a SmbNmpipeStatus when the ResourceType is DISK' do
106
+ parameter_block.resource_type = RubySMB::SMB1::ResourceType::DISK
107
+ access_mask = parameter_block.status_flags.send(:current_choice)
108
+ expect(access_mask.class).to eq RubySMB::SMB1::BitField::FileStatusFlags
109
+ end
110
+
111
+ it 'should be a SmbNmpipeStatus when the ResourceType is BYTE_MODE_PIPE' do
112
+ parameter_block.resource_type = RubySMB::SMB1::ResourceType::PRINTER
113
+ expect(parameter_block.status_flags).to eq(0x0000)
114
+ end
115
+ end
116
+
117
+ describe '#maximal_access_rights' do
118
+ it 'should be a DirectoryAccessMask when the file is a directory' do
119
+ parameter_block.ext_file_attributes.directory = 1
120
+ access_mask = parameter_block.maximal_access_rights.send(:current_choice)
121
+ expect(access_mask.class).to eq RubySMB::SMB1::BitField::DirectoryAccessMask
122
+ end
123
+
124
+ it 'should be a FileAccessMask when the file is not a directory' do
125
+ parameter_block.ext_file_attributes.directory = 0
126
+ access_mask = parameter_block.maximal_access_rights.send(:current_choice)
127
+ expect(access_mask.class).to eq RubySMB::SMB1::BitField::FileAccessMask
128
+ end
129
+ end
130
+
131
+ describe '#guest_maximal_access_rights' do
132
+ it 'should be a DirectoryAccessMask when the file is a directory' do
133
+ parameter_block.ext_file_attributes.directory = 1
134
+ access_mask = parameter_block.guest_maximal_access_rights.send(:current_choice)
135
+ expect(access_mask.class).to eq RubySMB::SMB1::BitField::DirectoryAccessMask
136
+ end
137
+
138
+ it 'should be a FileAccessMask when the file is not a directory' do
139
+ parameter_block.ext_file_attributes.directory = 0
140
+ access_mask = parameter_block.guest_maximal_access_rights.send(:current_choice)
141
+ expect(access_mask.class).to eq RubySMB::SMB1::BitField::FileAccessMask
142
+ end
143
+ end
144
+ end
145
+
146
+ describe '#data_block' do
147
+ subject(:data_block) { packet.data_block }
148
+
149
+ it 'is a standard DataBlock' do
150
+ expect(data_block).to be_a RubySMB::SMB1::DataBlock
151
+ end
152
+
153
+ it 'should be empty' do
154
+ expect(data_block.byte_count).to eq(0)
155
+ end
156
+ end
157
+ end