cybersource_rest_client 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/AuthenticationSDK/authentication/http/GetSignatureParameter.rb +64 -0
- data/lib/AuthenticationSDK/authentication/http/HttpSignatureHeader.rb +52 -0
- data/lib/AuthenticationSDK/authentication/jwt/JwtToken.rb +62 -0
- data/lib/AuthenticationSDK/authentication/payloadDigest/digest.rb +10 -0
- data/lib/AuthenticationSDK/core/Authorization.rb +24 -0
- data/lib/AuthenticationSDK/core/ITokenGeneration.rb +4 -0
- data/lib/AuthenticationSDK/core/Logger.rb +26 -0
- data/lib/AuthenticationSDK/core/MerchantConfig.rb +181 -0
- data/{AuthenticationSDK → lib/AuthenticationSDK}/resource/TRRReports.json +0 -0
- data/{AuthenticationSDK → lib/AuthenticationSDK}/resource/cybs.yml +0 -0
- data/{AuthenticationSDK → lib/AuthenticationSDK}/resource/request.json +0 -0
- data/{AuthenticationSDK → lib/AuthenticationSDK}/resource/request_capture.json +0 -0
- data/{AuthenticationSDK → lib/AuthenticationSDK}/resource/testrest.p12 +0 -0
- data/{AuthenticationSDK → lib/AuthenticationSDK}/spec/Authorization_spec.rb +0 -0
- data/{AuthenticationSDK → lib/AuthenticationSDK}/spec/MerchantConfigData.rb +0 -0
- data/{AuthenticationSDK → lib/AuthenticationSDK}/spec/MerchantConfig_spec.rb +0 -0
- data/{AuthenticationSDK → lib/AuthenticationSDK}/spec/PostRequestData.json +0 -0
- data/{AuthenticationSDK → lib/AuthenticationSDK}/spec/PutRequestData.json +0 -0
- data/{AuthenticationSDK → lib/AuthenticationSDK}/spec/ResponseCodeMessage_spec.rb +0 -0
- data/{AuthenticationSDK → lib/AuthenticationSDK}/spec/spec_helper.rb +0 -0
- data/lib/AuthenticationSDK/util/ApiException.rb +19 -0
- data/lib/AuthenticationSDK/util/Cache.rb +36 -0
- data/lib/AuthenticationSDK/util/Constants.rb +138 -0
- data/lib/AuthenticationSDK/util/PropertiesUtil.rb +19 -0
- data/lib/AuthenticationSDK/util/Utility.rb +32 -0
- data/lib/cybersource_rest_client/api_client.rb +11 -11
- data/lib/cybersource_rest_client.rb +13 -0
- metadata +27 -29
- data/AuthenticationSDK/AuthenticationSDK-0.0.1.gem +0 -0
- data/AuthenticationSDK/Cybersource.gemspec +0 -25
- data/AuthenticationSDK/authentication/http/GetSignatureParameter.rb +0 -64
- data/AuthenticationSDK/authentication/http/HttpSignatureHeader.rb +0 -52
- data/AuthenticationSDK/authentication/jwt/JwtToken.rb +0 -62
- data/AuthenticationSDK/authentication/payloadDigest/digest.rb +0 -10
- data/AuthenticationSDK/core/Authorization.rb +0 -24
- data/AuthenticationSDK/core/ITokenGeneration.rb +0 -4
- data/AuthenticationSDK/core/Logger.rb +0 -26
- data/AuthenticationSDK/core/MerchantConfig.rb +0 -181
- data/AuthenticationSDK/util/ApiException.rb +0 -19
- data/AuthenticationSDK/util/Cache.rb +0 -36
- data/AuthenticationSDK/util/Constants.rb +0 -138
- data/AuthenticationSDK/util/PropertiesUtil.rb +0 -20
- data/AuthenticationSDK/util/Utility.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a8735c72e139b8c81a915d7f82fd194189f36bb3206de4a20edd098e538999cd
|
4
|
+
data.tar.gz: c85d359997ede2deed769d1dd349730581ca21992c4ebf621c4b93e7b79b3204
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff7bec1dfd8d017f81730fa7432c5aa372582a288085af7e041ea79e108c401bd14419d664119ecec11988542cbf1980da7f0b740868c9504210f105bc12a108
|
7
|
+
data.tar.gz: 1c65b4018234fecd0be94afa1cee3bf74b3350647ca597a963252bb56111c221090238e6dcb0a316db38ed7d11231b82b5adbec4fce633f534e59e24e7d56e25
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require_relative '../../util/Constants.rb'
|
2
|
+
require_relative '.././payloadDigest/digest.rb'
|
3
|
+
require 'openssl'
|
4
|
+
# This function returns value for paramter Signature which is then passed to Signature header
|
5
|
+
# paramter 'Signature' is calucated based on below key values and then signed with SECRET KEY -
|
6
|
+
# host: Sandbox (apitest.cybersource.com) or Production (api.cybersource.com) hostname
|
7
|
+
# date: "HTTP-date" format as defined by RFC7231.
|
8
|
+
# (request-target): Should be in format of httpMethod: path
|
9
|
+
# Example: "post /pts/v2/payments"
|
10
|
+
# Digest: Only needed for POST calls.
|
11
|
+
# digestString = BASE64( HMAC-SHA256 ( Payload ));
|
12
|
+
# Digest: “SHA-256=“ + digestString;
|
13
|
+
# v-c-merchant-id: set value to Cybersource Merchant ID
|
14
|
+
# This ID can be found on EBC portal*/
|
15
|
+
class SignatureParameter
|
16
|
+
def generateSignatureParameter(merchantconfig_obj, gmtdatetime, log_obj)
|
17
|
+
request_type = merchantconfig_obj.requestType.upcase
|
18
|
+
merchantSecretKey = merchantconfig_obj.merchantSecretKey
|
19
|
+
signatureString = Constants::HOST + ': ' + merchantconfig_obj.requestHost
|
20
|
+
signatureString << "\n"+ Constants::DATE + ': ' + gmtdatetime
|
21
|
+
signatureString << "\n(request-target): "
|
22
|
+
if request_type == Constants::GET_REQUEST_TYPE || request_type == Constants::DELETE_REQUEST_TYPE
|
23
|
+
targetUrl=gettargetUrlForGetDelete(request_type,merchantconfig_obj)
|
24
|
+
signatureString << targetUrl + "\n"
|
25
|
+
elsif request_type == Constants::POST_REQUEST_TYPE || request_type == Constants::PUT_REQUEST_TYPE || request_type == Constants::PATCH_REQUEST_TYPE
|
26
|
+
targetUrl=gettargetUrlForPutPost(request_type,merchantconfig_obj)
|
27
|
+
signatureString << targetUrl + "\n"
|
28
|
+
payload = merchantconfig_obj.requestJsonData
|
29
|
+
digest = DigestGeneration.new.generateDigest(payload, log_obj)
|
30
|
+
digest_payload = Constants::SHA256 + digest
|
31
|
+
signatureString << Constants::DIGEST + ': ' + digest_payload + "\n"
|
32
|
+
end
|
33
|
+
signatureString << Constants::V_C_MERCHANT_ID + ': ' + merchantconfig_obj.merchantId
|
34
|
+
encodedSignatureString = signatureString.force_encoding(Encoding::UTF_8)
|
35
|
+
decodedKey = Base64.decode64(merchantSecretKey)
|
36
|
+
base64EncodedSignature = Base64.strict_encode64(OpenSSL::HMAC.digest('sha256', decodedKey, encodedSignatureString))
|
37
|
+
return base64EncodedSignature
|
38
|
+
rescue StandardError => err
|
39
|
+
log_obj.logger.error(err.message)
|
40
|
+
log_obj.logger.error(err.backtrace)
|
41
|
+
puts 'Check log for more details.'
|
42
|
+
exit!
|
43
|
+
end
|
44
|
+
def gettargetUrlForGetDelete(request_type, merchantconfig_obj)
|
45
|
+
targetUrlForGetDelete = ''
|
46
|
+
if request_type == Constants::DELETE_REQUEST_TYPE
|
47
|
+
targetUrlForGetDelete = Constants::DELETE_REQUEST_TYPE_LOWER + ' ' + merchantconfig_obj.requestTarget
|
48
|
+
elsif request_type == Constants::GET_REQUEST_TYPE
|
49
|
+
targetUrlForGetDelete = Constants::GET_REQUEST_TYPE_LOWER + ' ' + merchantconfig_obj.requestTarget
|
50
|
+
end
|
51
|
+
return targetUrlForGetDelete
|
52
|
+
end
|
53
|
+
def gettargetUrlForPutPost(request_type, merchantconfig_obj)
|
54
|
+
targetUrlForPutPost = ''
|
55
|
+
if request_type == Constants::POST_REQUEST_TYPE
|
56
|
+
targetUrlForPutPost = Constants::POST_REQUEST_TYPE_LOWER + ' ' + merchantconfig_obj.requestTarget
|
57
|
+
elsif request_type == Constants::PUT_REQUEST_TYPE
|
58
|
+
targetUrlForPutPost = Constants::PUT_REQUEST_TYPE_LOWER + ' ' + merchantconfig_obj.requestTarget
|
59
|
+
elsif request_type == Constants::PATCH_REQUEST_TYPE
|
60
|
+
targetUrlForPutPost = Constants::PATCH_REQUEST_TYPE_LOWER + ' ' + merchantconfig_obj.requestTarget
|
61
|
+
end
|
62
|
+
return targetUrlForPutPost
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require_relative '../../core/ITokenGeneration.rb'
|
3
|
+
require_relative '../../util/Constants.rb'
|
4
|
+
require_relative '../../util/ApiException.rb'
|
5
|
+
require_relative '.././payloadDigest/digest.rb'
|
6
|
+
require_relative '.././http/GetSignatureParameter.rb'
|
7
|
+
public
|
8
|
+
# SignatureHeader return SignatureHeader Value that contains following paramters
|
9
|
+
# * keyid -- Merchant ID obtained from EBC portal
|
10
|
+
# * algorithm -- Should have value as "HmacSHA256"
|
11
|
+
# * headers -- List of all header name passed in the Signature paramter below
|
12
|
+
# String getHeaders = "host date (request-target)" + " " + "v-c-merchant-id";
|
13
|
+
# String postHeaders = "host date (request-target) digest v-c-merchant-id";
|
14
|
+
# Note: Digest is not passed for GET calls
|
15
|
+
# * signature -- Signature header has paramter called signature
|
16
|
+
# Paramter 'Signature' must contain all the paramters mentioned in header above in given order
|
17
|
+
class GenerateHttpSignature
|
18
|
+
# Generates Signature based on the requestType
|
19
|
+
def getToken(merchantconfig_obj, gmtdatetime, log_obj)
|
20
|
+
request_type = merchantconfig_obj.requestType.upcase
|
21
|
+
signatureHeaderValue =''
|
22
|
+
signatureHeaderValue << Constants::KEY_ID + merchantconfig_obj.merchantKeyId + "\""
|
23
|
+
# Algorithm should be always HmacSHA256 for http signature
|
24
|
+
signatureHeaderValue << ', ' + Constants::ALGORITHM + Constants::SIGNATURE_ALGORITHM + "\""
|
25
|
+
# Headers - list is choosen based on HTTP method
|
26
|
+
signatureheader=getsignatureHeader(request_type)
|
27
|
+
signatureHeaderValue << ', ' + Constants::HEADERS_PARAM + signatureheader + "\""
|
28
|
+
# Get Value for parameter 'Signature' to be passed to Signature Header
|
29
|
+
signature_value = SignatureParameter.new.generateSignatureParameter(merchantconfig_obj, gmtdatetime, log_obj)
|
30
|
+
signatureHeaderValue << ', ' + Constants::SIGNATURE_PARAM + signature_value + "\""
|
31
|
+
return signatureHeaderValue
|
32
|
+
rescue StandardError => err
|
33
|
+
ApiException.new.apiexception(err,log_obj)
|
34
|
+
exit!
|
35
|
+
end
|
36
|
+
def getsignatureHeader(request_type)
|
37
|
+
headers = ''
|
38
|
+
if request_type == Constants::POST_REQUEST_TYPE
|
39
|
+
headers = 'host date (request-target) digest ' + Constants::V_C_MERCHANT_ID
|
40
|
+
elsif request_type == Constants::GET_REQUEST_TYPE || request_type == Constants::DELETE_REQUEST_TYPE
|
41
|
+
headers = 'host date (request-target)' + ' ' + Constants::V_C_MERCHANT_ID
|
42
|
+
elsif request_type == Constants::PUT_REQUEST_TYPE
|
43
|
+
headers = 'host date (request-target) digest ' + Constants::V_C_MERCHANT_ID
|
44
|
+
elsif request_type == Constants::PATCH_REQUEST_TYPE
|
45
|
+
headers = 'host date (request-target) digest ' + Constants::V_C_MERCHANT_ID
|
46
|
+
else
|
47
|
+
raise StandardError.new(Constants::ERROR_PREFIX + Constants::INVALID_REQUEST_TYPE_METHOD)
|
48
|
+
end
|
49
|
+
return headers
|
50
|
+
end
|
51
|
+
implements TokenInterface
|
52
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require 'openssl'
|
3
|
+
require 'jwt'
|
4
|
+
require 'json'
|
5
|
+
require 'active_support'
|
6
|
+
require_relative '../../core/ITokenGeneration.rb'
|
7
|
+
require_relative '../../util/Constants.rb'
|
8
|
+
require_relative '../../util/ApiException.rb'
|
9
|
+
require_relative '../../util/Cache.rb'
|
10
|
+
require_relative '../../authentication/payloadDigest/digest.rb'
|
11
|
+
public
|
12
|
+
#JWT Token-generated based on the Request type
|
13
|
+
class GenerateJwtToken
|
14
|
+
def getToken(merchantconfig_obj,gmtDatetime,log_obj)
|
15
|
+
jwtBody = ''
|
16
|
+
request_type = merchantconfig_obj.requestType.upcase
|
17
|
+
filePath = merchantconfig_obj.keysDirectory + '/' + merchantconfig_obj.keyFilename + '.p12'
|
18
|
+
if (!File.exist?(filePath))
|
19
|
+
raise Constants::ERROR_PREFIX + Constants::FILE_NOT_FOUND + File.expand_path(filePath)
|
20
|
+
end
|
21
|
+
p12File = File.binread(filePath)
|
22
|
+
jwtBody=getJwtBody(request_type, gmtDatetime, merchantconfig_obj, log_obj)
|
23
|
+
claimSet = JSON.parse(jwtBody)
|
24
|
+
p12FilePath = OpenSSL::PKCS12.new(p12File, merchantconfig_obj.keyPass)
|
25
|
+
# Generating certificate.
|
26
|
+
cacheObj = ActiveSupport::Cache::MemoryStore.new
|
27
|
+
x5Cert = Cache.new.fetchCachedCertificate(filePath, p12File, merchantconfig_obj.keyPass, cacheObj)
|
28
|
+
# Generating Public key.
|
29
|
+
publicKey = OpenSSL::PKey::RSA.new(p12FilePath.key.public_key)
|
30
|
+
#Generating Private Key
|
31
|
+
privateKey = OpenSSL::PKey::RSA.new(p12FilePath.key)
|
32
|
+
# JWT token-Generates using RS256 algorithm only
|
33
|
+
x5clist = [x5Cert]
|
34
|
+
customHeaders = {}
|
35
|
+
customHeaders['v-c-merchant-id'] = merchantconfig_obj.keyAlias
|
36
|
+
customHeaders['x5c'] = x5clist
|
37
|
+
# Generating JWT token
|
38
|
+
token = JWT.encode(claimSet, privateKey, 'RS256', customHeaders)
|
39
|
+
return token
|
40
|
+
rescue StandardError => err
|
41
|
+
if err.message.include? 'PKCS12_parse: mac verify failure'
|
42
|
+
ApiException.new.customerror(Constants::ERROR_PREFIX + Constants::INCORRECT_KEY_PASS,log_obj)
|
43
|
+
exit!
|
44
|
+
else
|
45
|
+
ApiException.new.apiexception(err,log_obj)
|
46
|
+
exit!
|
47
|
+
end
|
48
|
+
end
|
49
|
+
def getJwtBody(request_type, gmtDatetime, merchantconfig_obj,log_obj)
|
50
|
+
if request_type == Constants::POST_REQUEST_TYPE || request_type == Constants::PUT_REQUEST_TYPE || request_type == Constants::PATCH_REQUEST_TYPE
|
51
|
+
payload = merchantconfig_obj.requestJsonData
|
52
|
+
# Note: Digest is not passed for GET calls
|
53
|
+
digest = DigestGeneration.new.generateDigest(payload, log_obj)
|
54
|
+
jwtBody = "{\n \"digest\":\"" + digest + "\", \"digestAlgorithm\":\"SHA-256\", \"iat\":\"" + gmtDatetime + "\"}"
|
55
|
+
elsif request_type == Constants::GET_REQUEST_TYPE || request_type == Constants::DELETE_REQUEST_TYPE
|
56
|
+
jwtBody = "{\n \"iat\":\"" + gmtDatetime + "\"\n} \n\n"
|
57
|
+
else
|
58
|
+
raise StandardError.new(Constants::ERROR_PREFIX + Constants::INVALID_REQUEST_TYPE_METHOD)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
implements TokenInterface
|
62
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'digest'
|
2
|
+
public
|
3
|
+
# This method return Digest value which is SHA-256
|
4
|
+
# hash of payload that is BASE64 encoded
|
5
|
+
class DigestGeneration
|
6
|
+
def generateDigest(payload, log_obj)
|
7
|
+
digest = Digest::SHA256.base64digest(payload)
|
8
|
+
return digest
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative '../authentication/http/HttpSignatureHeader.rb'
|
2
|
+
require_relative '../authentication/jwt/JwtToken.rb'
|
3
|
+
require_relative '../util/Constants.rb'
|
4
|
+
require_relative '../util/ApiException.rb'
|
5
|
+
public
|
6
|
+
# This function calls for the generation of Signature message depending on the authentication type.
|
7
|
+
class Authorization
|
8
|
+
def getToken(merchantconfig_obj, gmtdatetime, log_obj)
|
9
|
+
authenticationType = merchantconfig_obj.authenticationType.upcase
|
10
|
+
if merchantconfig_obj.requestType.to_s.empty?
|
11
|
+
raise StandardError.new(Constants::ERROR_PREFIX + Constants::REQUEST_TYPE_EMPTY)
|
12
|
+
end
|
13
|
+
if authenticationType == Constants::AUTH_TYPE_HTTP
|
14
|
+
token = GenerateHttpSignature.new.getToken(merchantconfig_obj, gmtdatetime, log_obj)
|
15
|
+
elsif authenticationType == Constants::AUTH_TYPE_JWT
|
16
|
+
token = GenerateJwtToken.new.getToken(merchantconfig_obj, gmtdatetime, log_obj)
|
17
|
+
elsif authenticationType != Constants::AUTH_TYPE_HTTP || authenticationType != Constants::AUTH_TYPE_JWT
|
18
|
+
raise StandardError.ner(Constants::ERROR_PREFIX + Constants::AUTH_ERROR)
|
19
|
+
end
|
20
|
+
rescue StandardError => err
|
21
|
+
ApiException.new.apiexception(err,log_obj)
|
22
|
+
exit!
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative '../util/ApiException.rb'
|
2
|
+
require 'logger'
|
3
|
+
public
|
4
|
+
# Logger Class
|
5
|
+
class Log
|
6
|
+
def initialize(logDirectory, logFilename, logSize, enableLog)
|
7
|
+
#log
|
8
|
+
if enableLog == true
|
9
|
+
filename = logDirectory + '/' + logFilename + '.log'
|
10
|
+
datetime = DateTime.now
|
11
|
+
if File.exist?(filename) && File.size(filename) >= logSize
|
12
|
+
updatedFileName = logDirectory + '/' + logFilename + '_' + datetime.strftime('%Y%m%d%H%M%S') + '.log'
|
13
|
+
File.rename(filename, updatedFileName)
|
14
|
+
end
|
15
|
+
@logger = Logger.new(STDOUT)
|
16
|
+
@logger = Logger.new(filename, logSize)
|
17
|
+
@logger.datetime_format = datetime.strftime('%Y-%m-%d %H:%M:%S')
|
18
|
+
else
|
19
|
+
@logger = Logger.new(false)
|
20
|
+
end
|
21
|
+
rescue StandardError => err
|
22
|
+
puts err
|
23
|
+
exit!
|
24
|
+
end
|
25
|
+
attr_accessor :logger
|
26
|
+
end
|
@@ -0,0 +1,181 @@
|
|
1
|
+
require_relative './Logger.rb'
|
2
|
+
require_relative '../util/Constants.rb'
|
3
|
+
require_relative '../util/ApiException.rb'
|
4
|
+
public
|
5
|
+
# This fuction has all the merchantConfig properties getters and setters methods
|
6
|
+
class Merchantconfig
|
7
|
+
def initialize(cybsPropertyObj)
|
8
|
+
# Common Parameters
|
9
|
+
@merchantId = cybsPropertyObj['merchantID']
|
10
|
+
@runEnvironment = cybsPropertyObj['runEnvironment']
|
11
|
+
@authenticationType = cybsPropertyObj['authenticationType']
|
12
|
+
@logDirectory = cybsPropertyObj['logDirectory']
|
13
|
+
@logSize = cybsPropertyObj['logSize']
|
14
|
+
@enableLog = cybsPropertyObj['enableLog']
|
15
|
+
@proxyAddress = cybsPropertyObj['proxyAddress']
|
16
|
+
@proxyPort = cybsPropertyObj['proxyPort']
|
17
|
+
@getId = ''
|
18
|
+
@requestHost = ''
|
19
|
+
@requestTarget = ''
|
20
|
+
@requestJsonData = ''
|
21
|
+
# HTTP Parameters
|
22
|
+
@merchantSecretKey = cybsPropertyObj['merchantsecretKey']
|
23
|
+
@merchantKeyId = cybsPropertyObj['merchantKeyId']
|
24
|
+
# JWT Parameters
|
25
|
+
@keysDirectory = cybsPropertyObj['keysDirectory']
|
26
|
+
@keyAlias = cybsPropertyObj['keyAlias']
|
27
|
+
@keyPass = cybsPropertyObj['keyPass']
|
28
|
+
@keyFilename = cybsPropertyObj['keyFilename']
|
29
|
+
@logFilename = cybsPropertyObj['logFilename']
|
30
|
+
validateMerchantDetails()
|
31
|
+
logAllProperties(cybsPropertyObj)
|
32
|
+
end
|
33
|
+
#fall back logic
|
34
|
+
def validateMerchantDetails()
|
35
|
+
logmessage=''
|
36
|
+
if @enableLog.to_s.empty?
|
37
|
+
@enableLog = true
|
38
|
+
elsif @enableLog.instance_of? Fixnum
|
39
|
+
@enableLog = @enableLog.to_s
|
40
|
+
end
|
41
|
+
if @logSize.to_s.empty?
|
42
|
+
@logSize = Constants::DEFAULT_LOG_SIZE
|
43
|
+
elsif !@logSize.instance_of? Fixnum
|
44
|
+
@logSize=@logSize.to_i
|
45
|
+
end
|
46
|
+
if @logDirectory.to_s.empty? || !Dir.exist?(@logDirectory)
|
47
|
+
@logDirectory = Constants::DEFAULT_LOG_DIRECTORY
|
48
|
+
unless Dir.exist?(@logDirectory)
|
49
|
+
Dir.mkdir(Constants::DEFAULT_LOG_DIRECTORY)
|
50
|
+
end
|
51
|
+
logmessage = Constants::WARNING_PREFIX + Constants::INVALID_LOG_DIRECTORY + File.expand_path(@logDirectory)
|
52
|
+
end
|
53
|
+
if @logFilename.to_s.empty?
|
54
|
+
@logFilename = Constants::DEFAULT_LOGFILE_NAME
|
55
|
+
elsif !@logFilename.instance_of? String
|
56
|
+
@logFilename=@logFilename.to_s
|
57
|
+
end
|
58
|
+
@log_obj = Log.new @logDirectory,@logFilename,@logSize,@enableLog
|
59
|
+
@log_obj.logger.info('START> =======================================')
|
60
|
+
if !logmessage.to_s.empty?
|
61
|
+
ApiException.new.apiwarning(logmessage,log_obj)
|
62
|
+
end
|
63
|
+
if @merchantId.to_s.empty?
|
64
|
+
err = raise StandardError.new(Constants::ERROR_PREFIX + Constants::MERCHANT_ID_NULL)
|
65
|
+
ApiException.new.apiexception(err,log_obj)
|
66
|
+
elsif !@merchantId.instance_of? String
|
67
|
+
@merchantId=@merchantId.to_s
|
68
|
+
end
|
69
|
+
if @authenticationType.to_s.empty?
|
70
|
+
err = raise StandardError.new(Constants::ERROR_PREFIX + Constants::AUTH_TYPE_MANDATORY)
|
71
|
+
ApiException.new.apiexception(err,log_obj)
|
72
|
+
end
|
73
|
+
if !@authenticationType.instance_of? String
|
74
|
+
err = raise StandardError.new(Constants::ERROR_PREFIX+ Constants::AUTH_ERROR)
|
75
|
+
ApiException.new.apiexception(err,log_obj)
|
76
|
+
end
|
77
|
+
if !@runEnvironment.to_s.empty?
|
78
|
+
if !@runEnvironment.instance_of? String
|
79
|
+
@requestHost = @runEnvironment.to_s
|
80
|
+
elsif @runEnvironment.upcase == Constants::RUN_ENV_PROD
|
81
|
+
@requestHost = Constants::PRODUCTION_URL
|
82
|
+
elsif @runEnvironment.upcase == Constants::RUN_ENV_SANDBOX
|
83
|
+
@requestHost = Constants::SANDBOX_URL
|
84
|
+
else
|
85
|
+
@requestHost = @runEnvironment
|
86
|
+
end
|
87
|
+
elsif @runEnvironment.to_s.empty?
|
88
|
+
err = raise StandardError.new(Constants::ERROR_PREFIX + Constants::RUN_ENVIRONMENT)
|
89
|
+
ApiException.new.apiexception(err,log_obj)
|
90
|
+
end
|
91
|
+
if @authenticationType.upcase == Constants::AUTH_TYPE_JWT
|
92
|
+
if @keyAlias.to_s.empty?
|
93
|
+
@keyAlias = @merchantId
|
94
|
+
ApiException.new.apiwarning(Constants::WARNING_PREFIX + Constants::KEY_ALIAS_NULL_EMPTY, log_obj)
|
95
|
+
elsif !@keyAlias.instance_of? String
|
96
|
+
@keyAlias=@keyAlias.to_s
|
97
|
+
elsif @keyAlias != @merchantId
|
98
|
+
@keyAlias = @merchantId
|
99
|
+
ApiException.new.apiwarning(Constants::WARNING_PREFIX + Constants::INCORRECT_KEY_ALIAS, log_obj)
|
100
|
+
end
|
101
|
+
if @keyPass.to_s.empty?
|
102
|
+
@keyPass = @merchantId
|
103
|
+
ApiException.new.apiwarning(Constants::WARNING_PREFIX + Constants::KEY_PASS_NULL, log_obj)
|
104
|
+
elsif !@keyPass.instance_of? String
|
105
|
+
@keyPass=@keyPass.to_s
|
106
|
+
end
|
107
|
+
if @keysDirectory.to_s.empty?
|
108
|
+
@keysDirectory = Constants::DEFAULT_KEY_DIRECTORY
|
109
|
+
ApiException.new.apiwarning(Constants::WARNING_PREFIX + Constants::KEY_DIRECTORY_EMPTY + @keysDirectory, log_obj)
|
110
|
+
elsif !@keysDirectory.instance_of? String
|
111
|
+
@keysDirectory=@keysDirectory.to_s
|
112
|
+
end
|
113
|
+
if @keyFilename.to_s.empty?
|
114
|
+
@keyFilename = @merchantId
|
115
|
+
ApiException.new.apiwarning(Constants::WARNING_PREFIX + Constants::KEY_FILE_NAME_NULL_EMPTY, log_obj)
|
116
|
+
elsif !@keyFilename.instance_of? String
|
117
|
+
@keyFilename=@keyFilename.to_s
|
118
|
+
end
|
119
|
+
end
|
120
|
+
if @authenticationType.upcase == Constants::AUTH_TYPE_HTTP
|
121
|
+
if @merchantKeyId.to_s.empty?
|
122
|
+
err = raise StandardError.new(Constants::ERROR_PREFIX+ Constants::MERCHANT_KEY_ID_MANDATORY)
|
123
|
+
ApiException.new.apiexception(err,log_obj)
|
124
|
+
elsif !@merchantKeyId.instance_of? String
|
125
|
+
@merchantKeyId=@merchantKeyId.to_s
|
126
|
+
end
|
127
|
+
if @merchantSecretKey.to_s.empty?
|
128
|
+
err = raise StandardError.new(Constants::ERROR_PREFIX+ Constants::MERCHANT_SECRET_KEY_MANDATORY)
|
129
|
+
ApiException.new.apiexception(err,log_obj)
|
130
|
+
elsif !@merchantSecretKey.instance_of? String
|
131
|
+
@merchantSecretKey=@merchantSecretKey.to_s
|
132
|
+
end
|
133
|
+
end
|
134
|
+
if !@proxyAddress.instance_of? String
|
135
|
+
@proxyAddress=@proxyAddress.to_s
|
136
|
+
end
|
137
|
+
if !@proxyPort.instance_of? String
|
138
|
+
@proxyPort=@proxyPort.to_s
|
139
|
+
end
|
140
|
+
end
|
141
|
+
def logAllProperties(propertyObj)
|
142
|
+
merchantConfig = ''
|
143
|
+
hiddenProperties = (Constants::HIDDEN_MERCHANT_PROPERTIES).split(',')
|
144
|
+
hiddenPropArray = Array.new
|
145
|
+
hiddenProperties.each do |value|
|
146
|
+
hiddenPropArray << value.strip
|
147
|
+
end
|
148
|
+
hiddenPropArray.each do |prop|
|
149
|
+
propertyObj.each do |key, value|
|
150
|
+
if key == prop
|
151
|
+
propertyObj.delete(key)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
@log_obj.logger.info('MERCHCFG >' + propertyObj.to_s)
|
156
|
+
end
|
157
|
+
|
158
|
+
# getter and setter methods
|
159
|
+
attr_accessor :merchantId
|
160
|
+
attr_accessor :merchantSecretKey
|
161
|
+
attr_accessor :merchantKeyId
|
162
|
+
attr_accessor :authenticationType
|
163
|
+
attr_accessor :keysDirectory
|
164
|
+
attr_accessor :requestHost
|
165
|
+
attr_accessor :keyAlias
|
166
|
+
attr_accessor :keyPass
|
167
|
+
attr_accessor :keyFilename
|
168
|
+
attr_accessor :requestJsonData
|
169
|
+
attr_accessor :requestUrl
|
170
|
+
attr_accessor :requestType
|
171
|
+
attr_accessor :getId
|
172
|
+
attr_accessor :logDirectory
|
173
|
+
attr_accessor :logFilename
|
174
|
+
attr_accessor :enableLog
|
175
|
+
attr_accessor :logSize
|
176
|
+
attr_accessor :logger
|
177
|
+
attr_accessor :proxyAddress
|
178
|
+
attr_accessor :proxyPort
|
179
|
+
attr_accessor :requestTarget
|
180
|
+
attr_accessor :log_obj
|
181
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
public
|
2
|
+
class ApiException
|
3
|
+
def apiexception(err,log_Obj)
|
4
|
+
log_Obj.logger.error(err.message)
|
5
|
+
if !err.backtrace.to_s.empty?
|
6
|
+
log_Obj.logger.error(err.backtrace)
|
7
|
+
end
|
8
|
+
log_Obj.logger.info('END> =======================================')
|
9
|
+
puts 'Check log for more details.'
|
10
|
+
end
|
11
|
+
def apiwarning(message,log_Obj)
|
12
|
+
log_Obj.logger.warn(message)
|
13
|
+
end
|
14
|
+
def customerror(message,log_Obj)
|
15
|
+
log_Obj.logger.error(message)
|
16
|
+
log_Obj.logger.info('END> =======================================')
|
17
|
+
puts 'Check log for more details.'
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
require 'base64'
|
3
|
+
public
|
4
|
+
# P12 file certificate Cache
|
5
|
+
class Cache
|
6
|
+
def fetchCachedCertificate(filePath, p12File, keyPass, cacheObj)
|
7
|
+
certCache = cacheObj.read('certiFromP12File')
|
8
|
+
cachedLastModifiedTimeStamp = cacheObj.read('certificateLastModifiedTimeStamp')
|
9
|
+
if File.exist?(filePath)
|
10
|
+
currentFileLastModifiedTime = File.mtime(filePath)
|
11
|
+
if certCache.to_s.empty? || cachedLastModifiedTimeStamp.to_s.empty?
|
12
|
+
certificateFromP12File = getCertificate(p12File, keyPass, cacheObj, currentFileLastModifiedTime)
|
13
|
+
return certificateFromP12File
|
14
|
+
elsif currentFileLastModifiedTime > cachedLastModifiedTimeStamp
|
15
|
+
# Function call to read the file and put values to new cache
|
16
|
+
certificateFromP12File = getCertificate(p12File, keyPass, cacheObj, currentFileLastModifiedTime)
|
17
|
+
return certificateFromP12File
|
18
|
+
else
|
19
|
+
return certCache
|
20
|
+
end
|
21
|
+
else
|
22
|
+
raise Constants::ERROR_PREFIX + Constants::FILE_NOT_FOUND + filePath
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def getCertificate(p12File, keyPass, cacheObj, currentFileLastModifiedTime)
|
27
|
+
p12FilePath = OpenSSL::PKCS12.new(p12File, keyPass)
|
28
|
+
# Generating certificate from p12File.
|
29
|
+
x5CertPem = OpenSSL::X509::Certificate.new(p12FilePath.certificate)
|
30
|
+
# Converting Certificate format from PEM TO DER to remove header and footer of the certificate.
|
31
|
+
x5CertDer = Base64.strict_encode64(x5CertPem.to_der)
|
32
|
+
cacheObj.write('certiFromP12File', x5CertDer)
|
33
|
+
cacheObj.write('certificateLastModifiedTimeStamp', currentFileLastModifiedTime)
|
34
|
+
return x5CertDer
|
35
|
+
end
|
36
|
+
end
|