class Heroku::Kensa::Sso

Attributes

id[RW]
proxy_port[RW]
timestamp[RW]
token[RW]
url[RW]

Public Class Methods

new(data) click to toggle source
# File lib/heroku/kensa/sso.rb, line 9
def initialize(data)
  @id   = data[:id]
  @salt = data['api']['sso_salt']

  env   = data.fetch :env, 'test'
  if @url = data['api'][env]['sso_url']
    @use_post   = true
    @proxy_port = find_available_port
  else
    @url  = data["api"][env].chomp('/')
  end
  @timestamp  = Time.now.to_i
  @token      = make_token(@timestamp)
end

Public Instance Methods

POST?() click to toggle source
# File lib/heroku/kensa/sso.rb, line 32
def POST?
  @use_post
end
base64_url_variant(text) click to toggle source
# File lib/heroku/kensa/sso.rb, line 95
def base64_url_variant(text)
  base64 = [text].pack('m').gsub('=', '').gsub("\n", '')
  base64.tr('+/','-_')
end
find_available_port() click to toggle source
# File lib/heroku/kensa/sso.rb, line 113
def find_available_port
  server = TCPServer.new('127.0.0.1', 0)
  server.addr[1]
ensure
  server.close if server
end
full_url() click to toggle source
# File lib/heroku/kensa/sso.rb, line 44
def full_url
  [ url, path, querystring ].join
end
Also aliased as: get_url
get_url()
Alias for: full_url
make_token(t) click to toggle source
# File lib/heroku/kensa/sso.rb, line 58
def make_token(t)
  Digest::SHA1.hexdigest([@id, @salt, t].join(':'))
end
message() click to toggle source
# File lib/heroku/kensa/sso.rb, line 100
def message
  if self.POST?
    "POSTing #{query_data} to #{post_url} via proxy on port #{@proxy_port}"
  else
    "Opening #{full_url}"
  end
end
path() click to toggle source
# File lib/heroku/kensa/sso.rb, line 24
def path
  if self.POST?
    URI.parse(url).path
  else
    "/heroku/resources/#{id}"
  end
end
post_url() click to toggle source
# File lib/heroku/kensa/sso.rb, line 49
def post_url
  url
end
query_data() click to toggle source
# File lib/heroku/kensa/sso.rb, line 67
def query_data
  query_params.map{|p| p.join('=')}.join('&')
end
query_params() click to toggle source
# File lib/heroku/kensa/sso.rb, line 71
def query_params
  { 'token'     => @token,
    'timestamp' => @timestamp.to_s,
    'nav-data'  => sample_nav_data,
    'email'     => 'username@example.com',
    'app'       => 'myapp'
  }.tap do |params|
    params.merge!('id' => @id) if self.POST?
  end
end
querystring() click to toggle source
# File lib/heroku/kensa/sso.rb, line 62
def querystring
  return '' unless @salt
  '?' + query_data
end
run_proxy() click to toggle source
# File lib/heroku/kensa/sso.rb, line 120
def run_proxy
  return unless self.POST?
  server = PostProxy.new self
  @proxy = server

  trap("INT") { server.stop }
  pid = fork do
    server.start
  end
  at_exit { server.stop; Process.waitpid pid }
end
sample_nav_data() click to toggle source
# File lib/heroku/kensa/sso.rb, line 82
def sample_nav_data
  json = OkJson.encode({
    :addon => 'Your Addon',
    :appname => 'myapp',
    :addons => [
      { :slug => 'cron', :name => 'Cron' },
      { :slug => 'custom_domains+wildcard', :name => 'Custom Domains + Wildcard' },
      { :slug => 'youraddon', :name => 'Your Addon', :current => true },
    ]
  })
  base64_url_variant(json)
end
sso_url() click to toggle source
# File lib/heroku/kensa/sso.rb, line 36
def sso_url
  if self.POST?
    "http://localhost:#{@proxy_port}/"
  else
    full_url
  end
end
start() click to toggle source
# File lib/heroku/kensa/sso.rb, line 108
def start
  run_proxy
  self
end
timestamp=(other) click to toggle source
# File lib/heroku/kensa/sso.rb, line 53
def timestamp=(other)
  @timestamp = other
  @token = make_token(@timestamp)
end