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,11 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Field
|
3
|
+
# Class representing an SMB2 FileID as defined in
|
4
|
+
# [2.2.14.1 SMB2_FILEID](https://msdn.microsoft.com/en-us/library/cc246513.aspx)
|
5
|
+
class Smb2Fileid < BinData::Record
|
6
|
+
endian :little
|
7
|
+
uint64 :persistent, label: 'Persistent File Handle'
|
8
|
+
uint64 :volatile, label: 'Volatile File handle'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -5,10 +5,10 @@ module RubySMB
|
|
5
5
|
class SmbFea < BinData::Record
|
6
6
|
endian :little
|
7
7
|
extended_attribute_flag :ea_flag, label: 'Extended Attribute Flag'
|
8
|
-
uint8 :attribute_name_length, label: 'Attribute Name Length', initial_value:
|
9
|
-
uint16 :attribute_value_length, label: 'Attribute Value Length', initial_value:
|
8
|
+
uint8 :attribute_name_length, label: 'Attribute Name Length', initial_value: -> { attribute_name.length }
|
9
|
+
uint16 :attribute_value_length, label: 'Attribute Value Length', initial_value: -> { attribute_value.length }
|
10
10
|
string :attribute_name, label: 'Attribute Name'
|
11
11
|
string :attribute_value, label: 'Attribute Value'
|
12
12
|
end
|
13
13
|
end
|
14
|
-
end
|
14
|
+
end
|
@@ -4,10 +4,10 @@ module RubySMB
|
|
4
4
|
# [2.2.1.2.2.1 SMB_FEA_LIST](https://msdn.microsoft.com/en-us/library/ff359296.aspx)
|
5
5
|
class SmbFeaList < BinData::Record
|
6
6
|
endian :little
|
7
|
-
uint32 :size_of_list,
|
8
|
-
array :fea_list,
|
7
|
+
uint32 :size_of_list, label: 'Size of List in Bytes', initial_value: -> { fea_list.do_num_bytes }
|
8
|
+
array :fea_list, initial_length: 0 do
|
9
9
|
smb_fea
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
13
|
-
end
|
13
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Field
|
3
|
+
# Class representing an SMB Get Extended Attribute structure as defined in
|
4
|
+
# [2.2.1.2.1 SMB_GEA](https://msdn.microsoft.com/en-us/library/ee442131.aspx?f=255&MSPPError=-2147217396)
|
5
|
+
class SmbGea < BinData::Record
|
6
|
+
endian :little
|
7
|
+
uint8 :attribute_name_length, label: 'Attribute Name Length', initial_value: -> { attribute_name.do_num_bytes }
|
8
|
+
string :attribute_name, label: 'Attribute Name'
|
9
|
+
uint8 :null_pad, label: 'Null-Padding', initial_value: 0x00
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Field
|
3
|
+
# Class representing an SMB Get Extended Attribute List as defined in
|
4
|
+
# [2.2.1.2.1.1 SMB_GEA_LIST](https://msdn.microsoft.com/en-us/library/ff359447.aspx)
|
5
|
+
class SmbGeaList < BinData::Record
|
6
|
+
endian :little
|
7
|
+
uint32 :size_of_list, label: 'Size of List in Bytes', initial_value: -> { self.do_num_bytes }
|
8
|
+
array :gea_list, initial_length: 0 do
|
9
|
+
smb_gea
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -2,25 +2,21 @@ module RubySMB
|
|
2
2
|
module Field
|
3
3
|
# Represents a NULL-Terminated String in UTF-16
|
4
4
|
class Stringz16 < BinData::Stringz
|
5
|
-
|
6
5
|
def assign(val)
|
7
|
-
super(binary_string(val.encode(
|
6
|
+
super(binary_string(val.encode('utf-16le')))
|
8
7
|
end
|
9
8
|
|
10
9
|
def snapshot
|
11
10
|
# override to always remove trailing zero bytes
|
12
11
|
result = _value
|
13
|
-
result
|
14
12
|
result = trim_and_zero_terminate(result)
|
15
|
-
result.chomp("\0\0").force_encoding(
|
13
|
+
result.chomp("\0\0").force_encoding('utf-16le')
|
16
14
|
end
|
17
15
|
|
18
16
|
private
|
19
17
|
|
20
18
|
def append_zero_byte_if_needed!(str)
|
21
|
-
if str.
|
22
|
-
str << "\0\0"
|
23
|
-
end
|
19
|
+
str << "\0\0" if str.empty? || !str.end_with?("\0\0")
|
24
20
|
end
|
25
21
|
|
26
22
|
# Override parent on {BinData::Stringz} to use
|
data/lib/ruby_smb/field/utime.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
1
3
|
module RubySMB
|
2
4
|
module Field
|
3
|
-
|
4
5
|
# Conveneince class for dealing with 32-bit unsigned UTIME
|
5
6
|
# fields in SMB, as defined in
|
6
7
|
# [2.2.1.4.3 UTIME](https://msdn.microsoft.com/en-us/library/ee441907.aspx)
|
@@ -23,14 +24,14 @@ module RubySMB
|
|
23
24
|
# @return
|
24
25
|
def set(value)
|
25
26
|
case value
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
27
|
+
when DateTime
|
28
|
+
set(value.to_time)
|
29
|
+
when Time
|
30
|
+
set(value.to_i)
|
31
|
+
when Integer
|
32
|
+
self.val = value
|
33
|
+
else
|
34
|
+
self.val = value.to_i
|
34
35
|
end
|
35
36
|
val
|
36
37
|
end
|
@@ -51,4 +52,4 @@ module RubySMB
|
|
51
52
|
end
|
52
53
|
end
|
53
54
|
end
|
54
|
-
end
|
55
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module RubySMB
|
2
|
+
# Namespace for structures and classes from File System
|
3
|
+
# Control Codes as defined in
|
4
|
+
# [[MS-FSCC]: File System Control Codes](https://msdn.microsoft.com/en-us/library/cc231987.aspx)
|
5
|
+
module Fscc
|
6
|
+
require 'ruby_smb/fscc/file_attributes'
|
7
|
+
require 'ruby_smb/fscc/file_full_ea_info'
|
8
|
+
require 'ruby_smb/fscc/ea_info_array'
|
9
|
+
require 'ruby_smb/fscc/file_information'
|
10
|
+
require 'ruby_smb/fscc/control_codes'
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
|
4
|
+
# Defines the FSCTL/IOCTL control codes as defined in
|
5
|
+
# [2.2.31 SMB2 IOCTL Request](https://msdn.microsoft.com/en-us/library/cc246545.aspx)
|
6
|
+
module ControlCodes
|
7
|
+
|
8
|
+
FSCTL_DFS_GET_REFERRALS = 0x00060194
|
9
|
+
FSCTL_PIPE_PEEK = 0x0011400C
|
10
|
+
FSCTL_PIPE_WAIT = 0x00110018
|
11
|
+
FSCTL_PIPE_TRANSCEIVE = 0x0011C017
|
12
|
+
FSCTL_SRV_COPYCHUNK = 0x001440F2
|
13
|
+
FSCTL_SRV_ENUMERATE_SNAPSHOTS = 0x00144064
|
14
|
+
FSCTL_SRV_REQUEST_RESUME_KEY = 0x00140078
|
15
|
+
FSCTL_SRV_READ_HASH = 0x001441bb
|
16
|
+
FSCTL_SRV_COPYCHUNK_WRITE = 0x001480F2
|
17
|
+
FSCTL_LMR_REQUEST_RESILIENCY = 0x001401D4
|
18
|
+
FSCTL_QUERY_NETWORK_INTERFACE_INFO = 0x001401FC
|
19
|
+
FSCTL_SET_REPARSE_POINT = 0x000900A4
|
20
|
+
FSCTL_DFS_GET_REFERRALS_EX = 0x000601B0
|
21
|
+
FSCTL_FILE_LEVEL_TRIM = 0x00098208
|
22
|
+
FSCTL_VALIDATE_NEGOTIATE_INFO = 0x00140204
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -1,19 +1,18 @@
|
|
1
1
|
module RubySMB
|
2
|
-
module
|
2
|
+
module Fscc
|
3
3
|
# Convenience class that extend the normal {BinData::Array} for use
|
4
|
-
# with {RubySMB::
|
5
|
-
# updates the {RubySMB::
|
4
|
+
# with {RubySMB::Fscc::FileFullEaInfo}. This array will automatically
|
5
|
+
# updates the {RubySMB::Fscc::FileFullEaInfo#next_entry_offset} of
|
6
6
|
# each element in the array.
|
7
7
|
class EaInfoArray < BinData::Array
|
8
|
-
|
9
8
|
# Overrides the method from {BinData::Array} to
|
10
9
|
# call #update_offsets
|
11
|
-
# @raise [ArgumentError] if the inserted element is not a {RubySMB::
|
10
|
+
# @raise [ArgumentError] if the inserted element is not a {RubySMB::Fscc::FileFullEaInfo}
|
12
11
|
def []=(index, value)
|
13
|
-
unless value.is_a? RubySMB::
|
14
|
-
raise ArgumentError,
|
12
|
+
unless value.is_a? RubySMB::Fscc::FileFullEaInfo
|
13
|
+
raise ArgumentError, 'This array can only contain RubySMB::Fscc::FileFullEaInfo objects'
|
15
14
|
end
|
16
|
-
retval = super(index,value)
|
15
|
+
retval = super(index, value)
|
17
16
|
update_offsets
|
18
17
|
retval
|
19
18
|
end
|
@@ -23,12 +22,12 @@ module RubySMB
|
|
23
22
|
#
|
24
23
|
# @param index [Integer] the index to insert into the array at
|
25
24
|
# @param objs [Array<Object>] the objects to be inserted
|
26
|
-
# @raise [ArgumentError] if the inserted element is not a {RubySMB::
|
25
|
+
# @raise [ArgumentError] if the inserted element is not a {RubySMB::Fscc::FileFullEaInfo}
|
27
26
|
# @return [self]
|
28
27
|
def insert(index, *objs)
|
29
28
|
objs.each do |x|
|
30
|
-
unless x.is_a? RubySMB::
|
31
|
-
raise ArgumentError,
|
29
|
+
unless x.is_a? RubySMB::Fscc::FileFullEaInfo
|
30
|
+
raise ArgumentError, 'This array can only contain RubySMB::Fscc::FileFullEaInfo objects'
|
32
31
|
end
|
33
32
|
end
|
34
33
|
super(index, *objs)
|
@@ -41,8 +40,8 @@ module RubySMB
|
|
41
40
|
#
|
42
41
|
# @return [self]
|
43
42
|
def update_offsets
|
44
|
-
|
45
|
-
if element ==
|
43
|
+
each do |element|
|
44
|
+
if element == last
|
46
45
|
# If this is the end of our array, the offset must be 0
|
47
46
|
element.next_entry_offset = 0
|
48
47
|
else
|
@@ -52,7 +51,6 @@ module RubySMB
|
|
52
51
|
end
|
53
52
|
self
|
54
53
|
end
|
55
|
-
|
56
54
|
end
|
57
55
|
end
|
58
56
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
# The bit-field for File System Control Code File Attributes as defined in
|
4
|
+
# [2.6 File Attributes](https://msdn.microsoft.com/en-us/library/cc232110.aspx)
|
5
|
+
class FileAttributes < BinData::Record
|
6
|
+
endian :little
|
7
|
+
bit1 :normal, label: 'Normal File/Directory'
|
8
|
+
bit1 :device, label: 'Device'
|
9
|
+
bit1 :archive, label: 'Archive'
|
10
|
+
bit1 :directory, label: 'Directory'
|
11
|
+
bit1 :volume, label: 'Volume Label'
|
12
|
+
bit1 :system, label: 'System File'
|
13
|
+
bit1 :hidden, label: 'Hidden File'
|
14
|
+
bit1 :read_only, label: 'Read Only'
|
15
|
+
# Byte boundary
|
16
|
+
bit1 :reserved, label: 'Reserved Space'
|
17
|
+
bit1 :encrypted, label: 'File is Encrypted'
|
18
|
+
bit1 :content_indexed, label: 'Content Indexed'
|
19
|
+
bit1 :offline, label: 'Offline Storage'
|
20
|
+
bit1 :compressed, label: 'Compressed File'
|
21
|
+
bit1 :reparse_point, label: 'Reparse Point'
|
22
|
+
bit1 :sparse, label: 'Sparse File'
|
23
|
+
bit1 :temp, label: 'Temporary File'
|
24
|
+
# Byte boundary
|
25
|
+
bit8 :reserved2, label: 'Reserved Space'
|
26
|
+
bit8 :reserved3, label: 'Reserved Space'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module RubySMB
|
2
|
-
module
|
2
|
+
module Fscc
|
3
3
|
# Class representing a FillFullEaInformation structure as defined in
|
4
4
|
# [2.4.15 FileFullEaInformation](https://msdn.microsoft.com/en-us/library/cc232069.aspx)
|
5
5
|
class FileFullEaInfo < BinData::Record
|
6
|
-
endian
|
6
|
+
endian :little
|
7
7
|
uint32 :next_entry_offset, label: 'Next Entry Offset'
|
8
8
|
extended_attribute_flag :flags
|
9
|
-
uint8 :ea_name_length, label: 'EA Name Length', initial_value:
|
10
|
-
uint8 :ea_value_length, label: 'EA Value Length', initial_value:
|
9
|
+
uint8 :ea_name_length, label: 'EA Name Length', initial_value: -> { ea_name.do_num_bytes }
|
10
|
+
uint8 :ea_value_length, label: 'EA Value Length', initial_value: -> { ea_value.do_num_bytes }
|
11
11
|
string :ea_name, label: 'EA Name'
|
12
12
|
string :ea_value, label: 'EA Value'
|
13
13
|
end
|
14
14
|
end
|
15
|
-
end
|
15
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
# Namespace and constant values for File Information Classes, as defined in
|
4
|
+
# [2.4 File Information Classes](https://msdn.microsoft.com/en-us/library/cc232064.aspx)
|
5
|
+
module FileInformation
|
6
|
+
# Information class used in directory enumeration to return detailed
|
7
|
+
# information about the contents of a directory.
|
8
|
+
FILE_DIRECTORY_INFORMATION = 0x01
|
9
|
+
|
10
|
+
# Information class used in directory enumeration to return detailed
|
11
|
+
# information (with extended attributes size) about the contents of a
|
12
|
+
# directory.
|
13
|
+
FILE_FULL_DIRECTORY_INFORMATION = 0x02
|
14
|
+
|
15
|
+
# Information class used in directory enumeration to return detailed
|
16
|
+
# information (with extended attributes size and short names) about the
|
17
|
+
# contents of a directory.
|
18
|
+
FILE_BOTH_DIRECTORY_INFORMATION = 0x03
|
19
|
+
|
20
|
+
# Information class used to rename a file.
|
21
|
+
FILE_RENAME_INFORMATION = 0x0A
|
22
|
+
|
23
|
+
# Information class used in directory enumeration to return detailed
|
24
|
+
# information (with only filenames) about the contents of a directory.
|
25
|
+
FILE_NAMES_INFORMATION = 0x0C
|
26
|
+
|
27
|
+
# Information class used to mark a file for deletion.
|
28
|
+
FILE_DISPOSITION_INFORMATION = 0x0D
|
29
|
+
|
30
|
+
# Information class used in directory enumeration to return detailed
|
31
|
+
# information (with extended attributes size, short names and file ID)
|
32
|
+
# about the contents of a directory.
|
33
|
+
FILE_ID_BOTH_DIRECTORY_INFORMATION = 0x25
|
34
|
+
|
35
|
+
# Information class used in directory enumeration to return detailed
|
36
|
+
# information (with extended attributes size and file ID) about the
|
37
|
+
# contents of a directory.
|
38
|
+
FILE_ID_FULL_DIRECTORY_INFORMATION = 0x26
|
39
|
+
|
40
|
+
|
41
|
+
# These Information Classes can be used by SMB1 using the pass-through
|
42
|
+
# Information Levels when available on the server (CAP_INFOLEVEL_PASSTHRU
|
43
|
+
# capability flag in an SMB_COM_NEGOTIATE server response). The constant
|
44
|
+
# SMB_INFO_PASSTHROUGH needs to be added to access these Information
|
45
|
+
# Levels. This is documented in
|
46
|
+
# [2.2.2.3.5 Pass-through Information Level Codes](https://msdn.microsoft.com/en-us/library/ff470158.aspx)
|
47
|
+
SMB_INFO_PASSTHROUGH = 0x03e8
|
48
|
+
|
49
|
+
|
50
|
+
require 'ruby_smb/fscc/file_information/file_directory_information'
|
51
|
+
require 'ruby_smb/fscc/file_information/file_full_directory_information'
|
52
|
+
require 'ruby_smb/fscc/file_information/file_disposition_information'
|
53
|
+
require 'ruby_smb/fscc/file_information/file_id_full_directory_information'
|
54
|
+
require 'ruby_smb/fscc/file_information/file_both_directory_information'
|
55
|
+
require 'ruby_smb/fscc/file_information/file_id_both_directory_information'
|
56
|
+
require 'ruby_smb/fscc/file_information/file_names_information'
|
57
|
+
require 'ruby_smb/fscc/file_information/file_rename_information'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileBothDirectoryInformation Class as defined in
|
5
|
+
# [2.4.8 FileBothDirectoryInformation](https://msdn.microsoft.com/en-us/library/cc232095.aspx)
|
6
|
+
class FileBothDirectoryInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_BOTH_DIRECTORY_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
uint32 :next_offset, label: 'Next Entry Offset'
|
12
|
+
uint32 :file_index, label: 'File Index'
|
13
|
+
file_time :create_time, label: 'Create Time'
|
14
|
+
file_time :last_access, label: 'Last Accessed Time'
|
15
|
+
file_time :last_write, label: 'Last Write Time'
|
16
|
+
file_time :last_change, label: 'Last Modified Time'
|
17
|
+
uint64 :end_of_file, label: 'End of File'
|
18
|
+
uint64 :allocation_size, label: 'Allocated Size'
|
19
|
+
file_attributes :file_attributes, label: 'File Attributes'
|
20
|
+
uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
|
21
|
+
uint32 :ea_size, label: 'Extended Attributes Size'
|
22
|
+
uint8 :short_name_length, label: 'Short Name Length'
|
23
|
+
uint8 :reserved, label: 'Reserved Space'
|
24
|
+
string16 :short_name, label: 'File Short Name', length: 24
|
25
|
+
string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileDirectoryInformation Class as defined in
|
5
|
+
# [2.4.10 FileDirectoryInformation](https://msdn.microsoft.com/en-us/library/cc232097.aspx)
|
6
|
+
class FileDirectoryInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_DIRECTORY_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
uint32 :next_offset, label: 'Next Entry Offset'
|
12
|
+
uint32 :file_index, label: 'File Index'
|
13
|
+
file_time :create_time, label: 'Create Time'
|
14
|
+
file_time :last_access, label: 'Last Accessed Time'
|
15
|
+
file_time :last_write, label: 'Last Write Time'
|
16
|
+
file_time :last_change, label: 'Last Modified Time'
|
17
|
+
uint64 :end_of_file, label: 'End of File'
|
18
|
+
uint64 :allocation_size, label: 'Allocated Size'
|
19
|
+
file_attributes :file_attributes, label: 'File Attributes'
|
20
|
+
uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
|
21
|
+
string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileDispositionInformation Class as defined in
|
5
|
+
# [2.4.11 FileDispositionInformation](https://msdn.microsoft.com/en-us/library/cc232098.aspx)
|
6
|
+
class FileDispositionInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_DISPOSITION_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
uint8 :delete_pending, label: 'Delete Pending', initial_value: 0
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|