mastercard_core_sdk 1.3.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +6 -7
- data/lib/mastercard_core_sdk/client/api_client.rb +8 -6
- data/lib/mastercard_core_sdk/constants/constants.rb +5 -0
- data/lib/mastercard_core_sdk/converters/encoded_url_converter.rb +1 -1
- data/lib/mastercard_core_sdk/converters/jose_converter.rb +96 -0
- data/lib/mastercard_core_sdk/converters/json_converter.rb +10 -1
- data/lib/mastercard_core_sdk/converters/sdk_converter_factory.rb +12 -1
- data/lib/mastercard_core_sdk/converters/xml_converter.rb +1 -1
- data/lib/mastercard_core_sdk/core/api_config.rb +4 -2
- data/lib/mastercard_core_sdk/core/api_config_builder.rb +11 -3
- data/lib/mastercard_core_sdk/core/mastercard_api_configuration.rb +2 -1
- data/lib/mastercard_core_sdk/core/request_response_logger.rb +33 -9
- data/lib/mastercard_core_sdk/core/service_request.rb +1 -1
- data/lib/mastercard_core_sdk/exceptions/error_handler.rb +1 -1
- data/lib/mastercard_core_sdk/models/detail.rb +2 -2
- data/lib/mastercard_core_sdk/models/details.rb +1 -1
- data/lib/mastercard_core_sdk/models/error.rb +5 -5
- data/lib/mastercard_core_sdk/models/errors.rb +3 -3
- data/lib/mastercard_core_sdk/oauth/oauth_util.rb +1 -2
- data/lib/mastercard_core_sdk/util/jose.rb +127 -0
- data/lib/mastercard_core_sdk/version.rb +1 -1
- data/lib/mastercard_core_sdk.rb +4 -7
- metadata +12 -13
- data/lib/mastercard_core_sdk/api/access_token_api.rb +0 -38
- data/lib/mastercard_core_sdk/api/request_token_api.rb +0 -33
- data/lib/mastercard_core_sdk/models/access_token_response.rb +0 -148
- data/lib/mastercard_core_sdk/models/request_token_response.rb +0 -170
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7304d039b64910aa3f8fc16a2f798172480f61e8
|
4
|
+
data.tar.gz: e678aba02e0b2af6ae4fa6e13c8305c8a433954e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24adf61809aac72ed89494f5e954bacd94b1dda3e5ed62ce9203f1221f75a87a7af0432f5a24acc9b17a55c7e4129347ce20b526430d8e5c2a2dca8a5ffbf06d
|
7
|
+
data.tar.gz: 3691d34e13f729bb6d9f89be6e02ac60f2bdeb396677332dc89f62ec73ed46593c25197d59eae6a91154dec973e480e9be7960ce2d162246e71c063f942cefee
|
data/LICENSE.txt
CHANGED
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 -
|
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 [
|
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
|
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
|
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)
|
56
|
+
Copyright (c) 2017, MasterCard International Incorporated. See LICENSE for details.
|
58
57
|
|
59
58
|
## LICENSE
|
60
|
-
Copyright (c)
|
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
|
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
|
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
|
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
|
-
|
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
|
-
|
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
|
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
|
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
|
-
|
75
|
-
|
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.
|
93
|
-
|
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
|
-
|
98
|
-
|
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
|
@@ -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(
|
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
|
@@ -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 => :
|
42
|
-
:reason_code => :
|
43
|
-
:recoverable => :
|
44
|
-
:source => :
|
45
|
-
: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 => :
|
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
|
-
|
113
|
-
|
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.
|
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
|
+
|
data/lib/mastercard_core_sdk.rb
CHANGED
@@ -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:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Mastercard
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
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:
|
136
|
-
email:
|
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/
|
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
|
-
-
|
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:
|
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:
|
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
|