class DuodealerAPI::Session
Attributes
api_version[R]
domain[RW]
extra[RW]
name[RW]
token[RW]
url[RW]
Public Class Methods
new(domain:, token:, api_version:, extra: {})
click to toggle source
# File lib/duodealer_api/session.rb, line 86 def initialize(domain:, token:, api_version:, extra: {}) self.domain = self.class.prepare_domain(domain) self.api_version = api_version self.token = token self.extra = extra end
prepare_domain(domain)
click to toggle source
# File lib/duodealer_api/session.rb, line 46 def prepare_domain(domain) return nil if domain.blank? # remove http:// or https:// domain = domain.strip.gsub(%r{\Ahttps?://}, '') # extract host, removing any username, password or path shop = URI.parse("https://#{domain}").host # extract subdomain of .duodealer.com if idx = shop.index(".") shop = shop.slice(0, idx) end return nil if shop.empty? "#{shop}.#{duodealer_domain}" rescue URI::InvalidURIError nil end
setup(params)
click to toggle source
# File lib/duodealer_api/session.rb, line 18 def setup(params) params.each { |k,value| public_send("#{k}=", value) } end
temp(domain:, token:, api_version:, &block)
click to toggle source
# File lib/duodealer_api/session.rb, line 22 def temp(domain:, token:, api_version:, &block) session = new(domain: domain, token: token, api_version: api_version) with_session(session, &block) end
validate_signature(params)
click to toggle source
# File lib/duodealer_api/session.rb, line 62 def validate_signature(params) params = (params.respond_to?(:to_unsafe_hash) ? params.to_unsafe_hash : 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
with_session(session) { || ... }
click to toggle source
# File lib/duodealer_api/session.rb, line 28 def with_session(session, &_block) original_session = extract_current_session begin DuodealerAPI::Base.activate_session(session) yield ensure DuodealerAPI::Base.activate_session(original_session) end end
with_version(api_version, &block)
click to toggle source
# File lib/duodealer_api/session.rb, line 39 def with_version(api_version, &block) original_session = extract_current_session session = new(domain: original_session.site, token: original_session.token, api_version: api_version) with_session(session, &block) end
Private Class Methods
encoded_params_for_signature(params)
click to toggle source
# File lib/duodealer_api/session.rb, line 73 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
extract_current_session()
click to toggle source
# File lib/duodealer_api/session.rb, line 78 def extract_current_session site = DuodealerAPI::Base.site.to_s token = DuodealerAPI::Base.headers['X-DuoDealer-Access-Token'] version = DuodealerAPI::Base.api_version new(domain: site, token: token, api_version: version) end
Public Instance Methods
api_version=(version)
click to toggle source
# File lib/duodealer_api/session.rb, line 128 def api_version=(version) @api_version = ApiVersion::NullVersion.matches?(version) ? ApiVersion::NullVersion : ApiVersion.find_version(version) end
create_permission_url(scope, redirect_uri, options = {})
click to toggle source
# File lib/duodealer_api/session.rb, line 93 def create_permission_url(scope, redirect_uri, options = {}) params = { client_id: api_key, scope: scope.join(','), redirect_uri: redirect_uri } params[:state] = options[:state] if options[:state] construct_oauth_url("authorize", params) end
expired?()
click to toggle source
# File lib/duodealer_api/session.rb, line 146 def expired? return false if expires_in.nil? expires_in <= 0 end
expires_at()
click to toggle source
# File lib/duodealer_api/session.rb, line 141 def expires_at return unless extra.present? @expires_at ||= Time.at(extra['expires_at']).utc end
expires_in()
click to toggle source
# File lib/duodealer_api/session.rb, line 136 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/duodealer_api/session.rb, line 99 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 DuodealerAPI::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
shop()
click to toggle source
# File lib/duodealer_api/session.rb, line 120 def shop Shop.current end
site()
click to toggle source
# File lib/duodealer_api/session.rb, line 124 def site "https://#{domain}" end
valid?()
click to toggle source
# File lib/duodealer_api/session.rb, line 132 def valid? domain.present? && token.present? && api_version.is_a?(ApiVersion) end
Private Instance Methods
access_token_request(code)
click to toggle source
# File lib/duodealer_api/session.rb, line 157 def access_token_request(code) uri = URI.parse(construct_oauth_url('access_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
construct_oauth_url(path, query_params = {})
click to toggle source
# File lib/duodealer_api/session.rb, line 166 def construct_oauth_url(path, query_params = {}) query_string = "?#{parameterize(query_params)}" unless query_params.empty? "https://#{domain}/admin/oauth/#{path}#{query_string}" end
parameterize(params)
click to toggle source
# File lib/duodealer_api/session.rb, line 153 def parameterize(params) URI.escape(params.collect { |k, v| "#{k}=#{v}" }.join('&')) end