55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
# File 'lib/ruby_smb/server/server_client/session_setup.rb', line 55
def do_session_setup_smb2(request, session)
@smb2_related_operations_state.delete(:session_id)
session_id = request..session_id
if session_id == 0
session_id = rand(1..0xfffffffe)
session = Session.new(session_id)
else
session = @session_table[session_id]
if session.nil?
response = SMB2::Packet::ErrorPacket.new
response..nt_status = WindowsError::NTStatus::STATUS_USER_SESSION_DELETED
return response
end
end
gss_result = process_gss(request.buffer)
return if gss_result.nil?
response = SMB2::Packet::SessionSetupResponse.new
response..nt_status = gss_result.nt_status.value
response..credits = 1
response..message_id = request..message_id
response..session_id = session_id
response.buffer = gss_result.buffer
update_preauth_hash(request) if @dialect == '0x0311'
if gss_result.nt_status == WindowsError::NTStatus::STATUS_SUCCESS
session.state = :valid
session.user_id = gss_result.identity
session.is_guest = !!gss_result.is_guest
session.key = @gss_authenticator.session_key
session.signing_required = request.security_mode.signing_required == 1 || (!session.is_guest && !session.is_anonymous)
response..credits = 32
@cipher_id = 0 if session.is_anonymous || session.is_guest response.session_flags.encrypt_data = 1 unless @cipher_id == 0
response.session_flags.guest = session.is_guest
elsif gss_result.nt_status == WindowsError::NTStatus::STATUS_MORE_PROCESSING_REQUIRED && @dialect == '0x0311'
update_preauth_hash(response)
end
@session_table[session_id] = session
@smb2_related_operations_state[:session_id] = session_id
response
end
|