mastercard_core_sdk 2.0.0 → 2.1.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 +2 -2
- data/lib/mastercard_core_sdk.rb +3 -3
- data/lib/mastercard_core_sdk/client/api_client.rb +4 -4
- data/lib/mastercard_core_sdk/constants/constants.rb +5 -4
- data/lib/mastercard_core_sdk/converters/encoded_url_converter.rb +1 -1
- data/lib/mastercard_core_sdk/converters/json_converter.rb +14 -4
- data/lib/mastercard_core_sdk/converters/sdk_converter_factory.rb +0 -11
- data/lib/mastercard_core_sdk/core/mastercard_api_configuration.rb +5 -0
- data/lib/mastercard_core_sdk/core/proxy_config.rb +34 -0
- data/lib/mastercard_core_sdk/oauth/oauth_util.rb +3 -5
- data/lib/mastercard_core_sdk/util/jwe_util.rb +56 -0
- data/lib/mastercard_core_sdk/version.rb +1 -1
- metadata +38 -5
- data/lib/mastercard_core_sdk/converters/jose_converter.rb +0 -96
- data/lib/mastercard_core_sdk/util/jose.rb +0 -127
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0a1a32938c92a314feadfbf5c46bc304491c1816
|
4
|
+
data.tar.gz: 92fdcf8f20d8741a82cb46c5b107dfabc61b8f5e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce672fd31f12e542368e524684f074634a2bb9e09cb1692c5c532e843db80e567efdeb69215fa49dc227445a55493da6c564c8b1a6280505520d3bbb29689e7c
|
7
|
+
data.tar.gz: c5136d0d37273b6e53499076a907bef2202e8b08946dcfafe62f5e8b71d9be11194f6d1cc10709b175942ddce204d86e2b7b7ca06760b38e510a96792a77a63f
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -53,10 +53,10 @@ MasterCardApiConfiguration.sandbox = false #By default Sandbox environment is s
|
|
53
53
|
```
|
54
54
|
|
55
55
|
## Copyright
|
56
|
-
Copyright (c)
|
56
|
+
Copyright (c) 2018, MasterCard International Incorporated. See LICENSE for details.
|
57
57
|
|
58
58
|
## LICENSE
|
59
|
-
Copyright (c)
|
59
|
+
Copyright (c) 2018, MasterCard International Incorporated. All rights reserved.
|
60
60
|
|
61
61
|
Redistribution and use in source and binary forms, with or without modification, are
|
62
62
|
permitted provided that the following conditions are met:
|
data/lib/mastercard_core_sdk.rb
CHANGED
@@ -7,6 +7,7 @@ require_relative 'mastercard_core_sdk/core/request_response_logger'
|
|
7
7
|
require_relative 'mastercard_core_sdk/core/query_params'
|
8
8
|
require_relative 'mastercard_core_sdk/core/service_request'
|
9
9
|
require_relative 'mastercard_core_sdk/core/configuration'
|
10
|
+
require_relative 'mastercard_core_sdk/core/proxy_config'
|
10
11
|
|
11
12
|
#tracker
|
12
13
|
require_relative 'mastercard_core_sdk/tracker/api_tracker'
|
@@ -42,15 +43,14 @@ require_relative 'mastercard_core_sdk/models/error_response'
|
|
42
43
|
require_relative 'mastercard_core_sdk/oauth/oauth_util'
|
43
44
|
require_relative 'mastercard_core_sdk/oauth/oauth_parameters'
|
44
45
|
|
45
|
-
#
|
46
|
-
require_relative 'mastercard_core_sdk/util/
|
46
|
+
# Util
|
47
|
+
require_relative 'mastercard_core_sdk/util/jwe_util'
|
47
48
|
|
48
49
|
#converters
|
49
50
|
require_relative 'mastercard_core_sdk/converters/sdk_converter_factory'
|
50
51
|
require_relative 'mastercard_core_sdk/converters/xml_converter'
|
51
52
|
require_relative 'mastercard_core_sdk/converters/json_converter'
|
52
53
|
require_relative 'mastercard_core_sdk/converters/encoded_url_converter'
|
53
|
-
require_relative 'mastercard_core_sdk/converters/jose_converter'
|
54
54
|
|
55
55
|
# MultiConfig Environments
|
56
56
|
require_relative 'mastercard_core_sdk/core/api_config'
|
@@ -7,17 +7,17 @@ require_relative '../models/error_response'
|
|
7
7
|
require_relative '../core/mastercard_authenticator'
|
8
8
|
require_relative '../core/mastercard_api_configuration'
|
9
9
|
require_relative '../core/api_config'
|
10
|
+
require_relative '../core/proxy_config'
|
10
11
|
require_relative '../interceptors/signature_builder'
|
11
12
|
require_relative '../interceptors/logger_builder'
|
12
13
|
require_relative '../interceptors/api_tracker_builder'
|
13
14
|
require_relative '../converters/sdk_converter_factory'
|
14
|
-
require_relative '../util/jose'
|
15
15
|
|
16
16
|
module MastercardCoreSdk
|
17
17
|
module Client
|
18
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.
|
19
19
|
class ApiClient
|
20
|
-
include MastercardCoreSdk::
|
20
|
+
include MastercardCoreSdk::Core, MastercardCoreSdk::Interceptors, MastercardCoreSdk::Converters, MastercardCoreSdk::Tracker
|
21
21
|
|
22
22
|
@@logger = Logging.logger[self]
|
23
23
|
|
@@ -67,7 +67,6 @@ module MastercardCoreSdk
|
|
67
67
|
# @return [String] Response body
|
68
68
|
def call(path, service_request, http_method, return_type)
|
69
69
|
request = build_request(http_method, path, service_request, @api_config)
|
70
|
-
Jose.api_config = @api_config
|
71
70
|
response_body, response_code, response_headers = call_api(request, return_type)
|
72
71
|
|
73
72
|
return response_body
|
@@ -131,7 +130,8 @@ module MastercardCoreSdk
|
|
131
130
|
:sslkey => @config.key_file
|
132
131
|
}
|
133
132
|
req_opts[:cainfo] = @config.ssl_ca_cert if @config.ssl_ca_cert
|
134
|
-
|
133
|
+
req_opts.merge!(MasterCardApiConfiguration.proxy_config.options) if MasterCardApiConfiguration.proxy_config
|
134
|
+
|
135
135
|
if [:post, :patch, :put, :delete].include?(http_method)
|
136
136
|
req_body = build_request_body(request)
|
137
137
|
req_opts.update :body => req_body
|
@@ -12,7 +12,7 @@ module MastercardCoreSdk
|
|
12
12
|
OAUTH_NONCE = 'oauth_nonce'
|
13
13
|
OAUTH_SIGNATURE = 'oauth_signature'
|
14
14
|
OAUTH_SIGNATURE_METHOD = 'oauth_signature_method'
|
15
|
-
|
15
|
+
OAUTH_SIGNATURE_METHOD_RSA_SHA256 = 'RSA-SHA256'
|
16
16
|
OAUTH_TIMESTAMP = 'oauth_timestamp'
|
17
17
|
OAUTH_VERSION = 'oauth_version'
|
18
18
|
OAUTH_VERSION_VAL = '1.0'
|
@@ -83,8 +83,6 @@ module MastercardCoreSdk
|
|
83
83
|
ERR_MSG_CONVERSION = "Conversion failed."
|
84
84
|
ERR_MSG_API_CONFIG = "Api Config cannot be null."
|
85
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."
|
88
86
|
|
89
87
|
NULL_RESPONSE_PARAMETERS_ERROR = "Response parameters cannot be null."
|
90
88
|
NULL_OAUTH_PARAMETERS_ERROR = "Oauth parameters cannot be null."
|
@@ -96,5 +94,8 @@ module MastercardCoreSdk
|
|
96
94
|
CONTENT_TYPE_JOSE = "JOSE"
|
97
95
|
ERR_MSG_CONTENT_TYPE = "Content-type is not supported :"
|
98
96
|
|
99
|
-
|
97
|
+
EMPTY_JWE_PAYLOAD_ERR = "JWE encrypted payload should not be null."
|
98
|
+
EMPTY_JWE_PRIVATE_KEY_ERR = "Private key should not be null."
|
99
|
+
EMPTY_JWE_RESPONSE_TYPE_ERR = "Response type should not be null."
|
100
|
+
|
100
101
|
end
|
@@ -38,7 +38,7 @@ module MastercardCoreSdk
|
|
38
38
|
def parse_response_params(response_params)
|
39
39
|
response_params_hash = {}
|
40
40
|
if response_params.empty?
|
41
|
-
raise
|
41
|
+
raise SDKOAuthError.new(NULL_OAUTH_PARAMETERS_ERROR)
|
42
42
|
else
|
43
43
|
if response_params.is_a?(String) && response_params.match(/&/)
|
44
44
|
response_params_arr = response_params.split('&').compact
|
@@ -38,17 +38,27 @@ module MastercardCoreSdk
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
# Convert the response to the given return type.
|
41
|
+
# Convert the response_body from Typhoeus response to the given return type.
|
42
42
|
#
|
43
|
-
# @param
|
43
|
+
# @param response the Typhoeus response object.
|
44
|
+
# @param return_type some examples: "User", "Array[User]", "Hash[String,Integer]".
|
44
45
|
def response_body_converter(response, return_type)
|
45
46
|
body = response.response_body
|
46
47
|
return nil if body.nil? || body.empty?
|
48
|
+
response_content_converter(body, return_type)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Convert the response to the given return type.
|
52
|
+
#
|
53
|
+
# @param response_body the response from API.
|
54
|
+
# @param return_type some examples: "User", "Array[User]", "Hash[String,Integer]".
|
55
|
+
def response_content_converter(response_body, return_type)
|
56
|
+
return nil if response_body.nil? || response_body.empty?
|
47
57
|
begin
|
48
|
-
data = JSON.parse("[#{
|
58
|
+
data = JSON.parse("[#{response_body}]", :symbolize_names => true)[0]
|
49
59
|
rescue JSON::ParserError => e
|
50
60
|
if %w(String Date DateTime).include?(return_type.to_s)
|
51
|
-
data =
|
61
|
+
data = response_body
|
52
62
|
else
|
53
63
|
@@logger.error e.message
|
54
64
|
raise SDKConversionError.new(:error_message => e.message, :source => self.class)
|
@@ -26,8 +26,6 @@ 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
|
31
29
|
else
|
32
30
|
@@logger.debug "#{ERR_MSG_CONTENT_TYPE} #{content_type}"
|
33
31
|
raise SDKConversionError.new(:error_message => "#{ERR_MSG_CONTENT_TYPE} #{content_type}", :source => self.class)
|
@@ -59,8 +57,6 @@ module MastercardCoreSdk
|
|
59
57
|
mime_sub_type = CONTENT_TYPE_XML
|
60
58
|
elsif urlencoded_mime?(mime)
|
61
59
|
mime_sub_type = CONTENT_TYPE_URL_ENCODED
|
62
|
-
elsif jose_mime?(mime)
|
63
|
-
mime_sub_type = CONTENT_TYPE_JOSE
|
64
60
|
else
|
65
61
|
@@logger.debug "#{ERR_MSG_CONTENT_TYPE} #{mime}"
|
66
62
|
raise SDKConversionError.new(:error_message => "#{ERR_MSG_CONTENT_TYPE} #{mime}", :source => self.class)
|
@@ -89,13 +85,6 @@ module MastercardCoreSdk
|
|
89
85
|
!!(mime =~ /www-form-urlencoded/i)
|
90
86
|
end
|
91
87
|
|
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
|
-
|
99
88
|
end
|
100
89
|
end
|
101
90
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'logging'
|
2
2
|
require_relative '../exceptions/sdk_validation_error'
|
3
3
|
require_relative 'api_config_builder'
|
4
|
+
require_relative 'proxy_config'
|
4
5
|
|
5
6
|
module MastercardCoreSdk
|
6
7
|
module Core
|
@@ -31,6 +32,9 @@ module MastercardCoreSdk
|
|
31
32
|
# Determines if environment is Sandbox.
|
32
33
|
attr_accessor :sandbox
|
33
34
|
|
35
|
+
# Defines [ProxyConfig] configurations.
|
36
|
+
attr_accessor :proxy_config
|
37
|
+
|
34
38
|
# Validates private key, consumer key and host_url for api_config.
|
35
39
|
# @raise [SDKValidationError] if validation fails
|
36
40
|
def validate_config(config)
|
@@ -88,6 +92,7 @@ module MastercardCoreSdk
|
|
88
92
|
self.additional_properties = {}
|
89
93
|
self.configs = {}
|
90
94
|
self.sandbox = true
|
95
|
+
self.proxy_config = nil
|
91
96
|
|
92
97
|
# Initialize builders hash with sandbox/production environment configurations.
|
93
98
|
@@builders = {}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module MastercardCoreSdk
|
2
|
+
module Core
|
3
|
+
# Set proxy configurations for Typhoeus Request.
|
4
|
+
class ProxyConfig
|
5
|
+
|
6
|
+
# Set uri scheme,hostname, port in proxy configuration
|
7
|
+
# @example : "http://127.0.0.1:3000"
|
8
|
+
attr_accessor :proxy
|
9
|
+
|
10
|
+
# Set username, password for basic authentication in proxy
|
11
|
+
# @example : "username:password"
|
12
|
+
attr_accessor :proxyuserpwd
|
13
|
+
|
14
|
+
# Hash of proxy configurations.
|
15
|
+
# @example : {:proxy => "http://127.0.0.1:3000", :proxyuserpwd => "username:password"}
|
16
|
+
attr_reader :options
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@proxy = nil
|
20
|
+
@proxyuserpwd = nil
|
21
|
+
@options = {}
|
22
|
+
end
|
23
|
+
|
24
|
+
# Set Proxy options for MasterCardApiConfiguration.
|
25
|
+
# @return [Hash]
|
26
|
+
def options
|
27
|
+
@options[:proxy] = @proxy if @proxy
|
28
|
+
@options[:proxyuserpwd] = @proxyuserpwd if @proxyuserpwd
|
29
|
+
return @options
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -23,7 +23,6 @@ module MastercardCoreSdk
|
|
23
23
|
# @param api_request
|
24
24
|
# @return [Typhoeus::Request]
|
25
25
|
def build_request_header(api_request)
|
26
|
-
|
27
26
|
@signature_base_string = @auth_header = @signed_signature_base_string = @header = ''
|
28
27
|
|
29
28
|
headers = api_request.options[:headers]
|
@@ -49,7 +48,7 @@ module MastercardCoreSdk
|
|
49
48
|
oparams.add_parameter(OAUTH_CONSUMER_KEY, @api_config.consumer_key)
|
50
49
|
oparams.add_parameter(OAUTH_NONCE, generate_nonce)
|
51
50
|
oparams.add_parameter(OAUTH_TIMESTAMP, generate_timestamp)
|
52
|
-
oparams.add_parameter(OAUTH_SIGNATURE_METHOD,
|
51
|
+
oparams.add_parameter(OAUTH_SIGNATURE_METHOD, OAUTH_SIGNATURE_METHOD_RSA_SHA256)
|
53
52
|
oparams.add_parameter(OAUTH_VERSION, OAUTH_VERSION_VAL)
|
54
53
|
oparams
|
55
54
|
end
|
@@ -93,7 +92,7 @@ module MastercardCoreSdk
|
|
93
92
|
if @signature_base_string == nil || @signature_base_string.length == 0
|
94
93
|
raise OAuthError("Signature Base String May Not Be Null.")
|
95
94
|
end
|
96
|
-
digest = OpenSSL::Digest::
|
95
|
+
digest = OpenSSL::Digest::SHA256.new
|
97
96
|
key = @api_config.private_key
|
98
97
|
|
99
98
|
@signed_signature_base_string = CGI.escape(Base64.encode64(key.sign(digest,@signature_base_string)))
|
@@ -110,7 +109,6 @@ module MastercardCoreSdk
|
|
110
109
|
# oauth_params - populated oauth parameters object
|
111
110
|
def generate_signature_base_string(url, request_method, oauth_params)
|
112
111
|
@signature_base_string = CGI.escape(request_method.upcase) << AMP << CGI.escape(normalize_url(url)) << AMP << CGI.escape(normalize_parameters(url, oauth_params))
|
113
|
-
|
114
112
|
end
|
115
113
|
|
116
114
|
# Method to return "core" URL for signature base string generation. http://somesite.com:8080?blah becomes http://somesite.com, for example
|
@@ -145,7 +143,7 @@ module MastercardCoreSdk
|
|
145
143
|
# Method to generate body hash if body is present
|
146
144
|
def generate_body_hash(headers = {}, body, oauth_params)
|
147
145
|
if !body.empty?
|
148
|
-
oauth_body_hash = Digest::
|
146
|
+
oauth_body_hash = Digest::SHA256.base64digest(body)
|
149
147
|
oauth_params.add_parameter(OAUTH_BODY_HASH, oauth_body_hash)
|
150
148
|
end
|
151
149
|
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'jwe'
|
2
|
+
require 'json'
|
3
|
+
require 'logging'
|
4
|
+
|
5
|
+
require_relative '../exceptions/sdk_validation_error'
|
6
|
+
require_relative '../converters/sdk_converter_factory'
|
7
|
+
|
8
|
+
module MastercardCoreSdk
|
9
|
+
module Util
|
10
|
+
# JweUtil class provides the utility to decrypt encrypted payload object.
|
11
|
+
class JweUtil
|
12
|
+
@@logger = Logging.logger[self]
|
13
|
+
|
14
|
+
class << self
|
15
|
+
include MastercardCoreSdk::Core, MastercardCoreSdk::Exceptions, MastercardCoreSdk::Converters
|
16
|
+
|
17
|
+
# Decrypt JWE encrypted payload.
|
18
|
+
# @param encrypted_jwe_payload the encrypted payload input.
|
19
|
+
# @param private_key the private key.
|
20
|
+
# @param response_type the response type for conversion after decryption.
|
21
|
+
# @return [Object] the decrypted payload.
|
22
|
+
# @raise [SDKValidationError] if encrypted_jwe_payload, private_key, response_type is not provided.
|
23
|
+
def get_jwe_decrypted_payload(encrypted_jwe_payload, private_key, response_type)
|
24
|
+
|
25
|
+
if(encrypted_jwe_payload.to_s.empty?)
|
26
|
+
@@logger.error EMPTY_JWE_PAYLOAD_ERR
|
27
|
+
raise SDKValidationError.new(EMPTY_JWE_PAYLOAD_ERR)
|
28
|
+
end
|
29
|
+
|
30
|
+
if(private_key.to_s.empty?)
|
31
|
+
@@logger.error EMPTY_JWE_PRIVATE_KEY_ERR
|
32
|
+
raise SDKValidationError.new(EMPTY_JWE_PRIVATE_KEY_ERR)
|
33
|
+
end
|
34
|
+
|
35
|
+
if(response_type.to_s.empty?)
|
36
|
+
@@logger.error EMPTY_JWE_RESPONSE_TYPE_ERR
|
37
|
+
raise SDKValidationError.new(EMPTY_JWE_RESPONSE_TYPE_ERR)
|
38
|
+
end
|
39
|
+
|
40
|
+
begin
|
41
|
+
decrypted_jwe_payload = JWE.decrypt(encrypted_jwe_payload, private_key)
|
42
|
+
converter = SDKConverterFactory.get_converter(CONTENT_TYPE_JSON)
|
43
|
+
rescue StandardError => error
|
44
|
+
@@logger.error error.message
|
45
|
+
raise SDKConversionError.new(:error_message => error.message, :source => self.class)
|
46
|
+
end
|
47
|
+
return converter.response_content_converter(decrypted_jwe_payload, response_type)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
|
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: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mastercard
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-02-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '5.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: simplecov
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.15'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.15'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: typhoeus
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -132,9 +146,28 @@ dependencies:
|
|
132
146
|
- - ">="
|
133
147
|
- !ruby/object:Gem::Version
|
134
148
|
version: 1.8.3
|
149
|
+
- !ruby/object:Gem::Dependency
|
150
|
+
name: jwe
|
151
|
+
requirement: !ruby/object:Gem::Requirement
|
152
|
+
requirements:
|
153
|
+
- - "~>"
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
version: '0.3'
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: 0.3.0
|
159
|
+
type: :runtime
|
160
|
+
prerelease: false
|
161
|
+
version_requirements: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - "~>"
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0.3'
|
166
|
+
- - ">="
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: 0.3.0
|
135
169
|
description: Mastercard Core API SDK.
|
136
170
|
email:
|
137
|
-
- support@masterpass.com
|
138
171
|
- merchant_support@masterpass.com
|
139
172
|
executables: []
|
140
173
|
extensions: []
|
@@ -148,7 +181,6 @@ files:
|
|
148
181
|
- lib/mastercard_core_sdk/client/api_client.rb
|
149
182
|
- lib/mastercard_core_sdk/constants/constants.rb
|
150
183
|
- lib/mastercard_core_sdk/converters/encoded_url_converter.rb
|
151
|
-
- lib/mastercard_core_sdk/converters/jose_converter.rb
|
152
184
|
- lib/mastercard_core_sdk/converters/json_converter.rb
|
153
185
|
- lib/mastercard_core_sdk/converters/sdk_converter_factory.rb
|
154
186
|
- lib/mastercard_core_sdk/converters/xml_converter.rb
|
@@ -157,6 +189,7 @@ files:
|
|
157
189
|
- lib/mastercard_core_sdk/core/configuration.rb
|
158
190
|
- lib/mastercard_core_sdk/core/mastercard_api_configuration.rb
|
159
191
|
- lib/mastercard_core_sdk/core/mastercard_authenticator.rb
|
192
|
+
- lib/mastercard_core_sdk/core/proxy_config.rb
|
160
193
|
- lib/mastercard_core_sdk/core/query_params.rb
|
161
194
|
- lib/mastercard_core_sdk/core/request_response_logger.rb
|
162
195
|
- lib/mastercard_core_sdk/core/service_request.rb
|
@@ -178,7 +211,7 @@ files:
|
|
178
211
|
- lib/mastercard_core_sdk/oauth/oauth_parameters.rb
|
179
212
|
- lib/mastercard_core_sdk/oauth/oauth_util.rb
|
180
213
|
- lib/mastercard_core_sdk/tracker/api_tracker.rb
|
181
|
-
- lib/mastercard_core_sdk/util/
|
214
|
+
- lib/mastercard_core_sdk/util/jwe_util.rb
|
182
215
|
- lib/mastercard_core_sdk/version.rb
|
183
216
|
homepage: https://developer.mastercard.com
|
184
217
|
licenses:
|
@@ -1,96 +0,0 @@
|
|
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
|
@@ -1,127 +0,0 @@
|
|
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
|
-
|