mastercard_core_sdk 2.0.0 → 2.1.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 +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
|
-
|