class VersacommerceAPI::Session

Attributes

name[RW]
token[RW]
url[RW]

Public Class Methods

new(url, token = nil, params = nil) click to toggle source
# File lib/versacommerce_api/session.rb, line 12
def initialize(url, token = nil, params = nil)
  self.url, self.token = url, token

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

  self.class.prepare_url(self.url)
end
request_token(domain) click to toggle source
# File lib/versacommerce_api/session.rb, line 30
def self.request_token(domain)
  return nil if domain.blank? || api_key.blank?
  begin
    content = open("https://#{domain}/api/auth.xml?api_key=#{api_key}") { |io| data = io.read }
    Hash.from_xml(content)["token"] if content
  rescue
    nil
  end
end
setup(params) click to toggle source
# File lib/versacommerce_api/session.rb, line 25
def self.setup(params)
  params.each { |k,value| send("#{k}=", value) }
end

Private Class Methods

prepare_url(url) click to toggle source
# File lib/versacommerce_api/session.rb, line 74
def self.prepare_url(url)
  return nil if url.blank?
  url.gsub!(/https?:\/\//, '') # remove http:// or https://
  url.concat(".versacommerce.de") unless url.include?('.')  # extend url to versacommerce.de if no host is given
end
validate_signature(params) click to toggle source
# File lib/versacommerce_api/session.rb, line 80
def self.validate_signature(params)
  return false unless signature = params[:signature]

  sorted_params = params.except(:signature, :action, :controller).collect{|k,v|"#{k}=#{v}"}.sort.join
  Digest::MD5.hexdigest(secret + sorted_params) == signature
end

Public Instance Methods

create_permission_url() click to toggle source
# File lib/versacommerce_api/session.rb, line 46
def create_permission_url
  return nil if url.blank? || api_key.blank?
  "https://#{url}/api/auth?api_key=#{api_key}"
end
shop() click to toggle source
# File lib/versacommerce_api/session.rb, line 41
def shop
  Shop.current
end
site() click to toggle source

Used by ActiveResource::Base to make all non-authentication API calls

# File lib/versacommerce_api/session.rb, line 53
def site
  "#{protocol}://#{api_key}:#{computed_password}@#{url}/api/"
end
valid?() click to toggle source
# File lib/versacommerce_api/session.rb, line 58
def valid?
  url.present? && token.present?
end

Private Instance Methods

computed_password() click to toggle source

secret = shared_key token was provided by registration

# File lib/versacommerce_api/session.rb, line 70
def computed_password
  Digest::MD5.hexdigest(secret + token.to_s)
end