Implements the "keyboard-interactive" SSH authentication method.
Methods
Included Modules
Constants
InfoRequest | = | Struct.new( :name, :instruction, :password, :prompts ) |
Represents an information request from the server | ||
Prompt | = | Struct.new( :prompt, :echo ) |
Represents a single prompt in an InfoRequest. | ||
USERAUTH_INFO_REQUEST | = | 60 |
USERAUTH_INFO_RESPONSE | = | 61 |
Attributes
[W] | messenger | The messenger to use when communicating. |
Public Class methods
Create a new Password authenticator. It will use the given buffers factory to create new buffer instances. The callback should be a proc object to use to specialize the behavior of this authentication method.
[ show source ]
# File lib/net/ssh/userauth/methods/keyboard-interactive.rb, line 45 45: def initialize( buffers, callback ) 46: @buffers = buffers 47: @callback = callback 48: end
Public Instance methods
Attempt to authenticate the given user for the given service. The data hash must specify a :password value, otherwise this will always return false.
[ show source ]
# File lib/net/ssh/userauth/methods/keyboard-interactive.rb, line 53 53: def authenticate( next_service, username, data={} ) 54: password = data[:password] 55: 56: msg = @buffers.writer 57: msg.write_byte USERAUTH_REQUEST 58: msg.write_string username 59: msg.write_string next_service 60: msg.write_string "keyboard-interactive" 61: msg.write_string "" 62: msg.write_string "" 63: @messenger.send_message msg 64: 65: loop do 66: message = @messenger.wait_for_message 67: 68: case message.message_type 69: when USERAUTH_SUCCESS 70: return true 71: when USERAUTH_FAILURE 72: return false 73: when USERAUTH_INFO_REQUEST 74: name = message.buffer.read_string 75: instruction = message.buffer.read_string 76: req = InfoRequest.new( name, instruction, password, [] ) 77: password = nil # only use the given password once 78: 79: lang_tag = message.buffer.read_string 80: message.buffer.read_long.times do 81: prompt = message.buffer.read_string 82: echo = message.buffer.read_bool 83: req.prompts << Prompt.new( prompt, echo ) 84: end 85: 86: responses = @callback.call( req ) 87: msg = @buffers.writer 88: msg.write_byte USERAUTH_INFO_RESPONSE 89: msg.write_long responses.length 90: msg.write_string(*responses) 91: @messenger.send_message msg 92: else 93: raise Net::SSH::Exception, 94: "unexpected reply in keyboard interactive: " + 95: message.inspect 96: end 97: end 98: end