module Hub::GitHubAPI::OAuth

Public Instance Methods

apply_authentication(req, url) click to toggle source
Calls superclass method
# File lib/hub/github_api.rb, line 322
def apply_authentication req, url
  if req.path =~ %r{^(/api/v3)?/authorizations\b}
    super
  else
    user = url.user ? CGI.unescape(url.user) : config.username(url.host)
    token = config.oauth_token(url.host, user) {
      obtain_oauth_token url.host, user
    }
    req['Authorization'] = "token #{token}"
  end
end
obtain_oauth_token(host, user, two_factor_code = nil) click to toggle source
# File lib/hub/github_api.rb, line 334
def obtain_oauth_token host, user, two_factor_code = nil
  auth_url = URI.parse("https://%s@%s/authorizations" % [CGI.escape(user), host])

  # dummy request to trigger a 2FA SMS since a HTTP GET won't do it
  post(auth_url) if !two_factor_code

  # first try to fetch existing authorization
  res = get_all(auth_url) do |req|
    req['X-GitHub-OTP'] = two_factor_code if two_factor_code
  end
  unless res.success?
    if !two_factor_code && res['X-GitHub-OTP'].to_s.include?('required')
      two_factor_code = config.prompt_auth_code
      return obtain_oauth_token(host, user, two_factor_code)
    else
      res.error!
    end
  end

  if found = res.data.find {|auth| auth['note'] == 'hub' || auth['note_url'] == oauth_app_url }
    found['token']
  else
    # create a new authorization
    res = post auth_url,
      :scopes => %w[repo], :note => 'hub', :note_url => oauth_app_url do |req|
        req['X-GitHub-OTP'] = two_factor_code if two_factor_code
      end
    res.error! unless res.success?
    res.data['token']
  end
end