module GithubPivotalFlow::GitHubAPI::OAuth

Public Instance Methods

apply_authentication(req, url) click to toggle source
Calls superclass method
# File lib/github_pivotal_flow/github_api.rb, line 202
def apply_authentication req, url
  if req.path =~ %r{^(/api/v3)?/authorizations$}
    super
  else
    user = url.user ? CGI.unescape(url.user) : config.github_username(url.host)
    token = config.github_api_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/github_pivotal_flow/github_api.rb, line 214
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(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.ask_auth_code
      return obtain_oauth_token(host, user, two_factor_code)
    else
      res.error!
    end
  end

  if found = res.data.find {|auth| auth['app']['url'] == oauth_app_url }
    found['token']
  else
    # create a new authorization
    res = post auth_url,
               :scopes => %w[repo], :note => 'github-pivotal-flow', :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