17: def authenticate(next_service, username, password=nil)
18: debug { "trying keyboard-interactive" }
19: send_message(userauth_request(username, next_service, "keyboard-interactive", "", ""))
20:
21: loop do
22: message = session.next_message
23:
24: case message.type
25: when USERAUTH_SUCCESS
26: debug { "keyboard-interactive succeeded" }
27: return true
28: when USERAUTH_FAILURE
29: debug { "keyboard-interactive failed" }
30:
31: raise Net::SSH::Authentication::DisallowedMethod unless
32: message[:authentications].split(/,/).include? 'keyboard-interactive'
33:
34: return false
35: when USERAUTH_INFO_REQUEST
36: name = message.read_string
37: instruction = message.read_string
38: debug { "keyboard-interactive info request" }
39:
40: unless password
41: puts(name) unless name.empty?
42: puts(instruction) unless instruction.empty?
43: end
44:
45: lang_tag = message.read_string
46: responses =[]
47:
48: message.read_long.times do
49: text = message.read_string
50: echo = message.read_bool
51: responses << (password || prompt(text, echo))
52: end
53:
54:
55:
56: password = nil
57:
58: msg = Buffer.from(:byte, USERAUTH_INFO_RESPONSE, :long, responses.length, :string, responses)
59: send_message(msg)
60: else
61: raise Net::SSH::Exception, "unexpected reply in keyboard interactive: #{message.type} (#{message.inspect})"
62: end
63: end
64: end