This file is indexed.

/usr/lib/ruby/vendor_ruby/net/ssh/authentication/methods/password.rb is in ruby-net-ssh 1:4.2.0-2ubuntu1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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
require 'net/ssh/errors'
require 'net/ssh/prompt'
require 'net/ssh/authentication/methods/abstract'

module Net
  module SSH
    module Authentication
      module Methods

        # Implements the "password" SSH authentication method.
        class Password < Abstract
          # Attempt to authenticate the given user for the given service. If
          # the password parameter is nil, this will ask for password
          def authenticate(next_service, username, password=nil)
            clear_prompter!
            retries = 0
            max_retries =  get_max_retries
            return false if !password && max_retries == 0

            begin
              password_to_send = password || ask_password(username)

              send_message(userauth_request(username, next_service, "password", false, password_to_send))
              message = session.next_message
              retries += 1

              if message.type == USERAUTH_FAILURE
                debug { "password failed" }

                raise Net::SSH::Authentication::DisallowedMethod unless
                  message[:authentications].split(/,/).include? 'password'
                password = nil
              end
            end until (message.type != USERAUTH_FAILURE || retries >= max_retries)

            case message.type
              when USERAUTH_SUCCESS
                debug { "password succeeded" }
                @prompter.success if @prompter
                return true
              when USERAUTH_FAILURE
                return false
              when USERAUTH_PASSWD_CHANGEREQ
                debug { "password change request received, failing" }
                return false
              else
                raise Net::SSH::Exception, "unexpected reply to USERAUTH_REQUEST: #{message.type} (#{message.inspect})"
            end
          end

          private

          NUMBER_OF_PASSWORD_PROMPTS = 3

          def clear_prompter!
            @prompt_info = nil
            @prompter = nil
          end

          def ask_password(username)
            host = session.transport.host
            prompt_info = {type: 'password', user: username, host: host}
            if @prompt_info != prompt_info
              @prompt_info = prompt_info
              @prompter = prompt.start(prompt_info)
            end
            echo = false
            @prompter.ask("#{username}@#{host}'s password:", echo)
          end

          def get_max_retries
            options = session.transport.options || {}
            result = options[:number_of_password_prompts] || NUMBER_OF_PASSWORD_PROMPTS
            options[:non_interactive] ? 0 : result
          end
        end

      end
    end
  end
end