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.
- 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
|