Skip to Content Skip to Search
Methods
N
P
Included Modules

Constants

TIMEOUT_IN_SECONDS = 300
 

Attributes

[R] host
[R] options

Class Public methods

new(options, host)

# File ruby/lib/rubygems/gemcutter_utilities/webauthn_poller.rb, line 29
def initialize(options, host)
  @options = options
  @host = host
end

poll_thread(options, host, webauthn_url, credentials)

# File ruby/lib/rubygems/gemcutter_utilities/webauthn_poller.rb, line 34
def self.poll_thread(options, host, webauthn_url, credentials)
  Thread.new do
    thread = Thread.current
    thread.abort_on_exception = true
    thread.report_on_exception = false
    thread[:otp] = new(options, host).poll_for_otp(webauthn_url, credentials)
  rescue Gem::WebauthnVerificationError, Gem::Timeout::Error => e
    thread[:error] = e
  end
end

Instance Public methods

poll_for_otp(webauthn_url, credentials)

# File ruby/lib/rubygems/gemcutter_utilities/webauthn_poller.rb, line 45
def poll_for_otp(webauthn_url, credentials)
  Gem::Timeout.timeout(TIMEOUT_IN_SECONDS) do
    loop do
      response = webauthn_verification_poll_response(webauthn_url, credentials)
      raise Gem::WebauthnVerificationError, response.message unless response.is_a?(Gem::Net::HTTPSuccess)

      require "json"
      parsed_response = JSON.parse(response.body)
      case parsed_response["status"]
      when "pending"
        sleep 5
      when "success"
        return parsed_response["code"]
      else
        raise Gem::WebauthnVerificationError, parsed_response.fetch("message", "Invalid response from server")
      end
    end
  end
end