mastercard_core_sdk 1.3.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +6 -7
  4. data/lib/mastercard_core_sdk/client/api_client.rb +8 -6
  5. data/lib/mastercard_core_sdk/constants/constants.rb +5 -0
  6. data/lib/mastercard_core_sdk/converters/encoded_url_converter.rb +1 -1
  7. data/lib/mastercard_core_sdk/converters/jose_converter.rb +96 -0
  8. data/lib/mastercard_core_sdk/converters/json_converter.rb +10 -1
  9. data/lib/mastercard_core_sdk/converters/sdk_converter_factory.rb +12 -1
  10. data/lib/mastercard_core_sdk/converters/xml_converter.rb +1 -1
  11. data/lib/mastercard_core_sdk/core/api_config.rb +4 -2
  12. data/lib/mastercard_core_sdk/core/api_config_builder.rb +11 -3
  13. data/lib/mastercard_core_sdk/core/mastercard_api_configuration.rb +2 -1
  14. data/lib/mastercard_core_sdk/core/request_response_logger.rb +33 -9
  15. data/lib/mastercard_core_sdk/core/service_request.rb +1 -1
  16. data/lib/mastercard_core_sdk/exceptions/error_handler.rb +1 -1
  17. data/lib/mastercard_core_sdk/models/detail.rb +2 -2
  18. data/lib/mastercard_core_sdk/models/details.rb +1 -1
  19. data/lib/mastercard_core_sdk/models/error.rb +5 -5
  20. data/lib/mastercard_core_sdk/models/errors.rb +3 -3
  21. data/lib/mastercard_core_sdk/oauth/oauth_util.rb +1 -2
  22. data/lib/mastercard_core_sdk/util/jose.rb +127 -0
  23. data/lib/mastercard_core_sdk/version.rb +1 -1
  24. data/lib/mastercard_core_sdk.rb +4 -7
  25. metadata +12 -13
  26. data/lib/mastercard_core_sdk/api/access_token_api.rb +0 -38
  27. data/lib/mastercard_core_sdk/api/request_token_api.rb +0 -33
  28. data/lib/mastercard_core_sdk/models/access_token_response.rb +0 -148
  29. data/lib/mastercard_core_sdk/models/request_token_response.rb +0 -170
  30. data/lib/mastercard_core_sdk/tracker/token_api_tracker.rb +0 -52
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 70baa13d8f8b4684d46d10f1447d213c1b4f79a9
4
- data.tar.gz: 536119e0d246a3e11b01ee4fd1bae3440c42a12c
3
+ metadata.gz: 7304d039b64910aa3f8fc16a2f798172480f61e8
4
+ data.tar.gz: e678aba02e0b2af6ae4fa6e13c8305c8a433954e
5
5
  SHA512:
6
- metadata.gz: 5564f83d9186449a34d4a5ae88ee6f3b565e46a26c81182c8a8d0be2e4b7279265036fbd83df813b46eff66921738f9f2f3defaaf4b8f4aac22280cf74008463
7
- data.tar.gz: 952f07b940667b6bf92bdf58617cc0207535aafbc76388f9cf9c3a593ba909470bcae7994af374936b39a69edfee22e8576b6f4a404533ccbbd1433ef490cd1f
6
+ metadata.gz: 24adf61809aac72ed89494f5e954bacd94b1dda3e5ed62ce9203f1221f75a87a7af0432f5a24acc9b17a55c7e4129347ce20b526430d8e5c2a2dca8a5ffbf06d
7
+ data.tar.gz: 3691d34e13f729bb6d9f89be6e02ac60f2bdeb396677332dc89f62ec73ed46593c25197d59eae6a91154dec973e480e9be7960ce2d162246e71c063f942cefee
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2016, MasterCard International Incorporated
1
+ Copyright (c) 2017, MasterCard International Incorporated
2
2
  All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without modification, are
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  This is core SDK containing the configuration part for checkout SDK.
4
4
 
5
- The merchant checkout SDK - MastercardMasterpassMerchant requires this MastercardCoreSdk as dependency for calling the checkout API services.
5
+ The merchant checkout SDK - MastercardMerchantCheckout requires this MastercardCoreSdk as dependency for calling the checkout API services.
6
6
 
7
7
  Features include :
8
8
 
@@ -12,7 +12,7 @@ Features include :
12
12
 
13
13
  • ApiTracker - ApiTracker tracks the details of SDK from which API services are called.
14
14
 
15
- For more information, refer [mastercard's developer site](https://developer.mastercard.com).
15
+ For more information, refer [Masterpass Merchant Integration](https://developer.mastercard.com/documentation/masterpass-merchant-integration).
16
16
 
17
17
  ## Installation
18
18
 
@@ -43,21 +43,20 @@ MastercardCoreSdk.configure do |config|
43
43
  end
44
44
  ```
45
45
 
46
- Set configurations for private key and consumer key to call API:
46
+ Set configurations for Consumer Key & Private Key from [Mastercard's developer's site](https://developer.mastercard.com/):
47
47
 
48
48
  ```
49
49
  MasterCardApiConfiguration.consumer_key = <Consumer Key>
50
50
  MasterCardApiConfiguration.private_key = OpenSSL::PKCS12.new(File.open(<Path to P12 file>), <Password>).key
51
- MasterCardApiConfiguration.sandbox = false #By default SANDBOX environment is set, Set sandbox to false to use Production environment
51
+ MasterCardApiConfiguration.sandbox = false #By default Sandbox environment is set to true, Set sandbox to false to use Production environment.
52
52
 
53
- request_token_response = RequestTokenApi.create(<URL>)
54
53
  ```
55
54
 
56
55
  ## Copyright
57
- Copyright (c) 2016, MasterCard International Incorporated. See LICENSE for details.
56
+ Copyright (c) 2017, MasterCard International Incorporated. See LICENSE for details.
58
57
 
59
58
  ## LICENSE
60
- Copyright (c) 2016, MasterCard International Incorporated. All rights reserved.
59
+ Copyright (c) 2017, MasterCard International Incorporated. All rights reserved.
61
60
 
62
61
  Redistribution and use in source and binary forms, with or without modification, are
63
62
  permitted provided that the following conditions are met:
@@ -11,12 +11,13 @@ require_relative '../interceptors/signature_builder'
11
11
  require_relative '../interceptors/logger_builder'
12
12
  require_relative '../interceptors/api_tracker_builder'
13
13
  require_relative '../converters/sdk_converter_factory'
14
+ require_relative '../util/jose'
14
15
 
15
16
  module MastercardCoreSdk
16
17
  module Client
17
18
  # ApiClient is the base class to invoke the API. It is responsible for to convert all request and response according to the content type.
18
19
  class ApiClient
19
- include MastercardCoreSdk::Core, MastercardCoreSdk::Interceptors, MastercardCoreSdk::Converters, MastercardCoreSdk::Tracker
20
+ include MastercardCoreSdk::Util, MastercardCoreSdk::Core, MastercardCoreSdk::Interceptors, MastercardCoreSdk::Converters, MastercardCoreSdk::Tracker
20
21
 
21
22
  @@logger = Logging.logger[self]
22
23
 
@@ -66,6 +67,7 @@ module MastercardCoreSdk
66
67
  # @return [String] Response body
67
68
  def call(path, service_request, http_method, return_type)
68
69
  request = build_request(http_method, path, service_request, @api_config)
70
+ Jose.api_config = @api_config
69
71
  response_body, response_code, response_headers = call_api(request, return_type)
70
72
 
71
73
  return response_body
@@ -80,19 +82,19 @@ module MastercardCoreSdk
80
82
  @mastercard_authenticator.api_tracker = @api_tracker
81
83
  @mastercard_authenticator.authenticate
82
84
  response = request.run
83
-
85
+
84
86
  # Clearing callbacks
85
87
  request.on_complete.clear
86
88
  Typhoeus.before.clear
87
-
89
+
88
90
  unless response.success?
89
91
  error_response = ErrorResponse.new(:response => response, :response_code => response.response_code)
90
92
  @error_handler.handle_error(error_response)
91
93
  end
92
-
94
+
93
95
  if return_type
94
96
  converter = SDKConverterFactory.get_converter(response.headers['Content-Type'])
95
- data = converter.response_body_converter(response.response_body, return_type)
97
+ data = converter.response_body_converter(response, return_type)
96
98
  else
97
99
  data = nil
98
100
  end
@@ -103,7 +105,7 @@ module MastercardCoreSdk
103
105
  # Builds the HTTP request
104
106
  #
105
107
  # @param [String] http_method HTTP method/verb (e.g. POST)
106
- # @param [String] path URL path (e.g. /account/new)
108
+ # @param [String] path URL path
107
109
  # @param [Object] request ServiceRequest object
108
110
  # @param [Object] api_config ApiConfig object
109
111
  # @return [Typhoeus::Request] A Typhoeus Request
@@ -49,6 +49,7 @@ module MastercardCoreSdk
49
49
  HTTP_CODE = "HttpCode"
50
50
 
51
51
  BASE_SDK_VERSION = "base_sdk_version="
52
+ TOKEN_SDK_VERSION = "token_sdk_version="
52
53
  CLIENT_SDK_VERSION = "client_sdk_version="
53
54
  LANG_NAME = "lang_name="
54
55
  LANG_VERSION = "lang_version="
@@ -82,6 +83,8 @@ module MastercardCoreSdk
82
83
  ERR_MSG_CONVERSION = "Conversion failed."
83
84
  ERR_MSG_API_CONFIG = "Api Config cannot be null."
84
85
  ERR_MSG_HOST_URL = "Host URL cannot be empty."
86
+ ERR_MSG_JOSE_CONVERSION = "Jose conversion not supported."
87
+ ERR_MSG_JOSE_DECRYPTION = "Decryption failed, Invalid authentication tag."
85
88
 
86
89
  NULL_RESPONSE_PARAMETERS_ERROR = "Response parameters cannot be null."
87
90
  NULL_OAUTH_PARAMETERS_ERROR = "Oauth parameters cannot be null."
@@ -90,6 +93,8 @@ module MastercardCoreSdk
90
93
  CONTENT_TYPE_XML = "XML"
91
94
  CONTENT_TYPE_JSON = "JSON"
92
95
  CONTENT_TYPE_URL_ENCODED = "WWW-FORM-URLENCODED"
96
+ CONTENT_TYPE_JOSE = "JOSE"
93
97
  ERR_MSG_CONTENT_TYPE = "Content-type is not supported :"
98
+
94
99
 
95
100
  end
@@ -22,7 +22,7 @@ module MastercardCoreSdk
22
22
  # @param return_type Defines converted object type; examples: "RequestTokenResponse", "AccessTokenResponse"
23
23
  # @return [Object]
24
24
  def response_body_converter(response, return_type)
25
- body = response
25
+ body = response.response_body
26
26
  return nil if body.nil? || body.empty?
27
27
 
28
28
  begin
@@ -0,0 +1,96 @@
1
+ require 'logging'
2
+ require 'json'
3
+ require_relative '../core/mastercard_api_configuration'
4
+ require_relative '../core/api_config'
5
+ require_relative '../exceptions/sdk_conversion_error'
6
+
7
+ module MastercardCoreSdk
8
+ module Converters
9
+ # Handles conversion for content-type : "application/jose"
10
+ class JoseConverter
11
+ include MastercardCoreSdk::Core, MastercardCoreSdk::Exceptions, MastercardCoreSdk::Util
12
+
13
+ @@logger = Logging.logger[self]
14
+ attr_accessor :skip_root
15
+
16
+ def initialize
17
+ @skip_root = false
18
+ end
19
+
20
+ # Convert object (array, hash, object, etc) to JSON.
21
+ # @param object to be converted into JSON string
22
+ # @raise [SDKConversionError] Error for conversion.
23
+ def request_body_converter(object)
24
+ @@logger.error ERR_MSG_JOSE_CONVERSION
25
+ raise SDKConversionError.new(:error_message => ERR_MSG_JOSE_CONVERSION, :source => self.class)
26
+ end
27
+
28
+ # Convert the response to the given return type.
29
+ # @param [String] return_type some examples: "User", "Array[User]", "Hash[String,Integer]"
30
+ def response_body_converter(response, return_type)
31
+ body = response.response_body
32
+ request = response.request
33
+ return nil if body.nil? || body.empty?
34
+ begin
35
+ headers = request.original_options[:headers]
36
+ # api_config = MasterCardApiConfiguration.api_config(headers[ApiConfig::CONFIG_NAME_HEADER])
37
+ api_config = Jose.api_config
38
+ plain_text = Jose.decrypt(body, api_config.private_key)
39
+ data = JSON.parse("[#{plain_text}]", :symbolize_names => true)[0]
40
+ rescue JSON::ParserError => e
41
+ if %w(String Date DateTime).include?(return_type.to_s)
42
+ data = body
43
+ else
44
+ @@logger.error e.message
45
+ raise SDKConversionError.new(:error_message => e.message, :source => self.class)
46
+ end
47
+ end
48
+ convert_to_type data, return_type
49
+ end
50
+
51
+ private
52
+
53
+ # Convert data to the given return type.
54
+ def convert_to_type(data, return_type)
55
+ return nil if data.nil?
56
+ case return_type.to_s
57
+ when 'String'
58
+ data.to_s
59
+ when 'Integer'
60
+ data.to_i
61
+ when 'Float'
62
+ data.to_f
63
+ when 'BOOLEAN'
64
+ data == true
65
+ when 'DateTime'
66
+ # parse date time (expecting ISO 8601 format)
67
+ DateTime.parse data
68
+ when 'Date'
69
+ # parse date time (expecting ISO 8601 format)
70
+ Date.parse data
71
+ when 'Object'
72
+ # generic object, return directly
73
+ data
74
+ when /\AArray<(.+)>\z/
75
+ # e.g. Array<Pet>
76
+ sub_type = $1
77
+ data.map {|item| convert_to_type(item, sub_type) }
78
+ when /\AHash\<String, (.+)\>\z/
79
+ # e.g. Hash<String, Integer>
80
+ sub_type = $1
81
+ {}.tap do |hash|
82
+ data.each {|k, v| hash[k] = convert_to_type(v, sub_type) }
83
+ end
84
+ else
85
+ if skip_root
86
+ data = data[data.keys[0]]
87
+ end
88
+ return_type.new.tap do |model|
89
+ model.build_from_hash data
90
+ end
91
+ end
92
+ end
93
+
94
+ end
95
+ end
96
+ end
@@ -10,6 +10,12 @@ module MastercardCoreSdk
10
10
 
11
11
  @@logger = Logging.logger[self]
12
12
 
13
+ attr_accessor :skip_root
14
+
15
+ def initialize
16
+ @skip_root = false
17
+ end
18
+
13
19
  # Convert object (array, hash, object, etc) to JSON.
14
20
  # @param object to be converted into JSON string
15
21
  # @return [String] JSON string representation of the object
@@ -36,7 +42,7 @@ module MastercardCoreSdk
36
42
  #
37
43
  # @param [String] return_type some examples: "User", "Array[User]", "Hash[String,Integer]"
38
44
  def response_body_converter(response, return_type)
39
- body = response
45
+ body = response.response_body
40
46
  return nil if body.nil? || body.empty?
41
47
  begin
42
48
  data = JSON.parse("[#{body}]", :symbolize_names => true)[0]
@@ -96,6 +102,9 @@ module MastercardCoreSdk
96
102
  data.each {|k, v| hash[k] = convert_to_type(v, sub_type) }
97
103
  end
98
104
  else
105
+ if skip_root
106
+ data = data[data.keys[0]]
107
+ end
99
108
  return_type.new.tap do |model|
100
109
  model.build_from_hash data
101
110
  end
@@ -12,7 +12,7 @@ module MastercardCoreSdk
12
12
  class << self
13
13
  include MastercardCoreSdk::Exceptions
14
14
 
15
- # Get converter as per mime-type.
15
+ # Get converter as per content-type.
16
16
  # @param mime String specifying content-type for request.
17
17
  # @return [Hash]
18
18
  def get_converter(mime)
@@ -26,6 +26,8 @@ module MastercardCoreSdk
26
26
  converter = JsonConverter.new
27
27
  elsif content_type.include?(CONTENT_TYPE_URL_ENCODED)
28
28
  converter = EncodedURLConverter.new
29
+ elsif content_type.include?(CONTENT_TYPE_JOSE)
30
+ converter = JoseConverter.new
29
31
  else
30
32
  @@logger.debug "#{ERR_MSG_CONTENT_TYPE} #{content_type}"
31
33
  raise SDKConversionError.new(:error_message => "#{ERR_MSG_CONTENT_TYPE} #{content_type}", :source => self.class)
@@ -57,6 +59,8 @@ module MastercardCoreSdk
57
59
  mime_sub_type = CONTENT_TYPE_XML
58
60
  elsif urlencoded_mime?(mime)
59
61
  mime_sub_type = CONTENT_TYPE_URL_ENCODED
62
+ elsif jose_mime?(mime)
63
+ mime_sub_type = CONTENT_TYPE_JOSE
60
64
  else
61
65
  @@logger.debug "#{ERR_MSG_CONTENT_TYPE} #{mime}"
62
66
  raise SDKConversionError.new(:error_message => "#{ERR_MSG_CONTENT_TYPE} #{mime}", :source => self.class)
@@ -85,6 +89,13 @@ module MastercardCoreSdk
85
89
  !!(mime =~ /www-form-urlencoded/i)
86
90
  end
87
91
 
92
+ # Check if the given MIME is a JOSE mime.
93
+ # @param mime String specifying mime-type.
94
+ # @return [Boolean]
95
+ def jose_mime?(mime)
96
+ !!(mime =~ /jose/i)
97
+ end
98
+
88
99
  end
89
100
  end
90
101
  end
@@ -34,7 +34,7 @@ module MastercardCoreSdk
34
34
  # @param return_type specifies model; examples: "RequestTokenResponse", "AccessTokenResponse"
35
35
  # @return [Object]
36
36
  def response_body_converter(response, return_type)
37
- body = response
37
+ body = response.response_body
38
38
 
39
39
  return nil if body.nil? || body.empty?
40
40
 
@@ -4,18 +4,20 @@ module MastercardCoreSdk
4
4
  class ApiConfig
5
5
 
6
6
  CONFIG_NAME_HEADER = "__config_name__"
7
- attr_accessor :name, :consumer_key, :private_key, :host_url
7
+ attr_accessor :name, :consumer_key, :private_key, :host_url, :additional_properties
8
8
 
9
9
  # Constructs ApiConfig object.
10
10
  # @param name the environment name. e.g. "SANDBOX"
11
11
  # @param consumer_key the consumer key (Generated from mastercard developer zone).
12
12
  # @param private_key the private key, to be fetched from the certificate.
13
13
  # @param host_url the environment host url. e.g. "https://sandbox.api.mastercard.com"
14
- def initialize(name, consumer_key, private_key, host_url)
14
+ # @param additional_properties the additional properties for plugins information.
15
+ def initialize(name, consumer_key, private_key, host_url, additional_properties = {})
15
16
  @name = name
16
17
  @consumer_key = consumer_key
17
18
  @private_key = private_key
18
19
  @host_url = host_url
20
+ @additional_properties = additional_properties
19
21
  end
20
22
 
21
23
  end
@@ -35,14 +35,22 @@ module MastercardCoreSdk
35
35
  return self
36
36
  end
37
37
 
38
- # Build and register the ApiConfig object.
38
+ # Sets additional properties for plugins
39
+ # @param additional_properties [Hash] the plugin details as hash with plugin_version as key.
40
+ # @return [ApiConfigBuilder]
41
+ def additional_properties(additional_properties = {})
42
+ @additional_properties= additional_properties
43
+ return self
44
+ end
45
+
46
+ # Register the ApiConfig with MasterCardApiConfiguration.
39
47
  # @return [ApiConfig]
40
48
  def build
41
- api_config = ApiConfig.new(@name, @consumer_key, @private_key, @host_url)
49
+ api_config = ApiConfig.new(@name, @consumer_key, @private_key, @host_url, @additional_properties)
42
50
  MasterCardApiConfiguration.register_config(api_config)
43
51
  return api_config
44
52
  end
45
53
 
46
54
  end
47
55
  end
48
- end
56
+ end
@@ -1,4 +1,4 @@
1
- require "logging"
1
+ require 'logging'
2
2
  require_relative '../exceptions/sdk_validation_error'
3
3
  require_relative 'api_config_builder'
4
4
 
@@ -56,6 +56,7 @@ module MastercardCoreSdk
56
56
  # @param api_config the ApiConfig object.
57
57
  def register_config(api_config)
58
58
  self.configs.merge!({ api_config.name => api_config })
59
+ MasterCardApiConfiguration.additional_properties = api_config.additional_properties if !api_config.additional_properties.nil? && !api_config.additional_properties.empty?
59
60
  end
60
61
 
61
62
  # Check if environment is Sandbox.
@@ -1,5 +1,6 @@
1
1
  require 'nokogiri'
2
- require "logging"
2
+ require 'logging'
3
+ require 'json'
3
4
  require_relative '../exceptions/sdk_validation_error'
4
5
 
5
6
  module MastercardCoreSdk
@@ -69,10 +70,20 @@ module MastercardCoreSdk
69
70
 
70
71
  if response.response_body
71
72
  response_body = response.response_body
72
-
73
73
  xml_mime = !!(response.headers['Content-Type'] =~ /xml/i)
74
- if xml_mime && response_body.include?("AccountNumber")
75
- response_body = mask_data(response_body)
74
+ json_mime = !!(response.headers['Content-Type'] =~ /json/i)
75
+
76
+ if json_mime
77
+ if response_body.include?("accountNumber")
78
+ response_hash = JSON.parse(response_body)
79
+ response_body = mask_json_data(response_hash).to_json
80
+ end
81
+
82
+ elsif xml_mime
83
+ if response_body.include?("AccountNumber")
84
+ xml_doc = Nokogiri::XML(response_body)
85
+ response_body = mask_xml_data(xml_doc).serialize(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML).sub("\n","").strip
86
+ end
76
87
  end
77
88
 
78
89
  log_str += NEWLINE + response_body.to_s
@@ -89,13 +100,26 @@ module MastercardCoreSdk
89
100
 
90
101
  private
91
102
 
92
- def self.mask_data(response_body)
93
- xmldoc = Nokogiri::XML(response_body)
94
- xmldoc.at("Card").search("AccountNumber").each do |node|
103
+ def self.mask_xml_data(xml_doc)
104
+ xml_doc.at("Card").search("AccountNumber").each do |node|
95
105
  node.content = node.content.gsub(/.(?=\d{4})/,'*')
96
106
  end
97
- response_body = xmldoc.serialize(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML).sub("\n","").strip
98
- return response_body
107
+ return xml_doc
108
+ end
109
+
110
+ def self.mask_json_data(response_hash)
111
+ if response_hash.is_a? Hash
112
+ response_hash.each do |key, value|
113
+ if key == "card" && response_hash[key].key?("accountNumber")
114
+ response_hash["card"]["accountNumber"] = response_hash["card"]["accountNumber"].gsub(/.(?=\d{4})/,'*')
115
+ return response_hash
116
+ elsif value.is_a? Array
117
+ value.each do |hash|
118
+ mask_json_data(hash)
119
+ end
120
+ end
121
+ end
122
+ end
99
123
  end
100
124
 
101
125
  end
@@ -16,7 +16,7 @@ module MastercardCoreSdk
16
16
  # @return [Hash]
17
17
  def query_params=(query_params)
18
18
  if query_params && query_params.params
19
- query_params.params.map{|hash| @query_params.merge!(hash)}
19
+ @query_params.merge!(query_params.params)
20
20
  end
21
21
  end
22
22
 
@@ -61,7 +61,7 @@ module MastercardCoreSdk
61
61
 
62
62
  begin
63
63
  converter = SDKConverterFactory.get_converter(content_type)
64
- errors = converter.response_body_converter(response_body, Errors)
64
+ errors = converter.response_body_converter(error_response.response, Errors)
65
65
  raise SDKResponseError.new(:errors_object => errors, :status_code => response_status_code)
66
66
 
67
67
  rescue SDKConversionError => err
@@ -19,8 +19,8 @@ module MastercardCoreSdk
19
19
  # Attribute mapping from ruby-style variable name to JSON key.
20
20
  def self.attribute_map
21
21
  {
22
- :name => :Name,
23
- :value => :Value
22
+ :name => :name,
23
+ :value => :value
24
24
  }
25
25
  end
26
26
 
@@ -17,7 +17,7 @@ module MastercardCoreSdk
17
17
  # Attribute mapping from ruby-style variable name to JSON key.
18
18
  def self.attribute_map
19
19
  {
20
- :detail => :Detail
20
+ :detail => :detail
21
21
  }
22
22
  end
23
23
 
@@ -38,11 +38,11 @@ module MastercardCoreSdk
38
38
  # Attribute mapping from ruby-style variable name to JSON key.
39
39
  def self.attribute_map
40
40
  {
41
- :description => :Description,
42
- :reason_code => :ReasonCode,
43
- :recoverable => :Recoverable,
44
- :source => :Source,
45
- :details => :Details,
41
+ :description => :description,
42
+ :reason_code => :reasonCode,
43
+ :recoverable => :recoverable,
44
+ :source => :source,
45
+ :details => :details,
46
46
  :extension_point => :ExtensionPoint
47
47
  }
48
48
  end
@@ -16,7 +16,7 @@ module MastercardCoreSdk
16
16
  # Attribute mapping from ruby-style variable name to JSON key.
17
17
  def self.attribute_map
18
18
  {
19
- :error => :Error
19
+ :error => :errors
20
20
  }
21
21
  end
22
22
 
@@ -109,8 +109,8 @@ module MastercardCoreSdk
109
109
  end
110
110
  end
111
111
  else # model
112
- _model = MastercardCoreSdk.const_get(type).new
113
- _model.build_from_hash(value)
112
+ _model = MastercardCoreSdk.const_get(type).new
113
+ _model.build_from_hash(value)
114
114
  end
115
115
  end
116
116
 
@@ -27,8 +27,7 @@ module MastercardCoreSdk
27
27
  @signature_base_string = @auth_header = @signed_signature_base_string = @header = ''
28
28
 
29
29
  headers = api_request.options[:headers]
30
- url = api_request.base_url
31
-
30
+ url = api_request.url
32
31
  body = api_request.options[:body] || ""
33
32
 
34
33
  @api_config = MasterCardApiConfiguration.api_config(headers[ApiConfig::CONFIG_NAME_HEADER])
@@ -0,0 +1,127 @@
1
+ require 'openssl'
2
+ require 'json'
3
+ require 'securerandom'
4
+ require 'base64'
5
+ require_relative '../exceptions/sdk_validation_error'
6
+
7
+ module MastercardCoreSdk
8
+ module Util
9
+ class Jose
10
+
11
+ SEGMENTS = 5
12
+
13
+ class << self
14
+ include MastercardCoreSdk::Core, MastercardCoreSdk::Exceptions
15
+
16
+ attr_accessor :api_config, :alg, :enc, :plain_text, :cipher_text, :private_key, :public_key
17
+ attr_accessor :jwe_protected_header,:cek, :encrypted_cek, :hmac_key, :hmac_input, :aes_enc_key, :iv, :aad, :al, :auth_tag
18
+
19
+ def to_s
20
+ [
21
+ jwe_protected_header,
22
+ encrypted_cek,
23
+ iv,
24
+ cipher_text,
25
+ auth_tag
26
+ ].collect do |segment|
27
+ url_safe_encode64 segment.to_s
28
+ end.join('.')
29
+ end
30
+
31
+ def sha_size
32
+ case enc.to_sym
33
+ when :'A128CBC-HS256'
34
+ 256
35
+ when :'A256CBC-HS512'
36
+ 512
37
+ else
38
+ raise 'Unknown Hash Size'
39
+ end
40
+ end
41
+
42
+ # Returns the Base64Url decoded version of `binary` without padding.
43
+ # @param [String] binary
44
+ # @return [String]
45
+ def url_safe_decode64(binary)
46
+ binary = binary.tr('-_', '+/')
47
+ case binary.bytesize % 4
48
+ when 2
49
+ binary += '=='
50
+ when 3
51
+ binary += '='
52
+ end
53
+ return Base64.decode64(binary)
54
+ end
55
+
56
+ # Returns the Base64Url encoded version of `binary` without padding.
57
+ # @param [String] binary
58
+ # @return [String]
59
+ def url_safe_encode64(binary)
60
+ return Base64.strict_encode64(binary).tr('+/', '-_').delete('=')
61
+ end
62
+
63
+ def decode_compact_serialized(input)
64
+ unless input.count('.') + 1 == SEGMENTS
65
+ raise SDKValidationError.new("Invalid format, should include #{SEGMENTS} segments.")
66
+ end
67
+ header, self.encrypted_cek, self.iv, self.cipher_text, self.auth_tag = input.split('.').collect do |segment|
68
+ url_safe_decode64 segment
69
+ end
70
+ self.aad = input.split('.').first
71
+ self.jwe_protected_header = JSON.load(header)
72
+ end
73
+
74
+ def decrypt(input, private_key)
75
+ decode_compact_serialized input
76
+ self.alg = jwe_protected_header["alg"]
77
+ self.enc = jwe_protected_header["enc"]
78
+ self.private_key = private_key
79
+ cipher = OpenSSL::Cipher.new 'AES-128-CBC'
80
+ cipher.decrypt
81
+ self.cek = private_key.private_decrypt encrypted_cek, OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING
82
+ self.hmac_key, self.aes_enc_key = derive_encryption_and_hmac_keys
83
+ cipher.key = aes_enc_key
84
+ cipher.iv = iv
85
+ self.plain_text = cipher.update(cipher_text) + cipher.final
86
+ self.al = derive_al
87
+ self.hmac_input = [ aad, iv, cipher_text, al ].join
88
+ verify_cbc_authentication_tag!
89
+ return self.plain_text
90
+ end
91
+
92
+ def derive_al
93
+ [(aad.bytesize * 8)].pack('Q>')
94
+ end
95
+
96
+ def derive_encryption_and_hmac_keys
97
+ cek.unpack(
98
+ "a#{cek.length / 2}" * 2
99
+ )
100
+ end
101
+
102
+ def verify_cbc_authentication_tag!
103
+ expected_auth_tag = OpenSSL::HMAC.digest(
104
+ OpenSSL::Digest.new("SHA#{sha_size}"), hmac_key, hmac_input
105
+ )[0, sha_size / 2 / 8]
106
+ unless secure_compare(auth_tag, expected_auth_tag)
107
+ raise SDKValidationError.new(ERR_MSG_JOSE_DECRYPTION)
108
+ end
109
+ end
110
+
111
+ def secure_compare(a, b)
112
+ return false unless a.bytesize == b.bytesize
113
+
114
+ l = a.unpack "C#{a.bytesize}"
115
+
116
+ res = 0
117
+ b.each_byte { |byte| res |= byte ^ l.shift }
118
+ res == 0
119
+ end
120
+
121
+ end
122
+ end
123
+ end
124
+ end
125
+
126
+
127
+
@@ -1,3 +1,3 @@
1
1
  module MastercardCoreSdk
2
- VERSION = "1.3.0"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -10,11 +10,6 @@ require_relative 'mastercard_core_sdk/core/configuration'
10
10
 
11
11
  #tracker
12
12
  require_relative 'mastercard_core_sdk/tracker/api_tracker'
13
- require_relative 'mastercard_core_sdk/tracker/token_api_tracker'
14
-
15
- #api
16
- require_relative 'mastercard_core_sdk/api/request_token_api'
17
- require_relative 'mastercard_core_sdk/api/access_token_api'
18
13
 
19
14
  #client
20
15
  require_relative 'mastercard_core_sdk/client/api_client'
@@ -36,24 +31,26 @@ require_relative 'mastercard_core_sdk/interceptors/api_tracker_builder'
36
31
  require_relative 'mastercard_core_sdk/interceptors/logger_builder'
37
32
 
38
33
  #models
39
- require_relative 'mastercard_core_sdk/models/access_token_response'
40
34
  require_relative 'mastercard_core_sdk/models/detail'
41
35
  require_relative 'mastercard_core_sdk/models/details'
42
36
  require_relative 'mastercard_core_sdk/models/error'
43
37
  require_relative 'mastercard_core_sdk/models/errors'
44
38
  require_relative 'mastercard_core_sdk/models/extension_point'
45
- require_relative 'mastercard_core_sdk/models/request_token_response'
46
39
  require_relative 'mastercard_core_sdk/models/error_response'
47
40
 
48
41
  # OAuth
49
42
  require_relative 'mastercard_core_sdk/oauth/oauth_util'
50
43
  require_relative 'mastercard_core_sdk/oauth/oauth_parameters'
51
44
 
45
+ # OAuth
46
+ require_relative 'mastercard_core_sdk/util/jose'
47
+
52
48
  #converters
53
49
  require_relative 'mastercard_core_sdk/converters/sdk_converter_factory'
54
50
  require_relative 'mastercard_core_sdk/converters/xml_converter'
55
51
  require_relative 'mastercard_core_sdk/converters/json_converter'
56
52
  require_relative 'mastercard_core_sdk/converters/encoded_url_converter'
53
+ require_relative 'mastercard_core_sdk/converters/jose_converter'
57
54
 
58
55
  # MultiConfig Environments
59
56
  require_relative 'mastercard_core_sdk/core/api_config'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mastercard_core_sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
- - MasterCard
7
+ - Mastercard
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-02-23 00:00:00.000000000 Z
11
+ date: 2017-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -132,8 +132,10 @@ dependencies:
132
132
  - - ">="
133
133
  - !ruby/object:Gem::Version
134
134
  version: 1.8.3
135
- description: MasterCard Core API SDK. See https://developer.mastercard.com
136
- email: openapi@mastercard.com
135
+ description: Mastercard Core API SDK.
136
+ email:
137
+ - support@masterpass.com
138
+ - merchant_support@masterpass.com
137
139
  executables: []
138
140
  extensions: []
139
141
  extra_rdoc_files:
@@ -143,11 +145,10 @@ files:
143
145
  - LICENSE.txt
144
146
  - README.md
145
147
  - lib/mastercard_core_sdk.rb
146
- - lib/mastercard_core_sdk/api/access_token_api.rb
147
- - lib/mastercard_core_sdk/api/request_token_api.rb
148
148
  - lib/mastercard_core_sdk/client/api_client.rb
149
149
  - lib/mastercard_core_sdk/constants/constants.rb
150
150
  - lib/mastercard_core_sdk/converters/encoded_url_converter.rb
151
+ - lib/mastercard_core_sdk/converters/jose_converter.rb
151
152
  - lib/mastercard_core_sdk/converters/json_converter.rb
152
153
  - lib/mastercard_core_sdk/converters/sdk_converter_factory.rb
153
154
  - lib/mastercard_core_sdk/converters/xml_converter.rb
@@ -168,22 +169,20 @@ files:
168
169
  - lib/mastercard_core_sdk/interceptors/api_tracker_builder.rb
169
170
  - lib/mastercard_core_sdk/interceptors/logger_builder.rb
170
171
  - lib/mastercard_core_sdk/interceptors/signature_builder.rb
171
- - lib/mastercard_core_sdk/models/access_token_response.rb
172
172
  - lib/mastercard_core_sdk/models/detail.rb
173
173
  - lib/mastercard_core_sdk/models/details.rb
174
174
  - lib/mastercard_core_sdk/models/error.rb
175
175
  - lib/mastercard_core_sdk/models/error_response.rb
176
176
  - lib/mastercard_core_sdk/models/errors.rb
177
177
  - lib/mastercard_core_sdk/models/extension_point.rb
178
- - lib/mastercard_core_sdk/models/request_token_response.rb
179
178
  - lib/mastercard_core_sdk/oauth/oauth_parameters.rb
180
179
  - lib/mastercard_core_sdk/oauth/oauth_util.rb
181
180
  - lib/mastercard_core_sdk/tracker/api_tracker.rb
182
- - lib/mastercard_core_sdk/tracker/token_api_tracker.rb
181
+ - lib/mastercard_core_sdk/util/jose.rb
183
182
  - lib/mastercard_core_sdk/version.rb
184
183
  homepage: https://developer.mastercard.com
185
184
  licenses:
186
- - MasterCard
185
+ - Mastercard
187
186
  metadata: {}
188
187
  post_install_message:
189
188
  rdoc_options: []
@@ -193,7 +192,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
193
192
  requirements:
194
193
  - - ">="
195
194
  - !ruby/object:Gem::Version
196
- version: '0'
195
+ version: 2.2.4
197
196
  required_rubygems_version: !ruby/object:Gem::Requirement
198
197
  requirements:
199
198
  - - ">="
@@ -204,5 +203,5 @@ rubyforge_project:
204
203
  rubygems_version: 2.4.5.1
205
204
  signing_key:
206
205
  specification_version: 4
207
- summary: MasterCard Core API SDK
206
+ summary: Mastercard Core API SDK
208
207
  test_files: []
@@ -1,38 +0,0 @@
1
- require_relative '../core/service_request'
2
- require_relative '../client/api_client'
3
- require_relative '../exceptions/error_handler'
4
- require_relative '../models/access_token_response'
5
-
6
- module MastercardCoreSdk
7
- module Api
8
- # Invokes AccessTokenApi.
9
- class AccessTokenApi
10
- include MastercardCoreSdk::Core, MastercardCoreSdk::Client, MastercardCoreSdk::Exceptions, MastercardCoreSdk::Tracker
11
-
12
- # This API call is used to exchange a request token for a long access token from the Masterpass service.
13
- # For Pairing during checkout, this service will need to be called twice:
14
- # 1. To request the checkout access token, which is used to retrieve checkout data.
15
- # 2. To request the long access token, which is used to retrieve precheckout data.
16
- # You will need the Request Token (oauth_token) and Verifier (oauth_verifier) from the merchant callback to get an access token.
17
- #
18
- # @note Since version 1.2.0, the method signature for {create} has changed.
19
- # @param oauth_token the oauth token, which is used to retrieve checkout data.
20
- # @param oauth_verifier the oauth verifier.
21
- # @param api_config Optional ApiConfig object.
22
- # @return [AccessTokenResponse]
23
- def self.create(oauth_token, oauth_verifier, api_config = nil)
24
- path = "/oauth/consumer/v1/access_token"
25
-
26
- service_request = ServiceRequest.new
27
- service_request.headers = {"oauth_verifier" => oauth_verifier, "oauth_token" => oauth_token}
28
- service_request.content_type = "application/xml"
29
- api_client = ApiClient.new(api_config)
30
-
31
- api_client.api_tracker = TokenApiTracker.new
32
- api_client.error_handler = ErrorHandler.new
33
- return api_client.call(path, service_request, "POST", AccessTokenResponse)
34
- end
35
-
36
- end
37
- end
38
- end
@@ -1,33 +0,0 @@
1
- require_relative '../core/service_request'
2
- require_relative '../client/api_client'
3
- require_relative '../exceptions/error_handler'
4
- require_relative '../models/request_token_response'
5
-
6
- module MastercardCoreSdk
7
- module Api
8
- # Invokes RequestTokenApi.
9
- class RequestTokenApi
10
- include MastercardCoreSdk::Core, MastercardCoreSdk::Client, MastercardCoreSdk::Exceptions, MastercardCoreSdk::Tracker
11
-
12
- # This api call used to get the request token.This must be executed when a
13
- # consumer clicks Buy with MasterPass or Connect with MasterPass buttons on your site/app.
14
- #
15
- # @param oauth_callback_url the oauth callback URL.
16
- # @param api_config Optional ApiConfig object.
17
- # @return [RequestTokenResponse]
18
- def self.create(oauth_callback_url, api_config = nil)
19
- path = "/oauth/consumer/v1/request_token"
20
-
21
- service_request = ServiceRequest.new
22
- service_request.headers = {"oauth_callback" => oauth_callback_url}
23
- service_request.content_type = "application/xml"
24
- api_client = ApiClient.new(api_config)
25
-
26
- api_client.api_tracker = TokenApiTracker.new
27
- api_client.error_handler = ErrorHandler.new
28
- return api_client.call(path, service_request, "POST", RequestTokenResponse)
29
- end
30
-
31
- end
32
- end
33
- end
@@ -1,148 +0,0 @@
1
- module MastercardCoreSdk
2
-
3
- # Defines attributes for access token response.
4
- class AccessTokenResponse
5
-
6
- # @!attribute oauth_token_secret
7
- # @return [String]
8
- attr_accessor :oauth_token_secret
9
-
10
- # @!attribute oauth_token
11
- # @return [String]
12
- attr_accessor :oauth_token
13
-
14
- # Attribute mapping from ruby-style variable name to JSON key.
15
- def self.attribute_map
16
- {
17
- :oauth_token => :OauthToken,
18
- :oauth_token_secret => :OauthTokenSecret
19
- }
20
- end
21
-
22
- #Initializing object attributes.
23
- def initialize(attributes = {})
24
- return unless attributes.is_a?(Hash)
25
- # convert string to symbol for hash key
26
- attributes = attributes.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
27
- self.class.datatype_map.each_pair do |key, type|
28
- if attributes.has_key?(key)
29
- send "#{key}=", _deserialize(type, attributes[key])
30
- end
31
- end
32
- end
33
-
34
- # Check equality by comparing each attribute.
35
- def ==(o)
36
- return true if self.equal?(o)
37
- self.class == o.class &&
38
- oauth_token == o.oauth_token &&
39
- oauth_token_secret == o.oauth_token_secret
40
- end
41
-
42
- # @see the `==` method
43
- def eql?(o)
44
- self == o
45
- end
46
-
47
- # Calculate hash code according to all attributes.
48
- def hash
49
- [oauth_token, oauth_token_secret].hash
50
- end
51
-
52
- # build the object from hash
53
- def build_from_hash(attributes)
54
- return nil unless attributes.is_a?(Hash)
55
- self.class.datatype_map.each_pair do |key, type|
56
- if type =~ /^Array<(.*)>/i
57
- if attributes[self.class.attribute_map[key]].is_a?(Array)
58
- self.send("#{key}=", attributes[self.class.attribute_map[key]].map{ |v| _deserialize($1, v) } )
59
- else
60
- #TODO show warning in debug mode
61
- end
62
- elsif !attributes[self.class.attribute_map[key]].nil?
63
- self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
64
- else
65
- # data not found in attributes(hash), not an issue as the data can be optional
66
- end
67
- end
68
- self
69
- end
70
-
71
- def _deserialize(type, value)
72
- case type.to_sym
73
- when :DateTime
74
- DateTime.parse(value)
75
- when :Date
76
- Date.parse(value)
77
- when :String
78
- value.to_s
79
- when :Integer
80
- value.to_i
81
- when :Float
82
- value.to_f
83
- when :BOOLEAN
84
- !!(value.to_s =~ /^(true|t|yes|y|1)$/i)
85
- when /\AArray<(?<inner_type>.+)>\z/
86
- inner_type = Regexp.last_match[:inner_type]
87
- value.map { |v| _deserialize(inner_type, v) }
88
- when /\AHash<(?<k_type>.+), (?<v_type>.+)>\z/
89
- k_type = Regexp.last_match[:k_type]
90
- v_type = Regexp.last_match[:v_type]
91
- {}.tap do |hash|
92
- value.each do |k, v|
93
- hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
94
- end
95
- end
96
- else # model
97
- _model = MastercardCoreSdk.const_get(type).new
98
- _model.build_from_hash(value)
99
- end
100
- end
101
-
102
- def to_s
103
- to_hash.to_s
104
- end
105
-
106
- # to_body is an alias to to_body (backward compatibility))
107
- def to_body
108
- to_hash
109
- end
110
-
111
- # return the object in the form of hash
112
- def to_hash
113
- hash = {}
114
- self.class.attribute_map.each_pair do |attr, param|
115
- value = self.send(attr)
116
- next if value.nil?
117
- hash[param] = _to_hash(value)
118
- end
119
- hash
120
- end
121
-
122
- # Method to output non-array value in the form of hash
123
- # For object, use to_hash. Otherwise, just return the value
124
- def _to_hash(value)
125
- if value.is_a?(Array)
126
- value.compact.map{ |v| _to_hash(v) }
127
- elsif value.is_a?(Hash)
128
- {}.tap do |hash|
129
- value.each { |k, v| hash[k] = _to_hash(v) }
130
- end
131
- elsif value.respond_to? :to_hash
132
- value.to_hash
133
- else
134
- value
135
- end
136
- end
137
-
138
- private
139
- # Attribute to datatype mapping.
140
- def self.datatype_map
141
- {
142
- :oauth_token => 'String',
143
- :oauth_token_secret => 'String'
144
- }
145
- end
146
-
147
- end
148
- end
@@ -1,170 +0,0 @@
1
- require 'uri'
2
-
3
- module MastercardCoreSdk
4
-
5
- # Defines attributes for request token response.
6
- class RequestTokenResponse
7
-
8
- # @!attribute xoauth_request_auth_url
9
- # @return [String]
10
- attr_accessor :xoauth_request_auth_url
11
-
12
- # @!attribute oauth_token
13
- # @return [String]
14
- attr_accessor :oauth_token
15
-
16
- # @!attribute oauth_token_secret
17
- # @return [String]
18
- attr_accessor :oauth_token_secret
19
-
20
- # @!attribute oauth_expires_in
21
- # @return [Integer] no. of seconds after which oauth_token expires
22
- attr_accessor :oauth_expires_in
23
-
24
- # @!attribute oauth_callback_confirmed
25
- # @return [Boolean]
26
- attr_accessor :oauth_callback_confirmed
27
-
28
- # Attribute mapping from ruby-style variable name to JSON key.
29
- def self.attribute_map
30
- {
31
- :xoauth_request_auth_url => :XoauthRequestAuthUrl,
32
- :oauth_token => :OauthToken,
33
- :oauth_token_secret => :OauthTokenSecret,
34
- :oauth_expires_in => :OauthExpiresIn,
35
- :oauth_callback_confirmed => :OauthCallbackConfirmed
36
- }
37
- end
38
-
39
- #Initializing object attributes with response parameters
40
- def initialize(attributes = {})
41
- return unless attributes.is_a?(Hash)
42
- # convert string to symbol for hash key
43
- attributes = attributes.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
44
- self.class.datatype_map.each_pair do |key, type|
45
- if attributes.has_key?(key)
46
- send "#{key}=", (key.to_s == "xoauth_request_auth_url") ? URI.decode(_deserialize(type, attributes[key])) : _deserialize(type, attributes[key])
47
- end
48
- end
49
- end
50
-
51
- # Check equality by comparing each attribute.
52
- def ==(o)
53
- return true if self.equal?(o)
54
- self.class == o.class &&
55
- xoauth_request_auth_url == o.xoauth_request_auth_url &&
56
- oauth_token == o.oauth_token &&
57
- oauth_token_secret == o.oauth_token_secret &&
58
- oauth_expires_in == o.oauth_expires_in &&
59
- oauth_callback_confirmed == o.oauth_callback_confirmed
60
- end
61
-
62
- # @see the `==` method
63
- def eql?(o)
64
- self == o
65
- end
66
-
67
- # Calculate hash code according to all attributes.
68
- def hash
69
- [currency_code, subtotal, shopping_cart_item, extension_point].hash
70
- end
71
-
72
- # build the object from hash
73
- def build_from_hash(attributes)
74
- return nil unless attributes.is_a?(Hash)
75
- self.class.datatype_map.each_pair do |key, type|
76
- if type =~ /^Array<(.*)>/i
77
- if attributes[self.class.attribute_map[key]].is_a?(Array)
78
- self.send("#{key}=", attributes[self.class.attribute_map[key]].map{ |v| _deserialize($1, v) } )
79
- else
80
- #TODO show warning in debug mode
81
- end
82
- elsif !attributes[self.class.attribute_map[key]].nil?
83
- self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
84
- else
85
- # data not found in attributes(hash), not an issue as the data can be optional
86
- end
87
- end
88
- self
89
- end
90
-
91
- def _deserialize(type, value)
92
- case type.to_sym
93
- when :DateTime
94
- DateTime.parse(value)
95
- when :Date
96
- Date.parse(value)
97
- when :String
98
- value.to_s
99
- when :Integer
100
- value.to_i
101
- when :Float
102
- value.to_f
103
- when :BOOLEAN
104
- !!(value.to_s =~ /^(true|t|yes|y|1)$/i)
105
- when /\AArray<(?<inner_type>.+)>\z/
106
- inner_type = Regexp.last_match[:inner_type]
107
- value.map { |v| _deserialize(inner_type, v) }
108
- when /\AHash<(?<k_type>.+), (?<v_type>.+)>\z/
109
- k_type = Regexp.last_match[:k_type]
110
- v_type = Regexp.last_match[:v_type]
111
- {}.tap do |hash|
112
- value.each do |k, v|
113
- hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
114
- end
115
- end
116
- else # model
117
- _model = MastercardCoreSdk.const_get(type).new
118
- _model.build_from_hash(value)
119
- end
120
- end
121
-
122
- def to_s
123
- to_hash.to_s
124
- end
125
-
126
- # to_body is an alias to to_body (backward compatibility))
127
- def to_body
128
- to_hash
129
- end
130
-
131
- # return the object in the form of hash
132
- def to_hash
133
- hash = {}
134
- self.class.attribute_map.each_pair do |attr, param|
135
- value = self.send(attr)
136
- next if value.nil?
137
- hash[param] = _to_hash(value)
138
- end
139
- hash
140
- end
141
-
142
- # Method to output non-array value in the form of hash
143
- # For object, use to_hash. Otherwise, just return the value
144
- def _to_hash(value)
145
- if value.is_a?(Array)
146
- value.compact.map{ |v| _to_hash(v) }
147
- elsif value.is_a?(Hash)
148
- {}.tap do |hash|
149
- value.each { |k, v| hash[k] = _to_hash(v) }
150
- end
151
- elsif value.respond_to? :to_hash
152
- value.to_hash
153
- else
154
- value
155
- end
156
- end
157
-
158
- private
159
- # Attribute to datatype mapping.
160
- def self.datatype_map
161
- {
162
- :xoauth_request_auth_url => 'String',
163
- :oauth_token => 'String',
164
- :oauth_token_secret => 'String',
165
- :oauth_expires_in => 'Integer',
166
- :oauth_callback_confirmed => 'BOOLEAN'
167
- }
168
- end
169
- end
170
- end
@@ -1,52 +0,0 @@
1
- require_relative '../core/mastercard_api_configuration'
2
- require_relative '../tracker/api_tracker'
3
-
4
- module MastercardCoreSdk
5
- module Tracker
6
- # Provides tracking api information and user-agent information for Token services.
7
- class TokenApiTracker
8
- include MastercardCoreSdk::Core, MastercardCoreSdk::Tracker::ApiTracker
9
-
10
- # Defines the programming language.
11
- #
12
- # @return [String]
13
- attr_accessor :language
14
-
15
- # Defines the programming language version.
16
- #
17
- # @return [String]
18
- attr_accessor :language_version
19
-
20
- # Defines the plugin version if any defined in {MasterCardApiConfiguration} as additional_properties.
21
- #
22
- # @return [String]
23
- attr_reader :plugin_version
24
-
25
- def initialize
26
- @language = "Ruby"
27
- @language_version = RUBY_VERSION
28
-
29
- additional_track_info = MasterCardApiConfiguration.additional_properties
30
- if (additional_track_info && additional_track_info.size > 0 && additional_track_info.key?(PLUGIN_VERSION))
31
- @plugin_version = additional_track_info[PLUGIN_VERSION]
32
- end
33
- end
34
-
35
- # Overriding {ApiTracker#tracking_info} method.
36
- # Get tracking information set in User-Agent header.
37
- # @return [String]
38
- def tracking_info
39
- api_tracker_string = LANG_NAME + language + SEPERATOR + LANG_VERSION + language_version
40
- api_tracker_string += SEPERATOR + PLUGIN_VERSION + EQUAL + plugin_version unless plugin_version.nil?
41
- return api_tracker_string
42
- end
43
-
44
- # Overriding {ApiTracker#user_agent_info} method.
45
- #
46
- # @return [String]
47
- def user_agent_info
48
- return USER_AGENT
49
- end
50
- end
51
- end
52
- end