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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7304d039b64910aa3f8fc16a2f798172480f61e8
4
- data.tar.gz: e678aba02e0b2af6ae4fa6e13c8305c8a433954e
3
+ metadata.gz: 0a1a32938c92a314feadfbf5c46bc304491c1816
4
+ data.tar.gz: 92fdcf8f20d8741a82cb46c5b107dfabc61b8f5e
5
5
  SHA512:
6
- metadata.gz: 24adf61809aac72ed89494f5e954bacd94b1dda3e5ed62ce9203f1221f75a87a7af0432f5a24acc9b17a55c7e4129347ce20b526430d8e5c2a2dca8a5ffbf06d
7
- data.tar.gz: 3691d34e13f729bb6d9f89be6e02ac60f2bdeb396677332dc89f62ec73ed46593c25197d59eae6a91154dec973e480e9be7960ce2d162246e71c063f942cefee
6
+ metadata.gz: ce672fd31f12e542368e524684f074634a2bb9e09cb1692c5c532e843db80e567efdeb69215fa49dc227445a55493da6c564c8b1a6280505520d3bbb29689e7c
7
+ data.tar.gz: c5136d0d37273b6e53499076a907bef2202e8b08946dcfafe62f5e8b71d9be11194f6d1cc10709b175942ddce204d86e2b7b7ca06760b38e510a96792a77a63f
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2017, MasterCard International Incorporated
1
+ Copyright (c) 2018, MasterCard International Incorporated
2
2
  All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without modification, are
data/README.md CHANGED
@@ -53,10 +53,10 @@ MasterCardApiConfiguration.sandbox = false #By default Sandbox environment is s
53
53
  ```
54
54
 
55
55
  ## Copyright
56
- Copyright (c) 2017, MasterCard International Incorporated. See LICENSE for details.
56
+ Copyright (c) 2018, MasterCard International Incorporated. See LICENSE for details.
57
57
 
58
58
  ## LICENSE
59
- Copyright (c) 2017, MasterCard International Incorporated. All rights reserved.
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:
@@ -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
- # OAuth
46
- require_relative 'mastercard_core_sdk/util/jose'
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::Util, MastercardCoreSdk::Core, MastercardCoreSdk::Interceptors, MastercardCoreSdk::Converters, MastercardCoreSdk::Tracker
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
- OAUTH_KEY_SIGNATURE_METHOD_VAL = 'RSA-SHA1'
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 SdkOAuthError.new(NULL_OAUTH_PARAMETERS_ERROR)
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 [String] return_type some examples: "User", "Array[User]", "Hash[String,Integer]"
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("[#{body}]", :symbolize_names => true)[0]
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 = body
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, OAUTH_KEY_SIGNATURE_METHOD_VAL)
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::SHA1.new
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::SHA1.base64digest(body)
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
+
@@ -1,3 +1,3 @@
1
1
  module MastercardCoreSdk
2
- VERSION = "2.0.0"
2
+ VERSION = "2.1.0"
3
3
  end
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.0.0
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: 2017-08-10 00:00:00.000000000 Z
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/jose.rb
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
-