class HrrRbSsh::Authentication::Method::KeyboardInteractive

Constants

NAME
PREFERENCE

Public Class Methods

new(transport, options, variables, authentication_methods, logger: nil) click to toggle source
# File lib/hrr_rb_ssh/authentication/method/keyboard_interactive.rb, line 15
def initialize transport, options, variables, authentication_methods, logger: nil
  self.logger = logger
  @transport = transport
  @options = options
  @authenticator = options.fetch( 'authentication_keyboard_interactive_authenticator', Authenticator.new{ false } )
  @variables = variables
  @authentication_methods = authentication_methods
end

Public Instance Methods

authenticate(userauth_request_message) click to toggle source
# File lib/hrr_rb_ssh/authentication/method/keyboard_interactive.rb, line 24
def authenticate userauth_request_message
  log_info { "authenticate" }
  username = userauth_request_message[:'user name']
  submethods = userauth_request_message[:'submethods']
  context = Context.new(@transport, username, submethods, @variables, @authentication_methods, logger: logger)
  @authenticator.authenticate context
end
request_authentication(username, service_name) click to toggle source
# File lib/hrr_rb_ssh/authentication/method/keyboard_interactive.rb, line 32
def request_authentication username, service_name
  message = {
    :'message number' => Message::SSH_MSG_USERAUTH_REQUEST::VALUE,
    :"user name"      => username,
    :"service name"   => service_name,
    :"method name"    => NAME,
    :"language tag"   => "",
    :'submethods'     => "",
  }
  payload = Message::SSH_MSG_USERAUTH_REQUEST.new(logger: logger).encode message
  @transport.send payload

  payload = @transport.receive
  case payload[0,1].unpack("C")[0]
  when Message::SSH_MSG_USERAUTH_INFO_REQUEST::VALUE
    message = Message::SSH_MSG_USERAUTH_INFO_REQUEST.new(logger: logger).decode payload
    num_responses = @options['client_authentication_keyboard_interactive'].size
    message = {
      :'message number' => Message::SSH_MSG_USERAUTH_INFO_RESPONSE::VALUE,
      :'num-responses'  => num_responses,
    }
    message_responses = @options['client_authentication_keyboard_interactive'].map.with_index{ |response, i|
      {:"response[#{i+1}]" => response}
    }.inject(Hash.new){ |a, b| a.merge(b) }
    message.update(message_responses)
    payload = Message::SSH_MSG_USERAUTH_INFO_RESPONSE.new(logger: logger).encode message
    @transport.send payload
    @transport.receive
  else
    payload
  end
end