lib/chargify2/direct.rb in chargify2-0.2.1 vs lib/chargify2/direct.rb in chargify2-0.2.2

- old
+ new

@@ -1,14 +1,14 @@ module Chargify2 class Direct attr_reader :client - + def initialize(client) @client = client validate_client end - + def secure_parameters(params = {}) SecureParameters.new(params, client) end def response_parameters(params = {}) @@ -16,13 +16,13 @@ end def self.signature(message, secret) OpenSSL::HMAC.hexdigest(OpenSSL::Digest::Digest.new('sha1'), secret, message) end - + private - + def validate_client unless client.is_a?(Client) raise ArgumentError.new("Direct.new requires a Client as an argument") end end @@ -33,111 +33,111 @@ attr_reader :api_id attr_reader :timestamp attr_reader :nonce attr_reader :data attr_reader :secret - + def initialize(hash, client) args = hash.symbolize_keys - + @api_id = client.api_id @secret = client.api_secret @timestamp = args[:timestamp] @nonce = args[:nonce] @data = args[:data] - + validate_args end - + def to_form_inputs output = [] output << %{<input type="hidden" name="secure[api_id]" value="#{h(api_id)}"/>} output << %{<input type="hidden" name="secure[timestamp]" value="#{h(timestamp)}"/>} if timestamp? output << %{<input type="hidden" name="secure[nonce]" value="#{h(nonce)}"/>} if nonce? output << %{<input type="hidden" name="secure[data]" value="#{h(encoded_data)}"/>} if data? output << %{<input type="hidden" name="secure[signature]" value="#{h(signature)}"/>} output.join("\n") end - %w(timestamp nonce data).each do |method| + %w(timestamp nonce data api_id secret).each do |method| define_method("#{method}?") do value = self.send(method) - value && value.to_s.strip.length > 0 + value && !(value.is_a?(Hash) ? value : value.to_s.strip).empty? end end - + def encoded_data hash = data? ? data : {} uri = Addressable::URI.new uri.query_values = hash uri.query end - + def signature message = "#{api_id}#{timestamp}#{nonce}#{encoded_data}" Direct.signature(message, secret) end - + private - + def h(s) ERB::Util.html_escape(s) end - + def validate_args if data && !data.is_a?(Hash) raise ArgumentError.new("The 'data' must be provided as a Hash (you passed a #{data.class})") end - - unless api_id && secret && api_id.to_s.length > 0 && secret.to_s.length > 0 + + unless api_id? && secret? raise ArgumentError.new("SecureParameters require connection to a Client - was one given?") end end end - + # There is no need to instantiate a ResponseParameters instance directly. Use Direct#response_parameters instead. class ResponseParameters attr_reader :api_id attr_reader :timestamp attr_reader :nonce attr_reader :status_code attr_reader :result_code attr_reader :call_id attr_reader :secret attr_reader :signature - + def initialize(params, client) args = params.symbolize_keys - + @api_id = client.api_id @secret = client.api_secret @status_code = args[:status_code] @timestamp = args[:timestamp] @nonce = args[:nonce] @result_code = args[:result_code] @call_id = args[:call_id] @signature = args[:signature] - + validate_args end - + def verified? message = "#{api_id}#{timestamp}#{nonce}#{status_code}#{result_code}#{call_id}" Direct.signature(message, secret) == signature end - + def success? status_code.to_s == '200' end - + private - + def validate_args unless api_id && secret && api_id.to_s.length > 0 && secret.to_s.length > 0 raise ArgumentError.new("ResponseParameters require connection to a Client - was one given?") end end end end -end \ No newline at end of file +end