53: def authenticate(next_service, username, password=nil)
54: debug { "beginning authentication of `#{username}'" }
55:
56: transport.send_message(transport.service_request("ssh-userauth"))
57: message = expect_message(SERVICE_ACCEPT)
58:
59: key_manager = KeyManager.new(logger, options)
60: keys.each { |key| key_manager.add(key) } unless keys.empty?
61: key_data.each { |key2| key_manager.add_key_data(key2) } unless key_data.empty?
62:
63: attempted = []
64:
65: @auth_methods.each do |name|
66: begin
67: next unless @allowed_auth_methods.include?(name)
68: attempted << name
69:
70: debug { "trying #{name}" }
71: begin
72: method = Methods.const_get(name.split(/\W+/).map { |p| p.capitalize }.join).new(self, :key_manager => key_manager)
73: rescue NameError => ne
74: debug{"Mechanism #{name} was requested, but isn't a known type. Ignoring it."}
75: next
76: end
77:
78: return true if method.authenticate(next_service, username, password)
79: rescue Net::SSH::Authentication::DisallowedMethod
80: end
81: end
82:
83: error { "all authorization methods failed (tried #{attempted.join(', ')})" }
84: return false
85: ensure
86: key_manager.finish if key_manager
87: end