ruby_smb 2.0.2 → 3.0.0

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 (285) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/.github/workflows/verify.yml +46 -0
  4. data/README.md +0 -1
  5. data/examples/anonymous_auth.rb +3 -3
  6. data/examples/append_file.rb +10 -8
  7. data/examples/auth_capture.rb +71 -0
  8. data/examples/authenticate.rb +9 -5
  9. data/examples/delete_file.rb +8 -6
  10. data/examples/dump_secrets_from_sid.rb +207 -0
  11. data/examples/enum_domain_users.rb +75 -0
  12. data/examples/enum_registry_key.rb +5 -4
  13. data/examples/enum_registry_values.rb +5 -4
  14. data/examples/get_computer_info.rb +42 -0
  15. data/examples/list_directory.rb +8 -6
  16. data/examples/negotiate_with_netbios_service.rb +9 -5
  17. data/examples/net_share_enum_all.rb +6 -4
  18. data/examples/pipes.rb +11 -12
  19. data/examples/query_service_status.rb +102 -0
  20. data/examples/read_file.rb +8 -6
  21. data/examples/read_registry_key_value.rb +6 -5
  22. data/examples/rename_file.rb +9 -7
  23. data/examples/tree_connect.rb +7 -5
  24. data/examples/write_file.rb +9 -7
  25. data/lib/ruby_smb/client/authentication.rb +5 -10
  26. data/lib/ruby_smb/client/echo.rb +2 -4
  27. data/lib/ruby_smb/client/negotiation.rb +13 -16
  28. data/lib/ruby_smb/client/tree_connect.rb +2 -4
  29. data/lib/ruby_smb/client/utils.rb +16 -10
  30. data/lib/ruby_smb/client/winreg.rb +1 -1
  31. data/lib/ruby_smb/client.rb +102 -75
  32. data/lib/ruby_smb/compression/lznt1.rb +164 -0
  33. data/lib/ruby_smb/compression.rb +7 -0
  34. data/lib/ruby_smb/dcerpc/bind.rb +28 -20
  35. data/lib/ruby_smb/dcerpc/bind_ack.rb +29 -28
  36. data/lib/ruby_smb/dcerpc/client.rb +542 -0
  37. data/lib/ruby_smb/dcerpc/drsr/drs_bind_request.rb +24 -0
  38. data/lib/ruby_smb/dcerpc/drsr/drs_bind_response.rb +26 -0
  39. data/lib/ruby_smb/dcerpc/drsr/drs_crack_names_request.rb +57 -0
  40. data/lib/ruby_smb/dcerpc/drsr/drs_crack_names_response.rb +76 -0
  41. data/lib/ruby_smb/dcerpc/drsr/drs_domain_controller_info_request.rb +46 -0
  42. data/lib/ruby_smb/dcerpc/drsr/drs_domain_controller_info_response.rb +168 -0
  43. data/lib/ruby_smb/dcerpc/drsr/drs_extensions.rb +56 -0
  44. data/lib/ruby_smb/dcerpc/drsr/drs_get_nc_changes_request.rb +121 -0
  45. data/lib/ruby_smb/dcerpc/drsr/drs_get_nc_changes_response.rb +118 -0
  46. data/lib/ruby_smb/dcerpc/drsr/drs_unbind_request.rb +24 -0
  47. data/lib/ruby_smb/dcerpc/drsr/drs_unbind_response.rb +26 -0
  48. data/lib/ruby_smb/dcerpc/drsr.rb +909 -0
  49. data/lib/ruby_smb/dcerpc/epm/epm_ept_map_request.rb +26 -0
  50. data/lib/ruby_smb/dcerpc/epm/epm_ept_map_response.rb +25 -0
  51. data/lib/ruby_smb/dcerpc/epm/epm_twrt.rb +211 -0
  52. data/lib/ruby_smb/dcerpc/epm.rb +75 -0
  53. data/lib/ruby_smb/dcerpc/error.rb +20 -0
  54. data/lib/ruby_smb/dcerpc/ndr.rb +1204 -80
  55. data/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_request.rb +27 -0
  56. data/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_response.rb +26 -0
  57. data/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_request.rb +27 -0
  58. data/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_response.rb +23 -0
  59. data/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_request.rb +24 -0
  60. data/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_response.rb +24 -0
  61. data/lib/ruby_smb/dcerpc/netlogon.rb +102 -0
  62. data/lib/ruby_smb/dcerpc/p_syntax_id_t.rb +4 -3
  63. data/lib/ruby_smb/dcerpc/pdu_header.rb +7 -7
  64. data/lib/ruby_smb/dcerpc/ptypes.rb +1 -0
  65. data/lib/ruby_smb/dcerpc/request.rb +85 -19
  66. data/lib/ruby_smb/dcerpc/response.rb +45 -10
  67. data/lib/ruby_smb/dcerpc/rpc_auth3.rb +28 -0
  68. data/lib/ruby_smb/dcerpc/rpc_security_attributes.rb +34 -0
  69. data/lib/ruby_smb/dcerpc/rrp_rpc_unicode_string.rb +118 -0
  70. data/lib/ruby_smb/dcerpc/samr/rpc_sid.rb +150 -0
  71. data/lib/ruby_smb/dcerpc/samr/samr_close_handle_request.rb +23 -0
  72. data/lib/ruby_smb/dcerpc/samr/samr_close_handle_response.rb +24 -0
  73. data/lib/ruby_smb/dcerpc/samr/samr_connect_request.rb +32 -0
  74. data/lib/ruby_smb/dcerpc/samr/samr_connect_response.rb +23 -0
  75. data/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_request.rb +26 -0
  76. data/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_response.rb +55 -0
  77. data/lib/ruby_smb/dcerpc/samr/samr_get_alias_membership_request.rb +48 -0
  78. data/lib/ruby_smb/dcerpc/samr/samr_get_alias_membership_response.rb +38 -0
  79. data/lib/ruby_smb/dcerpc/samr/samr_get_groups_for_user_request.rb +23 -0
  80. data/lib/ruby_smb/dcerpc/samr/samr_get_groups_for_user_response.rb +48 -0
  81. data/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_request.rb +24 -0
  82. data/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_response.rb +25 -0
  83. data/lib/ruby_smb/dcerpc/samr/samr_open_domain_request.rb +27 -0
  84. data/lib/ruby_smb/dcerpc/samr/samr_open_domain_response.rb +24 -0
  85. data/lib/ruby_smb/dcerpc/samr/samr_open_user_request.rb +26 -0
  86. data/lib/ruby_smb/dcerpc/samr/samr_open_user_response.rb +24 -0
  87. data/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_request.rb +23 -0
  88. data/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_response.rb +23 -0
  89. data/lib/ruby_smb/dcerpc/samr.rb +613 -0
  90. data/lib/ruby_smb/dcerpc/sec_trailer.rb +26 -0
  91. data/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all.rb +56 -79
  92. data/lib/ruby_smb/dcerpc/srvsvc.rb +27 -4
  93. data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request.rb +36 -0
  94. data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response.rb +26 -0
  95. data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_request.rb +25 -0
  96. data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response.rb +26 -0
  97. data/lib/ruby_smb/dcerpc/svcctl/control_service_request.rb +26 -0
  98. data/lib/ruby_smb/dcerpc/svcctl/control_service_response.rb +26 -0
  99. data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request.rb +25 -0
  100. data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response.rb +23 -0
  101. data/lib/ruby_smb/dcerpc/svcctl/open_service_w_request.rb +23 -0
  102. data/lib/ruby_smb/dcerpc/svcctl/open_service_w_response.rb +23 -0
  103. data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request.rb +25 -0
  104. data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response.rb +45 -0
  105. data/lib/ruby_smb/dcerpc/svcctl/query_service_status_request.rb +23 -0
  106. data/lib/ruby_smb/dcerpc/svcctl/query_service_status_response.rb +27 -0
  107. data/lib/ruby_smb/dcerpc/svcctl/service_status.rb +26 -0
  108. data/lib/ruby_smb/dcerpc/svcctl/start_service_w_request.rb +27 -0
  109. data/lib/ruby_smb/dcerpc/svcctl/start_service_w_response.rb +25 -0
  110. data/lib/ruby_smb/dcerpc/svcctl.rb +477 -0
  111. data/lib/ruby_smb/dcerpc/uuid.rb +3 -0
  112. data/lib/ruby_smb/dcerpc/winreg/close_key_response.rb +2 -2
  113. data/lib/ruby_smb/dcerpc/winreg/create_key_request.rb +62 -0
  114. data/lib/ruby_smb/dcerpc/winreg/create_key_response.rb +36 -0
  115. data/lib/ruby_smb/dcerpc/winreg/enum_key_request.rb +2 -19
  116. data/lib/ruby_smb/dcerpc/winreg/enum_key_response.rb +3 -20
  117. data/lib/ruby_smb/dcerpc/winreg/enum_value_request.rb +5 -14
  118. data/lib/ruby_smb/dcerpc/winreg/enum_value_response.rb +5 -14
  119. data/lib/ruby_smb/dcerpc/winreg/open_key_request.rb +1 -9
  120. data/lib/ruby_smb/dcerpc/winreg/open_key_response.rb +4 -3
  121. data/lib/ruby_smb/dcerpc/winreg/open_root_key_request.rb +6 -7
  122. data/lib/ruby_smb/dcerpc/winreg/open_root_key_response.rb +2 -2
  123. data/lib/ruby_smb/dcerpc/winreg/query_info_key_request.rb +1 -1
  124. data/lib/ruby_smb/dcerpc/winreg/query_info_key_response.rb +9 -18
  125. data/lib/ruby_smb/dcerpc/winreg/query_value_request.rb +4 -13
  126. data/lib/ruby_smb/dcerpc/winreg/query_value_response.rb +7 -15
  127. data/lib/ruby_smb/dcerpc/winreg/regsam.rb +3 -1
  128. data/lib/ruby_smb/dcerpc/winreg/save_key_request.rb +28 -0
  129. data/lib/ruby_smb/dcerpc/winreg/save_key_response.rb +23 -0
  130. data/lib/ruby_smb/dcerpc/winreg.rb +99 -22
  131. data/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_request.rb +26 -0
  132. data/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_response.rb +88 -0
  133. data/lib/ruby_smb/dcerpc/wkssvc.rb +65 -0
  134. data/lib/ruby_smb/dcerpc.rb +45 -11
  135. data/lib/ruby_smb/dialect.rb +45 -0
  136. data/lib/ruby_smb/dispatcher/base.rb +1 -1
  137. data/lib/ruby_smb/dispatcher/socket.rb +2 -2
  138. data/lib/ruby_smb/error.rb +21 -5
  139. data/lib/ruby_smb/field/file_time.rb +1 -1
  140. data/lib/ruby_smb/field/string16.rb +5 -1
  141. data/lib/ruby_smb/field/stringz16.rb +17 -1
  142. data/lib/ruby_smb/generic_packet.rb +11 -1
  143. data/lib/ruby_smb/gss/provider/authenticator.rb +42 -0
  144. data/lib/ruby_smb/gss/provider/ntlm.rb +303 -0
  145. data/lib/ruby_smb/gss/provider.rb +35 -0
  146. data/lib/ruby_smb/gss.rb +56 -63
  147. data/lib/ruby_smb/nbss/session_header.rb +4 -4
  148. data/lib/ruby_smb/ntlm.rb +61 -0
  149. data/lib/ruby_smb/server/server_client/negotiation.rb +156 -0
  150. data/lib/ruby_smb/server/server_client/session_setup.rb +82 -0
  151. data/lib/ruby_smb/server/server_client.rb +162 -0
  152. data/lib/ruby_smb/server.rb +54 -0
  153. data/lib/ruby_smb/signing.rb +59 -0
  154. data/lib/ruby_smb/smb1/file.rb +10 -25
  155. data/lib/ruby_smb/smb1/packet/negotiate_response.rb +11 -11
  156. data/lib/ruby_smb/smb1/packet/negotiate_response_extended.rb +1 -1
  157. data/lib/ruby_smb/smb1/packet/session_setup_request.rb +1 -1
  158. data/lib/ruby_smb/smb1/packet/trans2/find_first2_response.rb +0 -1
  159. data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +0 -1
  160. data/lib/ruby_smb/smb1/packet/trans2/open2_response.rb +1 -2
  161. data/lib/ruby_smb/smb1/packet/trans2/set_file_information_response.rb +1 -13
  162. data/lib/ruby_smb/smb1/pipe.rb +12 -6
  163. data/lib/ruby_smb/smb1/tree.rb +13 -9
  164. data/lib/ruby_smb/smb2/file.rb +33 -33
  165. data/lib/ruby_smb/smb2/negotiate_context.rb +18 -2
  166. data/lib/ruby_smb/smb2/packet/compression_transform_header.rb +4 -0
  167. data/lib/ruby_smb/smb2/packet/negotiate_request.rb +9 -0
  168. data/lib/ruby_smb/smb2/packet/negotiate_response.rb +0 -1
  169. data/lib/ruby_smb/smb2/packet/session_setup_response.rb +2 -2
  170. data/lib/ruby_smb/smb2/packet/tree_connect_request.rb +1 -1
  171. data/lib/ruby_smb/smb2/pipe.rb +13 -6
  172. data/lib/ruby_smb/smb2/tree.rb +21 -11
  173. data/lib/ruby_smb/smb2.rb +3 -1
  174. data/lib/ruby_smb/version.rb +1 -1
  175. data/lib/ruby_smb.rb +5 -3
  176. data/spec/lib/ruby_smb/client_spec.rb +199 -86
  177. data/spec/lib/ruby_smb/compression/lznt1_spec.rb +32 -0
  178. data/spec/lib/ruby_smb/dcerpc/bind_ack_spec.rb +69 -41
  179. data/spec/lib/ruby_smb/dcerpc/bind_spec.rb +75 -21
  180. data/spec/lib/ruby_smb/dcerpc/client_spec.rb +714 -0
  181. data/spec/lib/ruby_smb/dcerpc/drsr_spec.rb +2169 -0
  182. data/spec/lib/ruby_smb/dcerpc/ndr_spec.rb +3977 -239
  183. data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_request_spec.rb +69 -0
  184. data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_response_spec.rb +53 -0
  185. data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_request_spec.rb +69 -0
  186. data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_response_spec.rb +37 -0
  187. data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_request_spec.rb +45 -0
  188. data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_response_spec.rb +37 -0
  189. data/spec/lib/ruby_smb/dcerpc/p_syntax_id_t_spec.rb +18 -4
  190. data/spec/lib/ruby_smb/dcerpc/pdu_header_spec.rb +27 -1
  191. data/spec/lib/ruby_smb/dcerpc/request_spec.rb +76 -11
  192. data/spec/lib/ruby_smb/dcerpc/response_spec.rb +99 -9
  193. data/spec/lib/ruby_smb/dcerpc/rpc_auth3_spec.rb +75 -0
  194. data/spec/lib/ruby_smb/dcerpc/rpc_security_attributes_spec.rb +162 -0
  195. data/spec/lib/ruby_smb/dcerpc/rrp_rpc_unicode_string_spec.rb +340 -0
  196. data/spec/lib/ruby_smb/dcerpc/samr/rpc_sid_spec.rb +116 -0
  197. data/spec/lib/ruby_smb/dcerpc/samr/samr_close_handle_request_spec.rb +40 -0
  198. data/spec/lib/ruby_smb/dcerpc/samr/samr_close_handle_response_spec.rb +48 -0
  199. data/spec/lib/ruby_smb/dcerpc/samr/samr_connect_request_spec.rb +56 -0
  200. data/spec/lib/ruby_smb/dcerpc/samr/samr_connect_response_spec.rb +47 -0
  201. data/spec/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_request_spec.rb +63 -0
  202. data/spec/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_response_spec.rb +265 -0
  203. data/spec/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_request_spec.rb +52 -0
  204. data/spec/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_response_spec.rb +36 -0
  205. data/spec/lib/ruby_smb/dcerpc/samr/samr_open_domain_request_spec.rb +56 -0
  206. data/spec/lib/ruby_smb/dcerpc/samr/samr_open_domain_response_spec.rb +48 -0
  207. data/spec/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_request_spec.rb +48 -0
  208. data/spec/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_response_spec.rb +42 -0
  209. data/spec/lib/ruby_smb/dcerpc/samr_spec.rb +420 -0
  210. data/spec/lib/ruby_smb/dcerpc/sec_trailer_spec.rb +92 -0
  211. data/spec/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all_spec.rb +149 -110
  212. data/spec/lib/ruby_smb/dcerpc/srvsvc_spec.rb +21 -17
  213. data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request_spec.rb +168 -0
  214. data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response_spec.rb +38 -0
  215. data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_request_spec.rb +30 -0
  216. data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response_spec.rb +38 -0
  217. data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_request_spec.rb +39 -0
  218. data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_response_spec.rb +38 -0
  219. data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request_spec.rb +68 -0
  220. data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response_spec.rb +38 -0
  221. data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_request_spec.rb +53 -0
  222. data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_response_spec.rb +38 -0
  223. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request_spec.rb +38 -0
  224. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response_spec.rb +152 -0
  225. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_request_spec.rb +30 -0
  226. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_response_spec.rb +38 -0
  227. data/spec/lib/ruby_smb/dcerpc/svcctl/service_status_spec.rb +76 -0
  228. data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_request_spec.rb +47 -0
  229. data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_response_spec.rb +30 -0
  230. data/spec/lib/ruby_smb/dcerpc/svcctl_spec.rb +508 -0
  231. data/spec/lib/ruby_smb/dcerpc/uuid_spec.rb +15 -23
  232. data/spec/lib/ruby_smb/dcerpc/winreg/close_key_response_spec.rb +2 -2
  233. data/spec/lib/ruby_smb/dcerpc/winreg/create_key_request_spec.rb +73 -0
  234. data/spec/lib/ruby_smb/dcerpc/winreg/create_key_response_spec.rb +44 -0
  235. data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_request_spec.rb +4 -56
  236. data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_response_spec.rb +4 -56
  237. data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_request_spec.rb +10 -34
  238. data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_response_spec.rb +10 -34
  239. data/spec/lib/ruby_smb/dcerpc/winreg/open_key_request_spec.rb +2 -26
  240. data/spec/lib/ruby_smb/dcerpc/winreg/open_key_response_spec.rb +2 -2
  241. data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_request_spec.rb +17 -20
  242. data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_response_spec.rb +2 -2
  243. data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_request_spec.rb +0 -4
  244. data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_response_spec.rb +20 -44
  245. data/spec/lib/ruby_smb/dcerpc/winreg/query_value_request_spec.rb +8 -32
  246. data/spec/lib/ruby_smb/dcerpc/winreg/query_value_response_spec.rb +18 -42
  247. data/spec/lib/ruby_smb/dcerpc/winreg/regsam_spec.rb +4 -0
  248. data/spec/lib/ruby_smb/dcerpc/winreg/save_key_request_spec.rb +45 -0
  249. data/spec/lib/ruby_smb/dcerpc/winreg/save_key_response_spec.rb +22 -0
  250. data/spec/lib/ruby_smb/dcerpc/winreg_spec.rb +219 -62
  251. data/spec/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_request_spec.rb +43 -0
  252. data/spec/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_response_spec.rb +410 -0
  253. data/spec/lib/ruby_smb/dcerpc/wkssvc_spec.rb +70 -0
  254. data/spec/lib/ruby_smb/dispatcher/socket_spec.rb +10 -10
  255. data/spec/lib/ruby_smb/error_spec.rb +34 -5
  256. data/spec/lib/ruby_smb/field/string16_spec.rb +22 -0
  257. data/spec/lib/ruby_smb/field/stringz16_spec.rb +12 -0
  258. data/spec/lib/ruby_smb/generic_packet_spec.rb +7 -0
  259. data/spec/lib/ruby_smb/gss/provider/ntlm/account_spec.rb +32 -0
  260. data/spec/lib/ruby_smb/gss/provider/ntlm/authenticator_spec.rb +101 -0
  261. data/spec/lib/ruby_smb/gss/provider/ntlm/os_version_spec.rb +32 -0
  262. data/spec/lib/ruby_smb/gss/provider/ntlm_spec.rb +113 -0
  263. data/spec/lib/ruby_smb/nbss/session_header_spec.rb +4 -11
  264. data/spec/lib/ruby_smb/server/server_client_spec.rb +156 -0
  265. data/spec/lib/ruby_smb/server_spec.rb +32 -0
  266. data/spec/lib/ruby_smb/smb1/file_spec.rb +2 -4
  267. data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_response_spec.rb +0 -1
  268. data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_response_spec.rb +0 -1
  269. data/spec/lib/ruby_smb/smb1/packet/trans2/open2_response_spec.rb +0 -5
  270. data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_response_spec.rb +0 -6
  271. data/spec/lib/ruby_smb/smb1/pipe_spec.rb +20 -14
  272. data/spec/lib/ruby_smb/smb1/tree_spec.rb +22 -0
  273. data/spec/lib/ruby_smb/smb2/file_spec.rb +61 -9
  274. data/spec/lib/ruby_smb/smb2/negotiate_context_spec.rb +2 -2
  275. data/spec/lib/ruby_smb/smb2/pipe_spec.rb +20 -14
  276. data/spec/lib/ruby_smb/smb2/tree_spec.rb +58 -1
  277. data/spec/spec_helper.rb +1 -1
  278. data/spec/support/bin_helper.rb +9 -0
  279. data.tar.gz.sig +0 -0
  280. metadata +229 -23
  281. metadata.gz.sig +0 -0
  282. data/.travis.yml +0 -6
  283. data/lib/ruby_smb/client/signing.rb +0 -64
  284. data/lib/ruby_smb/dcerpc/rrp_unicode_string.rb +0 -35
  285. data/spec/lib/ruby_smb/dcerpc/rrp_unicode_string_spec.rb +0 -98
@@ -0,0 +1,38 @@
1
+ RSpec.describe RubySMB::Dcerpc::Svcctl::CloseServiceHandleResponse do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :h_sc_object }
5
+ it { is_expected.to respond_to :error_status }
6
+
7
+ it 'is little endian' do
8
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
9
+ end
10
+
11
+ describe '#h_sc_object' do
12
+ it 'is a ScRpcHandle structure' do
13
+ expect(packet.h_sc_object).to be_a RubySMB::Dcerpc::Svcctl::ScRpcHandle
14
+ end
15
+ end
16
+
17
+ describe '#error_status' do
18
+ it 'is a NdrUint32' do
19
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
20
+ end
21
+ end
22
+
23
+ describe '#initialize_instance' do
24
+ it 'sets #opnum to CLOSE_SERVICE_HANDLE constant' do
25
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Svcctl::CLOSE_SERVICE_HANDLE)
26
+ end
27
+ end
28
+
29
+ it 'reads its own binary representation and outputs the same packet' do
30
+ packet = described_class.new(
31
+ h_sc_object: {context_handle_attributes: 0, context_handle_uuid: '367abb81-9844-35f1-ad32-98f038001003'},
32
+ error_status: 3
33
+ )
34
+ binary = packet.to_binary_s
35
+ expect(described_class.read(binary)).to eq(packet)
36
+ end
37
+ end
38
+
@@ -0,0 +1,39 @@
1
+ RSpec.describe RubySMB::Dcerpc::Svcctl::ControlServiceRequest do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :h_service }
5
+ it { is_expected.to respond_to :dw_control }
6
+
7
+ it 'is little endian' do
8
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
9
+ end
10
+
11
+
12
+ describe '#h_service' do
13
+ it 'is a ScRpcHandle structure' do
14
+ expect(packet.h_service).to be_a RubySMB::Dcerpc::Svcctl::ScRpcHandle
15
+ end
16
+ end
17
+
18
+ describe '#dw_control' do
19
+ it 'is a NdrUint32' do
20
+ expect(packet.dw_control).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
21
+ end
22
+ end
23
+
24
+ describe '#initialize_instance' do
25
+ it 'sets #opnum to CONTROL_SERVICE constant' do
26
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Svcctl::CONTROL_SERVICE)
27
+ end
28
+ end
29
+
30
+ it 'reads its own binary representation and outputs the same packet' do
31
+ packet = described_class.new(
32
+ h_service: {context_handle_attributes: 0, context_handle_uuid: '367abb81-9844-35f1-ad32-98f038001003'},
33
+ dw_control: 3
34
+ )
35
+ binary = packet.to_binary_s
36
+ expect(described_class.read(binary)).to eq(packet)
37
+ end
38
+ end
39
+
@@ -0,0 +1,38 @@
1
+ RSpec.describe RubySMB::Dcerpc::Svcctl::ControlServiceResponse do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :lp_service_status }
5
+ it { is_expected.to respond_to :error_status }
6
+
7
+ it 'is little endian' do
8
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
9
+ end
10
+
11
+ describe '#lp_service_status' do
12
+ it 'is a ServiceStatus structure' do
13
+ expect(packet.lp_service_status).to be_a RubySMB::Dcerpc::Svcctl::ServiceStatus
14
+ end
15
+ end
16
+
17
+ describe '#error_status' do
18
+ it 'is a NdrUint32' do
19
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
20
+ end
21
+ end
22
+
23
+ describe '#initialize_instance' do
24
+ it 'sets #opnum to CONTROL_SERVICE constant' do
25
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Svcctl::CONTROL_SERVICE)
26
+ end
27
+ end
28
+
29
+ it 'reads its own binary representation and outputs the same packet' do
30
+ packet = described_class.new(
31
+ service_status: RubySMB::Dcerpc::Svcctl::ServiceStatus.new(dw_service_type: 8, dw_current_state:2, dw_controls_accepted:1),
32
+ error_status: 3
33
+ )
34
+ binary = packet.to_binary_s
35
+ expect(described_class.read(binary)).to eq(packet)
36
+ end
37
+ end
38
+
@@ -0,0 +1,68 @@
1
+ RSpec.describe RubySMB::Dcerpc::Svcctl::SvcctlHandleW do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it 'is Ndr::NdrWideStringzPtr subclass' do
5
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrWideStringzPtr
6
+ end
7
+ end
8
+
9
+ RSpec.describe RubySMB::Dcerpc::Svcctl::OpenSCManagerWRequest do
10
+ subject(:packet) { described_class.new }
11
+
12
+ it { is_expected.to respond_to :lp_machine_name }
13
+ it { is_expected.to respond_to :lp_database_name }
14
+ it { is_expected.to respond_to :dw_desired_access }
15
+
16
+ it 'is little endian' do
17
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
18
+ end
19
+
20
+ describe '#lp_machine_name' do
21
+ it 'is a SvcctlHandleW structure' do
22
+ expect(packet.lp_machine_name).to be_a RubySMB::Dcerpc::Svcctl::SvcctlHandleW
23
+ end
24
+ end
25
+
26
+ describe '#lp_database_name' do
27
+ it 'is a Ndr::NdrWideStringzPtr structure' do
28
+ expect(packet.lp_database_name).to be_a RubySMB::Dcerpc::Ndr::NdrWideStringzPtr
29
+ end
30
+ end
31
+
32
+ describe '#dw_desired_access' do
33
+ it 'is a NdrUint32' do
34
+ expect(packet.dw_desired_access).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
35
+ end
36
+ end
37
+
38
+ describe '#initialize_instance' do
39
+ it 'sets #opnum to OPEN_SC_MANAGER_W constant' do
40
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Svcctl::OPEN_SC_MANAGER_W)
41
+ end
42
+ end
43
+
44
+ it 'should keep #lp_database_name 4-byte aligned' do
45
+ 5.times do |i|
46
+ packet.lp_machine_name = "A" * i
47
+ expect(packet.lp_database_name.abs_offset % 4).to eq 0
48
+ end
49
+ end
50
+
51
+ it 'should keep #dw_desired_access 4-byte aligned' do
52
+ 5.times do |i|
53
+ packet.lp_database_name = "A" * i
54
+ expect(packet.dw_desired_access.abs_offset % 4).to eq 0
55
+ end
56
+ end
57
+
58
+ it 'reads its own binary representation and outputs the same packet' do
59
+ packet = described_class.new(
60
+ lp_machine_name: 'test',
61
+ lp_database_name: 'test2',
62
+ dw_desired_access: 3
63
+ )
64
+ binary = packet.to_binary_s
65
+ expect(described_class.read(binary)).to eq(packet)
66
+ end
67
+ end
68
+
@@ -0,0 +1,38 @@
1
+ RSpec.describe RubySMB::Dcerpc::Svcctl::OpenSCManagerWResponse do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :lp_sc_handle }
5
+ it { is_expected.to respond_to :error_status }
6
+
7
+ it 'is little endian' do
8
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
9
+ end
10
+
11
+ describe '#lp_sc_handle' do
12
+ it 'is a ScRpcHandle structure' do
13
+ expect(packet.lp_sc_handle).to be_a RubySMB::Dcerpc::Svcctl::ScRpcHandle
14
+ end
15
+ end
16
+
17
+ describe '#error_status' do
18
+ it 'is a NdrUint32' do
19
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
20
+ end
21
+ end
22
+
23
+ describe '#initialize_instance' do
24
+ it 'sets #opnum to OPEN_SC_MANAGER_W constant' do
25
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Svcctl::OPEN_SC_MANAGER_W)
26
+ end
27
+ end
28
+
29
+ it 'reads its own binary representation and outputs the same packet' do
30
+ packet = described_class.new(
31
+ lp_sc_handle: {context_handle_attributes: 0, context_handle_uuid: '367abb81-9844-35f1-ad32-98f038001003'},
32
+ error_status: 3
33
+ )
34
+ binary = packet.to_binary_s
35
+ expect(described_class.read(binary)).to eq(packet)
36
+ end
37
+ end
38
+
@@ -0,0 +1,53 @@
1
+ RSpec.describe RubySMB::Dcerpc::Svcctl::OpenServiceWRequest do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :lp_sc_handle }
5
+ it { is_expected.to respond_to :lp_service_name }
6
+ it { is_expected.to respond_to :dw_desired_access }
7
+
8
+ it 'is little endian' do
9
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
10
+ end
11
+
12
+
13
+ describe '#lp_sc_handle' do
14
+ it 'is a ScRpcHandle structure' do
15
+ expect(packet.lp_sc_handle).to be_a RubySMB::Dcerpc::Svcctl::ScRpcHandle
16
+ end
17
+ end
18
+
19
+ describe '#lp_service_name' do
20
+ it 'is a NdrConfVarWideStringz structure' do
21
+ expect(packet.lp_service_name).to be_a RubySMB::Dcerpc::Ndr::NdrConfVarWideStringz
22
+ end
23
+ end
24
+
25
+ describe '#dw_desired_access' do
26
+ it 'is a NdrUint32' do
27
+ expect(packet.dw_desired_access).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
28
+ end
29
+ end
30
+
31
+ it 'should keep #dw_desired_access 4-byte aligned' do
32
+ 5.times do |i|
33
+ packet.lp_service_name = "A" * i
34
+ expect(packet.dw_desired_access.abs_offset % 4).to eq 0
35
+ end
36
+ end
37
+ describe '#initialize_instance' do
38
+ it 'sets #opnum to OPEN_SERVICE_W constant' do
39
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Svcctl::OPEN_SERVICE_W)
40
+ end
41
+ end
42
+
43
+ it 'reads its own binary representation and outputs the same packet' do
44
+ packet = described_class.new(
45
+ lp_sc_handle: {context_handle_attributes: 0, context_handle_uuid: '367abb81-9844-35f1-ad32-98f038001003'},
46
+ lp_service_name: 'test',
47
+ dw_desired_access: 3
48
+ )
49
+ binary = packet.to_binary_s
50
+ expect(described_class.read(binary)).to eq(packet)
51
+ end
52
+ end
53
+
@@ -0,0 +1,38 @@
1
+ RSpec.describe RubySMB::Dcerpc::Svcctl::OpenServiceWResponse do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :lp_sc_handle }
5
+ it { is_expected.to respond_to :error_status }
6
+
7
+ it 'is little endian' do
8
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
9
+ end
10
+
11
+ describe '#lp_sc_handle' do
12
+ it 'is a ScRpcHandle structure' do
13
+ expect(packet.lp_sc_handle).to be_a RubySMB::Dcerpc::Svcctl::ScRpcHandle
14
+ end
15
+ end
16
+
17
+ describe '#error_status' do
18
+ it 'is a NdrUint32' do
19
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
20
+ end
21
+ end
22
+
23
+ describe '#initialize_instance' do
24
+ it 'sets #opnum to OPEN_SC_MANAGER_W constant' do
25
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Svcctl::OPEN_SC_MANAGER_W)
26
+ end
27
+ end
28
+
29
+ it 'reads its own binary representation and outputs the same packet' do
30
+ packet = described_class.new(
31
+ lp_sc_handle: {context_handle_attributes: 0, context_handle_uuid: '367abb81-9844-35f1-ad32-98f038001003'},
32
+ error_status: 3
33
+ )
34
+ binary = packet.to_binary_s
35
+ expect(described_class.read(binary)).to eq(packet)
36
+ end
37
+ end
38
+
@@ -0,0 +1,38 @@
1
+ RSpec.describe RubySMB::Dcerpc::Svcctl::QueryServiceConfigWRequest do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :h_service }
5
+ it { is_expected.to respond_to :cb_buf_size }
6
+
7
+ it 'is little endian' do
8
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
9
+ end
10
+
11
+ describe '#h_service' do
12
+ it 'is a ScRpcHandle structure' do
13
+ expect(packet.h_service).to be_a RubySMB::Dcerpc::Svcctl::ScRpcHandle
14
+ end
15
+ end
16
+
17
+ describe '#cb_buf_size' do
18
+ it 'is a NdrUint32' do
19
+ expect(packet.cb_buf_size).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
20
+ end
21
+ end
22
+
23
+ describe '#initialize_instance' do
24
+ it 'sets #opnum to QUERY_SERVICE_CONFIG_W constant' do
25
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Svcctl::QUERY_SERVICE_CONFIG_W)
26
+ end
27
+ end
28
+
29
+ it 'reads its own binary representation and outputs the same packet' do
30
+ packet = described_class.new(
31
+ h_service: {context_handle_attributes: 0, context_handle_uuid: '367abb81-9844-35f1-ad32-98f038001003'},
32
+ cb_buf_size: 3
33
+ )
34
+ binary = packet.to_binary_s
35
+ expect(described_class.read(binary)).to eq(packet)
36
+ end
37
+ end
38
+
@@ -0,0 +1,152 @@
1
+ RSpec.describe RubySMB::Dcerpc::Svcctl::LpBoundedDword8k do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it 'is NdrUint32 subclass' do
5
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrUint32
6
+ end
7
+ end
8
+
9
+ RSpec.describe RubySMB::Dcerpc::Svcctl::QueryServiceConfigW do
10
+ subject(:packet) { described_class.new }
11
+
12
+ it { is_expected.to respond_to :dw_service_type }
13
+ it { is_expected.to respond_to :dw_start_type }
14
+ it { is_expected.to respond_to :dw_error_control }
15
+ it { is_expected.to respond_to :lp_binary_path_name }
16
+ it { is_expected.to respond_to :lp_load_order_group }
17
+ it { is_expected.to respond_to :dw_tag_id }
18
+ it { is_expected.to respond_to :lp_dependencies }
19
+ it { is_expected.to respond_to :lp_service_start_name }
20
+ it { is_expected.to respond_to :lp_display_name }
21
+
22
+ it 'is little endian' do
23
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
24
+ end
25
+
26
+ describe '#dw_service_type' do
27
+ it 'is a NdrUint32' do
28
+ expect(packet.dw_service_type).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
29
+ end
30
+ end
31
+
32
+ describe '#dw_start_type' do
33
+ it 'is a NdrUint32' do
34
+ expect(packet.dw_start_type).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
35
+ end
36
+ end
37
+
38
+ describe '#dw_error_control' do
39
+ it 'is a NdrUint32' do
40
+ expect(packet.dw_error_control).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
41
+ end
42
+ end
43
+
44
+ describe '#lp_binary_path_name' do
45
+ it 'is a NdrWideStringPtr structure' do
46
+ expect(packet.lp_binary_path_name).to be_a RubySMB::Dcerpc::Ndr::NdrWideStringPtr
47
+ end
48
+ end
49
+
50
+ describe '#lp_load_order_group' do
51
+ it 'is a NdrWideStringPtr structure' do
52
+ expect(packet.lp_load_order_group).to be_a RubySMB::Dcerpc::Ndr::NdrWideStringPtr
53
+ end
54
+ end
55
+
56
+ describe '#dw_tag_id' do
57
+ it 'is a NdrUint32' do
58
+ expect(packet.dw_tag_id).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
59
+ end
60
+ end
61
+
62
+ describe '#lp_dependencies' do
63
+ it 'is a NdrWideStringPtr structure' do
64
+ expect(packet.lp_dependencies).to be_a RubySMB::Dcerpc::Ndr::NdrWideStringPtr
65
+ end
66
+ end
67
+
68
+ describe '#lp_service_start_name' do
69
+ it 'is a NdrWideStringPtr structure' do
70
+ expect(packet.lp_service_start_name).to be_a RubySMB::Dcerpc::Ndr::NdrWideStringPtr
71
+ end
72
+ end
73
+
74
+ describe '#lp_display_name' do
75
+ it 'is a NdrWideStringPtr structure' do
76
+ expect(packet.lp_display_name).to be_a RubySMB::Dcerpc::Ndr::NdrWideStringPtr
77
+ end
78
+ end
79
+
80
+ it 'reads its own binary representation and outputs the same packet' do
81
+ packet = described_class.new(
82
+ dw_service_type: 3,
83
+ dw_start_type: 4,
84
+ dw_error_control: 5,
85
+ lp_binary_path_name: 'test',
86
+ lp_load_order_group: 'test2',
87
+ dw_tag_id: 3,
88
+ lp_dependencies: 'test3',
89
+ lp_service_start_name: 'test4',
90
+ lp_display_name: 'test5'
91
+ )
92
+ binary = packet.to_binary_s
93
+ expect(described_class.read(binary)).to eq(packet)
94
+ end
95
+ end
96
+
97
+ RSpec.describe RubySMB::Dcerpc::Svcctl::QueryServiceConfigWResponse do
98
+ subject(:packet) { described_class.new }
99
+
100
+ it { is_expected.to respond_to :lp_service_config }
101
+ it { is_expected.to respond_to :pcb_bytes_needed }
102
+ it { is_expected.to respond_to :error_status }
103
+
104
+ it 'is little endian' do
105
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
106
+ end
107
+
108
+ describe '#lp_service_config' do
109
+ it 'is a QueryServiceConfigW structure' do
110
+ expect(packet.lp_service_config).to be_a RubySMB::Dcerpc::Svcctl::QueryServiceConfigW
111
+ end
112
+ end
113
+
114
+ describe '#pcb_bytes_needed' do
115
+ it 'is a LpBoundedDword8k structure' do
116
+ expect(packet.pcb_bytes_needed).to be_a RubySMB::Dcerpc::Svcctl::LpBoundedDword8k
117
+ end
118
+ end
119
+
120
+ describe '#error_status' do
121
+ it 'is a NdrUint32' do
122
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
123
+ end
124
+ end
125
+
126
+ describe '#initialize_instance' do
127
+ it 'sets #opnum to QUERY_SERVICE_CONFIG_W constant' do
128
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Svcctl::QUERY_SERVICE_CONFIG_W)
129
+ end
130
+ end
131
+
132
+ it 'reads its own binary representation and outputs the same packet' do
133
+ sc = RubySMB::Dcerpc::Svcctl::QueryServiceConfigW.new(
134
+ dw_service_type: 3,
135
+ dw_start_type: 4,
136
+ dw_error_control: 5,
137
+ lp_binary_path_name: 'test',
138
+ lp_load_order_group: 'test2',
139
+ dw_tag_id: 3,
140
+ lp_dependencies: 'test3',
141
+ lp_service_start_name: 'test4',
142
+ lp_display_name: 'test5'
143
+ )
144
+ packet = described_class.new(
145
+ lp_service_config: sc,
146
+ pcb_bytes_needed: 4,
147
+ error_status: 3
148
+ )
149
+ binary = packet.to_binary_s
150
+ expect(described_class.read(binary)).to eq(packet)
151
+ end
152
+ end
@@ -0,0 +1,30 @@
1
+ RSpec.describe RubySMB::Dcerpc::Svcctl::QueryServiceStatusRequest do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :h_service }
5
+
6
+ it 'is little endian' do
7
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
8
+ end
9
+
10
+ describe '#h_service' do
11
+ it 'is a ScRpcHandle structure' do
12
+ expect(packet.h_service).to be_a RubySMB::Dcerpc::Svcctl::ScRpcHandle
13
+ end
14
+ end
15
+
16
+ describe '#initialize_instance' do
17
+ it 'sets #opnum to QUERY_SERVICE_STATUS constant' do
18
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Svcctl::QUERY_SERVICE_STATUS)
19
+ end
20
+ end
21
+
22
+ it 'reads its own binary representation and outputs the same packet' do
23
+ packet = described_class.new(
24
+ h_service: {context_handle_attributes: 0, context_handle_uuid: '367abb81-9844-35f1-ad32-98f038001003'}
25
+ )
26
+ binary = packet.to_binary_s
27
+ expect(described_class.read(binary)).to eq(packet)
28
+ end
29
+ end
30
+
@@ -0,0 +1,38 @@
1
+ RSpec.describe RubySMB::Dcerpc::Svcctl::QueryServiceStatusResponse do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :lp_service_status }
5
+ it { is_expected.to respond_to :error_status }
6
+
7
+ it 'is little endian' do
8
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
9
+ end
10
+
11
+ describe '#lp_service_status' do
12
+ it 'is a ServiceStatus structure' do
13
+ expect(packet.lp_service_status).to be_a RubySMB::Dcerpc::Svcctl::ServiceStatus
14
+ end
15
+ end
16
+
17
+ describe '#error_status' do
18
+ it 'is a NdrUint32' do
19
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
20
+ end
21
+ end
22
+
23
+ describe '#initialize_instance' do
24
+ it 'sets #opnum to QUERY_SERVICE_STATUS constant' do
25
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Svcctl::QUERY_SERVICE_STATUS)
26
+ end
27
+ end
28
+
29
+ it 'reads its own binary representation and outputs the same packet' do
30
+ packet = described_class.new(
31
+ lp_service_status: RubySMB::Dcerpc::Svcctl::ServiceStatus.new(dw_service_type: 1, dw_current_state: 3),
32
+ error_status: 3
33
+ )
34
+ binary = packet.to_binary_s
35
+ expect(described_class.read(binary)).to eq(packet)
36
+ end
37
+ end
38
+
@@ -0,0 +1,76 @@
1
+ RSpec.describe RubySMB::Dcerpc::Svcctl::ServiceStatus do
2
+ it 'is a NdrStruct' do
3
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrStruct
4
+ end
5
+
6
+ subject(:packet) { described_class.new }
7
+
8
+ it { is_expected.to respond_to :dw_service_type }
9
+ it { is_expected.to respond_to :dw_current_state }
10
+ it { is_expected.to respond_to :dw_controls_accepted }
11
+ it { is_expected.to respond_to :dw_win32_exit_code }
12
+ it { is_expected.to respond_to :dw_service_specific_exit_code }
13
+ it { is_expected.to respond_to :dw_check_point }
14
+ it { is_expected.to respond_to :dw_wait_hint }
15
+
16
+ it 'is little endian' do
17
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
18
+ end
19
+
20
+ describe '#dw_service_type' do
21
+ it 'is a NdrUint32' do
22
+ expect(packet.dw_service_type).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
23
+ end
24
+ end
25
+
26
+ describe '#dw_current_state' do
27
+ it 'is a NdrUint32' do
28
+ expect(packet.dw_current_state).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
29
+ end
30
+ end
31
+
32
+ describe '#dw_controls_accepted' do
33
+ it 'is a NdrUint32' do
34
+ expect(packet.dw_controls_accepted).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
35
+ end
36
+ end
37
+
38
+ describe '#dw_win32_exit_code' do
39
+ it 'is a NdrUint32' do
40
+ expect(packet.dw_win32_exit_code).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
41
+ end
42
+ end
43
+
44
+ describe '#dw_service_specific_exit_code' do
45
+ it 'is a NdrUint32' do
46
+ expect(packet.dw_service_specific_exit_code).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
47
+ end
48
+ end
49
+
50
+ describe '#dw_check_point' do
51
+ it 'is a NdrUint32' do
52
+ expect(packet.dw_check_point).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
53
+ end
54
+ end
55
+
56
+ describe '#dw_wait_hint' do
57
+ it 'is a NdrUint32' do
58
+ expect(packet.dw_wait_hint).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
59
+ end
60
+ end
61
+
62
+ it 'reads its own binary representation and outputs the same packet' do
63
+ packet = described_class.new(
64
+ dw_desired_access: 2,
65
+ dw_current_state: 3,
66
+ dw_controls_accepted: 4,
67
+ dw_win32_exit_code: 5,
68
+ dw_service_specific_exit_code: 6,
69
+ dw_check_point: 7,
70
+ dw_wait_hint: 8
71
+ )
72
+ binary = packet.to_binary_s
73
+ expect(described_class.read(binary)).to eq(packet)
74
+ end
75
+ end
76
+