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,180 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe RubySMB::SMB1::Packet::Trans2::FindFirst2Request do
|
4
|
+
subject(:packet) { described_class.new }
|
5
|
+
|
6
|
+
describe '#smb_header' do
|
7
|
+
subject(:header) { packet.smb_header }
|
8
|
+
|
9
|
+
it 'is a standard SMB Header' do
|
10
|
+
expect(header).to be_a RubySMB::SMB1::SMBHeader
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should have the command set to SMB_COM_NEGOTIATE' do
|
14
|
+
expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should not have the response flag set' do
|
18
|
+
expect(header.flags.reply).to eq 0
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#parameter_block' do
|
23
|
+
subject(:parameter_block) { packet.parameter_block }
|
24
|
+
|
25
|
+
it 'is a standard ParameterBlock' do
|
26
|
+
expect(parameter_block).to be_a RubySMB::SMB1::Packet::Trans2::Request::ParameterBlock
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should have the setup set to the OPEN2 subcommand' do
|
30
|
+
expect(parameter_block.setup).to include RubySMB::SMB1::Packet::Trans2::Subcommands::FIND_FIRST2
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#data_block' do
|
35
|
+
subject(:data_block) { packet.data_block }
|
36
|
+
|
37
|
+
it 'is a standard DataBlock' do
|
38
|
+
expect(data_block).to be_a RubySMB::SMB1::DataBlock
|
39
|
+
end
|
40
|
+
|
41
|
+
it { is_expected.to respond_to :name }
|
42
|
+
it { is_expected.to respond_to :trans2_parameters }
|
43
|
+
it { is_expected.to respond_to :trans2_data }
|
44
|
+
|
45
|
+
it 'should keep #trans2_parameters 4-byte aligned' do
|
46
|
+
expect(data_block.trans2_parameters.abs_offset % 4).to eq 0
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should keep #trans2_data 4-byte aligned' do
|
50
|
+
expect(data_block.trans2_data.abs_offset % 4).to eq 0
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#trans2_parameters' do
|
54
|
+
subject(:parameters) { data_block.trans2_parameters }
|
55
|
+
|
56
|
+
it { is_expected.to respond_to :search_attributes }
|
57
|
+
it { is_expected.to respond_to :search_count }
|
58
|
+
it { is_expected.to respond_to :flags }
|
59
|
+
it { is_expected.to respond_to :information_level }
|
60
|
+
it { is_expected.to respond_to :storage_type }
|
61
|
+
it { is_expected.to respond_to :filename }
|
62
|
+
|
63
|
+
describe '#search_attributes' do
|
64
|
+
it 'is a smb_file_attributes_field' do
|
65
|
+
expect(parameters.search_attributes).to be_a RubySMB::SMB1::BitField::SmbFileAttributes
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '#flags' do
|
70
|
+
subject(:flags) { parameters.flags }
|
71
|
+
|
72
|
+
it { is_expected.to respond_to :backup }
|
73
|
+
it { is_expected.to respond_to :continue }
|
74
|
+
it { is_expected.to respond_to :resume_keys }
|
75
|
+
it { is_expected.to respond_to :close_eos }
|
76
|
+
it { is_expected.to respond_to :close }
|
77
|
+
|
78
|
+
describe 'close' do
|
79
|
+
it 'should be a 1-bit field per the SMB spec' do
|
80
|
+
expect(flags.close).to be_a BinData::Bit1
|
81
|
+
end
|
82
|
+
|
83
|
+
it_behaves_like 'bit field with one flag set', :close, 'v', 0x0001
|
84
|
+
end
|
85
|
+
|
86
|
+
describe 'close_eos' do
|
87
|
+
it 'should be a 1-bit field per the SMB spec' do
|
88
|
+
expect(flags.close_eos).to be_a BinData::Bit1
|
89
|
+
end
|
90
|
+
|
91
|
+
it_behaves_like 'bit field with one flag set', :close_eos, 'v', 0x0002
|
92
|
+
end
|
93
|
+
|
94
|
+
describe 'resume_keys' do
|
95
|
+
it 'should be a 1-bit field per the SMB spec' do
|
96
|
+
expect(flags.resume_keys).to be_a BinData::Bit1
|
97
|
+
end
|
98
|
+
|
99
|
+
it_behaves_like 'bit field with one flag set', :resume_keys, 'v', 0x0004
|
100
|
+
end
|
101
|
+
|
102
|
+
describe 'continue' do
|
103
|
+
it 'should be a 1-bit field per the SMB spec' do
|
104
|
+
expect(flags.continue).to be_a BinData::Bit1
|
105
|
+
end
|
106
|
+
|
107
|
+
it_behaves_like 'bit field with one flag set', :continue, 'v', 0x0008
|
108
|
+
end
|
109
|
+
|
110
|
+
describe 'backup' do
|
111
|
+
it 'should be a 1-bit field per the SMB spec' do
|
112
|
+
expect(flags.backup).to be_a BinData::Bit1
|
113
|
+
end
|
114
|
+
|
115
|
+
it_behaves_like 'bit field with one flag set', :backup, 'v', 0x0010
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe '#filename' do
|
120
|
+
let(:name) { 'hello.txt' }
|
121
|
+
|
122
|
+
before :example do
|
123
|
+
parameters.filename = name
|
124
|
+
end
|
125
|
+
|
126
|
+
context 'when unicode flag is set' do
|
127
|
+
before :example do
|
128
|
+
packet.smb_header.flags2.unicode = 1
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'is terminated with unicode null-termination character' do
|
132
|
+
expect(parameters.filename.to_binary_s).to end_with("\x00\x00")
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'is UTF-16LE encoded' do
|
136
|
+
expect(parameters.filename.encoding.name).to eq 'UTF-16LE'
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context 'when unicode flag is not set' do
|
141
|
+
before :example do
|
142
|
+
packet.smb_header.flags2.unicode = 0
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'is terminated with ASCII null-termination character' do
|
146
|
+
expect(parameters.filename.to_binary_s).to end_with("\x00")
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'is ASCII-8BIT encoded' do
|
150
|
+
expect(parameters.filename.encoding.name).to eq 'ASCII-8BIT'
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
describe '#trans2_data' do
|
157
|
+
subject(:data) { data_block.trans2_data }
|
158
|
+
|
159
|
+
it { is_expected.to respond_to :extended_attribute_list }
|
160
|
+
|
161
|
+
describe '#extended_attribute_list' do
|
162
|
+
it 'is an smb_gea_list' do
|
163
|
+
expect(data.extended_attribute_list).to be_a RubySMB::Field::SmbGeaList
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'only exists if the information level is SMB_INFO_QUERY_EAS_FROM_LIST' do
|
167
|
+
data_block.trans2_parameters.information_level =
|
168
|
+
RubySMB::SMB1::Packet::Trans2::FindInformationLevel::SMB_INFO_QUERY_EAS_FROM_LIST
|
169
|
+
expect(data.do_num_bytes).to eq RubySMB::Field::SmbGeaList.new.do_num_bytes
|
170
|
+
end
|
171
|
+
|
172
|
+
it 'does not exist if the information level is SMB_INFO_STANDARD' do
|
173
|
+
data_block.trans2_parameters.information_level =
|
174
|
+
RubySMB::SMB1::Packet::Trans2::FindInformationLevel::SMB_INFO_STANDARD
|
175
|
+
expect(data.do_num_bytes).to eq 0
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include RubySMB::SMB1::Packet::Trans2::FindInformationLevel
|
4
|
+
|
5
|
+
RSpec.describe RubySMB::SMB1::Packet::Trans2::FindFirst2Response do
|
6
|
+
subject(:packet) { described_class.new }
|
7
|
+
|
8
|
+
describe '#smb_header' do
|
9
|
+
subject(:header) { packet.smb_header }
|
10
|
+
|
11
|
+
it 'is a standard SMB Header' do
|
12
|
+
expect(header).to be_a RubySMB::SMB1::SMBHeader
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should have the command set to SMB_COM_NEGOTIATE' do
|
16
|
+
expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should have the response flag set' do
|
20
|
+
expect(header.flags.reply).to eq 1
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#parameter_block' do
|
25
|
+
subject(:parameter_block) { packet.parameter_block }
|
26
|
+
|
27
|
+
it 'should have the setup set to the OPEN2 subcommand' do
|
28
|
+
expect(parameter_block.setup).to include RubySMB::SMB1::Packet::Trans2::Subcommands::FIND_FIRST2
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#data_block' do
|
33
|
+
subject(:data_block) { packet.data_block }
|
34
|
+
|
35
|
+
it { is_expected.to respond_to :name }
|
36
|
+
it { is_expected.to respond_to :trans2_parameters }
|
37
|
+
it { is_expected.to respond_to :trans2_data }
|
38
|
+
|
39
|
+
it 'should keep #trans2_parameters 4-byte aligned' do
|
40
|
+
expect(data_block.trans2_parameters.abs_offset % 4).to eq 0
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should keep #trans2_data 4-byte aligned' do
|
44
|
+
expect(data_block.trans2_data.abs_offset % 4).to eq 0
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '#trans2_parameters' do
|
48
|
+
subject(:parameters) { data_block.trans2_parameters }
|
49
|
+
|
50
|
+
it { is_expected.to respond_to :sid }
|
51
|
+
it { is_expected.to respond_to :search_count }
|
52
|
+
it { is_expected.to respond_to :eos }
|
53
|
+
it { is_expected.to respond_to :ea_error_offset }
|
54
|
+
it { is_expected.to respond_to :last_name_offset }
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#trans2_data' do
|
58
|
+
subject(:data) { data_block.trans2_data }
|
59
|
+
|
60
|
+
it { is_expected.to respond_to :buffer }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe '#results' do
|
65
|
+
|
66
|
+
let(:names1) {
|
67
|
+
names = FindFileFullDirectoryInfo.new
|
68
|
+
names.file_name = 'test.txt'
|
69
|
+
names.next_offset = names.do_num_bytes
|
70
|
+
names
|
71
|
+
}
|
72
|
+
|
73
|
+
let(:names2) {
|
74
|
+
names = FindFileFullDirectoryInfo.new
|
75
|
+
names.file_name = '..'
|
76
|
+
names
|
77
|
+
}
|
78
|
+
|
79
|
+
let(:names_array) { [names1, names2] }
|
80
|
+
|
81
|
+
let(:names_blob) { names_array.collect(&:to_binary_s).join('') }
|
82
|
+
|
83
|
+
it 'returns an array of parsed FindFileFullDirectoryInfo structs' do
|
84
|
+
packet.data_block.trans2_data.buffer = names_blob
|
85
|
+
expect(packet.results(FindFileFullDirectoryInfo, unicode: false)).to eq names_array
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'sets the FindFileFullDirectoryInfo unicode attribute when unicode argument is true' do
|
89
|
+
packet.data_block.trans2_data.buffer = names1.to_binary_s
|
90
|
+
find_info = FindFileFullDirectoryInfo.new
|
91
|
+
allow(FindFileFullDirectoryInfo).to receive(:new).and_return find_info
|
92
|
+
expect(find_info).to receive(:unicode=).with(true).once
|
93
|
+
packet.results(FindFileFullDirectoryInfo, unicode: true)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'does not set the FindFileFullDirectoryInfo unicode attribute when unicode argument is false' do
|
97
|
+
packet.data_block.trans2_data.buffer = names1.to_binary_s
|
98
|
+
find_info = FindFileFullDirectoryInfo.new
|
99
|
+
allow(FindFileFullDirectoryInfo).to receive(:new).and_return find_info
|
100
|
+
expect(find_info).to receive(:unicode=).with(false).once
|
101
|
+
packet.results(FindFileFullDirectoryInfo, unicode: false)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
RSpec.describe RubySMB::SMB1::Packet::Trans2::FindInformationLevel::FindFileFullDirectoryInfo do
|
2
|
+
it 'references the correct class level' do
|
3
|
+
expect(described_class).to be_const_defined(:CLASS_LEVEL)
|
4
|
+
expect(described_class::CLASS_LEVEL).to be RubySMB::SMB1::Packet::Trans2::FindInformationLevel::SMB_FIND_FILE_FULL_DIRECTORY_INFO
|
5
|
+
end
|
6
|
+
|
7
|
+
subject(:struct) { described_class.new }
|
8
|
+
|
9
|
+
it { should respond_to :next_offset }
|
10
|
+
it { should respond_to :file_index }
|
11
|
+
it { should respond_to :create_time }
|
12
|
+
it { should respond_to :last_access }
|
13
|
+
it { should respond_to :last_write }
|
14
|
+
it { should respond_to :last_change }
|
15
|
+
it { should respond_to :end_of_file }
|
16
|
+
it { should respond_to :allocation_size }
|
17
|
+
it { should respond_to :ext_file_attributes }
|
18
|
+
it { should respond_to :file_name_length }
|
19
|
+
it { should respond_to :ea_size }
|
20
|
+
it { should respond_to :file_name }
|
21
|
+
it { should respond_to :unicode }
|
22
|
+
|
23
|
+
it 'is little endian' do
|
24
|
+
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#next_offset' do
|
28
|
+
it 'is a 32-bit field' do
|
29
|
+
expect(struct.next_offset).to be_a BinData::Uint32le
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#file_index' do
|
34
|
+
it 'is a 32-bit field' do
|
35
|
+
expect(struct.file_index).to be_a BinData::Uint32le
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#create_time' do
|
40
|
+
it 'is a Filetime field' do
|
41
|
+
expect(struct.create_time).to be_a RubySMB::Field::FileTime
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#last_access' do
|
46
|
+
it 'is a Filetime field' do
|
47
|
+
expect(struct.last_access).to be_a RubySMB::Field::FileTime
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#last_write' do
|
52
|
+
it 'is a Filetime field' do
|
53
|
+
expect(struct.last_write).to be_a RubySMB::Field::FileTime
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#last_change' do
|
58
|
+
it 'is a Filetime field' do
|
59
|
+
expect(struct.last_change).to be_a RubySMB::Field::FileTime
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe '#end_of_file' do
|
64
|
+
it 'is a 64-bit field' do
|
65
|
+
expect(struct.end_of_file).to be_a BinData::Uint64le
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '#ext_file_attributes' do
|
70
|
+
it 'contains the extended file attributes of the file' do
|
71
|
+
expect(struct.ext_file_attributes).to be_a RubySMB::SMB1::BitField::SmbExtFileAttributes
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '#file_name_length' do
|
76
|
+
it 'is a 32-bit field' do
|
77
|
+
expect(struct.file_name_length).to be_a BinData::Uint32le
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'tracks the length of the file_name field including the null-terminating character when unicode is not set' do
|
81
|
+
filename = "Hello.txt"
|
82
|
+
struct.file_name = filename
|
83
|
+
expect(struct.file_name_length).to eq (filename.bytes.size + 1)
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'tracks the length of the file_name field without null-terminating characters when unicode is set' do
|
87
|
+
filename = "Hello.txt"
|
88
|
+
struct.unicode = true
|
89
|
+
struct.file_name = filename
|
90
|
+
expect(struct.file_name_length).to eq (filename.encode('UTF-16LE').bytes.size)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe '#ea_size' do
|
95
|
+
it 'is a 32-bit field' do
|
96
|
+
expect(struct.ea_size).to be_a BinData::Uint32le
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe '#file_name' do
|
101
|
+
let(:filename) { "Hello.txt" }
|
102
|
+
|
103
|
+
before :example do
|
104
|
+
struct.file_name = filename
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'is an unicode string field when unicode attribute is set to true' do
|
108
|
+
struct.unicode = true
|
109
|
+
expect(struct.file_name.encoding.name).to eq 'UTF-16LE'
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'is an ASCII-8BIT field when unicode attribute is set to false' do
|
113
|
+
expect(struct.file_name.encoding.name).to eq 'ASCII-8BIT'
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'is null-terminated when unicode attribute is set to false' do
|
117
|
+
expect(struct.file_name.to_binary_s).to eq "#{filename}\x00"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe '#unicode' do
|
122
|
+
it 'is set to false by default' do
|
123
|
+
expect(struct.unicode).to be false
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
@@ -0,0 +1,174 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe RubySMB::SMB1::Packet::Trans2::FindNext2Request do
|
4
|
+
subject(:packet) { described_class.new }
|
5
|
+
|
6
|
+
describe '#smb_header' do
|
7
|
+
subject(:header) { packet.smb_header }
|
8
|
+
|
9
|
+
it 'is a standard SMB Header' do
|
10
|
+
expect(header).to be_a RubySMB::SMB1::SMBHeader
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should have the command set to SMB_COM_NEGOTIATE' do
|
14
|
+
expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should not have the response flag set' do
|
18
|
+
expect(header.flags.reply).to eq 0
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#parameter_block' do
|
23
|
+
subject(:parameter_block) { packet.parameter_block }
|
24
|
+
|
25
|
+
it 'is a standard ParameterBlock' do
|
26
|
+
expect(parameter_block).to be_a RubySMB::SMB1::Packet::Trans2::Request::ParameterBlock
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should have the setup set to the OPEN2 subcommand' do
|
30
|
+
expect(parameter_block.setup).to include RubySMB::SMB1::Packet::Trans2::Subcommands::FIND_NEXT2
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#data_block' do
|
35
|
+
subject(:data_block) { packet.data_block }
|
36
|
+
|
37
|
+
it 'is a standard DataBlock' do
|
38
|
+
expect(data_block).to be_a RubySMB::SMB1::DataBlock
|
39
|
+
end
|
40
|
+
|
41
|
+
it { is_expected.to respond_to :name }
|
42
|
+
it { is_expected.to respond_to :trans2_parameters }
|
43
|
+
it { is_expected.to respond_to :trans2_data }
|
44
|
+
|
45
|
+
it 'should keep #trans2_parameters 4-byte aligned' do
|
46
|
+
expect(data_block.trans2_parameters.abs_offset % 4).to eq 0
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should keep #trans2_data 4-byte aligned' do
|
50
|
+
expect(data_block.trans2_data.abs_offset % 4).to eq 0
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#trans2_parameters' do
|
54
|
+
subject(:parameters) { data_block.trans2_parameters }
|
55
|
+
|
56
|
+
it { is_expected.to respond_to :sid }
|
57
|
+
it { is_expected.to respond_to :search_count }
|
58
|
+
it { is_expected.to respond_to :flags }
|
59
|
+
it { is_expected.to respond_to :information_level }
|
60
|
+
it { is_expected.to respond_to :resume_key }
|
61
|
+
it { is_expected.to respond_to :filename }
|
62
|
+
|
63
|
+
describe '#flags' do
|
64
|
+
subject(:flags) { parameters.flags }
|
65
|
+
|
66
|
+
it { is_expected.to respond_to :backup }
|
67
|
+
it { is_expected.to respond_to :continue }
|
68
|
+
it { is_expected.to respond_to :resume_keys }
|
69
|
+
it { is_expected.to respond_to :close_eos }
|
70
|
+
it { is_expected.to respond_to :close }
|
71
|
+
|
72
|
+
describe 'close' do
|
73
|
+
it 'should be a 1-bit field per the SMB spec' do
|
74
|
+
expect(flags.close).to be_a BinData::Bit1
|
75
|
+
end
|
76
|
+
|
77
|
+
it_behaves_like 'bit field with one flag set', :close, 'v', 0x0001
|
78
|
+
end
|
79
|
+
|
80
|
+
describe 'close_eos' do
|
81
|
+
it 'should be a 1-bit field per the SMB spec' do
|
82
|
+
expect(flags.close_eos).to be_a BinData::Bit1
|
83
|
+
end
|
84
|
+
|
85
|
+
it_behaves_like 'bit field with one flag set', :close_eos, 'v', 0x0002
|
86
|
+
end
|
87
|
+
|
88
|
+
describe 'resume_keys' do
|
89
|
+
it 'should be a 1-bit field per the SMB spec' do
|
90
|
+
expect(flags.resume_keys).to be_a BinData::Bit1
|
91
|
+
end
|
92
|
+
|
93
|
+
it_behaves_like 'bit field with one flag set', :resume_keys, 'v', 0x0004
|
94
|
+
end
|
95
|
+
|
96
|
+
describe 'continue' do
|
97
|
+
it 'should be a 1-bit field per the SMB spec' do
|
98
|
+
expect(flags.continue).to be_a BinData::Bit1
|
99
|
+
end
|
100
|
+
|
101
|
+
it_behaves_like 'bit field with one flag set', :continue, 'v', 0x0008
|
102
|
+
end
|
103
|
+
|
104
|
+
describe 'backup' do
|
105
|
+
it 'should be a 1-bit field per the SMB spec' do
|
106
|
+
expect(flags.backup).to be_a BinData::Bit1
|
107
|
+
end
|
108
|
+
|
109
|
+
it_behaves_like 'bit field with one flag set', :backup, 'v', 0x0010
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe '#filename' do
|
114
|
+
let(:name) { 'hello.txt' }
|
115
|
+
|
116
|
+
before :example do
|
117
|
+
parameters.filename = name
|
118
|
+
end
|
119
|
+
|
120
|
+
context 'when unicode flag is set' do
|
121
|
+
before :example do
|
122
|
+
packet.smb_header.flags2.unicode = 1
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'is terminated with unicode null-termination character' do
|
126
|
+
expect(parameters.filename.to_binary_s).to end_with("\x00\x00")
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'is UTF-16LE encoded' do
|
130
|
+
expect(parameters.filename.encoding.name).to eq 'UTF-16LE'
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'when unicode flag is not set' do
|
135
|
+
before :example do
|
136
|
+
packet.smb_header.flags2.unicode = 0
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'is terminated with ASCII null-termination character' do
|
140
|
+
expect(parameters.filename.to_binary_s).to end_with("\x00")
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'is ASCII-8BIT encoded' do
|
144
|
+
expect(parameters.filename.encoding.name).to eq 'ASCII-8BIT'
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
describe '#trans2_data' do
|
151
|
+
subject(:data) { data_block.trans2_data }
|
152
|
+
|
153
|
+
it { is_expected.to respond_to :extended_attribute_list }
|
154
|
+
|
155
|
+
describe '#extended_attribute_list' do
|
156
|
+
it 'is an smb_gea_list' do
|
157
|
+
expect(data.extended_attribute_list).to be_a RubySMB::Field::SmbGeaList
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'only exists if the information level is SMB_INFO_QUERY_EAS_FROM_LIST' do
|
161
|
+
data_block.trans2_parameters.information_level =
|
162
|
+
RubySMB::SMB1::Packet::Trans2::FindInformationLevel::SMB_INFO_QUERY_EAS_FROM_LIST
|
163
|
+
expect(data.do_num_bytes).to eq RubySMB::Field::SmbGeaList.new.do_num_bytes
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'does not exist if the information level is SMB_INFO_STANDARD' do
|
167
|
+
data_block.trans2_parameters.information_level =
|
168
|
+
RubySMB::SMB1::Packet::Trans2::FindInformationLevel::SMB_INFO_STANDARD
|
169
|
+
expect(data.do_num_bytes).to eq 0
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|