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