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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.github/workflows/verify.yml +46 -0
- data/README.md +0 -1
- data/examples/anonymous_auth.rb +3 -3
- data/examples/append_file.rb +10 -8
- data/examples/auth_capture.rb +71 -0
- data/examples/authenticate.rb +9 -5
- data/examples/delete_file.rb +8 -6
- data/examples/dump_secrets_from_sid.rb +207 -0
- data/examples/enum_domain_users.rb +75 -0
- data/examples/enum_registry_key.rb +5 -4
- data/examples/enum_registry_values.rb +5 -4
- data/examples/get_computer_info.rb +42 -0
- data/examples/list_directory.rb +8 -6
- data/examples/negotiate_with_netbios_service.rb +9 -5
- data/examples/net_share_enum_all.rb +6 -4
- data/examples/pipes.rb +11 -12
- data/examples/query_service_status.rb +102 -0
- data/examples/read_file.rb +8 -6
- data/examples/read_registry_key_value.rb +6 -5
- data/examples/rename_file.rb +9 -7
- data/examples/tree_connect.rb +7 -5
- data/examples/write_file.rb +9 -7
- data/lib/ruby_smb/client/authentication.rb +5 -10
- data/lib/ruby_smb/client/echo.rb +2 -4
- data/lib/ruby_smb/client/negotiation.rb +13 -16
- data/lib/ruby_smb/client/tree_connect.rb +2 -4
- data/lib/ruby_smb/client/utils.rb +16 -10
- data/lib/ruby_smb/client/winreg.rb +1 -1
- data/lib/ruby_smb/client.rb +102 -75
- data/lib/ruby_smb/compression/lznt1.rb +164 -0
- data/lib/ruby_smb/compression.rb +7 -0
- data/lib/ruby_smb/dcerpc/bind.rb +28 -20
- data/lib/ruby_smb/dcerpc/bind_ack.rb +29 -28
- data/lib/ruby_smb/dcerpc/client.rb +542 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_bind_request.rb +24 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_bind_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_crack_names_request.rb +57 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_crack_names_response.rb +76 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_domain_controller_info_request.rb +46 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_domain_controller_info_response.rb +168 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_extensions.rb +56 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_get_nc_changes_request.rb +121 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_get_nc_changes_response.rb +118 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_unbind_request.rb +24 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_unbind_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/drsr.rb +909 -0
- data/lib/ruby_smb/dcerpc/epm/epm_ept_map_request.rb +26 -0
- data/lib/ruby_smb/dcerpc/epm/epm_ept_map_response.rb +25 -0
- data/lib/ruby_smb/dcerpc/epm/epm_twrt.rb +211 -0
- data/lib/ruby_smb/dcerpc/epm.rb +75 -0
- data/lib/ruby_smb/dcerpc/error.rb +20 -0
- data/lib/ruby_smb/dcerpc/ndr.rb +1204 -80
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_request.rb +27 -0
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_request.rb +27 -0
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_response.rb +23 -0
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_request.rb +24 -0
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_response.rb +24 -0
- data/lib/ruby_smb/dcerpc/netlogon.rb +102 -0
- data/lib/ruby_smb/dcerpc/p_syntax_id_t.rb +4 -3
- data/lib/ruby_smb/dcerpc/pdu_header.rb +7 -7
- data/lib/ruby_smb/dcerpc/ptypes.rb +1 -0
- data/lib/ruby_smb/dcerpc/request.rb +85 -19
- data/lib/ruby_smb/dcerpc/response.rb +45 -10
- data/lib/ruby_smb/dcerpc/rpc_auth3.rb +28 -0
- data/lib/ruby_smb/dcerpc/rpc_security_attributes.rb +34 -0
- data/lib/ruby_smb/dcerpc/rrp_rpc_unicode_string.rb +118 -0
- data/lib/ruby_smb/dcerpc/samr/rpc_sid.rb +150 -0
- data/lib/ruby_smb/dcerpc/samr/samr_close_handle_request.rb +23 -0
- data/lib/ruby_smb/dcerpc/samr/samr_close_handle_response.rb +24 -0
- data/lib/ruby_smb/dcerpc/samr/samr_connect_request.rb +32 -0
- data/lib/ruby_smb/dcerpc/samr/samr_connect_response.rb +23 -0
- data/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_request.rb +26 -0
- data/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_response.rb +55 -0
- data/lib/ruby_smb/dcerpc/samr/samr_get_alias_membership_request.rb +48 -0
- data/lib/ruby_smb/dcerpc/samr/samr_get_alias_membership_response.rb +38 -0
- data/lib/ruby_smb/dcerpc/samr/samr_get_groups_for_user_request.rb +23 -0
- data/lib/ruby_smb/dcerpc/samr/samr_get_groups_for_user_response.rb +48 -0
- data/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_request.rb +24 -0
- data/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_response.rb +25 -0
- data/lib/ruby_smb/dcerpc/samr/samr_open_domain_request.rb +27 -0
- data/lib/ruby_smb/dcerpc/samr/samr_open_domain_response.rb +24 -0
- data/lib/ruby_smb/dcerpc/samr/samr_open_user_request.rb +26 -0
- data/lib/ruby_smb/dcerpc/samr/samr_open_user_response.rb +24 -0
- data/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_request.rb +23 -0
- data/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_response.rb +23 -0
- data/lib/ruby_smb/dcerpc/samr.rb +613 -0
- data/lib/ruby_smb/dcerpc/sec_trailer.rb +26 -0
- data/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all.rb +56 -79
- data/lib/ruby_smb/dcerpc/srvsvc.rb +27 -4
- data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request.rb +36 -0
- data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_request.rb +25 -0
- data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/svcctl/control_service_request.rb +26 -0
- data/lib/ruby_smb/dcerpc/svcctl/control_service_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request.rb +25 -0
- data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response.rb +23 -0
- data/lib/ruby_smb/dcerpc/svcctl/open_service_w_request.rb +23 -0
- data/lib/ruby_smb/dcerpc/svcctl/open_service_w_response.rb +23 -0
- data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request.rb +25 -0
- data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response.rb +45 -0
- data/lib/ruby_smb/dcerpc/svcctl/query_service_status_request.rb +23 -0
- data/lib/ruby_smb/dcerpc/svcctl/query_service_status_response.rb +27 -0
- data/lib/ruby_smb/dcerpc/svcctl/service_status.rb +26 -0
- data/lib/ruby_smb/dcerpc/svcctl/start_service_w_request.rb +27 -0
- data/lib/ruby_smb/dcerpc/svcctl/start_service_w_response.rb +25 -0
- data/lib/ruby_smb/dcerpc/svcctl.rb +477 -0
- data/lib/ruby_smb/dcerpc/uuid.rb +3 -0
- data/lib/ruby_smb/dcerpc/winreg/close_key_response.rb +2 -2
- data/lib/ruby_smb/dcerpc/winreg/create_key_request.rb +62 -0
- data/lib/ruby_smb/dcerpc/winreg/create_key_response.rb +36 -0
- data/lib/ruby_smb/dcerpc/winreg/enum_key_request.rb +2 -19
- data/lib/ruby_smb/dcerpc/winreg/enum_key_response.rb +3 -20
- data/lib/ruby_smb/dcerpc/winreg/enum_value_request.rb +5 -14
- data/lib/ruby_smb/dcerpc/winreg/enum_value_response.rb +5 -14
- data/lib/ruby_smb/dcerpc/winreg/open_key_request.rb +1 -9
- data/lib/ruby_smb/dcerpc/winreg/open_key_response.rb +4 -3
- data/lib/ruby_smb/dcerpc/winreg/open_root_key_request.rb +6 -7
- data/lib/ruby_smb/dcerpc/winreg/open_root_key_response.rb +2 -2
- data/lib/ruby_smb/dcerpc/winreg/query_info_key_request.rb +1 -1
- data/lib/ruby_smb/dcerpc/winreg/query_info_key_response.rb +9 -18
- data/lib/ruby_smb/dcerpc/winreg/query_value_request.rb +4 -13
- data/lib/ruby_smb/dcerpc/winreg/query_value_response.rb +7 -15
- data/lib/ruby_smb/dcerpc/winreg/regsam.rb +3 -1
- data/lib/ruby_smb/dcerpc/winreg/save_key_request.rb +28 -0
- data/lib/ruby_smb/dcerpc/winreg/save_key_response.rb +23 -0
- data/lib/ruby_smb/dcerpc/winreg.rb +99 -22
- data/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_request.rb +26 -0
- data/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_response.rb +88 -0
- data/lib/ruby_smb/dcerpc/wkssvc.rb +65 -0
- data/lib/ruby_smb/dcerpc.rb +45 -11
- data/lib/ruby_smb/dialect.rb +45 -0
- data/lib/ruby_smb/dispatcher/base.rb +1 -1
- data/lib/ruby_smb/dispatcher/socket.rb +2 -2
- data/lib/ruby_smb/error.rb +21 -5
- data/lib/ruby_smb/field/file_time.rb +1 -1
- data/lib/ruby_smb/field/string16.rb +5 -1
- data/lib/ruby_smb/field/stringz16.rb +17 -1
- data/lib/ruby_smb/generic_packet.rb +11 -1
- data/lib/ruby_smb/gss/provider/authenticator.rb +42 -0
- data/lib/ruby_smb/gss/provider/ntlm.rb +303 -0
- data/lib/ruby_smb/gss/provider.rb +35 -0
- data/lib/ruby_smb/gss.rb +56 -63
- data/lib/ruby_smb/nbss/session_header.rb +4 -4
- data/lib/ruby_smb/ntlm.rb +61 -0
- data/lib/ruby_smb/server/server_client/negotiation.rb +156 -0
- data/lib/ruby_smb/server/server_client/session_setup.rb +82 -0
- data/lib/ruby_smb/server/server_client.rb +162 -0
- data/lib/ruby_smb/server.rb +54 -0
- data/lib/ruby_smb/signing.rb +59 -0
- data/lib/ruby_smb/smb1/file.rb +10 -25
- data/lib/ruby_smb/smb1/packet/negotiate_response.rb +11 -11
- data/lib/ruby_smb/smb1/packet/negotiate_response_extended.rb +1 -1
- data/lib/ruby_smb/smb1/packet/session_setup_request.rb +1 -1
- data/lib/ruby_smb/smb1/packet/trans2/find_first2_response.rb +0 -1
- data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +0 -1
- data/lib/ruby_smb/smb1/packet/trans2/open2_response.rb +1 -2
- data/lib/ruby_smb/smb1/packet/trans2/set_file_information_response.rb +1 -13
- data/lib/ruby_smb/smb1/pipe.rb +12 -6
- data/lib/ruby_smb/smb1/tree.rb +13 -9
- data/lib/ruby_smb/smb2/file.rb +33 -33
- data/lib/ruby_smb/smb2/negotiate_context.rb +18 -2
- data/lib/ruby_smb/smb2/packet/compression_transform_header.rb +4 -0
- data/lib/ruby_smb/smb2/packet/negotiate_request.rb +9 -0
- data/lib/ruby_smb/smb2/packet/negotiate_response.rb +0 -1
- data/lib/ruby_smb/smb2/packet/session_setup_response.rb +2 -2
- data/lib/ruby_smb/smb2/packet/tree_connect_request.rb +1 -1
- data/lib/ruby_smb/smb2/pipe.rb +13 -6
- data/lib/ruby_smb/smb2/tree.rb +21 -11
- data/lib/ruby_smb/smb2.rb +3 -1
- data/lib/ruby_smb/version.rb +1 -1
- data/lib/ruby_smb.rb +5 -3
- data/spec/lib/ruby_smb/client_spec.rb +199 -86
- data/spec/lib/ruby_smb/compression/lznt1_spec.rb +32 -0
- data/spec/lib/ruby_smb/dcerpc/bind_ack_spec.rb +69 -41
- data/spec/lib/ruby_smb/dcerpc/bind_spec.rb +75 -21
- data/spec/lib/ruby_smb/dcerpc/client_spec.rb +714 -0
- data/spec/lib/ruby_smb/dcerpc/drsr_spec.rb +2169 -0
- data/spec/lib/ruby_smb/dcerpc/ndr_spec.rb +3977 -239
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_request_spec.rb +69 -0
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_response_spec.rb +53 -0
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_request_spec.rb +69 -0
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_response_spec.rb +37 -0
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_request_spec.rb +45 -0
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_response_spec.rb +37 -0
- data/spec/lib/ruby_smb/dcerpc/p_syntax_id_t_spec.rb +18 -4
- data/spec/lib/ruby_smb/dcerpc/pdu_header_spec.rb +27 -1
- data/spec/lib/ruby_smb/dcerpc/request_spec.rb +76 -11
- data/spec/lib/ruby_smb/dcerpc/response_spec.rb +99 -9
- data/spec/lib/ruby_smb/dcerpc/rpc_auth3_spec.rb +75 -0
- data/spec/lib/ruby_smb/dcerpc/rpc_security_attributes_spec.rb +162 -0
- data/spec/lib/ruby_smb/dcerpc/rrp_rpc_unicode_string_spec.rb +340 -0
- data/spec/lib/ruby_smb/dcerpc/samr/rpc_sid_spec.rb +116 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_close_handle_request_spec.rb +40 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_close_handle_response_spec.rb +48 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_connect_request_spec.rb +56 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_connect_response_spec.rb +47 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_request_spec.rb +63 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_response_spec.rb +265 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_request_spec.rb +52 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_response_spec.rb +36 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_open_domain_request_spec.rb +56 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_open_domain_response_spec.rb +48 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_request_spec.rb +48 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_response_spec.rb +42 -0
- data/spec/lib/ruby_smb/dcerpc/samr_spec.rb +420 -0
- data/spec/lib/ruby_smb/dcerpc/sec_trailer_spec.rb +92 -0
- data/spec/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all_spec.rb +149 -110
- data/spec/lib/ruby_smb/dcerpc/srvsvc_spec.rb +21 -17
- data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request_spec.rb +168 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_request_spec.rb +30 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_request_spec.rb +39 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request_spec.rb +68 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_request_spec.rb +53 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response_spec.rb +152 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_request_spec.rb +30 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/service_status_spec.rb +76 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_request_spec.rb +47 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_response_spec.rb +30 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl_spec.rb +508 -0
- data/spec/lib/ruby_smb/dcerpc/uuid_spec.rb +15 -23
- data/spec/lib/ruby_smb/dcerpc/winreg/close_key_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/winreg/create_key_request_spec.rb +73 -0
- data/spec/lib/ruby_smb/dcerpc/winreg/create_key_response_spec.rb +44 -0
- data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_request_spec.rb +4 -56
- data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_response_spec.rb +4 -56
- data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_request_spec.rb +10 -34
- data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_response_spec.rb +10 -34
- data/spec/lib/ruby_smb/dcerpc/winreg/open_key_request_spec.rb +2 -26
- data/spec/lib/ruby_smb/dcerpc/winreg/open_key_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_request_spec.rb +17 -20
- data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_request_spec.rb +0 -4
- data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_response_spec.rb +20 -44
- data/spec/lib/ruby_smb/dcerpc/winreg/query_value_request_spec.rb +8 -32
- data/spec/lib/ruby_smb/dcerpc/winreg/query_value_response_spec.rb +18 -42
- data/spec/lib/ruby_smb/dcerpc/winreg/regsam_spec.rb +4 -0
- data/spec/lib/ruby_smb/dcerpc/winreg/save_key_request_spec.rb +45 -0
- data/spec/lib/ruby_smb/dcerpc/winreg/save_key_response_spec.rb +22 -0
- data/spec/lib/ruby_smb/dcerpc/winreg_spec.rb +219 -62
- data/spec/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_request_spec.rb +43 -0
- data/spec/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_response_spec.rb +410 -0
- data/spec/lib/ruby_smb/dcerpc/wkssvc_spec.rb +70 -0
- data/spec/lib/ruby_smb/dispatcher/socket_spec.rb +10 -10
- data/spec/lib/ruby_smb/error_spec.rb +34 -5
- data/spec/lib/ruby_smb/field/string16_spec.rb +22 -0
- data/spec/lib/ruby_smb/field/stringz16_spec.rb +12 -0
- data/spec/lib/ruby_smb/generic_packet_spec.rb +7 -0
- data/spec/lib/ruby_smb/gss/provider/ntlm/account_spec.rb +32 -0
- data/spec/lib/ruby_smb/gss/provider/ntlm/authenticator_spec.rb +101 -0
- data/spec/lib/ruby_smb/gss/provider/ntlm/os_version_spec.rb +32 -0
- data/spec/lib/ruby_smb/gss/provider/ntlm_spec.rb +113 -0
- data/spec/lib/ruby_smb/nbss/session_header_spec.rb +4 -11
- data/spec/lib/ruby_smb/server/server_client_spec.rb +156 -0
- data/spec/lib/ruby_smb/server_spec.rb +32 -0
- data/spec/lib/ruby_smb/smb1/file_spec.rb +2 -4
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_response_spec.rb +0 -1
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_response_spec.rb +0 -1
- data/spec/lib/ruby_smb/smb1/packet/trans2/open2_response_spec.rb +0 -5
- data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_response_spec.rb +0 -6
- data/spec/lib/ruby_smb/smb1/pipe_spec.rb +20 -14
- data/spec/lib/ruby_smb/smb1/tree_spec.rb +22 -0
- data/spec/lib/ruby_smb/smb2/file_spec.rb +61 -9
- data/spec/lib/ruby_smb/smb2/negotiate_context_spec.rb +2 -2
- data/spec/lib/ruby_smb/smb2/pipe_spec.rb +20 -14
- data/spec/lib/ruby_smb/smb2/tree_spec.rb +58 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/support/bin_helper.rb +9 -0
- data.tar.gz.sig +0 -0
- metadata +229 -23
- metadata.gz.sig +0 -0
- data/.travis.yml +0 -6
- data/lib/ruby_smb/client/signing.rb +0 -64
- data/lib/ruby_smb/dcerpc/rrp_unicode_string.rb +0 -35
- data/spec/lib/ruby_smb/dcerpc/rrp_unicode_string_spec.rb +0 -98
|
@@ -107,6 +107,10 @@ RSpec.describe RubySMB::SMB2::File do
|
|
|
107
107
|
it 'sets the offset of the packet' do
|
|
108
108
|
expect(file.read_packet(offset: 55).offset).to eq 55
|
|
109
109
|
end
|
|
110
|
+
|
|
111
|
+
it 'sets the credit_charge of the packet' do
|
|
112
|
+
expect(file.read_packet(credit_charge: 3).smb2_header.credit_charge).to eq 3
|
|
113
|
+
end
|
|
110
114
|
end
|
|
111
115
|
|
|
112
116
|
describe '#read' do
|
|
@@ -125,7 +129,7 @@ RSpec.describe RubySMB::SMB2::File do
|
|
|
125
129
|
end
|
|
126
130
|
|
|
127
131
|
it 'uses a single packet to read the entire file' do
|
|
128
|
-
expect(file).to receive(:read_packet).with(read_length: 108, offset: 0).and_return(small_read)
|
|
132
|
+
expect(file).to receive(:read_packet).with(read_length: 108, offset: 0, credit_charge: 0).and_return(small_read)
|
|
129
133
|
expect(client).to receive(:send_recv).with(small_read, encrypt: false).and_return 'fake data'
|
|
130
134
|
expect(RubySMB::SMB2::Packet::ReadResponse).to receive(:read).with('fake data').and_return(small_response)
|
|
131
135
|
expect(file.read).to eq 'fake data'
|
|
@@ -161,14 +165,15 @@ RSpec.describe RubySMB::SMB2::File do
|
|
|
161
165
|
}
|
|
162
166
|
|
|
163
167
|
before :example do
|
|
168
|
+
client.server_supports_multi_credit = 1
|
|
164
169
|
allow(file).to receive(:read_packet)
|
|
165
170
|
allow(client).to receive(:send_recv)
|
|
166
171
|
allow(RubySMB::SMB2::Packet::ReadResponse).to receive(:read).and_return(big_response)
|
|
167
172
|
end
|
|
168
173
|
|
|
169
|
-
it 'uses
|
|
170
|
-
expect(file).to receive(:read_packet).once.with(read_length: described_class::MAX_PACKET_SIZE, offset: 0).and_return(big_read)
|
|
171
|
-
expect(file).to receive(:read_packet).once.with(read_length: described_class::MAX_PACKET_SIZE, offset: described_class::MAX_PACKET_SIZE).and_return(big_read)
|
|
174
|
+
it 'uses multiple packets to read the file in chunks' do
|
|
175
|
+
expect(file).to receive(:read_packet).once.with(read_length: described_class::MAX_PACKET_SIZE, offset: 0, credit_charge: 1).and_return(big_read)
|
|
176
|
+
expect(file).to receive(:read_packet).once.with(read_length: described_class::MAX_PACKET_SIZE, offset: described_class::MAX_PACKET_SIZE, credit_charge: 1).and_return(big_read)
|
|
172
177
|
expect(client).to receive(:send_recv).twice.and_return 'fake data'
|
|
173
178
|
expect(RubySMB::SMB2::Packet::ReadResponse).to receive(:read).twice.with('fake data').and_return(big_response)
|
|
174
179
|
file.read(bytes: (described_class::MAX_PACKET_SIZE * 2))
|
|
@@ -184,7 +189,7 @@ RSpec.describe RubySMB::SMB2::File do
|
|
|
184
189
|
|
|
185
190
|
context 'when the second response is not valid' do
|
|
186
191
|
it 'raise an InvalidPacket exception' do
|
|
187
|
-
allow(file).to receive(:read_packet).with(read_length: described_class::MAX_PACKET_SIZE, offset: described_class::MAX_PACKET_SIZE) do
|
|
192
|
+
allow(file).to receive(:read_packet).with(read_length: described_class::MAX_PACKET_SIZE, offset: described_class::MAX_PACKET_SIZE, credit_charge: 1) do
|
|
188
193
|
big_response.smb2_header.command = RubySMB::SMB2::Commands::LOGOFF
|
|
189
194
|
end
|
|
190
195
|
expect { file.read(bytes: (described_class::MAX_PACKET_SIZE * 2)) }.to raise_error(RubySMB::Error::InvalidPacket)
|
|
@@ -193,12 +198,31 @@ RSpec.describe RubySMB::SMB2::File do
|
|
|
193
198
|
|
|
194
199
|
context 'when the second response status code is not STATUS_SUCCESS' do
|
|
195
200
|
it 'raise an UnexpectedStatusCode exception' do
|
|
196
|
-
allow(file).to receive(:read_packet).with(read_length: described_class::MAX_PACKET_SIZE, offset: described_class::MAX_PACKET_SIZE) do
|
|
201
|
+
allow(file).to receive(:read_packet).with(read_length: described_class::MAX_PACKET_SIZE, offset: described_class::MAX_PACKET_SIZE, credit_charge: 1) do
|
|
197
202
|
big_response.smb2_header.nt_status = WindowsError::NTStatus::STATUS_INVALID_HANDLE.value
|
|
198
203
|
end
|
|
199
204
|
expect { file.read(bytes: (described_class::MAX_PACKET_SIZE * 2)) }.to raise_error(RubySMB::Error::UnexpectedStatusCode)
|
|
200
205
|
end
|
|
201
206
|
end
|
|
207
|
+
|
|
208
|
+
context 'when the server does not support multi credits' do
|
|
209
|
+
it 'reads 65536 bytes at a time with no credit charge' do
|
|
210
|
+
client.server_supports_multi_credit = false
|
|
211
|
+
expect(file).to receive(:read_packet).once.with(read_length: 65536, offset: 0, credit_charge: 0).and_return(big_read)
|
|
212
|
+
expect(file).to receive(:read_packet).once.with(read_length: 65536, offset: 65536, credit_charge: 0).and_return(big_read)
|
|
213
|
+
file.read(bytes: (described_class::MAX_PACKET_SIZE * 4))
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
context 'when the server supports multi credits' do
|
|
218
|
+
it 'reads a number of bytes equal to #server_max_read_size, with the expected credit charge' do
|
|
219
|
+
credit_charge = (90000 - 1) / 65536 + 1
|
|
220
|
+
client.server_max_read_size = 90000
|
|
221
|
+
expect(file).to receive(:read_packet).once.with(read_length: 90000, offset: 0, credit_charge: credit_charge).and_return(big_read)
|
|
222
|
+
expect(file).to receive(:read_packet).once.with(read_length: (described_class::MAX_PACKET_SIZE * 4 - 90000), offset: 90000, credit_charge: credit_charge).and_return(big_read)
|
|
223
|
+
file.read(bytes: (described_class::MAX_PACKET_SIZE * 4))
|
|
224
|
+
end
|
|
225
|
+
end
|
|
202
226
|
end
|
|
203
227
|
end
|
|
204
228
|
|
|
@@ -222,6 +246,10 @@ RSpec.describe RubySMB::SMB2::File do
|
|
|
222
246
|
it 'sets the buffer on the packet' do
|
|
223
247
|
expect(file.write_packet(data:'hello').buffer).to eq 'hello'
|
|
224
248
|
end
|
|
249
|
+
|
|
250
|
+
it 'sets the credit_charge on the packet header' do
|
|
251
|
+
expect(file.write_packet(credit_charge: 5).smb2_header.credit_charge).to eq 5
|
|
252
|
+
end
|
|
225
253
|
end
|
|
226
254
|
|
|
227
255
|
describe '#write' do
|
|
@@ -242,6 +270,11 @@ RSpec.describe RubySMB::SMB2::File do
|
|
|
242
270
|
end
|
|
243
271
|
|
|
244
272
|
context 'for a large write' do
|
|
273
|
+
before :example do
|
|
274
|
+
allow(client).to receive(:send_recv).and_return(write_response.to_binary_s)
|
|
275
|
+
client.server_supports_multi_credit = 1
|
|
276
|
+
end
|
|
277
|
+
|
|
245
278
|
it 'sends multiple packets' do
|
|
246
279
|
expect(client).to receive(:send_recv).twice.and_return(write_response.to_binary_s)
|
|
247
280
|
file.write(data: SecureRandom.random_bytes(described_class::MAX_PACKET_SIZE + 1))
|
|
@@ -254,6 +287,27 @@ RSpec.describe RubySMB::SMB2::File do
|
|
|
254
287
|
expect(client).to receive(:send_recv).twice.with(write_request, encrypt: true).and_return(write_response.to_binary_s)
|
|
255
288
|
file.write(data: SecureRandom.random_bytes(described_class::MAX_PACKET_SIZE + 1))
|
|
256
289
|
end
|
|
290
|
+
|
|
291
|
+
context 'when the server does not support multi credits' do
|
|
292
|
+
it 'writes 65536 bytes at a time with no credit charge' do
|
|
293
|
+
client.server_supports_multi_credit = false
|
|
294
|
+
data = SecureRandom.random_bytes(65536 * 2)
|
|
295
|
+
expect(file).to receive(:write_packet).once.with(data: data[0, 65536], offset: 0, credit_charge: 0)
|
|
296
|
+
expect(file).to receive(:write_packet).once.with(data: data[65536, (data.size - 65536)], offset: 65536, credit_charge: 0)
|
|
297
|
+
file.write(data: data)
|
|
298
|
+
end
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
context 'when the server supports multi credits' do
|
|
302
|
+
it 'reads a number of bytes equal to #server_max_write_size, with the expected credit charge' do
|
|
303
|
+
data = SecureRandom.random_bytes(90000 * 2)
|
|
304
|
+
credit_charge = (90000 - 1) / 65536 + 1
|
|
305
|
+
client.server_max_write_size = 90000
|
|
306
|
+
expect(file).to receive(:write_packet).once.with(data: data[0, 90000], offset: 0, credit_charge: credit_charge)
|
|
307
|
+
expect(file).to receive(:write_packet).once.with(data: data[90000, (data.size - 90000)], offset: 90000, credit_charge: credit_charge)
|
|
308
|
+
file.write(data: data)
|
|
309
|
+
end
|
|
310
|
+
end
|
|
257
311
|
end
|
|
258
312
|
|
|
259
313
|
it 'raises an InvalidPacket exception if the response is not valid' do
|
|
@@ -405,9 +459,7 @@ RSpec.describe RubySMB::SMB2::File do
|
|
|
405
459
|
|
|
406
460
|
it 'raises an InvalidPacket exception if the response is not valid' do
|
|
407
461
|
allow(response).to receive(:valid?).and_return(false)
|
|
408
|
-
|
|
409
|
-
allow(response).to receive(:smb2_header).and_return(smb2_header)
|
|
410
|
-
allow(smb2_header).to receive_messages(:protocol => nil, :command => nil)
|
|
462
|
+
allow(response).to receive(:packet_smb_version)
|
|
411
463
|
expect { file.close }.to raise_error(RubySMB::Error::InvalidPacket)
|
|
412
464
|
end
|
|
413
465
|
|
|
@@ -162,7 +162,7 @@ RSpec.describe RubySMB::SMB2::CompressionCapabilities do
|
|
|
162
162
|
end
|
|
163
163
|
end
|
|
164
164
|
|
|
165
|
-
RSpec.describe RubySMB::SMB2::NetnameNegotiateContextId
|
|
165
|
+
RSpec.describe RubySMB::SMB2::NetnameNegotiateContextId do
|
|
166
166
|
subject(:capability) { described_class.new }
|
|
167
167
|
|
|
168
168
|
it { is_expected.to respond_to :net_name }
|
|
@@ -173,7 +173,7 @@ RSpec.describe RubySMB::SMB2::NetnameNegotiateContextId do
|
|
|
173
173
|
|
|
174
174
|
describe '#net_name' do
|
|
175
175
|
it 'is a unicode string' do
|
|
176
|
-
expect(capability.net_name).to be_a RubySMB::Field::
|
|
176
|
+
expect(capability.net_name).to be_a RubySMB::Field::String16
|
|
177
177
|
end
|
|
178
178
|
end
|
|
179
179
|
|
|
@@ -86,9 +86,7 @@ RSpec.describe RubySMB::SMB2::Pipe do
|
|
|
86
86
|
|
|
87
87
|
it 'raises an InvalidPacket exception if the response is not valid' do
|
|
88
88
|
allow(response).to receive(:valid?).and_return(false)
|
|
89
|
-
|
|
90
|
-
allow(response).to receive(:smb2_header).and_return(smb2_header)
|
|
91
|
-
allow(smb2_header).to receive_messages(:protocol => nil, :command => nil)
|
|
89
|
+
allow(response).to receive(:packet_smb_version)
|
|
92
90
|
expect { pipe.peek }.to raise_error(RubySMB::Error::InvalidPacket)
|
|
93
91
|
end
|
|
94
92
|
|
|
@@ -148,17 +146,26 @@ RSpec.describe RubySMB::SMB2::Pipe do
|
|
|
148
146
|
expect(pipe.size_on_disk).to eq(create_response.allocation_size)
|
|
149
147
|
end
|
|
150
148
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
149
|
+
{
|
|
150
|
+
netlogon: RubySMB::Dcerpc::Netlogon,
|
|
151
|
+
srvsvc: RubySMB::Dcerpc::Srvsvc,
|
|
152
|
+
svcctl: RubySMB::Dcerpc::Svcctl,
|
|
153
|
+
winreg: RubySMB::Dcerpc::Winreg,
|
|
154
|
+
samr: RubySMB::Dcerpc::Samr,
|
|
155
|
+
wkssvc: RubySMB::Dcerpc::Wkssvc
|
|
156
|
+
}.each do |endpoint, klass|
|
|
157
|
+
context "with \'#{endpoint}\' filename" do
|
|
158
|
+
it "extends #{klass} class" do
|
|
159
|
+
pipe = described_class.new(tree: tree, response: create_response, name: endpoint.to_s)
|
|
160
|
+
expect(pipe).to be_a klass
|
|
161
|
+
end
|
|
155
162
|
end
|
|
156
|
-
end
|
|
157
163
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
164
|
+
context "with \'\\#{endpoint}\' filename" do
|
|
165
|
+
it "extends #{klass} class" do
|
|
166
|
+
pipe = described_class.new(tree: tree, response: create_response, name: "\\#{endpoint.to_s}")
|
|
167
|
+
expect(pipe).to be_a klass
|
|
168
|
+
end
|
|
162
169
|
end
|
|
163
170
|
end
|
|
164
171
|
end
|
|
@@ -254,8 +261,7 @@ RSpec.describe RubySMB::SMB2::Pipe do
|
|
|
254
261
|
|
|
255
262
|
context 'when the response is not an IoctlResponse packet' do
|
|
256
263
|
it 'raises an InvalidPacket exception' do
|
|
257
|
-
allow(ioctl_response).to
|
|
258
|
-
allow(ioctl_response).to receive_message_chain(:smb2_header, :command)
|
|
264
|
+
allow(ioctl_response).to receive(:packet_smb_version)
|
|
259
265
|
allow(ioctl_response).to receive(:valid?).and_return(false)
|
|
260
266
|
expect { pipe.ioctl_send_recv(dcerpc_request, options) }.to raise_error(RubySMB::Error::InvalidPacket)
|
|
261
267
|
end
|
|
@@ -195,7 +195,7 @@ RSpec.describe RubySMB::SMB2::Tree do
|
|
|
195
195
|
allow(client).to receive(:send_recv) do |packet|
|
|
196
196
|
expect(packet.file_information_class).to eq RubySMB::Fscc::FileInformation::FileIdFullDirectoryInformation::CLASS_LEVEL
|
|
197
197
|
expect(packet.name).to eq '*'.encode('UTF-16LE')
|
|
198
|
-
expect(packet.output_length).to eq
|
|
198
|
+
expect(packet.output_length).to eq 65_536
|
|
199
199
|
end
|
|
200
200
|
tree.list
|
|
201
201
|
end
|
|
@@ -288,6 +288,40 @@ RSpec.describe RubySMB::SMB2::Tree do
|
|
|
288
288
|
end
|
|
289
289
|
end
|
|
290
290
|
|
|
291
|
+
context 'when the dialect is 0x0202' do
|
|
292
|
+
it 'sets the packet output_length to 65536 and credit_charge header to 0' do
|
|
293
|
+
client.dialect = '0x0202'
|
|
294
|
+
allow(client).to receive(:send_recv) do |packet|
|
|
295
|
+
expect(packet.output_length).to eq(65536)
|
|
296
|
+
expect(packet.smb2_header.credit_charge).to eq(0)
|
|
297
|
+
end
|
|
298
|
+
tree.list
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
context 'when the server does not support multi credits' do
|
|
303
|
+
it 'sets the packet output_length to 65536 and credit_charge header to 0' do
|
|
304
|
+
client.server_supports_multi_credit = false
|
|
305
|
+
allow(client).to receive(:send_recv) do |packet|
|
|
306
|
+
expect(packet.output_length).to eq(65536)
|
|
307
|
+
expect(packet.smb2_header.credit_charge).to eq(0)
|
|
308
|
+
end
|
|
309
|
+
tree.list
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
context 'when the dialect is not 0x0202 and the server supports multi credits' do
|
|
314
|
+
it 'sets the packet output_length to server_max_read_size and credit_charge header to the expected value' do
|
|
315
|
+
client.server_supports_multi_credit = true
|
|
316
|
+
credit_charge = (90000 - 1) / 65536 + 1
|
|
317
|
+
client.server_max_read_size = 90000
|
|
318
|
+
allow(client).to receive(:send_recv) do |packet|
|
|
319
|
+
expect(packet.output_length).to eq(90000)
|
|
320
|
+
expect(packet.smb2_header.credit_charge).to eq(credit_charge)
|
|
321
|
+
end
|
|
322
|
+
tree.list
|
|
323
|
+
end
|
|
324
|
+
end
|
|
291
325
|
end
|
|
292
326
|
|
|
293
327
|
describe '#open_file' do
|
|
@@ -497,4 +531,27 @@ RSpec.describe RubySMB::SMB2::Tree do
|
|
|
497
531
|
end
|
|
498
532
|
end
|
|
499
533
|
end
|
|
534
|
+
|
|
535
|
+
describe '#open_pipe' do
|
|
536
|
+
let(:opts) { { filename: '\\test', write: true } }
|
|
537
|
+
before :example do
|
|
538
|
+
allow(tree).to receive(:open_file)
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
it 'calls #open_file with the provided options' do
|
|
542
|
+
opts[:filename] ='test'
|
|
543
|
+
expect(tree).to receive(:open_file).with(**opts)
|
|
544
|
+
tree.open_pipe(**opts)
|
|
545
|
+
end
|
|
546
|
+
|
|
547
|
+
it 'remove the leading \\ from the filename if needed' do
|
|
548
|
+
expect(tree).to receive(:open_file).with(filename: 'test', write: true)
|
|
549
|
+
tree.open_pipe(**opts)
|
|
550
|
+
end
|
|
551
|
+
|
|
552
|
+
it 'does not modify the original option hash' do
|
|
553
|
+
tree.open_pipe(**opts)
|
|
554
|
+
expect(opts).to eq( { filename: '\\test', write: true } )
|
|
555
|
+
end
|
|
556
|
+
end
|
|
500
557
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -7,7 +7,7 @@ end
|
|
|
7
7
|
require 'coveralls'
|
|
8
8
|
require 'ruby_smb'
|
|
9
9
|
|
|
10
|
-
if ENV['
|
|
10
|
+
if ENV['CI'] == 'true'
|
|
11
11
|
# don't generate local report as it is inaccessible on travis-ci, which is
|
|
12
12
|
# why coveralls is being used.
|
|
13
13
|
SimpleCov.formatter = Coveralls::SimpleCov::Formatter
|
data.tar.gz.sig
CHANGED
|
Binary file
|