-
Notifications
You must be signed in to change notification settings - Fork 48
PGP MTLS Batch Upload #165
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
mahmishr
wants to merge
9
commits into
master
Choose a base branch
from
feature/pgp-mtls
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
b085368
pgp mtls
mahmishr 2df31aa
Update package.json
mahmishr bb0fe83
Update cybersource_node_sdk_gen.bat
mahmishr 0d1d107
code refactored
mahmishr b2dcfd0
comments resolved
mahmishr 4cc5533
opts change
mahmishr f2ab7da
server name and log error chngs
mahmishr 870af5c
minor fix
mahmishr e16e630
Update package.json
mahmishr File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,197 @@ | ||
const path = require('path'); | ||
const fs = require('fs'); | ||
const PgpEncryptionUtility = require('../utilities/PGP/BatchUpload/PgpEncryptionUtility'); | ||
const MutualAuthUploadUtility = require('../utilities/PGP/BatchUpload/MutualAuthUploadUtility'); | ||
const BatchUploadUtility = require('../utilities/PGP/BatchUpload/BatchUploadUtility'); | ||
const LogConfiguration = require('../authentication/logging/LogConfiguration'); | ||
const Constants = require('../authentication/util/Constants'); | ||
const Logger = require('../authentication/logging/Logger'); | ||
|
||
/** | ||
* BatchUploadWithMTLSApi | ||
* Class for uploading batch files to CyberSource using mutual TLS authentication. | ||
* Supports PKCS#12 client certificates, and direct private key/certificate paths. | ||
* Handles PGP encryption of files before upload. | ||
*/ | ||
class BatchUploadWithMTLSApi { | ||
/** | ||
* Constructs a new BatchUploadWithMTLSApi instance. | ||
* @param {Object} [log_config] - Logging configuration object (optional). | ||
* @param {boolean} [log_config.enableLog=false] - Enable or disable logging. | ||
* @param {string} [log_config.logFileName='cybs-batch-upload'] - Log file name (without extension). | ||
* @param {string} [log_config.logDirectory='./logs'] - Directory to store log files. | ||
* @param {number} [log_config.logFileMaxSize=5242880] - Maximum log file size in bytes (default 5MB). | ||
* @param {string} [log_config.loggingLevel='debug'] - Logging level ('debug', 'info', 'warn', 'error'). | ||
* | ||
* Example: | ||
* const log_config = { | ||
* enableLog: true, | ||
* logFileName: 'cybs-batch-upload', | ||
* logDirectory: './logs', | ||
* logFileMaxSize: 5242880, | ||
* loggingLevel: 'debug' | ||
* }; | ||
*/ | ||
constructor(log_config) { | ||
if (!log_config) { | ||
log_config = { | ||
enableLog: false | ||
}; | ||
} | ||
const logConfiguration = new LogConfiguration(log_config); | ||
//fallback for missing values | ||
logConfiguration.getDefaultLoggingProperties(""); | ||
|
||
this.logger = Logger.getLoggerFromLogConfig(logConfiguration, 'BatchUploadWithMTLSApi'); | ||
this.logger.info(Constants.BEGIN_TRANSACTION); | ||
} | ||
|
||
/** | ||
* Uploads a batch file to CyberSource using a PKCS#12 (.p12/.pfx) client certificate for mutual TLS authentication. | ||
* The file is PGP-encrypted before upload. | ||
* | ||
* @param {Object} opts - Options for the upload. | ||
* @param {string} opts.inputFilePath - Path to the input file to be uploaded. | ||
* @param {string} opts.environmentHostname - CyberSource environment hostname. | ||
* @param {string} opts.publicKeyFilePath - Path to the PGP public key file for encryption. | ||
* @param {string} opts.clientCertP12FilePath - Path to the PKCS#12 client certificate file. | ||
* @param {string} opts.clientCertP12Password - Password for the PKCS#12 client certificate password. | ||
* @param {string} opts.serverTrustCertPath - Path to the server trust certificate file (optional). | ||
* @param {boolean} [opts.verify_ssl=true] - Whether to reject unauthorized SSL certificates (optional). | ||
* @param {function(Error, any):void} callback - Callback function with (error, result). | ||
*/ | ||
uploadBatchAPIWithP12(opts, callback) { | ||
const { | ||
inputFilePath, | ||
environmentHostname, | ||
publicKeyFilePath, | ||
clientCertP12FilePath, | ||
clientCertP12Password, | ||
serverTrustCertPath, | ||
verify_ssl = true | ||
} = opts; | ||
try { | ||
if (verify_ssl === false) { | ||
this.logger.warn('verify_ssl is set to false. SSL verification is DISABLED. This setting is NOT SAFE for production and should NOT be used in production environments!'); | ||
} | ||
this.logger.info('Starting batch upload with p12/pfx for given file'); | ||
const endpoint = '/pts/v1/transaction-batch-upload'; | ||
const endpointUrl = BatchUploadUtility.getEndpointUrl(environmentHostname, endpoint); | ||
BatchUploadUtility.validateBatchApiP12Inputs( | ||
inputFilePath, environmentHostname, publicKeyFilePath, clientCertP12FilePath, serverTrustCertPath | ||
); | ||
|
||
PgpEncryptionUtility.handlePGPEncrypt(inputFilePath, publicKeyFilePath) | ||
.then(encryptedBuffer => { | ||
let uploadFileName = 'file.pgp'; | ||
if (inputFilePath && inputFilePath.trim()) { | ||
const base = path.basename(inputFilePath, path.extname(inputFilePath)); | ||
uploadFileName = base + '.pgp'; | ||
} | ||
const clientCertP12 = fs.readFileSync(clientCertP12FilePath); | ||
const serverTrustCert = serverTrustCertPath ? fs.readFileSync(serverTrustCertPath) : undefined; | ||
return MutualAuthUploadUtility.handleUploadOperationUsingP12orPfx( | ||
encryptedBuffer, | ||
endpointUrl, | ||
uploadFileName, | ||
clientCertP12, | ||
clientCertP12Password, | ||
serverTrustCert, | ||
verify_ssl | ||
); | ||
}) | ||
.then(result => { | ||
callback(null, result); | ||
this.logger.info(Constants.END_TRANSACTION); | ||
}) | ||
.catch(error => { | ||
const errorMsg = error?.message || error?.error?.message || error.stack; | ||
this.logger.error(errorMsg); | ||
callback(error, (error && error.response) ? error.response : undefined); | ||
this.logger.info(Constants.END_TRANSACTION); | ||
}); | ||
} catch (e) { | ||
this.logger.error('Exception in Batch Upload API', e); | ||
callback(e); | ||
this.logger.info(Constants.END_TRANSACTION); | ||
} | ||
} | ||
|
||
/** | ||
* Uploads a batch file to CyberSource using a client private key and certificate for mutual TLS authentication. | ||
* The file is PGP-encrypted before upload. | ||
* | ||
* @param {Object} opts - Options for the upload. | ||
* @param {string} opts.inputFilePath - Path to the input file to be uploaded. | ||
* @param {string} opts.environmentHostname - CyberSource environment hostname. | ||
* @param {string} opts.publicKeyFilePath - Path to the PGP public key file for encryption. | ||
* @param {string} opts.clientPrivateKeyFilePath - Path to the client private key file. | ||
* @param {string} opts.clientCertFilePath - Path to the client certificate file. | ||
* @param {string} opts.serverTrustCertPath - Path to the server trust certificate file (optional). | ||
* @param {string} [opts.clientKeyPassword] - Password for the client private key (if encrypted). | ||
* @param {boolean} [opts.verify_ssl=true] - Whether to reject unauthorized SSL certificates (optional). | ||
* @param {function(Error, any):void} callback - Callback function with (error, result). | ||
*/ | ||
|
||
uploadBatchAPIWithKeys(opts, callback) { | ||
const { | ||
inputFilePath, | ||
environmentHostname, | ||
publicKeyFilePath, | ||
clientPrivateKeyFilePath, | ||
clientCertFilePath, | ||
serverTrustCertPath, | ||
clientKeyPassword, | ||
verify_ssl = true | ||
} = opts; | ||
try { | ||
if (verify_ssl === false) { | ||
this.logger.warn('verify_ssl is set to false. SSL verification is DISABLED. This setting is NOT SAFE for production and should NOT be used in production environments!'); | ||
} | ||
this.logger.info('Starting batch upload with client private key and certs for given file'); | ||
const endpoint = '/pts/v1/transaction-batch-upload'; | ||
const endpointUrl = BatchUploadUtility.getEndpointUrl(environmentHostname, endpoint); | ||
BatchUploadUtility.validateBatchApiKeysInputs( | ||
inputFilePath, environmentHostname, publicKeyFilePath, clientPrivateKeyFilePath, clientCertFilePath, serverTrustCertPath | ||
); | ||
|
||
PgpEncryptionUtility.handlePGPEncrypt(inputFilePath, publicKeyFilePath) | ||
.then(encryptedBuffer => { | ||
let uploadFileName = 'file.pgp'; | ||
if (inputFilePath && inputFilePath.trim()) { | ||
const base = path.basename(inputFilePath, path.extname(inputFilePath)); | ||
uploadFileName = base + '.pgp'; | ||
} | ||
const clientPrivateKey = fs.readFileSync(clientPrivateKeyFilePath); | ||
const clientCert = fs.readFileSync(clientCertFilePath); | ||
const serverTrustCert = serverTrustCertPath ? fs.readFileSync(serverTrustCertPath) : undefined; | ||
return MutualAuthUploadUtility.handleUploadOperationUsingPrivateKeyAndCerts( | ||
encryptedBuffer, | ||
endpointUrl, | ||
uploadFileName, | ||
clientPrivateKey, | ||
clientCert, | ||
serverTrustCert, | ||
clientKeyPassword, | ||
verify_ssl | ||
); | ||
}) | ||
.then(result => { | ||
callback(null, result); | ||
this.logger.info(Constants.END_TRANSACTION); | ||
}) | ||
.catch(error => { | ||
const errorMsg = error?.message || error?.error?.message || error.stack; | ||
this.logger.error(errorMsg); | ||
callback(error, (error && error.response) ? error.response : undefined); | ||
this.logger.info(Constants.END_TRANSACTION); | ||
}); | ||
} catch (e) { | ||
this.logger.error('Exception in Batch Upload API', e); | ||
callback(e); | ||
this.logger.info(Constants.END_TRANSACTION); | ||
} | ||
} | ||
} | ||
|
||
module.exports = BatchUploadWithMTLSApi; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.