@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.
- package/lib/handler/PlexoHandler.js +16 -4
- package/lib/sdk/IPaymentGatewayClient.d.ts +2 -2
- package/lib/sdk/PaymentGatewayClient.d.ts +2 -2
- package/lib/sdk/PaymentGatewayClient.js +5 -5
- package/lib/sdk/PaymentGatewayMock.d.ts +2 -2
- package/lib/sdk/PaymentGatewayMock.js +2 -8
- package/lib/sdk/helpers/signature/signatureHelper.d.ts +3 -6
- package/lib/sdk/helpers/signature/signatureHelper.js +50 -171
- package/lib/sdk/helpers/signature/signatureUtils.d.ts +10 -0
- package/lib/sdk/helpers/signature/signatureUtils.js +157 -0
- package/package.json +1 -1
|
@@ -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
|
-
|
|
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
|
-
|
|
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<
|
|
30
|
-
SignTransactionCallback(serverResponse: ServerResponse<TransactionCallback>): Promise<
|
|
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<
|
|
31
|
-
SignTransactionCallback(serverResponse: ServerResponse<TransactionCallback>): Promise<
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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<
|
|
30
|
-
SignTransactionCallback(serverResponse: ServerResponse<TransactionCallback>): Promise<
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
68
|
+
thumbnail = signatureUtils_1.signatureUtils
|
|
69
|
+
.getFingerprint(stringifiedCert, 'sha1', 'base64', 'hex')
|
|
70
|
+
.toUpperCase();
|
|
179
71
|
objectToSign.fingerprint = thumbnail;
|
|
180
|
-
canonizedObject =
|
|
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
|
|
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
|
|
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
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
117
|
+
canonizedObject = signatureUtils_1.signatureUtils.canonizeJson(response.object, [
|
|
118
|
+
'CreditLimits',
|
|
119
|
+
'creditLimits',
|
|
120
|
+
]);
|
|
270
121
|
objectInPascalCase = utils_1.caseUtils.toPascalKeys(canonizedObject);
|
|
271
|
-
objectSorted =
|
|
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
|
-
|
|
289
|
-
|
|
290
|
-
|
|
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
|
+
};
|