@houlak/plexo-sdk 0.1.39 → 0.1.40

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.
@@ -229,24 +229,36 @@ var UnwrapTransactionCallback = function (transactionCallback) { return __awaite
229
229
  });
230
230
  }); };
231
231
  var SignInstrumentCallback = function (instrumentCallback) { return __awaiter(void 0, void 0, void 0, function () {
232
- var signInstrumentCallbackResponse;
232
+ var signInstrumentCallbackResponse, serverResponse;
233
233
  return __generator(this, function (_a) {
234
234
  switch (_a.label) {
235
235
  case 0: return [4 /*yield*/, paymentGatewayClient.SignInstrumentCallback(instrumentCallback)];
236
236
  case 1:
237
237
  signInstrumentCallbackResponse = _a.sent();
238
- return [2 /*return*/, evaluator_service_1.Evaluator.genericEvaluator(instrumentCallback, signInstrumentCallbackResponse)];
238
+ serverResponse = {
239
+ response: signInstrumentCallbackResponse,
240
+ resultCode: signInstrumentCallbackResponse.object.object.resultCode,
241
+ errorMessage: signInstrumentCallbackResponse.object.object.errorMessage,
242
+ i18ErrorMessages: signInstrumentCallbackResponse.object.object.i18ErrorMessages,
243
+ };
244
+ return [2 /*return*/, evaluator_service_1.Evaluator.genericEvaluator(instrumentCallback, serverResponse)];
239
245
  }
240
246
  });
241
247
  }); };
242
248
  var SignTransactionCallback = function (transactionCallback) { return __awaiter(void 0, void 0, void 0, function () {
243
- var signTransactionCallbackResponse;
249
+ var signTransactionCallbackResponse, serverResponse;
244
250
  return __generator(this, function (_a) {
245
251
  switch (_a.label) {
246
252
  case 0: return [4 /*yield*/, paymentGatewayClient.SignTransactionCallback(transactionCallback)];
247
253
  case 1:
248
254
  signTransactionCallbackResponse = _a.sent();
249
- return [2 /*return*/, evaluator_service_1.Evaluator.genericEvaluator(transactionCallback, signTransactionCallbackResponse)];
255
+ serverResponse = {
256
+ response: signTransactionCallbackResponse,
257
+ resultCode: signTransactionCallbackResponse.object.object.resultCode,
258
+ errorMessage: signTransactionCallbackResponse.object.object.errorMessage,
259
+ i18ErrorMessages: signTransactionCallbackResponse.object.object.i18ErrorMessages,
260
+ };
261
+ return [2 /*return*/, evaluator_service_1.Evaluator.genericEvaluator(transactionCallback, serverResponse)];
250
262
  }
251
263
  });
252
264
  }); };
@@ -26,6 +26,6 @@ export interface IPaymentGatewayClient {
26
26
  EndReserveAsync(reserve: Reserve): Promise<ServerResponse<Transaction>>;
27
27
  UnwrapInstrumentCallbackAsync(serverSignedInstrumentCallback: ServerSignedCallback<InstrumentCallback>): Promise<ServerResponse<InstrumentCallback>>;
28
28
  UnwrapTransactionCallbackAsync(serverSignedTransactionCallback: ServerSignedCallback<TransactionCallback>): Promise<ServerResponse<TransactionCallback>>;
29
- SignInstrumentCallback(serverResponse: ServerResponse<InstrumentCallback>): Promise<ServerResponse<ClientSignedResponse>>;
30
- SignTransactionCallback(serverResponse: ServerResponse<TransactionCallback>): Promise<ServerResponse<ClientSignedResponse>>;
29
+ SignInstrumentCallback(serverResponse: ServerResponse<InstrumentCallback>): Promise<ClientSignedResponse>;
30
+ SignTransactionCallback(serverResponse: ServerResponse<TransactionCallback>): Promise<ClientSignedResponse>;
31
31
  }
@@ -27,6 +27,6 @@ export declare class PaymentGatewayClient implements IPaymentGatewayClient {
27
27
  EndReserveAsync(reserve: Reserve): Promise<ServerResponse<Transaction>>;
28
28
  UnwrapInstrumentCallbackAsync(serverSignedInstrumentCallback: ServerSignedCallback<InstrumentCallback>): Promise<ServerResponse<InstrumentCallback>>;
29
29
  UnwrapTransactionCallbackAsync(serverSignedTransactionCallback: ServerSignedCallback<TransactionCallback>): Promise<ServerResponse<TransactionCallback>>;
30
- SignInstrumentCallback(serverResponse: ServerResponse<InstrumentCallback>): Promise<ServerResponse<ClientSignedResponse>>;
31
- SignTransactionCallback(serverResponse: ServerResponse<TransactionCallback>): Promise<ServerResponse<ClientSignedResponse>>;
30
+ SignInstrumentCallback(serverResponse: ServerResponse<InstrumentCallback>): Promise<ClientSignedResponse>;
31
+ SignTransactionCallback(serverResponse: ServerResponse<TransactionCallback>): Promise<ClientSignedResponse>;
32
32
  }
@@ -71,7 +71,7 @@ var requestToPlexo = function (endpoint, request) { return __awaiter(void 0, voi
71
71
  utcUnixTimeExpiration: Date.parse(new Date().toString()),
72
72
  object: object,
73
73
  };
74
- return [4 /*yield*/, signatureHelper_1.SignatureHelper.getSignatureFromPlexo(stateObject)];
74
+ return [4 /*yield*/, signatureHelper_1.SignatureHelper.signRequest(stateObject)];
75
75
  case 1:
76
76
  signedClientRequest = _a.sent();
77
77
  logger_lib_1.default.debug("URL PX --> ".concat(endpoint));
@@ -327,7 +327,7 @@ var PaymentGatewayClient = /** @class */ (function () {
327
327
  var verify;
328
328
  return __generator(this, function (_a) {
329
329
  switch (_a.label) {
330
- case 0: return [4 /*yield*/, signatureHelper_1.SignatureHelper.getPlexoSignature(serverSignedInstrumentCallback.object.fingerprint, serverSignedInstrumentCallback)];
330
+ case 0: return [4 /*yield*/, signatureHelper_1.SignatureHelper.unwrapCallback(serverSignedInstrumentCallback.object.fingerprint, serverSignedInstrumentCallback)];
331
331
  case 1:
332
332
  verify = _a.sent();
333
333
  return [2 /*return*/, verify];
@@ -340,7 +340,7 @@ var PaymentGatewayClient = /** @class */ (function () {
340
340
  var verify;
341
341
  return __generator(this, function (_a) {
342
342
  switch (_a.label) {
343
- case 0: return [4 /*yield*/, signatureHelper_1.SignatureHelper.getPlexoSignature(serverSignedTransactionCallback.object.fingerprint, serverSignedTransactionCallback)];
343
+ case 0: return [4 /*yield*/, signatureHelper_1.SignatureHelper.unwrapCallback(serverSignedTransactionCallback.object.fingerprint, serverSignedTransactionCallback)];
344
344
  case 1:
345
345
  verify = _a.sent();
346
346
  return [2 /*return*/, verify];
@@ -353,7 +353,7 @@ var PaymentGatewayClient = /** @class */ (function () {
353
353
  var response;
354
354
  return __generator(this, function (_a) {
355
355
  switch (_a.label) {
356
- case 0: return [4 /*yield*/, signatureHelper_1.SignatureHelper.getSignatureFromCallback(serverResponse)];
356
+ case 0: return [4 /*yield*/, signatureHelper_1.SignatureHelper.signCallback(serverResponse)];
357
357
  case 1:
358
358
  response = _a.sent();
359
359
  return [2 /*return*/, response];
@@ -366,7 +366,7 @@ var PaymentGatewayClient = /** @class */ (function () {
366
366
  var response;
367
367
  return __generator(this, function (_a) {
368
368
  switch (_a.label) {
369
- case 0: return [4 /*yield*/, signatureHelper_1.SignatureHelper.getSignatureFromCallback(serverResponse)];
369
+ case 0: return [4 /*yield*/, signatureHelper_1.SignatureHelper.signCallback(serverResponse)];
370
370
  case 1:
371
371
  response = _a.sent();
372
372
  return [2 /*return*/, response];
@@ -26,6 +26,6 @@ export declare class PaymentGatewayMock implements IPaymentGatewayClient {
26
26
  EndReserveAsync(reserve: Reserve): Promise<ServerResponse<Transaction>>;
27
27
  UnwrapInstrumentCallbackAsync(serverSignedInstrumentCallback: ServerSignedCallback<InstrumentCallback>): Promise<ServerResponse<InstrumentCallback>>;
28
28
  UnwrapTransactionCallbackAsync(serverSignedTransactionCallback: ServerSignedCallback<TransactionCallback>): Promise<ServerResponse<TransactionCallback>>;
29
- SignInstrumentCallback(serverResponse: ServerResponse<InstrumentCallback>): Promise<ServerResponse<ClientSignedResponse>>;
30
- SignTransactionCallback(serverResponse: ServerResponse<TransactionCallback>): Promise<ServerResponse<ClientSignedResponse>>;
29
+ SignInstrumentCallback(serverResponse: ServerResponse<InstrumentCallback>): Promise<ClientSignedResponse>;
30
+ SignTransactionCallback(serverResponse: ServerResponse<TransactionCallback>): Promise<ClientSignedResponse>;
31
31
  }
@@ -314,20 +314,14 @@ var PaymentGatewayMock = /** @class */ (function () {
314
314
  PaymentGatewayMock.prototype.SignInstrumentCallback = function (serverResponse) {
315
315
  return __awaiter(this, void 0, void 0, function () {
316
316
  return __generator(this, function (_a) {
317
- return [2 /*return*/, {
318
- resultCode: IndexSDK_1.ResultCodes.Ok,
319
- response: mocks_1.mocks.clientSignedResponseMock,
320
- }];
317
+ return [2 /*return*/, mocks_1.mocks.clientSignedResponseMock];
321
318
  });
322
319
  });
323
320
  };
324
321
  PaymentGatewayMock.prototype.SignTransactionCallback = function (serverResponse) {
325
322
  return __awaiter(this, void 0, void 0, function () {
326
323
  return __generator(this, function (_a) {
327
- return [2 /*return*/, {
328
- resultCode: IndexSDK_1.ResultCodes.Ok,
329
- response: mocks_1.mocks.clientSignedResponseMock,
330
- }];
324
+ return [2 /*return*/, mocks_1.mocks.clientSignedResponseMock];
331
325
  });
332
326
  });
333
327
  };
@@ -1,9 +1,6 @@
1
1
  import { ClientSignedResponse, GenericSignedObject, GenericStateObject, InstrumentCallback, ServerResponse, TransactionCallback } from '../..';
2
- import { Certificate } from '../../types/signatureHelper.type';
3
- export declare const canonizeJson: <T>(object: T, keysToSkip?: string[]) => T;
4
2
  export declare const SignatureHelper: {
5
- getCertificate: () => Promise<Certificate>;
6
- getSignatureFromPlexo: <T extends object>(objectToSign: GenericStateObject<T>) => Promise<GenericSignedObject<T>>;
7
- getSignatureFromCallback: (response: ServerResponse<InstrumentCallback | TransactionCallback>) => Promise<ServerResponse<ClientSignedResponse>>;
8
- getPlexoSignature: <T_1 extends object>(fingerprint: string, response: GenericSignedObject<T_1>) => Promise<ServerResponse<T_1>>;
3
+ signRequest: <T extends object>(objectToSign: GenericStateObject<T>) => Promise<GenericSignedObject<T>>;
4
+ unwrapCallback: <T_1 extends object>(fingerprint: string, response: GenericSignedObject<T_1>) => Promise<ServerResponse<T_1>>;
5
+ signCallback: (response: ServerResponse<InstrumentCallback | TransactionCallback>) => Promise<ClientSignedResponse>;
9
6
  };
@@ -36,132 +36,22 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
36
36
  }
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.SignatureHelper = exports.canonizeJson = void 0;
39
+ exports.SignatureHelper = void 0;
40
40
  var axios_1 = require("axios");
41
- var fs = require("fs");
42
- var pem = require("pem");
43
41
  var crypto_1 = require("crypto");
44
- var util_1 = require("util");
45
42
  var logger_lib_1 = require("../../../lib/logger.lib");
46
43
  var config_1 = require("../../../config/config");
47
44
  var __1 = require("../..");
48
45
  var utils_1 = require("../../../utils");
49
- var stringifyWithFloats_1 = require("./stringifyWithFloats");
46
+ var signatureUtils_1 = require("./signatureUtils");
50
47
  var client = axios_1.default.create({
51
48
  baseURL: config_1.config.plexoUrl,
52
49
  });
53
- var canonizeJson = function (object, keysToSkip) {
54
- var cleanObject = deleteObjectUndefined(object, keysToSkip);
55
- logger_lib_1.default.info(cleanObject, 'Clean object');
56
- return sort(cleanObject);
57
- };
58
- exports.canonizeJson = canonizeJson;
59
- var sort = function (object) {
60
- if (Array.isArray(object)) {
61
- var newArray_1 = [];
62
- object.map(function (item) { return newArray_1.push(sort(item)); });
63
- return newArray_1;
64
- }
65
- if (object && typeof object === 'object') {
66
- var newObject_1 = {};
67
- Object.keys(object)
68
- .sort()
69
- .map(function (key) { return (newObject_1[key] = sort(object[key])); });
70
- return newObject_1;
71
- }
72
- return object;
73
- };
74
- // TODO:
75
- // const parseDateToISO = (object: any) => {}
76
- var deleteObjectUndefined = function (object, keysToSkip) {
77
- if (Array.isArray(object)) {
78
- object = object
79
- .filter(function (item) { return item !== undefined || !item.length; })
80
- .map(function (item) {
81
- return (item && typeof item === 'object') || Array.isArray(item)
82
- ? deleteObjectUndefined(item, keysToSkip)
83
- : null;
84
- });
85
- return;
86
- }
87
- if (object && typeof object === 'object') {
88
- Object.keys(object).map(function (key) {
89
- if (keysToSkip === null || keysToSkip === void 0 ? void 0 : keysToSkip.includes(key)) {
90
- return;
91
- }
92
- if (object[key] && typeof object[key] === 'object') {
93
- if (Object.entries(object[key]).length === 0) {
94
- delete object[key];
95
- }
96
- deleteObjectUndefined(object[key], keysToSkip);
97
- }
98
- if ((!object[key] && object[key] !== 0 && typeof object[key] !== 'boolean') ||
99
- (!object[key].length && Array.isArray(object[key]))) {
100
- delete object[key];
101
- return;
102
- }
103
- if (Array.isArray(object[key]) && object[key].length) {
104
- deleteObjectUndefined(object[key], keysToSkip);
105
- }
106
- });
107
- }
108
- return object;
109
- };
110
- var getFingerprint = function (content, algorithm, inputEncoding, outputEncoding) {
111
- if (algorithm === void 0) { algorithm = 'sha1'; }
112
- if (inputEncoding === void 0) { inputEncoding = 'utf8'; }
113
- if (outputEncoding === void 0) { outputEncoding = 'base64'; }
114
- var shaSum = (0, crypto_1.createHash)(algorithm);
115
- shaSum.update(content, inputEncoding);
116
- var res = shaSum.digest(outputEncoding);
117
- return res;
118
- };
119
- var getCertificate = function () { return __awaiter(void 0, void 0, void 0, function () {
120
- var pathPfx, pfx, certs;
121
- return __generator(this, function (_a) {
122
- switch (_a.label) {
123
- case 0:
124
- pathPfx = config_1.config.plexoClient.certificatePath;
125
- pfx = fs.readFileSync(pathPfx);
126
- return [4 /*yield*/, new Promise(function (resolve, reject) { return __awaiter(void 0, void 0, void 0, function () {
127
- return __generator(this, function (_a) {
128
- switch (_a.label) {
129
- case 0: return [4 /*yield*/, pem.readPkcs12(pfx, { p12Password: config_1.config.plexoClient.certificatePassword }, function (_err, cert) { return __awaiter(void 0, void 0, void 0, function () {
130
- var privateKey, stringifiedCert;
131
- return __generator(this, function (_a) {
132
- if (_err) {
133
- return [2 /*return*/, reject(_err)];
134
- }
135
- privateKey = cert.key;
136
- stringifiedCert = cert.cert;
137
- resolve({ privateKey: privateKey, cert: stringifiedCert });
138
- return [2 /*return*/];
139
- });
140
- }); })];
141
- case 1:
142
- _a.sent();
143
- return [2 /*return*/];
144
- }
145
- });
146
- }); })];
147
- case 1:
148
- certs = _a.sent();
149
- return [2 /*return*/, certs];
150
- }
151
- });
152
- }); };
153
- var generateSignature = function (object, privateKey) {
154
- var canonizedString = (0, stringifyWithFloats_1.stringifyAmountsWithFloats)(object);
155
- logger_lib_1.default.debug('STRING TO SIGN --> ' + canonizedString);
156
- var canonizedStringEncoded = new util_1.TextEncoder().encode(canonizedString);
157
- var signKey = (0, crypto_1.sign)('SHA512', canonizedStringEncoded, privateKey).toString('base64');
158
- return signKey;
159
- };
160
- var getSignatureFromPlexo = function (objectToSign) { return __awaiter(void 0, void 0, void 0, function () {
50
+ var signRequest = function (objectToSign) { return __awaiter(void 0, void 0, void 0, function () {
161
51
  var cert, privateKey, stringifiedCert, signedObject, thumbnail, canonizedObject, objectoToPascalKeys, signKey;
162
52
  return __generator(this, function (_a) {
163
53
  switch (_a.label) {
164
- case 0: return [4 /*yield*/, getCertificate()];
54
+ case 0: return [4 /*yield*/, signatureUtils_1.signatureUtils.getCertificate()];
165
55
  case 1:
166
56
  cert = _a.sent();
167
57
  privateKey = cert.privateKey;
@@ -175,54 +65,19 @@ var getSignatureFromPlexo = function (objectToSign) { return __awaiter(void 0, v
175
65
  object: objectToSign,
176
66
  signature: '',
177
67
  };
178
- thumbnail = getFingerprint(stringifiedCert, 'sha1', 'base64', 'hex').toUpperCase();
68
+ thumbnail = signatureUtils_1.signatureUtils
69
+ .getFingerprint(stringifiedCert, 'sha1', 'base64', 'hex')
70
+ .toUpperCase();
179
71
  objectToSign.fingerprint = thumbnail;
180
- canonizedObject = (0, exports.canonizeJson)(objectToSign);
72
+ canonizedObject = signatureUtils_1.signatureUtils.canonizeJson(objectToSign);
181
73
  objectoToPascalKeys = utils_1.caseUtils.toPascalKeys(canonizedObject);
182
- signKey = generateSignature(objectoToPascalKeys, privateKey);
74
+ signKey = signatureUtils_1.signatureUtils.generateSignature(objectoToPascalKeys, privateKey);
183
75
  signedObject.signature = signKey;
184
76
  signedObject.object = canonizedObject;
185
77
  return [2 /*return*/, signedObject];
186
78
  }
187
79
  });
188
80
  }); };
189
- var getSignatureFromCallback = function (response) { return __awaiter(void 0, void 0, void 0, function () {
190
- var object, stateObject, objectSignature, serverResponse;
191
- return __generator(this, function (_a) {
192
- switch (_a.label) {
193
- case 0:
194
- object = {
195
- client: response.response.client,
196
- request: response,
197
- };
198
- stateObject = {
199
- fingerprint: '',
200
- utcUnixTimeExpiration: Date.parse(new Date().toString()),
201
- object: object,
202
- };
203
- return [4 /*yield*/, getSignatureFromPlexo(stateObject)];
204
- case 1:
205
- objectSignature = _a.sent();
206
- serverResponse = {
207
- response: {
208
- object: {
209
- object: {
210
- client: objectSignature.object.object.client,
211
- resultCode: response.resultCode,
212
- },
213
- fingerprint: objectSignature.object.fingerprint,
214
- utcUnixTimeExpiration: objectSignature.object.utcUnixTimeExpiration,
215
- },
216
- signature: objectSignature.signature,
217
- },
218
- resultCode: response.resultCode,
219
- errorMessage: response.errorMessage,
220
- i18ErrorMessages: response.i18ErrorMessages,
221
- };
222
- return [2 /*return*/, serverResponse];
223
- }
224
- });
225
- }); };
226
81
  var getPlexoKey = function (fingerprint) { return __awaiter(void 0, void 0, void 0, function () {
227
82
  var plexoResponse;
228
83
  return __generator(this, function (_a) {
@@ -237,7 +92,7 @@ var getPlexoKey = function (fingerprint) { return __awaiter(void 0, void 0, void
237
92
  }
238
93
  });
239
94
  }); };
240
- var getPlexoSignature = function (fingerprint, response) { return __awaiter(void 0, void 0, void 0, function () {
95
+ var unwrapCallback = function (fingerprint, response) { return __awaiter(void 0, void 0, void 0, function () {
241
96
  var serverResponse, plexoResponse, err_1, certificate, key, canonizedObject, objectInPascalCase, objectSorted, objectBuffer, verifySignature;
242
97
  return __generator(this, function (_a) {
243
98
  switch (_a.label) {
@@ -249,7 +104,7 @@ var getPlexoSignature = function (fingerprint, response) { return __awaiter(void
249
104
  return [3 /*break*/, 3];
250
105
  case 2:
251
106
  err_1 = _a.sent();
252
- logger_lib_1.default.error({ err: err_1 }, 'Error getting plexo public key');
107
+ logger_lib_1.default.error({ err: err_1 }, 'Error getting plexo certificate');
253
108
  serverResponse = {
254
109
  response: response.object.object,
255
110
  resultCode: __1.ResultCodes.InvalidFingerprint,
@@ -257,24 +112,18 @@ var getPlexoSignature = function (fingerprint, response) { return __awaiter(void
257
112
  };
258
113
  return [2 /*return*/, serverResponse];
259
114
  case 3:
260
- // const key = createPublicKey(`-----BEGIN CERTIFICATE-----
261
- // ${plexoResponse.Object.Object.Response.Key}
262
- // -----END CERTIFICATE-----`)
263
- logger_lib_1.default.info(plexoResponse.Object.Object.Response.Key, 'plexo');
264
115
  certificate = new crypto_1.X509Certificate(Buffer.from(plexoResponse.Object.Object.Response.Key, 'base64'));
265
116
  key = certificate.publicKey.export({ format: 'pem', type: 'pkcs1' });
266
- logger_lib_1.default.info(key, 'Generated public key');
267
- logger_lib_1.default.info(response.object, 'Raw object');
268
- canonizedObject = (0, exports.canonizeJson)(response.object, ['CreditLimits', 'creditLimits']);
269
- logger_lib_1.default.info(canonizedObject, 'Objeto canonizado');
117
+ canonizedObject = signatureUtils_1.signatureUtils.canonizeJson(response.object, [
118
+ 'CreditLimits',
119
+ 'creditLimits',
120
+ ]);
270
121
  objectInPascalCase = utils_1.caseUtils.toPascalKeys(canonizedObject);
271
- objectSorted = sort(objectInPascalCase);
122
+ objectSorted = signatureUtils_1.signatureUtils.sortObject(objectInPascalCase);
272
123
  objectBuffer = Buffer.from(JSON.stringify(objectSorted));
273
- logger_lib_1.default.info(objectSorted, 'Objeto a verificar');
274
124
  verifySignature = (0, crypto_1.createVerify)('SHA512')
275
125
  .update(objectBuffer)
276
126
  .verify(key, response.signature, 'base64');
277
- logger_lib_1.default.info(verifySignature, 'Resultado de verificacion de firma');
278
127
  serverResponse = {
279
128
  response: response.object.object,
280
129
  resultCode: verifySignature ? __1.ResultCodes.Ok : __1.ResultCodes.InvalidSignature,
@@ -284,9 +133,39 @@ var getPlexoSignature = function (fingerprint, response) { return __awaiter(void
284
133
  }
285
134
  });
286
135
  }); };
136
+ var signCallback = function (response) { return __awaiter(void 0, void 0, void 0, function () {
137
+ var clientResponse, stateObject, signedObject, clientSignedResponse;
138
+ return __generator(this, function (_a) {
139
+ switch (_a.label) {
140
+ case 0:
141
+ clientResponse = {
142
+ resultCode: response.resultCode,
143
+ errorMessage: response.errorMessage,
144
+ client: response.response.client,
145
+ i18ErrorMessages: response.i18ErrorMessages,
146
+ };
147
+ stateObject = {
148
+ fingerprint: '',
149
+ object: clientResponse,
150
+ utcUnixTimeExpiration: Date.parse(new Date().toString()),
151
+ };
152
+ return [4 /*yield*/, signRequest(stateObject)];
153
+ case 1:
154
+ signedObject = _a.sent();
155
+ clientSignedResponse = {
156
+ signature: signedObject.signature,
157
+ object: {
158
+ fingerprint: signedObject.object.fingerprint,
159
+ utcUnixTimeExpiration: signedObject.object.utcUnixTimeExpiration,
160
+ object: clientResponse,
161
+ },
162
+ };
163
+ return [2 /*return*/, clientSignedResponse];
164
+ }
165
+ });
166
+ }); };
287
167
  exports.SignatureHelper = {
288
- getCertificate: getCertificate,
289
- getSignatureFromPlexo: getSignatureFromPlexo,
290
- getSignatureFromCallback: getSignatureFromCallback,
291
- getPlexoSignature: getPlexoSignature,
168
+ signRequest: signRequest,
169
+ unwrapCallback: unwrapCallback,
170
+ signCallback: signCallback,
292
171
  };
@@ -0,0 +1,10 @@
1
+ import { BinaryToTextEncoding, Encoding } from 'crypto';
2
+ import { Certificate } from '../../types/signatureHelper.type';
3
+ export declare const signatureUtils: {
4
+ canonizeJson: <T>(object: T, keysToSkip?: string[]) => T;
5
+ sortObject: (object: any | any[]) => any | any[];
6
+ deleteObjectUndefined: (object: any, keysToSkip?: string[]) => any;
7
+ getFingerprint: (content: string, algorithm?: string, inputEncoding?: Encoding, outputEncoding?: BinaryToTextEncoding) => string;
8
+ getCertificate: () => Promise<Certificate>;
9
+ generateSignature: <T_1 extends object>(object: T_1, privateKey: string) => string;
10
+ };
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.signatureUtils = void 0;
40
+ var fs = require("fs");
41
+ var pem = require("pem");
42
+ var crypto_1 = require("crypto");
43
+ var util_1 = require("util");
44
+ var logger_lib_1 = require("../../../lib/logger.lib");
45
+ var config_1 = require("../../../config/config");
46
+ var stringifyWithFloats_1 = require("./stringifyWithFloats");
47
+ var canonizeJson = function (object, keysToSkip) {
48
+ var cleanObject = deleteObjectUndefined(object, keysToSkip);
49
+ return sortObject(cleanObject);
50
+ };
51
+ var sortObject = function (object) {
52
+ if (Array.isArray(object)) {
53
+ var newArray_1 = [];
54
+ object.map(function (item) { return newArray_1.push(sortObject(item)); });
55
+ return newArray_1;
56
+ }
57
+ if (object && typeof object === 'object') {
58
+ var newObject_1 = {};
59
+ Object.keys(object)
60
+ .sort()
61
+ .map(function (key) { return (newObject_1[key] = sortObject(object[key])); });
62
+ return newObject_1;
63
+ }
64
+ return object;
65
+ };
66
+ var deleteObjectUndefined = function (object, keysToSkip) {
67
+ if (Array.isArray(object)) {
68
+ object = object
69
+ .filter(function (item) { return item !== undefined || !item.length; })
70
+ .map(function (item) {
71
+ return (item && typeof item === 'object') || Array.isArray(item)
72
+ ? deleteObjectUndefined(item, keysToSkip)
73
+ : null;
74
+ });
75
+ return;
76
+ }
77
+ if (object && typeof object === 'object') {
78
+ Object.keys(object).map(function (key) {
79
+ if (keysToSkip === null || keysToSkip === void 0 ? void 0 : keysToSkip.includes(key)) {
80
+ return;
81
+ }
82
+ if (object[key] && typeof object[key] === 'object') {
83
+ if (Object.entries(object[key]).length === 0) {
84
+ delete object[key];
85
+ }
86
+ deleteObjectUndefined(object[key], keysToSkip);
87
+ }
88
+ if ((!object[key] && object[key] !== 0 && typeof object[key] !== 'boolean') ||
89
+ (!object[key].length && Array.isArray(object[key]))) {
90
+ delete object[key];
91
+ return;
92
+ }
93
+ if (Array.isArray(object[key]) && object[key].length) {
94
+ deleteObjectUndefined(object[key], keysToSkip);
95
+ }
96
+ });
97
+ }
98
+ return object;
99
+ };
100
+ var getFingerprint = function (content, algorithm, inputEncoding, outputEncoding) {
101
+ if (algorithm === void 0) { algorithm = 'sha1'; }
102
+ if (inputEncoding === void 0) { inputEncoding = 'utf8'; }
103
+ if (outputEncoding === void 0) { outputEncoding = 'base64'; }
104
+ var shaSum = (0, crypto_1.createHash)(algorithm);
105
+ shaSum.update(content, inputEncoding);
106
+ var res = shaSum.digest(outputEncoding);
107
+ return res;
108
+ };
109
+ var getCertificate = function () { return __awaiter(void 0, void 0, void 0, function () {
110
+ var pathPfx, pfx, certs;
111
+ return __generator(this, function (_a) {
112
+ switch (_a.label) {
113
+ case 0:
114
+ pathPfx = config_1.config.plexoClient.certificatePath;
115
+ pfx = fs.readFileSync(pathPfx);
116
+ return [4 /*yield*/, new Promise(function (resolve, reject) { return __awaiter(void 0, void 0, void 0, function () {
117
+ return __generator(this, function (_a) {
118
+ switch (_a.label) {
119
+ case 0: return [4 /*yield*/, pem.readPkcs12(pfx, { p12Password: config_1.config.plexoClient.certificatePassword }, function (_err, cert) { return __awaiter(void 0, void 0, void 0, function () {
120
+ var privateKey, stringifiedCert;
121
+ return __generator(this, function (_a) {
122
+ if (_err) {
123
+ return [2 /*return*/, reject(_err)];
124
+ }
125
+ privateKey = cert.key;
126
+ stringifiedCert = cert.cert;
127
+ resolve({ privateKey: privateKey, cert: stringifiedCert });
128
+ return [2 /*return*/];
129
+ });
130
+ }); })];
131
+ case 1:
132
+ _a.sent();
133
+ return [2 /*return*/];
134
+ }
135
+ });
136
+ }); })];
137
+ case 1:
138
+ certs = _a.sent();
139
+ return [2 /*return*/, certs];
140
+ }
141
+ });
142
+ }); };
143
+ var generateSignature = function (object, privateKey) {
144
+ var canonizedString = (0, stringifyWithFloats_1.stringifyAmountsWithFloats)(object);
145
+ logger_lib_1.default.debug('STRING TO SIGN --> ' + canonizedString);
146
+ var canonizedStringEncoded = new util_1.TextEncoder().encode(canonizedString);
147
+ var signKey = (0, crypto_1.sign)('SHA512', canonizedStringEncoded, privateKey).toString('base64');
148
+ return signKey;
149
+ };
150
+ exports.signatureUtils = {
151
+ canonizeJson: canonizeJson,
152
+ sortObject: sortObject,
153
+ deleteObjectUndefined: deleteObjectUndefined,
154
+ getFingerprint: getFingerprint,
155
+ getCertificate: getCertificate,
156
+ generateSignature: generateSignature,
157
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@houlak/plexo-sdk",
3
- "version": "0.1.39",
3
+ "version": "0.1.40",
4
4
  "description": "Node SDK for Plexo payment services",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",