class SpiffyStoresAPI::Session

Attributes

extra[RW]
name[RW]
shop[RW]
token[RW]
url[RW]

Public Class Methods

new(url, token = nil, shop = nil, extra = {}) click to toggle source
# File lib/spiffy_stores_api/session.rb, line 70
def initialize(url, token = nil, shop = nil, extra = {})
  self.url = self.class.prepare_url(url)
  self.token = token
  self.shop = shop
  self.extra = extra
end
prepare_url(url) click to toggle source
# File lib/spiffy_stores_api/session.rb, line 36
def prepare_url(url)
  return nil if url.blank?
  # remove http:// or https://
  url = url.strip.gsub(/\Ahttps?:\/\//, '')
  # extract host, removing any username, password or path
  store = URI.parse("https://#{url}").host
  # extract subdomain of .spiffystores.com
  if idx = store.index(".")
    store = store.slice(0, idx)
  end
  return nil if store.empty?
  store = "#{store}.#{spiffy_stores_domain}"
  port ? "#{store}:#{port}" : store
rescue URI::InvalidURIError
  nil
end
setup(params) click to toggle source
# File lib/spiffy_stores_api/session.rb, line 18
def setup(params)
  params.each { |k,value| public_send("#{k}=", value) }
end
temp(domain, token) { || ... } click to toggle source
# File lib/spiffy_stores_api/session.rb, line 22
def temp(domain, token, &block)
  session = new(domain, token)
  original_site = SpiffyStoresAPI::Base.site.to_s
  original_token = SpiffyStoresAPI::Base.headers['Authorization'].try(:gsub, /^Bearer /i, '')
  original_session = new(original_site, original_token)

  begin
    SpiffyStoresAPI::Base.activate_session(session)
    yield
  ensure
    SpiffyStoresAPI::Base.activate_session(original_session)
  end
end
validate_signature(params) click to toggle source
# File lib/spiffy_stores_api/session.rb, line 53
def validate_signature(params)
  params = params.with_indifferent_access
  return false unless signature = params[:hmac]

  calculated_signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA256.new(), secret, encoded_params_for_signature(params))

  Rack::Utils.secure_compare(calculated_signature, signature)
end

Private Class Methods

encoded_params_for_signature(params) click to toggle source
# File lib/spiffy_stores_api/session.rb, line 64
def encoded_params_for_signature(params)
  params = params.except(:signature, :hmac, :action, :controller)
  params.map{|k,v| "#{URI.escape(k.to_s, '&=%')}=#{URI.escape(v.to_s, '&%')}"}.sort.join('&')
end

Public Instance Methods

create_permission_url(scope, redirect_uri = nil) click to toggle source
# File lib/spiffy_stores_api/session.rb, line 77
def create_permission_url(scope, redirect_uri = nil)
  params = {:client_id => api_key, :scope => scope.join(',')}
  params[:redirect_uri] = redirect_uri if redirect_uri
  "#{site}/admin/oauth/authorize?#{parameterize(params)}"
end
expired?() click to toggle source
# File lib/spiffy_stores_api/session.rb, line 126
def expired?
  return false if expires_in.nil?
  expires_in <= 0
end
expires_at() click to toggle source
# File lib/spiffy_stores_api/session.rb, line 121
def expires_at
  return unless extra.present?
  @expires_at ||= Time.at(extra['expires_at']).utc
end
expires_in() click to toggle source
# File lib/spiffy_stores_api/session.rb, line 116
def expires_in
  return unless expires_at.present?
  [0, expires_at.to_i - Time.now.utc.to_i].max
end
request_token(params) click to toggle source
# File lib/spiffy_stores_api/session.rb, line 83
def request_token(params)
  return token if token

  unless self.class.validate_signature(params) && params[:timestamp].to_i > 24.hours.ago.utc.to_i
    raise SpiffyStoresAPI::ValidationException, "Invalid Signature: Possible malicious login"
  end

  response = access_token_request(params['code'])
  if response.code == "200"
    self.extra = JSON.parse(response.body)
    self.token = extra.delete('access_token')

    if expires_in = extra.delete('expires_in')
      extra['expires_at'] = Time.now.utc.to_i + expires_in
    end
    token
  else
    raise RuntimeError, response.msg
  end
end
site() click to toggle source
# File lib/spiffy_stores_api/session.rb, line 108
def site
  "#{protocol}://#{url}/api"
end
store() click to toggle source
# File lib/spiffy_stores_api/session.rb, line 104
def store
  Store.current
end
valid?() click to toggle source
# File lib/spiffy_stores_api/session.rb, line 112
def valid?
  url.present? && token.present?
end

Private Instance Methods

access_token_request(code) click to toggle source
# File lib/spiffy_stores_api/session.rb, line 136
def access_token_request(code)
  uri = URI.parse("#{protocol}://#{url}/admin/oauth/token")
  https = Net::HTTP.new(uri.host, uri.port)
  https.use_ssl = true
  request = Net::HTTP::Post.new(uri.request_uri)
  request.set_form_data({"client_id" => api_key, "client_secret" => secret, "code" => code})
  https.request(request)
end
parameterize(params) click to toggle source
# File lib/spiffy_stores_api/session.rb, line 132
def parameterize(params)
  URI.escape(params.collect{|k,v| "#{k}=#{v}"}.join('&'))
end