Method: RubySMB::Server::ServerClient::SessionSetup#do_session_setup_smb2

Defined in:
lib/ruby_smb/server/server_client/session_setup.rb

#do_session_setup_smb2(request, session) ⇒ Object



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.smb2_header.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.smb2_header.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.smb2_header.nt_status = gss_result.nt_status.value
  response.smb2_header.credits = 1
  response.smb2_header.message_id = request.smb2_header.message_id
  response.smb2_header.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.smb2_header.credits = 32
    @cipher_id = 0 if session.is_anonymous || session.is_guest # disable encryption for anonymous users and guest users which have a null session key
    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