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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.md +247 -7
- data/examples/anonymous_auth.rb +6 -3
- data/examples/append_file.rb +40 -0
- data/examples/authenticate.rb +12 -7
- data/examples/delete_file.rb +40 -0
- data/examples/list_directory.rb +45 -0
- data/examples/negotiate.rb +0 -1
- data/examples/negotiate_with_netbios_service.rb +36 -0
- data/examples/net_share_enum_all.rb +30 -0
- data/examples/read_file.rb +39 -0
- data/examples/rename_file.rb +41 -0
- data/examples/tree_connect.rb +2 -4
- data/examples/write_file.rb +40 -0
- data/lib/ruby_smb.rb +5 -0
- data/lib/ruby_smb/client.rb +196 -43
- data/lib/ruby_smb/client/authentication.rb +89 -48
- data/lib/ruby_smb/client/echo.rb +1 -4
- data/lib/ruby_smb/client/negotiation.rb +46 -45
- data/lib/ruby_smb/client/signing.rb +9 -16
- data/lib/ruby_smb/client/tree_connect.rb +8 -13
- data/lib/ruby_smb/client/utils.rb +79 -0
- data/lib/ruby_smb/dcerpc.rb +30 -0
- data/lib/ruby_smb/dcerpc/bind.rb +60 -0
- data/lib/ruby_smb/dcerpc/handle.rb +60 -0
- data/lib/ruby_smb/dcerpc/ndr.rb +41 -0
- data/lib/ruby_smb/dcerpc/request.rb +43 -0
- data/lib/ruby_smb/dcerpc/response.rb +46 -0
- data/lib/ruby_smb/dcerpc/srvsvc.rb +17 -0
- data/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all.rb +93 -0
- data/lib/ruby_smb/dcerpc/uuid.rb +28 -0
- data/lib/ruby_smb/dispatcher.rb +7 -3
- data/lib/ruby_smb/dispatcher/base.rb +23 -14
- data/lib/ruby_smb/dispatcher/socket.rb +71 -51
- data/lib/ruby_smb/dispositions.rb +32 -0
- data/lib/ruby_smb/error.rb +24 -18
- data/lib/ruby_smb/field.rb +5 -2
- data/lib/ruby_smb/field/extended_attribute_flag.rb +1 -1
- data/lib/ruby_smb/field/file_time.rb +3 -1
- data/lib/ruby_smb/field/security_descriptor.rb +6 -6
- data/lib/ruby_smb/field/smb2_fileid.rb +11 -0
- data/lib/ruby_smb/field/smb_fea.rb +3 -3
- data/lib/ruby_smb/field/smb_fea_list.rb +3 -3
- data/lib/ruby_smb/field/smb_gea.rb +12 -0
- data/lib/ruby_smb/field/smb_gea_list.rb +13 -0
- data/lib/ruby_smb/field/string16.rb +14 -0
- data/lib/ruby_smb/field/stringz16.rb +3 -7
- data/lib/ruby_smb/field/utime.rb +11 -10
- data/lib/ruby_smb/fscc.rb +12 -0
- data/lib/ruby_smb/fscc/control_codes.rb +26 -0
- data/lib/ruby_smb/{field → fscc}/ea_info_array.rb +12 -14
- data/lib/ruby_smb/fscc/file_attributes.rb +29 -0
- data/lib/ruby_smb/{field → fscc}/file_full_ea_info.rb +5 -5
- data/lib/ruby_smb/fscc/file_information.rb +60 -0
- data/lib/ruby_smb/fscc/file_information/file_both_directory_information.rb +29 -0
- data/lib/ruby_smb/fscc/file_information/file_directory_information.rb +25 -0
- data/lib/ruby_smb/fscc/file_information/file_disposition_information.rb +15 -0
- data/lib/ruby_smb/fscc/file_information/file_full_directory_information.rb +26 -0
- data/lib/ruby_smb/fscc/file_information/file_id_both_directory_information.rb +31 -0
- data/lib/ruby_smb/fscc/file_information/file_id_full_directory_information.rb +28 -0
- data/lib/ruby_smb/fscc/file_information/file_names_information.rb +18 -0
- data/lib/ruby_smb/fscc/file_information/file_rename_information.rb +44 -0
- data/lib/ruby_smb/generic_packet.rb +40 -18
- data/lib/ruby_smb/gss.rb +49 -56
- data/lib/ruby_smb/impersonation_levels.rb +7 -2
- data/lib/ruby_smb/nbss.rb +16 -0
- data/lib/ruby_smb/nbss/negative_session_response.rb +30 -0
- data/lib/ruby_smb/nbss/session_header.rb +13 -0
- data/lib/ruby_smb/nbss/session_request.rb +13 -0
- data/lib/ruby_smb/smb1.rb +20 -17
- data/lib/ruby_smb/smb1/bit_field.rb +3 -0
- data/lib/ruby_smb/smb1/bit_field/create_options.rb +5 -5
- data/lib/ruby_smb/smb1/bit_field/file_status_flags.rb +18 -0
- data/lib/ruby_smb/smb1/bit_field/open2_access_mode.rb +11 -11
- data/lib/ruby_smb/smb1/bit_field/open2_open_mode.rb +1 -1
- data/lib/ruby_smb/smb1/bit_field/optional_support.rb +0 -1
- data/lib/ruby_smb/smb1/bit_field/security_flags.rb +15 -0
- data/lib/ruby_smb/smb1/bit_field/share_access.rb +2 -3
- data/lib/ruby_smb/smb1/bit_field/smb_ext_file_attributes.rb +21 -24
- data/lib/ruby_smb/smb1/bit_field/smb_file_attributes.rb +1 -1
- data/lib/ruby_smb/smb1/commands.rb +5 -0
- data/lib/ruby_smb/smb1/create_actions.rb +3 -5
- data/lib/ruby_smb/smb1/file.rb +289 -0
- data/lib/ruby_smb/smb1/oplock_levels.rb +2 -4
- data/lib/ruby_smb/smb1/packet.rb +10 -0
- data/lib/ruby_smb/smb1/packet/close_request.rb +31 -0
- data/lib/ruby_smb/smb1/packet/close_response.rb +28 -0
- data/lib/ruby_smb/smb1/packet/echo_request.rb +5 -7
- data/lib/ruby_smb/smb1/packet/echo_response.rb +5 -7
- data/lib/ruby_smb/smb1/packet/empty_packet.rb +1 -2
- data/lib/ruby_smb/smb1/packet/logoff_request.rb +1 -4
- data/lib/ruby_smb/smb1/packet/logoff_response.rb +1 -4
- data/lib/ruby_smb/smb1/packet/negotiate_response.rb +22 -0
- data/lib/ruby_smb/smb1/packet/negotiate_response_extended.rb +22 -0
- data/lib/ruby_smb/smb1/packet/nt_create_andx_request.rb +62 -0
- data/lib/ruby_smb/smb1/packet/nt_create_andx_response.rb +66 -0
- data/lib/ruby_smb/smb1/packet/nt_trans.rb +1 -2
- data/lib/ruby_smb/smb1/packet/nt_trans/create_request.rb +19 -13
- data/lib/ruby_smb/smb1/packet/nt_trans/create_response.rb +8 -10
- data/lib/ruby_smb/smb1/packet/nt_trans/request.rb +11 -11
- data/lib/ruby_smb/smb1/packet/nt_trans/response.rb +10 -10
- data/lib/ruby_smb/smb1/packet/nt_trans/subcommands.rb +8 -1
- data/lib/ruby_smb/smb1/packet/read_andx_request.rb +84 -0
- data/lib/ruby_smb/smb1/packet/read_andx_response.rb +47 -0
- data/lib/ruby_smb/smb1/packet/session_setup_legacy_request.rb +2 -6
- data/lib/ruby_smb/smb1/packet/session_setup_legacy_response.rb +1 -4
- data/lib/ruby_smb/smb1/packet/session_setup_request.rb +1 -6
- data/lib/ruby_smb/smb1/packet/session_setup_response.rb +2 -4
- data/lib/ruby_smb/smb1/packet/trans2.rb +8 -2
- data/lib/ruby_smb/smb1/packet/trans2/data_block.rb +6 -7
- data/lib/ruby_smb/smb1/packet/trans2/find_first2_request.rb +77 -0
- data/lib/ruby_smb/smb1/packet/trans2/find_first2_response.rb +87 -0
- data/lib/ruby_smb/smb1/packet/trans2/find_information_level.rb +32 -0
- data/lib/ruby_smb/smb1/packet/trans2/find_information_level/find_file_full_directory_info.rb +45 -0
- data/lib/ruby_smb/smb1/packet/trans2/find_next2_request.rb +77 -0
- data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +86 -0
- data/lib/ruby_smb/smb1/packet/trans2/open2_request.rb +10 -10
- data/lib/ruby_smb/smb1/packet/trans2/open2_response.rb +10 -12
- data/lib/ruby_smb/smb1/packet/trans2/request.rb +15 -17
- data/lib/ruby_smb/smb1/packet/trans2/request_secondary.rb +8 -10
- data/lib/ruby_smb/smb1/packet/trans2/response.rb +11 -13
- data/lib/ruby_smb/smb1/packet/trans2/set_file_information_request.rb +66 -0
- data/lib/ruby_smb/smb1/packet/trans2/set_file_information_response.rb +57 -0
- data/lib/ruby_smb/smb1/packet/trans2/subcommands.rb +5 -2
- data/lib/ruby_smb/smb1/packet/tree_connect_request.rb +4 -6
- data/lib/ruby_smb/smb1/packet/tree_connect_response.rb +5 -7
- data/lib/ruby_smb/smb1/packet/tree_disconnect_request.rb +2 -4
- data/lib/ruby_smb/smb1/packet/tree_disconnect_response.rb +2 -4
- data/lib/ruby_smb/smb1/packet/write_andx_request.rb +68 -0
- data/lib/ruby_smb/smb1/packet/write_andx_response.rb +35 -0
- data/lib/ruby_smb/smb1/resource_type.rb +18 -0
- data/lib/ruby_smb/smb1/tree.rb +188 -5
- data/lib/ruby_smb/smb2.rb +16 -11
- data/lib/ruby_smb/smb2/bit_field.rb +1 -0
- data/lib/ruby_smb/smb2/bit_field/file_access_mask.rb +1 -1
- data/lib/ruby_smb/smb2/bit_field/session_flags.rb +1 -2
- data/lib/ruby_smb/smb2/bit_field/share_flags.rb +4 -6
- data/lib/ruby_smb/smb2/create_context.rb +29 -0
- data/lib/ruby_smb/smb2/file.rb +251 -0
- data/lib/ruby_smb/smb2/info_type.rb +21 -0
- data/lib/ruby_smb/smb2/packet.rb +16 -0
- data/lib/ruby_smb/smb2/packet/close_request.rb +22 -0
- data/lib/ruby_smb/smb2/packet/close_response.rb +29 -0
- data/lib/ruby_smb/smb2/packet/create_request.rb +54 -0
- data/lib/ruby_smb/smb2/packet/create_response.rb +35 -0
- data/lib/ruby_smb/smb2/packet/echo_request.rb +1 -3
- data/lib/ruby_smb/smb2/packet/echo_response.rb +1 -3
- data/lib/ruby_smb/smb2/packet/error_packet.rb +1 -3
- data/lib/ruby_smb/smb2/packet/ioctl_request.rb +54 -0
- data/lib/ruby_smb/smb2/packet/ioctl_response.rb +39 -0
- data/lib/ruby_smb/smb2/packet/logoff_request.rb +1 -4
- data/lib/ruby_smb/smb2/packet/logoff_response.rb +1 -4
- data/lib/ruby_smb/smb2/packet/negotiate_request.rb +1 -1
- data/lib/ruby_smb/smb2/packet/negotiate_response.rb +1 -1
- data/lib/ruby_smb/smb2/packet/query_directory_request.rb +35 -0
- data/lib/ruby_smb/smb2/packet/query_directory_response.rb +45 -0
- data/lib/ruby_smb/smb2/packet/read_request.rb +30 -0
- data/lib/ruby_smb/smb2/packet/read_response.rb +26 -0
- data/lib/ruby_smb/smb2/packet/session_setup_request.rb +2 -5
- data/lib/ruby_smb/smb2/packet/session_setup_response.rb +4 -7
- data/lib/ruby_smb/smb2/packet/set_info_request.rb +58 -0
- data/lib/ruby_smb/smb2/packet/set_info_response.rb +20 -0
- data/lib/ruby_smb/smb2/packet/tree_connect_request.rb +3 -4
- data/lib/ruby_smb/smb2/packet/tree_connect_response.rb +5 -9
- data/lib/ruby_smb/smb2/packet/tree_disconnect_request.rb +1 -4
- data/lib/ruby_smb/smb2/packet/tree_disconnect_response.rb +1 -4
- data/lib/ruby_smb/smb2/packet/write_request.rb +29 -0
- data/lib/ruby_smb/smb2/packet/write_response.rb +26 -0
- data/lib/ruby_smb/smb2/tree.rb +163 -7
- data/lib/ruby_smb/version.rb +1 -1
- data/spec/lib/ruby_smb/client_spec.rb +459 -120
- data/spec/lib/ruby_smb/dcerpc/bind_spec.rb +14 -0
- data/spec/lib/ruby_smb/dcerpc/handle_spec.rb +31 -0
- data/spec/lib/ruby_smb/dcerpc/request_spec.rb +21 -0
- data/spec/lib/ruby_smb/dcerpc/response_spec.rb +15 -0
- data/spec/lib/ruby_smb/dcerpc/srvsvc_spec.rb +13 -0
- data/spec/lib/ruby_smb/dcerpc/uuid_spec.rb +12 -0
- data/spec/lib/ruby_smb/dispatcher/base_spec.rb +26 -0
- data/spec/lib/ruby_smb/dispatcher/socket_spec.rb +118 -18
- data/spec/lib/ruby_smb/field/extended_attribute_flag_spec.rb +0 -3
- data/spec/lib/ruby_smb/field/file_time_spec.rb +4 -2
- data/spec/lib/ruby_smb/field/security_descriptor.rb +0 -1
- data/spec/lib/ruby_smb/field/smb2_fileid_spec.rb +10 -0
- data/spec/lib/ruby_smb/field/smb_fea_list_spec.rb +3 -5
- data/spec/lib/ruby_smb/field/smb_gea_list_spec.rb +37 -0
- data/spec/lib/ruby_smb/field/smb_gea_spec.rb +22 -0
- data/spec/lib/ruby_smb/field/stringz16_spec.rb +7 -9
- data/spec/lib/ruby_smb/field/utime_spec.rb +4 -2
- data/spec/lib/ruby_smb/{field → fscc}/ea_info_array_spec.rb +7 -9
- data/spec/lib/ruby_smb/{field → fscc}/file_full_ea_info_spec.rb +2 -3
- data/spec/lib/ruby_smb/fscc/file_information/file_both_directory_information_spec.rb +71 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_directory_information_spec.rb +68 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_disposition_information_spec.rb +26 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_full_directory_information_spec.rb +69 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_id_both_directory_information_spec.rb +72 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_id_full_directory_information_spec.rb +70 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_names_information_spec.rb +41 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_rename_information_spec.rb +133 -0
- data/spec/lib/ruby_smb/fscc/fscc_file_attributes_spec.rb +143 -0
- data/spec/lib/ruby_smb/generic_packet_spec.rb +46 -21
- data/spec/lib/ruby_smb/nbss/negative_session_response_spec.rb +29 -0
- data/spec/lib/ruby_smb/nbss/session_header_spec.rb +30 -0
- data/spec/lib/ruby_smb/nbss/session_request_spec.rb +30 -0
- data/spec/lib/ruby_smb/smb1/bit_field/create_options_spec.rb +9 -1
- data/spec/lib/ruby_smb/smb1/bit_field/directory_access_mask_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb1/bit_field/file_access_mask_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb1/bit_field/file_status_flags_spec.rb +35 -0
- data/spec/lib/ruby_smb/smb1/bit_field/open2_access_mode_spec.rb +1 -3
- data/spec/lib/ruby_smb/smb1/bit_field/open2_flags_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb1/bit_field/open2_open_mode_spec.rb +0 -1
- data/spec/lib/ruby_smb/smb1/bit_field/optional_support_spec.rb +0 -1
- data/spec/lib/ruby_smb/smb1/bit_field/security_flags_spec.rb +26 -0
- data/spec/lib/ruby_smb/smb1/bit_field/share_access_spec.rb +0 -3
- data/spec/lib/ruby_smb/smb1/bit_field/smb_ext_file_attributes_spec.rb +20 -39
- data/spec/lib/ruby_smb/smb1/bit_field/smb_file_attributes_spec.rb +0 -6
- data/spec/lib/ruby_smb/smb1/bit_field/smb_nmpipe_status_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb1/bit_field/trans2_flags_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb1/bit_field/tree_connect_flags_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb1/file_spec.rb +469 -0
- data/spec/lib/ruby_smb/smb1/packet/close_request_spec.rb +54 -0
- data/spec/lib/ruby_smb/smb1/packet/close_response_spec.rb +45 -0
- data/spec/lib/ruby_smb/smb1/packet/echo_request_spec.rb +1 -4
- data/spec/lib/ruby_smb/smb1/packet/echo_response_spec.rb +1 -4
- data/spec/lib/ruby_smb/smb1/packet/error_packet_spec.rb +1 -3
- data/spec/lib/ruby_smb/smb1/packet/logoff_request_spec.rb +1 -4
- data/spec/lib/ruby_smb/smb1/packet/logoff_response_spec.rb +1 -4
- data/spec/lib/ruby_smb/smb1/packet/negotiate_request_spec.rb +1 -1
- data/spec/lib/ruby_smb/smb1/packet/negotiate_response_extended_spec.rb +37 -0
- data/spec/lib/ruby_smb/smb1/packet/negotiate_response_spec.rb +37 -0
- data/spec/lib/ruby_smb/smb1/packet/nt_create_andx_request_spec.rb +151 -0
- data/spec/lib/ruby_smb/smb1/packet/nt_create_andx_response_spec.rb +157 -0
- data/spec/lib/ruby_smb/smb1/packet/nt_trans/create_request_spec.rb +13 -6
- data/spec/lib/ruby_smb/smb1/packet/nt_trans/create_response_spec.rb +1 -7
- data/spec/lib/ruby_smb/smb1/packet/nt_trans/request_spec.rb +1 -6
- data/spec/lib/ruby_smb/smb1/packet/nt_trans/response_spec.rb +1 -5
- data/spec/lib/ruby_smb/smb1/packet/read_andx_request_spec.rb +149 -0
- data/spec/lib/ruby_smb/smb1/packet/read_andx_response_spec.rb +93 -0
- data/spec/lib/ruby_smb/smb1/packet/session_setup_legacy_request_spec.rb +1 -5
- data/spec/lib/ruby_smb/smb1/packet/session_setup_legacy_response_spec.rb +1 -5
- data/spec/lib/ruby_smb/smb1/packet/session_setup_request_spec.rb +3 -8
- data/spec/lib/ruby_smb/smb1/packet/session_setup_response_spec.rb +2 -4
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_request_spec.rb +180 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_response_spec.rb +104 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_information_level/find_file_full_directory_info_spec.rb +128 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_request_spec.rb +174 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_response_spec.rb +102 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/open2_request_spec.rb +1 -6
- data/spec/lib/ruby_smb/smb1/packet/trans2/open2_response_spec.rb +2 -7
- data/spec/lib/ruby_smb/smb1/packet/trans2/request_secondary_spec.rb +1 -5
- data/spec/lib/ruby_smb/smb1/packet/trans2/request_spec.rb +1 -5
- data/spec/lib/ruby_smb/smb1/packet/trans2/response_spec.rb +1 -4
- data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_request_spec.rb +98 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_response_spec.rb +56 -0
- data/spec/lib/ruby_smb/smb1/packet/tree_connect_request_spec.rb +1 -5
- data/spec/lib/ruby_smb/smb1/packet/tree_connect_response_spec.rb +1 -6
- data/spec/lib/ruby_smb/smb1/packet/tree_disconnect_request_spec.rb +1 -4
- data/spec/lib/ruby_smb/smb1/packet/tree_disconnect_response_spec.rb +1 -4
- data/spec/lib/ruby_smb/smb1/packet/write_andx_request_spec.rb +148 -0
- data/spec/lib/ruby_smb/smb1/packet/write_andx_response_spec.rb +54 -0
- data/spec/lib/ruby_smb/smb1/tree_spec.rb +409 -7
- data/spec/lib/ruby_smb/smb2/bit_field/directory_access_mask_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb2/bit_field/file_access_mask_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb2/bit_field/session_flags_spec.rb +1 -1
- data/spec/lib/ruby_smb/smb2/bit_field/share_capabilities_spec.rb +0 -1
- data/spec/lib/ruby_smb/smb2/bit_field/share_flags_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb2/create_context_spec.rb +42 -0
- data/spec/lib/ruby_smb/smb2/file_spec.rb +233 -0
- data/spec/lib/ruby_smb/smb2/packet/close_request_spec.rb +40 -0
- data/spec/lib/ruby_smb/smb2/packet/close_response_spec.rb +40 -0
- data/spec/lib/ruby_smb/smb2/packet/create_request_spec.rb +101 -0
- data/spec/lib/ruby_smb/smb2/packet/create_response_spec.rb +64 -0
- data/spec/lib/ruby_smb/smb2/packet/echo_request_spec.rb +1 -3
- data/spec/lib/ruby_smb/smb2/packet/echo_response_spec.rb +1 -3
- data/spec/lib/ruby_smb/smb2/packet/ioctl_request_spec.rb +48 -0
- data/spec/lib/ruby_smb/smb2/packet/logoff_request_spec.rb +1 -3
- data/spec/lib/ruby_smb/smb2/packet/logoff_response_spec.rb +1 -3
- data/spec/lib/ruby_smb/smb2/packet/query_directory_request_spec.rb +80 -0
- data/spec/lib/ruby_smb/smb2/packet/query_directory_response_spec.rb +64 -0
- data/spec/lib/ruby_smb/smb2/packet/read_request_spec.rb +43 -0
- data/spec/lib/ruby_smb/smb2/packet/read_response_spec.rb +50 -0
- data/spec/lib/ruby_smb/smb2/packet/session_setup_request_spec.rb +3 -4
- data/spec/lib/ruby_smb/smb2/packet/session_setup_response_spec.rb +2 -3
- data/spec/lib/ruby_smb/smb2/packet/set_info_request_spec.rb +205 -0
- data/spec/lib/ruby_smb/smb2/packet/set_info_response_spec.rb +32 -0
- data/spec/lib/ruby_smb/smb2/packet/tree_connect_request_spec.rb +3 -5
- data/spec/lib/ruby_smb/smb2/packet/tree_connect_response_spec.rb +1 -2
- data/spec/lib/ruby_smb/smb2/packet/tree_disconnect_request_spec.rb +1 -3
- data/spec/lib/ruby_smb/smb2/packet/tree_disconnect_response_spec.rb +1 -3
- data/spec/lib/ruby_smb/smb2/packet/write_request_spec.rb +51 -0
- data/spec/lib/ruby_smb/smb2/packet/write_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/smb2/tree_spec.rb +191 -5
- data/spec/spec_helper.rb +1 -1
- metadata +195 -12
- metadata.gz.sig +0 -0
- data/lib/ruby_smb/smb1/dispositions.rb +0 -36
- data/spec/lib/ruby_smb/dispatcher/dispatcher_base_spec.rb +0 -22
@@ -0,0 +1,22 @@
|
|
1
|
+
RSpec.describe RubySMB::Field::SmbGea do
|
2
|
+
subject(:gea) { described_class.new }
|
3
|
+
|
4
|
+
it { is_expected.to respond_to :attribute_name_length }
|
5
|
+
it { is_expected.to respond_to :attribute_name }
|
6
|
+
it { is_expected.to respond_to :null_pad }
|
7
|
+
|
8
|
+
it 'is little endian' do
|
9
|
+
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#attribute_name_length' do
|
13
|
+
it 'reflects the size of the attribute_name field' do
|
14
|
+
gea.attribute_name = 'TEST'
|
15
|
+
expect(gea.attribute_name_length).to eq 4
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'always has a null pad at the end' do
|
20
|
+
expect(gea.null_pad).to eq 0x00
|
21
|
+
end
|
22
|
+
end
|
@@ -4,14 +4,14 @@ RSpec.describe RubySMB::Field::Stringz16 do
|
|
4
4
|
subject(:stringz16) { described_class.new }
|
5
5
|
|
6
6
|
it 'starts as an empty string' do
|
7
|
-
expect(stringz16).to eq
|
7
|
+
expect(stringz16).to eq ''
|
8
8
|
end
|
9
9
|
|
10
10
|
context 'with a value already set' do
|
11
|
-
let(:abcd) { described_class.new(
|
11
|
+
let(:abcd) { described_class.new('ABCD') }
|
12
12
|
|
13
13
|
it 'should be UTF-16le' do
|
14
|
-
expect(abcd).to eq
|
14
|
+
expect(abcd).to eq 'ABCD'.encode('utf-16le')
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'should include the NULL terminator on binary output' do
|
@@ -23,12 +23,11 @@ RSpec.describe RubySMB::Field::Stringz16 do
|
|
23
23
|
let(:null_terminator) { described_class.new("ABCD\x00EFG") }
|
24
24
|
|
25
25
|
it 'drops everything after the null terminator' do
|
26
|
-
expect(null_terminator).to eq
|
26
|
+
expect(null_terminator).to eq 'ABCD'.encode('utf-16le')
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
context 'when reading data in' do
|
31
|
-
|
32
31
|
it 'stops at the first double null byte' do
|
33
32
|
io = StringIO.new("A\x00B\x00C\x00D\x00\x00\x00E\x00F\x00")
|
34
33
|
stringz16.read(io)
|
@@ -38,13 +37,12 @@ RSpec.describe RubySMB::Field::Stringz16 do
|
|
38
37
|
it 'handles a zero length string' do
|
39
38
|
io = StringIO.new("\x00\x00A\x00")
|
40
39
|
stringz16.read(io)
|
41
|
-
expect(stringz16).to eq
|
40
|
+
expect(stringz16).to eq ''
|
42
41
|
end
|
43
42
|
|
44
43
|
it 'fails if no null terminator is found' do
|
45
44
|
io = StringIO.new("A\x00B\x00C\x00D\x00")
|
46
|
-
expect{ stringz16.read(io) }.to raise_error(EOFError)
|
45
|
+
expect { stringz16.read(io) }.to raise_error(EOFError)
|
47
46
|
end
|
48
47
|
end
|
49
|
-
|
50
|
-
end
|
48
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
1
3
|
RSpec.describe RubySMB::Field::Utime do
|
2
4
|
subject(:time) { described_class.read(binary_filetime) }
|
3
5
|
|
@@ -42,13 +44,13 @@ RSpec.describe RubySMB::Field::Utime do
|
|
42
44
|
it 'will take a Time object correctly but lose Nanoseconds' do
|
43
45
|
empty_filetime.set time_filetime
|
44
46
|
val = empty_filetime.get
|
45
|
-
expect(val / 10_000_000).to eq
|
47
|
+
expect(val / 10_000_000).to eq(int_filetime / 10_000_000)
|
46
48
|
end
|
47
49
|
|
48
50
|
it 'will take a DateTime object correctly but lose Nanoseconds' do
|
49
51
|
empty_filetime.set datetime_filetime
|
50
52
|
val = empty_filetime.get
|
51
|
-
expect(val / 10_000_000).to eq
|
53
|
+
expect(val / 10_000_000).to eq(int_filetime / 10_000_000)
|
52
54
|
end
|
53
55
|
|
54
56
|
it 'will accept a raw integer value and set it' do
|
@@ -1,21 +1,21 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
RSpec.describe RubySMB::
|
3
|
+
RSpec.describe RubySMB::Fscc::EaInfoArray do
|
4
4
|
subject(:info_array) { described_class.new(type: :file_full_ea_info) }
|
5
5
|
let(:first_ea) {
|
6
|
-
ea = RubySMB::
|
6
|
+
ea = RubySMB::Fscc::FileFullEaInfo.new
|
7
7
|
ea.ea_name = 'First'
|
8
8
|
ea.ea_value = 'First Value'
|
9
9
|
ea
|
10
10
|
}
|
11
11
|
let(:second_ea) {
|
12
|
-
ea = RubySMB::
|
12
|
+
ea = RubySMB::Fscc::FileFullEaInfo.new
|
13
13
|
ea.ea_name = 'Second'
|
14
14
|
ea.ea_value = 'Second Value'
|
15
15
|
ea
|
16
16
|
}
|
17
17
|
let(:additional_ea) {
|
18
|
-
ea = RubySMB::
|
18
|
+
ea = RubySMB::Fscc::FileFullEaInfo.new
|
19
19
|
ea.ea_name = 'Additional'
|
20
20
|
ea.ea_value = 'Additional Value'
|
21
21
|
ea
|
@@ -40,12 +40,10 @@ RSpec.describe RubySMB::Field::EaInfoArray do
|
|
40
40
|
end
|
41
41
|
|
42
42
|
it 'raises an error when inserting an invalid object' do
|
43
|
-
expect{ info_array <<
|
43
|
+
expect { info_array << 'Foo' }.to raise_error(ArgumentError)
|
44
44
|
end
|
45
45
|
|
46
46
|
it 'raises an error when setting an invalid value' do
|
47
|
-
expect{ info_array[0] =
|
47
|
+
expect { info_array[0] = 'Foo' }.to raise_error(ArgumentError)
|
48
48
|
end
|
49
|
-
|
50
|
-
|
51
|
-
end
|
49
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
RSpec.describe RubySMB::
|
3
|
+
RSpec.describe RubySMB::Fscc::FileFullEaInfo do
|
4
4
|
subject(:info) { described_class.new }
|
5
5
|
|
6
6
|
it { is_expected.to respond_to :next_entry_offset }
|
@@ -31,5 +31,4 @@ RSpec.describe RubySMB::Field::FileFullEaInfo do
|
|
31
31
|
expect(info.ea_value_length).to eq info.ea_value.do_num_bytes
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
35
|
-
end
|
34
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe RubySMB::Fscc::FileInformation::FileBothDirectoryInformation do
|
4
|
+
it 'references the correct class level' do
|
5
|
+
expect(described_class).to be_const_defined(:CLASS_LEVEL)
|
6
|
+
expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_BOTH_DIRECTORY_INFORMATION
|
7
|
+
end
|
8
|
+
|
9
|
+
subject(:struct) { described_class.new }
|
10
|
+
|
11
|
+
it { should respond_to :next_offset }
|
12
|
+
it { should respond_to :file_index }
|
13
|
+
it { should respond_to :create_time }
|
14
|
+
it { should respond_to :last_access }
|
15
|
+
it { should respond_to :last_write }
|
16
|
+
it { should respond_to :last_change }
|
17
|
+
it { should respond_to :end_of_file }
|
18
|
+
it { should respond_to :allocation_size }
|
19
|
+
it { should respond_to :file_attributes }
|
20
|
+
it { should respond_to :file_name_length }
|
21
|
+
it { should respond_to :ea_size }
|
22
|
+
it { should respond_to :short_name }
|
23
|
+
it { should respond_to :short_name_length }
|
24
|
+
it { should respond_to :file_name }
|
25
|
+
|
26
|
+
it 'is little endian' do
|
27
|
+
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'tracks the creation time in a Filetime field' do
|
31
|
+
expect(struct.create_time).to be_a RubySMB::Field::FileTime
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'tracks the last access time in a Filetime field' do
|
35
|
+
expect(struct.last_access).to be_a RubySMB::Field::FileTime
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'tracks the last write time in a Filetime field' do
|
39
|
+
expect(struct.last_write).to be_a RubySMB::Field::FileTime
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'tracks the last modified time in a Filetime field' do
|
43
|
+
expect(struct.last_change).to be_a RubySMB::Field::FileTime
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'contains the file attributes of the file' do
|
47
|
+
expect(struct.file_attributes).to be_a RubySMB::Fscc::FileAttributes
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'tracks the length of the file_name field' do
|
51
|
+
struct.file_name = 'Hello.txt'
|
52
|
+
expect(struct.file_name_length).to eq struct.file_name.do_num_bytes
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'automatically encodes the file name in UTF-16LE' do
|
56
|
+
name = 'Hello_world.txt'
|
57
|
+
struct.file_name = name
|
58
|
+
expect(struct.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
|
59
|
+
end
|
60
|
+
|
61
|
+
describe 'reading in from a blob' do
|
62
|
+
it 'uses the file_name_length to know when to stop reading' do
|
63
|
+
name = 'Hello_world.txt'
|
64
|
+
struct.file_name = name
|
65
|
+
blob = struct.to_binary_s
|
66
|
+
blob << 'AAAA'
|
67
|
+
new_from_blob = described_class.read(blob)
|
68
|
+
expect(new_from_blob.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe RubySMB::Fscc::FileInformation::FileDirectoryInformation do
|
4
|
+
it 'references the correct class level' do
|
5
|
+
expect(described_class).to be_const_defined(:CLASS_LEVEL)
|
6
|
+
expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_DIRECTORY_INFORMATION
|
7
|
+
end
|
8
|
+
|
9
|
+
subject(:struct) { described_class.new }
|
10
|
+
|
11
|
+
it { should respond_to :next_offset }
|
12
|
+
it { should respond_to :file_index }
|
13
|
+
it { should respond_to :create_time }
|
14
|
+
it { should respond_to :last_access }
|
15
|
+
it { should respond_to :last_write }
|
16
|
+
it { should respond_to :last_change }
|
17
|
+
it { should respond_to :end_of_file }
|
18
|
+
it { should respond_to :allocation_size }
|
19
|
+
it { should respond_to :file_attributes }
|
20
|
+
it { should respond_to :file_name_length }
|
21
|
+
it { should respond_to :file_name }
|
22
|
+
|
23
|
+
it 'is little endian' do
|
24
|
+
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'tracks the creation time in a Filetime field' do
|
28
|
+
expect(struct.create_time).to be_a RubySMB::Field::FileTime
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'tracks the last access time in a Filetime field' do
|
32
|
+
expect(struct.last_access).to be_a RubySMB::Field::FileTime
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'tracks the last write time in a Filetime field' do
|
36
|
+
expect(struct.last_write).to be_a RubySMB::Field::FileTime
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'tracks the last modified time in a Filetime field' do
|
40
|
+
expect(struct.last_change).to be_a RubySMB::Field::FileTime
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'contains the file attributes of the file' do
|
44
|
+
expect(struct.file_attributes).to be_a RubySMB::Fscc::FileAttributes
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'tracks the length of the file_name field' do
|
48
|
+
struct.file_name = 'Hello.txt'
|
49
|
+
expect(struct.file_name_length).to eq struct.file_name.do_num_bytes
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'automatically encodes the file name in UTF-16LE' do
|
53
|
+
name = 'Hello_world.txt'
|
54
|
+
struct.file_name = name
|
55
|
+
expect(struct.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
|
56
|
+
end
|
57
|
+
|
58
|
+
describe 'reading in from a blob' do
|
59
|
+
it 'uses the file_name_length to know when to stop reading' do
|
60
|
+
name = 'Hello_world.txt'
|
61
|
+
struct.file_name = name
|
62
|
+
blob = struct.to_binary_s
|
63
|
+
blob << 'AAAA'
|
64
|
+
new_from_blob = described_class.read(blob)
|
65
|
+
expect(new_from_blob.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe RubySMB::Fscc::FileInformation::FileDispositionInformation do
|
4
|
+
it 'references the correct class level' do
|
5
|
+
expect(described_class).to be_const_defined(:CLASS_LEVEL)
|
6
|
+
expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_DISPOSITION_INFORMATION
|
7
|
+
end
|
8
|
+
|
9
|
+
subject(:struct) { described_class.new }
|
10
|
+
|
11
|
+
it { should respond_to :delete_pending }
|
12
|
+
|
13
|
+
it 'is little endian' do
|
14
|
+
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#delete_pending' do
|
18
|
+
it 'is a 8-bit field' do
|
19
|
+
expect(struct.delete_pending).to be_a BinData::Uint8
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should have a default value of 0' do
|
23
|
+
expect(struct.delete_pending).to eq 0
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe RubySMB::Fscc::FileInformation::FileFullDirectoryInformation do
|
4
|
+
it 'references the correct class level' do
|
5
|
+
expect(described_class).to be_const_defined(:CLASS_LEVEL)
|
6
|
+
expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_FULL_DIRECTORY_INFORMATION
|
7
|
+
end
|
8
|
+
|
9
|
+
subject(:struct) { described_class.new }
|
10
|
+
|
11
|
+
it { should respond_to :next_offset }
|
12
|
+
it { should respond_to :file_index }
|
13
|
+
it { should respond_to :create_time }
|
14
|
+
it { should respond_to :last_access }
|
15
|
+
it { should respond_to :last_write }
|
16
|
+
it { should respond_to :last_change }
|
17
|
+
it { should respond_to :end_of_file }
|
18
|
+
it { should respond_to :allocation_size }
|
19
|
+
it { should respond_to :file_attributes }
|
20
|
+
it { should respond_to :file_name_length }
|
21
|
+
it { should respond_to :ea_size }
|
22
|
+
it { should respond_to :file_name }
|
23
|
+
|
24
|
+
it 'is little endian' do
|
25
|
+
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'tracks the creation time in a Filetime field' do
|
29
|
+
expect(struct.create_time).to be_a RubySMB::Field::FileTime
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'tracks the last access time in a Filetime field' do
|
33
|
+
expect(struct.last_access).to be_a RubySMB::Field::FileTime
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'tracks the last write time in a Filetime field' do
|
37
|
+
expect(struct.last_write).to be_a RubySMB::Field::FileTime
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'tracks the last modified time in a Filetime field' do
|
41
|
+
expect(struct.last_change).to be_a RubySMB::Field::FileTime
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'contains the file attributes of the file' do
|
45
|
+
expect(struct.file_attributes).to be_a RubySMB::Fscc::FileAttributes
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'tracks the length of the file_name field' do
|
49
|
+
struct.file_name = 'Hello.txt'
|
50
|
+
expect(struct.file_name_length).to eq struct.file_name.do_num_bytes
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'automatically encodes the file name in UTF-16LE' do
|
54
|
+
name = 'Hello_world.txt'
|
55
|
+
struct.file_name = name
|
56
|
+
expect(struct.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
|
57
|
+
end
|
58
|
+
|
59
|
+
describe 'reading in from a blob' do
|
60
|
+
it 'uses the file_name_length to know when to stop reading' do
|
61
|
+
name = 'Hello_world.txt'
|
62
|
+
struct.file_name = name
|
63
|
+
blob = struct.to_binary_s
|
64
|
+
blob << 'AAAA'
|
65
|
+
new_from_blob = described_class.read(blob)
|
66
|
+
expect(new_from_blob.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe RubySMB::Fscc::FileInformation::FileIdBothDirectoryInformation do
|
4
|
+
it 'references the correct class level' do
|
5
|
+
expect(described_class).to be_const_defined(:CLASS_LEVEL)
|
6
|
+
expect(described_class::CLASS_LEVEL).to be RubySMB::Fscc::FileInformation::FILE_ID_BOTH_DIRECTORY_INFORMATION
|
7
|
+
end
|
8
|
+
|
9
|
+
subject(:struct) { described_class.new }
|
10
|
+
|
11
|
+
it { should respond_to :next_offset }
|
12
|
+
it { should respond_to :file_index }
|
13
|
+
it { should respond_to :create_time }
|
14
|
+
it { should respond_to :last_access }
|
15
|
+
it { should respond_to :last_write }
|
16
|
+
it { should respond_to :last_change }
|
17
|
+
it { should respond_to :end_of_file }
|
18
|
+
it { should respond_to :allocation_size }
|
19
|
+
it { should respond_to :file_attributes }
|
20
|
+
it { should respond_to :file_name_length }
|
21
|
+
it { should respond_to :ea_size }
|
22
|
+
it { should respond_to :short_name }
|
23
|
+
it { should respond_to :short_name_length }
|
24
|
+
it { should respond_to :file_id }
|
25
|
+
it { should respond_to :file_name }
|
26
|
+
|
27
|
+
it 'is little endian' do
|
28
|
+
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'tracks the creation time in a Filetime field' do
|
32
|
+
expect(struct.create_time).to be_a RubySMB::Field::FileTime
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'tracks the last access time in a Filetime field' do
|
36
|
+
expect(struct.last_access).to be_a RubySMB::Field::FileTime
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'tracks the last write time in a Filetime field' do
|
40
|
+
expect(struct.last_write).to be_a RubySMB::Field::FileTime
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'tracks the last modified time in a Filetime field' do
|
44
|
+
expect(struct.last_change).to be_a RubySMB::Field::FileTime
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'contains the file attributes of the file' do
|
48
|
+
expect(struct.file_attributes).to be_a RubySMB::Fscc::FileAttributes
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'tracks the length of the file_name field' do
|
52
|
+
struct.file_name = 'Hello.txt'
|
53
|
+
expect(struct.file_name_length).to eq struct.file_name.do_num_bytes
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'automatically encodes the file name in UTF-16LE' do
|
57
|
+
name = 'Hello_world.txt'
|
58
|
+
struct.file_name = name
|
59
|
+
expect(struct.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
|
60
|
+
end
|
61
|
+
|
62
|
+
describe 'reading in from a blob' do
|
63
|
+
it 'uses the file_name_length to know when to stop reading' do
|
64
|
+
name = 'Hello_world.txt'
|
65
|
+
struct.file_name = name
|
66
|
+
blob = struct.to_binary_s
|
67
|
+
blob << 'AAAA'
|
68
|
+
new_from_blob = described_class.read(blob)
|
69
|
+
expect(new_from_blob.file_name.force_encoding('utf-16le')).to eq name.encode('utf-16le')
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|