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 324
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
local_hostname() click to toggle source
# File lib/hub/github_api.rb, line 376
def local_hostname
  require 'socket'
  Socket.gethostname
end
local_user() click to toggle source
# File lib/hub/github_api.rb, line 371
def local_user
  require 'etc'
  Etc.getlogin
end
obtain_oauth_token(host, user) click to toggle source
# File lib/hub/github_api.rb, line 336
def obtain_oauth_token host, user
  auth_url = URI.parse("https://%s@%s/authorizations" % [CGI.escape(user), host])
  auth_params = {
    :scopes => ['repo'],
    :note => "hub for #{local_user}@#{local_hostname}",
    :note_url => oauth_app_url
  }
  res = nil
  two_factor_code = nil

  loop do
    res = post(auth_url, auth_params) do |req|
      req['X-GitHub-OTP'] = two_factor_code if two_factor_code
    end

    if res.success?
      break
    elsif res.status == 401 && res['X-GitHub-OTP'].to_s.include?('required')
      $stderr.puts "warning: invalid two-factor code" if two_factor_code
      two_factor_code = config.prompt_auth_code
    elsif res.status == 422 && 'already_exists' == res.data['errors'][0]['code']
      if auth_params[:note] =~ / (\d+)$/
        res.error! if $1.to_i >= 9
        auth_params[:note].succ!
      else
        auth_params[:note] += ' 2'
      end
    else
      res.error!
    end
  end

  res.data['token']
end