Class: OmniAuth::Strategies::Duodealer

Inherits:
OAuth2
  • Object
show all
Defined in:
lib/omniauth/strategies/duodealer.rb

Constant Summary collapse

DEFAULT_SCOPE =

Available scopes: content themes products customers orders script_tags shipping read_* or write_*

'read_products'
SCOPE_DELIMITER =
','
MINUTE =
60
CODE_EXPIRES_AFTER =
10 * MINUTE

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.encoded_params_for_signature(params) ⇒ Object



87
88
89
90
91
92
# File 'lib/omniauth/strategies/duodealer.rb', line 87

def self.encoded_params_for_signature(params)
  params = params.dup
  params.delete('hmac')
  params.delete('signature') # deprecated signature
  Rack::Utils.build_query(params.sort)
end

.hmac_sign(encoded_params, secret) ⇒ Object



94
95
96
# File 'lib/omniauth/strategies/duodealer.rb', line 94

def self.hmac_sign(encoded_params, secret)
  OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA256.new, secret, encoded_params)
end

Instance Method Details

#authorize_paramsObject



140
141
142
143
144
145
# File 'lib/omniauth/strategies/duodealer.rb', line 140

def authorize_params
  super.tap do |params|
    params[:scope] = normalized_scopes(params[:scope] || DEFAULT_SCOPE).join(SCOPE_DELIMITER)
    params[:grant_options] = ['per-user'] if options[:per_user_permissions]
  end
end

#build_access_tokenObject



136
137
138
# File 'lib/omniauth/strategies/duodealer.rb', line 136

def build_access_token
  @built_access_token ||= super
end

#callback_phaseObject



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/omniauth/strategies/duodealer.rb', line 119

def callback_phase
  return fail!(:invalid_site, CallbackError.new(:invalid_site, "OAuth endpoint is not a duodealer site.")) unless valid_site?
  return fail!(:invalid_signature, CallbackError.new(:invalid_signature, "Signature does not match, it may have been tampered with.")) unless valid_signature?

  token = build_access_token
  unless valid_scope?(token)
    return fail!(:invalid_scope, CallbackError.new(:invalid_scope, "Scope does not match, it may have been tampered with."))
  end
  unless valid_permissions?(token)
    return fail!(:invalid_permissions, CallbackError.new(:invalid_permissions, "Requested API access mode does not match."))
  end

  super
rescue ::OAuth2::Error => e
  fail!(:invalid_credentials, e)
end

#callback_urlObject



147
148
149
# File 'lib/omniauth/strategies/duodealer.rb', line 147

def callback_url
  options[:callback_url] || full_host + script_name + callback_path
end

#fix_httpsObject



102
103
104
# File 'lib/omniauth/strategies/duodealer.rb', line 102

def fix_https
  options[:client_options][:site] = options[:client_options][:site].gsub(/\Ahttp\:/, 'https:')
end

#normalized_scopes(scopes) ⇒ Object



81
82
83
84
85
# File 'lib/omniauth/strategies/duodealer.rb', line 81

def normalized_scopes(scopes)
  scope_list = scopes.to_s.split(SCOPE_DELIMITER).map(&:strip).reject(&:empty?).uniq
  ignore_scopes = scope_list.map { |scope| scope =~ /\Awrite_(.*)\z/ && "read_#{$1}" }.compact
  scope_list - ignore_scopes
end

#request_phaseObject



111
112
113
114
115
116
117
# File 'lib/omniauth/strategies/duodealer.rb', line 111

def request_phase
  if valid_site?
    super
  else
    fail!(:invalid_site)
  end
end

#setup_phaseObject



106
107
108
109
# File 'lib/omniauth/strategies/duodealer.rb', line 106

def setup_phase
  super
  fix_https
end

#valid_permissions?(token) ⇒ Boolean

Returns:

  • (Boolean)


98
99
100
# File 'lib/omniauth/strategies/duodealer.rb', line 98

def valid_permissions?(token)
  token && (options[:per_user_permissions] == !token['associated_user'].nil?)
end

#valid_scope?(token) ⇒ Boolean

Returns:

  • (Boolean)


74
75
76
77
78
79
# File 'lib/omniauth/strategies/duodealer.rb', line 74

def valid_scope?(token)
  params = options.authorize_params.merge(options_for("authorize"))
  return false unless token && params[:scope] && token['scope']
  expected_scope = normalized_scopes(params[:scope]).sort
  (expected_scope == token['scope'].split(SCOPE_DELIMITER).sort)
end

#valid_signature?Boolean

Returns:

  • (Boolean)


58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/omniauth/strategies/duodealer.rb', line 58

def valid_signature?
  return false unless request.POST.empty?

  params = request.GET
  signature = params['hmac']
  timestamp = params['timestamp']
  return false unless signature && timestamp

  return false unless timestamp.to_i > Time.now.to_i - CODE_EXPIRES_AFTER

  new_secret = options.client_secret
  old_secret = options.old_client_secret

  validate_signature(new_secret) || (old_secret && validate_signature(old_secret))
end

#valid_site?Boolean

Returns:

  • (Boolean)


54
55
56
# File 'lib/omniauth/strategies/duodealer.rb', line 54

def valid_site?
  !!(/\A(https|http)\:\/\/[a-zA-Z0-9][a-zA-Z0-9\-]*\.#{Regexp.quote(options[:duodealer_domain])}[\/]?\z/ =~ options[:client_options][:site])
end