6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
# File 'lib/ruby_smb/server/server_client/tree_connect.rb', line 6
def do_tree_connect_smb2(request, session)
response = RubySMB::SMB2::Packet::TreeConnectResponse.new
response..credits = 1
if session.tree_connect_table.length >= MAX_TREE_CONNECTIONS
logger.warn('Connection has reached the maximum number of tree connections')
response..nt_status = WindowsError::NTStatus::STATUS_INSUFFICIENT_RESOURCES
return response
end
share_name = request.path.encode('UTF-8').split('\\', 4).last
share_provider = @server.shares[share_name]
if share_provider.nil?
logger.warn("Received TREE_CONNECT request for non-existent share: #{share_name}")
response..nt_status = WindowsError::NTStatus::STATUS_BAD_NETWORK_NAME
return response
end
logger.debug("Received TREE_CONNECT request for share: #{share_name}")
response.share_type = case share_provider.type
when Share::TYPE_DISK
RubySMB::SMB2::Packet::TreeConnectResponse::SMB2_SHARE_TYPE_DISK
when Share::TYPE_PIPE
RubySMB::SMB2::Packet::TreeConnectResponse::SMB2_SHARE_TYPE_PIPE
when Share::TYPE_PRINT
RubySMB::SMB2::Packet::TreeConnectResponse::SMB2_SHARE_TYPE_PRINT
end
tree_id = rand(0xffffffff)
tree_id = rand(0xffffffff) while session.tree_connect_table.include?(tree_id)
response..tree_id = tree_id
session.tree_connect_table[tree_id] = share_processor = share_provider.new_processor(self, session)
response.maximal_access = share_processor.maximal_access
response
end
|