Merge pull request #467 from Adyen/hotfix/hmac

This commit is contained in:
Ricardo Ambrogi
2020-05-27 12:38:58 +02:00
committed by GitHub
29 changed files with 568 additions and 390 deletions

4
dist/es5/main.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
{
"name": "@adyen/api-library",
"version": "4.0.0",
"version": "4.0.1",
"description": "The Adyen API Library for NodeJS enables you to work with Adyen APIs.",
"main": "dist/lib/src/index.js",
"types": "dist/lib/src/index.d.ts",

View File

@@ -13,21 +13,28 @@ var _a;
import HmacValidator from "../utils/hmacValidator";
import { NotificationRequestItem } from "../typings/notification/models";
import { ApiConstants } from "../constants/apiConstants";
import NotificationRequest from "../notification/notificationRequest";
var key = "DFB1EB5485895CFA84146406857104ABB4CBCABDC8AAF103A624C8F6A3EAAB00";
var expectedSign = "xhpHvYq2u2Np0rstbZ6QjLGu7JWhvf7Iwaa6EviJSX0=";
var expectedSign = "ZNBPtI+oDyyRrLyD1XirkKnQgIAlFc07Vj27TeHsDRE=";
var notificationRequestItem = {
pspReference: "pspReference",
originalReference: "originalReference",
merchantAccountCode: "merchantAccount",
merchantReference: "reference",
amount: { currency: "EUR", value: 1000 },
eventCode: NotificationRequestItem.EventCodeEnum.CAPTURE,
eventDate: new Date("01-01-1970").toISOString(),
paymentMethod: "VISA",
reason: "reason",
success: NotificationRequestItem.SuccessEnum.True,
additionalData: (_a = {}, _a[ApiConstants.HMAC_SIGNATURE] = expectedSign, _a),
NotificationRequestItem: {
pspReference: "pspReference",
originalReference: "originalReference",
merchantAccountCode: "merchantAccount",
merchantReference: "reference",
amount: { currency: "EUR", value: 1000 },
eventCode: NotificationRequestItem.EventCodeEnum.REPORTAVAILABLE,
eventDate: "2019-09-21T11:45:24.637Z",
paymentMethod: "VISA",
reason: "reason",
success: NotificationRequestItem.SuccessEnum.True,
additionalData: (_a = {}, _a[ApiConstants.HMAC_SIGNATURE] = expectedSign, _a),
}
};
var notification = new NotificationRequest({
live: "false",
notificationItems: [notificationRequestItem]
});
describe("HMAC Validator", function () {
var hmacValidator;
beforeEach(function () {
@@ -47,19 +54,54 @@ describe("HMAC Validator", function () {
expect(encrypted).toEqual("34oR8T1whkQWTv9P+SzKyp8zhusf9n0dpqrm9nsqSJs=");
});
it("should get correct data to sign", function () {
var data = hmacValidator.getDataToSign(notificationRequestItem);
expect(data).toEqual("pspReference:originalReference:merchantAccount:reference:1000:EUR:CAPTURE:true");
var data = hmacValidator.getDataToSign(notification.notificationItems[0]);
expect(data).toEqual("pspReference:originalReference:merchantAccount:reference:1000:EUR:REPORT_AVAILABLE:true");
});
it("should have valid hmac", function () {
var encrypted = hmacValidator.calculateHmac(notificationRequestItem, key);
var encrypted = hmacValidator.calculateHmac(notification.notificationItems[0], key);
expect(expectedSign).toEqual(encrypted);
expect(hmacValidator.validateHMAC(notificationRequestItem, key)).toBeTruthy();
expect(hmacValidator.validateHMAC(notification.notificationItems[0], key)).toBeTruthy();
});
it("should have invalid hmac", function () {
var _a;
var invalidNotification = __assign(__assign({}, notificationRequestItem), { additionalData: (_a = {}, _a[ApiConstants.HMAC_SIGNATURE] = "notValidSign", _a) });
var invalidNotification = __assign(__assign({}, notification.notificationItems[0]), { additionalData: (_a = {}, _a[ApiConstants.HMAC_SIGNATURE] = "notValidSign", _a) });
var result = hmacValidator.validateHMAC(invalidNotification, key);
expect(result).toBeFalsy();
});
it("should test hmac", function () {
var data = "countryCode:currencyCode:merchantAccount:merchantReference:paymentAmount:sessionValidity:skinCode:NL:EUR:MagentoMerchantTest2:TEST-PAYMENT-2017-02-01-14\\:02\\:05:199:2017-02-02T14\\:02\\:05+01\\:00:PKz2KML1";
var key = "DFB1EB5485895CFA84146406857104ABB4CBCABDC8AAF103A624C8F6A3EAAB00";
var hmacValidator = new HmacValidator();
var encrypted = hmacValidator.calculateHmac(data, key);
expect(encrypted).toEqual("34oR8T1whkQWTv9P+SzKyp8zhusf9n0dpqrm9nsqSJs=");
});
it("should validate HMAC", function () {
expect(hmacValidator.validateHMAC(notification.notificationItems[0], key)).toBeTruthy();
});
it("should have valid notification request item HMAC", function () {
var _a;
var expectedSign = "ipnxGCaUZ4l8TUW75a71/ghd2Fe5ffvX0pV4TLTntIc=";
var notificationRequestItem = { NotificationRequestItem: {
pspReference: "pspReference",
originalReference: "originalReference",
merchantAccountCode: "merchantAccount",
merchantReference: "reference",
amount: { currency: "EUR", value: 1000 },
eventCode: "EVENT",
success: "true",
additionalData: (_a = {}, _a[ApiConstants.HMAC_SIGNATURE] = expectedSign, _a)
} };
var notification = new NotificationRequest({
live: "false",
notificationItems: [notificationRequestItem]
});
var data = hmacValidator.getDataToSign(notification.notificationItems[0]);
expect("pspReference:originalReference:merchantAccount:reference:1000:EUR:EVENT:true").toEqual(data);
var encrypted = hmacValidator.calculateHmac(notification.notificationItems[0], key);
expect(expectedSign).toEqual(encrypted);
expect(hmacValidator.validateHMAC(notification.notificationItems[0], key)).toBeTruthy();
notification.notificationItems[0].additionalData[ApiConstants.HMAC_SIGNATURE] = "notValidSign";
expect(hmacValidator.validateHMAC(notification.notificationItems[0], key)).toBeFalsy();
});
});
//# sourceMappingURL=hmacValidator.spec.js.map

View File

@@ -1 +1 @@
{"version":3,"file":"hmacValidator.spec.js","sourceRoot":"","sources":["../../../../src/__tests__/hmacValidator.spec.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"hmacValidator.spec.js","sourceRoot":"","sources":["../../../../src/__tests__/hmacValidator.spec.ts"],"names":[],"mappings":"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"}

View File

@@ -94,76 +94,15 @@ var assertError = function (e) {
}
fail(e);
};
beforeAll(function (done) { return __awaiter(void 0, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
client = createBasicAuthClient();
client.config.password = process.env.ADYEN_MARKETPLACE_PASSWORD;
client.config.username = process.env.ADYEN_MARKETPLACE_USER;
scope = nock(client.config.marketPayEndpoint);
platforms = new Platforms(client);
return [4, platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails: accountHolderDetails,
legalEntity: "Individual",
})];
case 1:
accountHolder = _a.sent();
return [4, platforms.Account.createAccount({
accountHolderCode: generateRandomCode(),
description: "This is a new account",
metadata: { meta: "data" },
payoutSchedule: "WEEKLY"
})];
case 2:
account = _a.sent();
return [4, platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails: accountHolderDetails,
legalEntity: "Individual"
})];
case 3:
accountHolderToSuspend = _a.sent();
return [4, platforms.Account.createAccount({
accountHolderCode: generateRandomCode(),
description: "This is a new account",
metadata: { meta: "data" },
payoutSchedule: "WEEKLY"
})];
case 4:
accountToClose = _a.sent();
return [4, platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails: accountHolderDetails,
legalEntity: "Individual"
})];
case 5:
accountHolderToUnSuspend = _a.sent();
return [4, platforms.Account.suspendAccountHolder({ accountHolderCode: accountHolderToUnSuspend.accountHolderCode })];
case 6:
_a.sent();
return [4, platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails: accountHolderDetails,
legalEntity: "Individual"
})];
case 7:
accountHolderToClose = _a.sent();
return [4, platforms.NotificationConfiguration.createNotificationConfiguration({
configurationDetails: __assign(__assign({}, notificationConfigurationDetails), { description: "" + generateRandomCode() })
})];
case 8:
notificationConfigurationToRetrieve = _a.sent();
done();
return [2];
}
});
}); });
beforeEach(function () {
if (!nock.isActive()) {
nock.activate();
}
client = createBasicAuthClient();
client.config.password = process.env.ADYEN_MARKETPLACE_PASSWORD;
client.config.username = process.env.ADYEN_MARKETPLACE_USER;
scope = nock(client.config.marketPayEndpoint);
platforms = new Platforms(client);
});
afterEach(function () {
nock.cleanAll();
@@ -211,6 +150,165 @@ describe("Platforms Test", function () {
});
});
});
});
});
describe("Fund", function () {
var _this = this;
var cases = [
["accountHolderBalance", createMock(), createMock()],
["accountHolderTransactionList", createMock(), createMock()],
["payoutAccountHolder", createMock(), createMock()],
["transferFunds", createMock(), createMock()],
["refundFundsTransfer", createMock(), createMock()],
["setupBeneficiary", createMock(), createMock()],
["refundNotPaidOutTransfers", createMock(), createMock()],
];
test.each(cases)("should %p", function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return __awaiter(_this, void 0, void 0, function () {
var fund, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
fund = platforms.Fund;
scope.post("/Fund/" + Client.MARKETPAY_FUND_API_VERSION + "//" + args[0]).reply(200, args[2]);
return [4, fund[args[0]](args[1])];
case 1:
result = _a.sent();
expect(result).toMatchObject(args[2]);
return [2];
}
});
});
});
});
describe("Notification Configuration", function () {
var _this = this;
var cases = [
["createNotificationConfiguration", createMock(), createMock()],
["getNotificationConfiguration", createMock(), createMock()],
["getNotificationConfigurationList", {}, createMock()],
["testNotificationConfiguration", createMock(), createMock()],
["updateNotificationConfiguration", createMock(), createMock()],
["deleteNotificationConfigurations", createMock(), createMock()],
];
test.each(cases)("should %p", function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return __awaiter(_this, void 0, void 0, function () {
var notificationConfiguration, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
notificationConfiguration = platforms.NotificationConfiguration;
scope.post("/Notification/" + Client.MARKETPAY_NOTIFICATION_API_VERSION + "//" + args[0]).reply(200, args[2]);
return [4, notificationConfiguration[args[0]](args[1])];
case 1:
result = _a.sent();
expect(result).toMatchObject(args[2]);
return [2];
}
});
});
});
});
describe("Hop", function () {
var _this = this;
var cases = [
["getOnboardingUrl", createMock(), createMock()]
];
test.each(cases)("should %p", function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return __awaiter(_this, void 0, void 0, function () {
var hostedOnboardingPage, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
hostedOnboardingPage = platforms.HostedOnboardingPage;
scope.post("/Hop/" + Client.MARKETPAY_HOP_API_VERSION + "//" + args[0]).reply(200, args[2]);
return [4, hostedOnboardingPage[args[0]](args[1])];
case 1:
result = _a.sent();
expect(result).toMatchObject(args[2]);
return [2];
}
});
});
});
});
});
describe.skip("Platforms Test E2E", function () {
var _this = this;
beforeAll(function (done) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4, platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails: accountHolderDetails,
legalEntity: "Individual",
})];
case 1:
accountHolder = _a.sent();
return [4, platforms.Account.createAccount({
accountHolderCode: generateRandomCode(),
description: "This is a new account",
metadata: { meta: "data" },
payoutSchedule: "WEEKLY"
})];
case 2:
account = _a.sent();
return [4, platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails: accountHolderDetails,
legalEntity: "Individual"
})];
case 3:
accountHolderToSuspend = _a.sent();
return [4, platforms.Account.createAccount({
accountHolderCode: generateRandomCode(),
description: "This is a new account",
metadata: { meta: "data" },
payoutSchedule: "WEEKLY"
})];
case 4:
accountToClose = _a.sent();
return [4, platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails: accountHolderDetails,
legalEntity: "Individual"
})];
case 5:
accountHolderToUnSuspend = _a.sent();
return [4, platforms.Account.suspendAccountHolder({ accountHolderCode: accountHolderToUnSuspend.accountHolderCode })];
case 6:
_a.sent();
return [4, platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails: accountHolderDetails,
legalEntity: "Individual"
})];
case 7:
accountHolderToClose = _a.sent();
return [4, platforms.NotificationConfiguration.createNotificationConfiguration({
configurationDetails: __assign(__assign({}, notificationConfigurationDetails), { description: "" + generateRandomCode() })
})];
case 8:
notificationConfigurationToRetrieve = _a.sent();
done();
return [2];
}
});
}); });
describe("Account", function () {
describe("Accounts E2E", function () {
it("should create account holder", function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
@@ -525,37 +623,6 @@ describe("Platforms Test", function () {
});
});
describe("Fund", function () {
var _this = this;
var cases = [
["accountHolderBalance", createMock(), createMock()],
["accountHolderTransactionList", createMock(), createMock()],
["payoutAccountHolder", createMock(), createMock()],
["transferFunds", createMock(), createMock()],
["refundFundsTransfer", createMock(), createMock()],
["setupBeneficiary", createMock(), createMock()],
["refundNotPaidOutTransfers", createMock(), createMock()],
];
test.each(cases)("should %p", function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return __awaiter(_this, void 0, void 0, function () {
var fund, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
fund = platforms.Fund;
scope.post("/Fund/" + Client.MARKETPAY_FUND_API_VERSION + "//" + args[0]).reply(200, args[2]);
return [4, fund[args[0]](args[1])];
case 1:
result = _a.sent();
expect(result).toMatchObject(args[2]);
return [2];
}
});
});
});
it("should retrieve the balance of an account holder", function () {
return __awaiter(this, void 0, void 0, function () {
var result, e_11;
@@ -642,37 +709,7 @@ describe("Platforms Test", function () {
});
});
describe("Notification Configuration", function () {
var _this = this;
var cases = [
["createNotificationConfiguration", createMock(), createMock()],
["getNotificationConfiguration", createMock(), createMock()],
["getNotificationConfigurationList", {}, createMock()],
["testNotificationConfiguration", createMock(), createMock()],
["updateNotificationConfiguration", createMock(), createMock()],
["deleteNotificationConfigurations", createMock(), createMock()],
];
var configurationID;
test.each(cases)("should %p", function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return __awaiter(_this, void 0, void 0, function () {
var notificationConfiguration, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
notificationConfiguration = platforms.NotificationConfiguration;
scope.post("/Notification/" + Client.MARKETPAY_NOTIFICATION_API_VERSION + "//" + args[0]).reply(200, args[2]);
return [4, notificationConfiguration[args[0]](args[1])];
case 1:
result = _a.sent();
expect(result).toMatchObject(args[2]);
return [2];
}
});
});
});
it("should retrieve all Notification Configurations", function () {
return __awaiter(this, void 0, void 0, function () {
var result, resultStr, e_14;
@@ -818,32 +855,5 @@ describe("Platforms Test", function () {
});
});
});
describe("Hop", function () {
var _this = this;
var cases = [
["getOnboardingUrl", createMock(), createMock()]
];
test.each(cases)("should %p", function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return __awaiter(_this, void 0, void 0, function () {
var hostedOnboardingPage, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
hostedOnboardingPage = platforms.HostedOnboardingPage;
scope.post("/Hop/" + Client.MARKETPAY_HOP_API_VERSION + "//" + args[0]).reply(200, args[2]);
return [4, hostedOnboardingPage[args[0]](args[1])];
case 1:
result = _a.sent();
expect(result).toMatchObject(args[2]);
return [2];
}
});
});
});
});
});
//# sourceMappingURL=platforms.spec.js.map

File diff suppressed because one or more lines are too long

View File

@@ -6,6 +6,7 @@ export declare class AdditionalData {
'expiryDate'?: string;
'authorisedAmountValue'?: string;
'authorisedAmountCurrency'?: string;
'hmacSignature'?: string;
static discriminator: string | undefined;
static attributeTypeMap: Array<{
name: string;

View File

@@ -40,6 +40,11 @@ var AdditionalData = (function () {
"name": "authorisedAmountCurrency",
"baseName": "authorisedAmountCurrency",
"type": "string"
},
{
"name": "hmacSignature",
"baseName": "hmacSignature",
"type": "string"
}
];
return AdditionalData;

View File

@@ -1 +1 @@
{"version":3,"file":"additionalData.js","sourceRoot":"","sources":["../../../../../src/typings/notification/additionalData.ts"],"names":[],"mappings":"AAkCA;IAAA;IAwEA,CAAC;IAHU,kCAAmB,GAA1B;QACI,OAAO,cAAc,CAAC,gBAAgB,CAAC;IAC3C,CAAC;IAzCM,4BAAa,GAAuB,SAAS,CAAC;IAE9C,+BAAgB,GAA0D;QAC7E;YACI,MAAM,EAAE,kBAAkB;YAC1B,UAAU,EAAE,kBAAkB;YAC9B,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,cAAc;YACtB,UAAU,EAAE,cAAc;YAC1B,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,UAAU;YAClB,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,aAAa;YACrB,UAAU,EAAE,aAAa;YACzB,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,YAAY;YACxB,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,uBAAuB;YAC/B,UAAU,EAAE,uBAAuB;YACnC,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,0BAA0B;YAClC,UAAU,EAAE,0BAA0B;YACtC,MAAM,EAAE,QAAQ;SACnB;KAAK,CAAC;IAKf,qBAAC;CAAA,AAxED,IAwEC;SAxEY,cAAc"}
{"version":3,"file":"additionalData.js","sourceRoot":"","sources":["../../../../../src/typings/notification/additionalData.ts"],"names":[],"mappings":"AAkCA;IAAA;IAiFA,CAAC;IAHU,kCAAmB,GAA1B;QACI,OAAO,cAAc,CAAC,gBAAgB,CAAC;IAC3C,CAAC;IA9CM,4BAAa,GAAuB,SAAS,CAAC;IAE9C,+BAAgB,GAA0D;QAC7E;YACI,MAAM,EAAE,kBAAkB;YAC1B,UAAU,EAAE,kBAAkB;YAC9B,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,cAAc;YACtB,UAAU,EAAE,cAAc;YAC1B,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,UAAU;YAClB,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,aAAa;YACrB,UAAU,EAAE,aAAa;YACzB,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,YAAY;YACxB,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,uBAAuB;YAC/B,UAAU,EAAE,uBAAuB;YACnC,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,0BAA0B;YAClC,UAAU,EAAE,0BAA0B;YACtC,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,eAAe;YACvB,UAAU,EAAE,eAAe;YAC3B,MAAM,EAAE,QAAQ;SACnB;KAAK,CAAC;IAKf,qBAAC;CAAA,AAjFD,IAiFC;SAjFY,cAAc"}

View File

@@ -1 +1 @@
{"version":3,"file":"amount.js","sourceRoot":"","sources":["../../../../../src/typings/notification/amount.ts"],"names":[],"mappings":"AAmCA;IAAA;IA2BA,CAAC;IAHU,0BAAmB,GAA1B;QACI,OAAO,MAAM,CAAC,gBAAgB,CAAC;IACnC,CAAC;IAhBM,oBAAa,GAAuB,SAAS,CAAC;IAE9C,uBAAgB,GAA0D;QAC7E;YACI,MAAM,EAAE,UAAU;YAClB,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,OAAO;YACf,UAAU,EAAE,OAAO;YACnB,MAAM,EAAE,QAAQ;SACnB;KAAK,CAAC;IAKf,aAAC;CAAA,AA3BD,IA2BC;SA3BY,MAAM"}
{"version":3,"file":"amount.js","sourceRoot":"","sources":["../../../../../src/typings/notification/amount.ts"],"names":[],"mappings":"AAkCA;IAAA;IA2BA,CAAC;IAHU,0BAAmB,GAA1B;QACI,OAAO,MAAM,CAAC,gBAAgB,CAAC;IACnC,CAAC;IAhBM,oBAAa,GAAuB,SAAS,CAAC;IAE9C,uBAAgB,GAA0D;QAC7E;YACI,MAAM,EAAE,UAAU;YAClB,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,OAAO;YACf,UAAU,EAAE,OAAO;YACnB,MAAM,EAAE,QAAQ;SACnB;KAAK,CAAC;IAKf,aAAC;CAAA,AA3BD,IA2BC;SA3BY,MAAM"}

View File

@@ -16,10 +16,13 @@ var HmacValidator = (function () {
return createHmac(HmacValidator.HMAC_SHA256_ALGORITHM, rawKey).update(dataString, "utf8").digest("base64");
};
HmacValidator.prototype.validateHMAC = function (notificationRequestItem, key) {
var _a;
var expectedSign = this.calculateHmac(notificationRequestItem, key);
var merchantSign = (_a = notificationRequestItem.additionalData) === null || _a === void 0 ? void 0 : _a[ApiConstants.HMAC_SIGNATURE];
return expectedSign === merchantSign;
var _a, _b;
if ((_a = notificationRequestItem.additionalData) === null || _a === void 0 ? void 0 : _a[ApiConstants.HMAC_SIGNATURE]) {
var expectedSign = this.calculateHmac(notificationRequestItem, key);
var merchantSign = (_b = notificationRequestItem.additionalData) === null || _b === void 0 ? void 0 : _b[ApiConstants.HMAC_SIGNATURE];
return expectedSign === merchantSign;
}
throw Error("Missing " + ApiConstants.HMAC_SIGNATURE);
};
HmacValidator.prototype.isNotificationRequestItem = function (item) {
return !Object.values(item).every(function (value) { return typeof value === "string"; });

View File

@@ -1 +1 @@
{"version":3,"file":"hmacValidator.js","sourceRoot":"","sources":["../../../../src/utils/hmacValidator.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"hmacValidator.js","sourceRoot":"","sources":["../../../../src/utils/hmacValidator.ts"],"names":[],"mappings":";;;;;;;AAmBA,OAAO,EAAC,UAAU,EAAC,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAC,YAAY,EAAC,MAAM,2BAA2B,CAAC;AAIvD;IAAA;IAgDA,CAAC;IA5CU,qCAAa,GAApB,UAAqB,IAAsC,EAAE,GAAW;QACpE,IAAM,UAAU,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,IAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvC,OAAO,UAAU,CAAC,aAAa,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/G,CAAC;IAEM,oCAAY,GAAnB,UAAoB,uBAAgD,EAAE,GAAW;;QAC7E,UAAI,uBAAuB,CAAC,cAAc,0CAAG,YAAY,CAAC,cAAc,GAAG;YACvE,IAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;YACtE,IAAM,YAAY,SAAG,uBAAuB,CAAC,cAAc,0CAAG,YAAY,CAAC,cAAc,CAAC,CAAC;YAC3F,OAAO,YAAY,KAAK,YAAY,CAAC;SACxC;QACD,MAAM,KAAK,CAAC,aAAW,YAAY,CAAC,cAAgB,CAAC,CAAC;IAC1D,CAAC;IAEO,iDAAyB,GAAjC,UAAkC,IAAgB;QAC9C,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,UAAC,KAAK,IAAc,OAAA,OAAO,KAAK,KAAK,QAAQ,EAAzB,CAAyB,CAAC,CAAC;IACrF,CAAC;IAEM,qCAAa,GAApB,UAAqB,uBAAmC;QACpD,IAAI,IAAI,CAAC,yBAAyB,CAAC,uBAAuB,CAAC,EAAE;YACzD,IAAM,cAAc,GAAG,EAAE,CAAC;YAC1B,cAAc,CAAC,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC;YAC1D,cAAc,CAAC,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;YAC/D,cAAc,CAAC,IAAI,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,CAAC;YACjE,cAAc,CAAC,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;YAC/D,cAAc,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1D,cAAc,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7D,cAAc,CAAC,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;YACvD,cAAc,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;YACrD,OAAO,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;SAC5D;aAAM;YACH,IAAM,MAAI,GAAa,EAAE,CAAC;YAC1B,IAAM,QAAM,GAAa,EAAE,CAAC;YAC5B,IAAM,UAAQ,GAAG,UAAC,GAAW;gBACzB,OAAA,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;YAA/C,CAA+C,CAAC;YACpD,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,UAAC,EAAY;oBAAX,GAAG,QAAA,EAAE,KAAK,QAAA;gBAC/D,MAAI,CAAC,IAAI,CAAC,UAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzB,QAAM,CAAC,IAAI,CAAC,UAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;YAEH,OAAO,eAAI,MAAI,EAAK,QAAM,EAAE,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;SAClE;IACL,CAAC;IA9Ca,mCAAqB,GAAG,QAAQ,CAAC;IACjC,4BAAc,GAAG,GAAG,CAAC;IA8CvC,oBAAC;CAAA,AAhDD,IAgDC;AAED,eAAe,aAAa,CAAC"}

View File

@@ -1,6 +1,6 @@
{
"name": "@adyen/api-library",
"version": "4.0.0",
"version": "4.0.1",
"description": "The Adyen API Library for NodeJS enables you to work with Adyen APIs.",
"main": "dist/lib/src/index.js",
"types": "dist/lib/src/index.d.ts",

View File

@@ -18,21 +18,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
var hmacValidator_1 = __importDefault(require("../utils/hmacValidator"));
var models_1 = require("../typings/notification/models");
var apiConstants_1 = require("../constants/apiConstants");
var notificationRequest_1 = __importDefault(require("../notification/notificationRequest"));
var key = "DFB1EB5485895CFA84146406857104ABB4CBCABDC8AAF103A624C8F6A3EAAB00";
var expectedSign = "xhpHvYq2u2Np0rstbZ6QjLGu7JWhvf7Iwaa6EviJSX0=";
var expectedSign = "ZNBPtI+oDyyRrLyD1XirkKnQgIAlFc07Vj27TeHsDRE=";
var notificationRequestItem = {
pspReference: "pspReference",
originalReference: "originalReference",
merchantAccountCode: "merchantAccount",
merchantReference: "reference",
amount: { currency: "EUR", value: 1000 },
eventCode: models_1.NotificationRequestItem.EventCodeEnum.CAPTURE,
eventDate: new Date("01-01-1970").toISOString(),
paymentMethod: "VISA",
reason: "reason",
success: models_1.NotificationRequestItem.SuccessEnum.True,
additionalData: (_a = {}, _a[apiConstants_1.ApiConstants.HMAC_SIGNATURE] = expectedSign, _a),
NotificationRequestItem: {
pspReference: "pspReference",
originalReference: "originalReference",
merchantAccountCode: "merchantAccount",
merchantReference: "reference",
amount: { currency: "EUR", value: 1000 },
eventCode: models_1.NotificationRequestItem.EventCodeEnum.REPORTAVAILABLE,
eventDate: "2019-09-21T11:45:24.637Z",
paymentMethod: "VISA",
reason: "reason",
success: models_1.NotificationRequestItem.SuccessEnum.True,
additionalData: (_a = {}, _a[apiConstants_1.ApiConstants.HMAC_SIGNATURE] = expectedSign, _a),
}
};
var notification = new notificationRequest_1.default({
live: "false",
notificationItems: [notificationRequestItem]
});
describe("HMAC Validator", function () {
var hmacValidator;
beforeEach(function () {
@@ -52,19 +59,54 @@ describe("HMAC Validator", function () {
expect(encrypted).toEqual("34oR8T1whkQWTv9P+SzKyp8zhusf9n0dpqrm9nsqSJs=");
});
it("should get correct data to sign", function () {
var data = hmacValidator.getDataToSign(notificationRequestItem);
expect(data).toEqual("pspReference:originalReference:merchantAccount:reference:1000:EUR:CAPTURE:true");
var data = hmacValidator.getDataToSign(notification.notificationItems[0]);
expect(data).toEqual("pspReference:originalReference:merchantAccount:reference:1000:EUR:REPORT_AVAILABLE:true");
});
it("should have valid hmac", function () {
var encrypted = hmacValidator.calculateHmac(notificationRequestItem, key);
var encrypted = hmacValidator.calculateHmac(notification.notificationItems[0], key);
expect(expectedSign).toEqual(encrypted);
expect(hmacValidator.validateHMAC(notificationRequestItem, key)).toBeTruthy();
expect(hmacValidator.validateHMAC(notification.notificationItems[0], key)).toBeTruthy();
});
it("should have invalid hmac", function () {
var _a;
var invalidNotification = __assign(__assign({}, notificationRequestItem), { additionalData: (_a = {}, _a[apiConstants_1.ApiConstants.HMAC_SIGNATURE] = "notValidSign", _a) });
var invalidNotification = __assign(__assign({}, notification.notificationItems[0]), { additionalData: (_a = {}, _a[apiConstants_1.ApiConstants.HMAC_SIGNATURE] = "notValidSign", _a) });
var result = hmacValidator.validateHMAC(invalidNotification, key);
expect(result).toBeFalsy();
});
it("should test hmac", function () {
var data = "countryCode:currencyCode:merchantAccount:merchantReference:paymentAmount:sessionValidity:skinCode:NL:EUR:MagentoMerchantTest2:TEST-PAYMENT-2017-02-01-14\\:02\\:05:199:2017-02-02T14\\:02\\:05+01\\:00:PKz2KML1";
var key = "DFB1EB5485895CFA84146406857104ABB4CBCABDC8AAF103A624C8F6A3EAAB00";
var hmacValidator = new hmacValidator_1.default();
var encrypted = hmacValidator.calculateHmac(data, key);
expect(encrypted).toEqual("34oR8T1whkQWTv9P+SzKyp8zhusf9n0dpqrm9nsqSJs=");
});
it("should validate HMAC", function () {
expect(hmacValidator.validateHMAC(notification.notificationItems[0], key)).toBeTruthy();
});
it("should have valid notification request item HMAC", function () {
var _a;
var expectedSign = "ipnxGCaUZ4l8TUW75a71/ghd2Fe5ffvX0pV4TLTntIc=";
var notificationRequestItem = { NotificationRequestItem: {
pspReference: "pspReference",
originalReference: "originalReference",
merchantAccountCode: "merchantAccount",
merchantReference: "reference",
amount: { currency: "EUR", value: 1000 },
eventCode: "EVENT",
success: "true",
additionalData: (_a = {}, _a[apiConstants_1.ApiConstants.HMAC_SIGNATURE] = expectedSign, _a)
} };
var notification = new notificationRequest_1.default({
live: "false",
notificationItems: [notificationRequestItem]
});
var data = hmacValidator.getDataToSign(notification.notificationItems[0]);
expect("pspReference:originalReference:merchantAccount:reference:1000:EUR:EVENT:true").toEqual(data);
var encrypted = hmacValidator.calculateHmac(notification.notificationItems[0], key);
expect(expectedSign).toEqual(encrypted);
expect(hmacValidator.validateHMAC(notification.notificationItems[0], key)).toBeTruthy();
notification.notificationItems[0].additionalData[apiConstants_1.ApiConstants.HMAC_SIGNATURE] = "notValidSign";
expect(hmacValidator.validateHMAC(notification.notificationItems[0], key)).toBeFalsy();
});
});
//# sourceMappingURL=hmacValidator.spec.js.map

View File

@@ -1 +1 @@
{"version":3,"file":"hmacValidator.spec.js","sourceRoot":"","sources":["../../../../src/__tests__/hmacValidator.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAmBA,yEAAmD;AACnD,yDAAuF;AACvF,0DAAuD;AAEvD,IAAM,GAAG,GAAG,kEAAkE,CAAC;AAC/E,IAAM,YAAY,GAAG,8CAA8C,CAAC;AACpE,IAAM,uBAAuB,GAA4B;IACrD,YAAY,EAAE,cAAc;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,mBAAmB,EAAE,iBAAiB;IACtC,iBAAiB,EAAE,WAAW;IAC9B,MAAM,EAAE,EAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAC;IACtC,SAAS,EAAE,gCAAuB,CAAC,aAAa,CAAC,OAAO;IACxD,SAAS,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE;IAC/C,aAAa,EAAE,MAAM;IACrB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,gCAAuB,CAAC,WAAW,CAAC,IAAI;IACjD,cAAc,YAAI,GAAC,2BAAY,CAAC,cAAsC,IAAG,YAAY,KAAE;CAC1F,CAAC;AAEF,QAAQ,CAAC,gBAAgB,EAAE;IACvB,IAAI,aAA4B,CAAC;IACjC,UAAU,CAAC;QACP,aAAa,GAAG,IAAI,uBAAa,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE;QAC1B,IAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,EAAC,eAAe,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAC,CAAC,CAAC;QAC9F,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,iDAAiD,EAAE;QAClD,IAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,EAAC,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,0BAA0B,EAAC,CAAC,CAAC;QAC9I,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,0FAA0F,CAAC,CAAC;IAC3H,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,0BAA0B,EAAE;QAC3B,IAAM,IAAI,GAAG,iNAAiN,CAAC;QAC/N,IAAM,SAAS,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,kEAAkE,CAAC,CAAC;QACxH,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,iCAAiC,EAAE;QAClC,IAAM,IAAI,GAAG,aAAa,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,gFAAgF,CAAC,CAAC;IAC3G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE;QACzB,IAAM,SAAS,GAAG,aAAa,CAAC,aAAa,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;QAC5E,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE;;QAC3B,IAAM,mBAAmB,yBAClB,uBAAuB,KAC1B,cAAc,YAAI,GAAC,2BAAY,CAAC,cAA+C,IAAG,cAAc,QACnG,CAAC;QACF,IAAM,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
{"version":3,"file":"hmacValidator.spec.js","sourceRoot":"","sources":["../../../../src/__tests__/hmacValidator.spec.ts"],"names":[],"mappings":"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"}

View File

@@ -99,76 +99,15 @@ var assertError = function (e) {
}
fail(e);
};
beforeAll(function (done) { return __awaiter(void 0, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
client = base_1.createBasicAuthClient();
client.config.password = process.env.ADYEN_MARKETPLACE_PASSWORD;
client.config.username = process.env.ADYEN_MARKETPLACE_USER;
scope = nock_1.default(client.config.marketPayEndpoint);
platforms = new index_1.Platforms(client);
return [4, platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails: accountHolderDetails,
legalEntity: "Individual",
})];
case 1:
accountHolder = _a.sent();
return [4, platforms.Account.createAccount({
accountHolderCode: generateRandomCode(),
description: "This is a new account",
metadata: { meta: "data" },
payoutSchedule: "WEEKLY"
})];
case 2:
account = _a.sent();
return [4, platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails: accountHolderDetails,
legalEntity: "Individual"
})];
case 3:
accountHolderToSuspend = _a.sent();
return [4, platforms.Account.createAccount({
accountHolderCode: generateRandomCode(),
description: "This is a new account",
metadata: { meta: "data" },
payoutSchedule: "WEEKLY"
})];
case 4:
accountToClose = _a.sent();
return [4, platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails: accountHolderDetails,
legalEntity: "Individual"
})];
case 5:
accountHolderToUnSuspend = _a.sent();
return [4, platforms.Account.suspendAccountHolder({ accountHolderCode: accountHolderToUnSuspend.accountHolderCode })];
case 6:
_a.sent();
return [4, platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails: accountHolderDetails,
legalEntity: "Individual"
})];
case 7:
accountHolderToClose = _a.sent();
return [4, platforms.NotificationConfiguration.createNotificationConfiguration({
configurationDetails: __assign(__assign({}, notificationConfigurationDetails), { description: "" + generateRandomCode() })
})];
case 8:
notificationConfigurationToRetrieve = _a.sent();
done();
return [2];
}
});
}); });
beforeEach(function () {
if (!nock_1.default.isActive()) {
nock_1.default.activate();
}
client = base_1.createBasicAuthClient();
client.config.password = process.env.ADYEN_MARKETPLACE_PASSWORD;
client.config.username = process.env.ADYEN_MARKETPLACE_USER;
scope = nock_1.default(client.config.marketPayEndpoint);
platforms = new index_1.Platforms(client);
});
afterEach(function () {
nock_1.default.cleanAll();
@@ -216,6 +155,165 @@ describe("Platforms Test", function () {
});
});
});
});
});
describe("Fund", function () {
var _this = this;
var cases = [
["accountHolderBalance", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["accountHolderTransactionList", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["payoutAccountHolder", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["transferFunds", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["refundFundsTransfer", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["setupBeneficiary", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["refundNotPaidOutTransfers", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
];
test.each(cases)("should %p", function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return __awaiter(_this, void 0, void 0, function () {
var fund, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
fund = platforms.Fund;
scope.post("/Fund/" + index_1.Client.MARKETPAY_FUND_API_VERSION + "//" + args[0]).reply(200, args[2]);
return [4, fund[args[0]](args[1])];
case 1:
result = _a.sent();
expect(result).toMatchObject(args[2]);
return [2];
}
});
});
});
});
describe("Notification Configuration", function () {
var _this = this;
var cases = [
["createNotificationConfiguration", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["getNotificationConfiguration", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["getNotificationConfigurationList", {}, ts_auto_mock_1.createMock()],
["testNotificationConfiguration", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["updateNotificationConfiguration", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["deleteNotificationConfigurations", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
];
test.each(cases)("should %p", function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return __awaiter(_this, void 0, void 0, function () {
var notificationConfiguration, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
notificationConfiguration = platforms.NotificationConfiguration;
scope.post("/Notification/" + index_1.Client.MARKETPAY_NOTIFICATION_API_VERSION + "//" + args[0]).reply(200, args[2]);
return [4, notificationConfiguration[args[0]](args[1])];
case 1:
result = _a.sent();
expect(result).toMatchObject(args[2]);
return [2];
}
});
});
});
});
describe("Hop", function () {
var _this = this;
var cases = [
["getOnboardingUrl", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()]
];
test.each(cases)("should %p", function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return __awaiter(_this, void 0, void 0, function () {
var hostedOnboardingPage, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
hostedOnboardingPage = platforms.HostedOnboardingPage;
scope.post("/Hop/" + index_1.Client.MARKETPAY_HOP_API_VERSION + "//" + args[0]).reply(200, args[2]);
return [4, hostedOnboardingPage[args[0]](args[1])];
case 1:
result = _a.sent();
expect(result).toMatchObject(args[2]);
return [2];
}
});
});
});
});
});
describe.skip("Platforms Test E2E", function () {
var _this = this;
beforeAll(function (done) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4, platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails: accountHolderDetails,
legalEntity: "Individual",
})];
case 1:
accountHolder = _a.sent();
return [4, platforms.Account.createAccount({
accountHolderCode: generateRandomCode(),
description: "This is a new account",
metadata: { meta: "data" },
payoutSchedule: "WEEKLY"
})];
case 2:
account = _a.sent();
return [4, platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails: accountHolderDetails,
legalEntity: "Individual"
})];
case 3:
accountHolderToSuspend = _a.sent();
return [4, platforms.Account.createAccount({
accountHolderCode: generateRandomCode(),
description: "This is a new account",
metadata: { meta: "data" },
payoutSchedule: "WEEKLY"
})];
case 4:
accountToClose = _a.sent();
return [4, platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails: accountHolderDetails,
legalEntity: "Individual"
})];
case 5:
accountHolderToUnSuspend = _a.sent();
return [4, platforms.Account.suspendAccountHolder({ accountHolderCode: accountHolderToUnSuspend.accountHolderCode })];
case 6:
_a.sent();
return [4, platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails: accountHolderDetails,
legalEntity: "Individual"
})];
case 7:
accountHolderToClose = _a.sent();
return [4, platforms.NotificationConfiguration.createNotificationConfiguration({
configurationDetails: __assign(__assign({}, notificationConfigurationDetails), { description: "" + generateRandomCode() })
})];
case 8:
notificationConfigurationToRetrieve = _a.sent();
done();
return [2];
}
});
}); });
describe("Account", function () {
describe("Accounts E2E", function () {
it("should create account holder", function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
@@ -530,37 +628,6 @@ describe("Platforms Test", function () {
});
});
describe("Fund", function () {
var _this = this;
var cases = [
["accountHolderBalance", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["accountHolderTransactionList", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["payoutAccountHolder", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["transferFunds", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["refundFundsTransfer", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["setupBeneficiary", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["refundNotPaidOutTransfers", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
];
test.each(cases)("should %p", function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return __awaiter(_this, void 0, void 0, function () {
var fund, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
fund = platforms.Fund;
scope.post("/Fund/" + index_1.Client.MARKETPAY_FUND_API_VERSION + "//" + args[0]).reply(200, args[2]);
return [4, fund[args[0]](args[1])];
case 1:
result = _a.sent();
expect(result).toMatchObject(args[2]);
return [2];
}
});
});
});
it("should retrieve the balance of an account holder", function () {
return __awaiter(this, void 0, void 0, function () {
var result, e_11;
@@ -647,37 +714,7 @@ describe("Platforms Test", function () {
});
});
describe("Notification Configuration", function () {
var _this = this;
var cases = [
["createNotificationConfiguration", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["getNotificationConfiguration", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["getNotificationConfigurationList", {}, ts_auto_mock_1.createMock()],
["testNotificationConfiguration", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["updateNotificationConfiguration", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
["deleteNotificationConfigurations", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()],
];
var configurationID;
test.each(cases)("should %p", function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return __awaiter(_this, void 0, void 0, function () {
var notificationConfiguration, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
notificationConfiguration = platforms.NotificationConfiguration;
scope.post("/Notification/" + index_1.Client.MARKETPAY_NOTIFICATION_API_VERSION + "//" + args[0]).reply(200, args[2]);
return [4, notificationConfiguration[args[0]](args[1])];
case 1:
result = _a.sent();
expect(result).toMatchObject(args[2]);
return [2];
}
});
});
});
it("should retrieve all Notification Configurations", function () {
return __awaiter(this, void 0, void 0, function () {
var result, resultStr, e_14;
@@ -823,32 +860,5 @@ describe("Platforms Test", function () {
});
});
});
describe("Hop", function () {
var _this = this;
var cases = [
["getOnboardingUrl", ts_auto_mock_1.createMock(), ts_auto_mock_1.createMock()]
];
test.each(cases)("should %p", function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return __awaiter(_this, void 0, void 0, function () {
var hostedOnboardingPage, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
hostedOnboardingPage = platforms.HostedOnboardingPage;
scope.post("/Hop/" + index_1.Client.MARKETPAY_HOP_API_VERSION + "//" + args[0]).reply(200, args[2]);
return [4, hostedOnboardingPage[args[0]](args[1])];
case 1:
result = _a.sent();
expect(result).toMatchObject(args[2]);
return [2];
}
});
});
});
});
});
//# sourceMappingURL=platforms.spec.js.map

File diff suppressed because one or more lines are too long

View File

@@ -6,6 +6,7 @@ export declare class AdditionalData {
'expiryDate'?: string;
'authorisedAmountValue'?: string;
'authorisedAmountCurrency'?: string;
'hmacSignature'?: string;
static discriminator: string | undefined;
static attributeTypeMap: Array<{
name: string;

View File

@@ -43,6 +43,11 @@ var AdditionalData = (function () {
"name": "authorisedAmountCurrency",
"baseName": "authorisedAmountCurrency",
"type": "string"
},
{
"name": "hmacSignature",
"baseName": "hmacSignature",
"type": "string"
}
];
return AdditionalData;

View File

@@ -1 +1 @@
{"version":3,"file":"additionalData.js","sourceRoot":"","sources":["../../../../../src/typings/notification/additionalData.ts"],"names":[],"mappings":";;;AAkCA;IAAA;IAwEA,CAAC;IAHU,kCAAmB,GAA1B;QACI,OAAO,cAAc,CAAC,gBAAgB,CAAC;IAC3C,CAAC;IAzCM,4BAAa,GAAuB,SAAS,CAAC;IAE9C,+BAAgB,GAA0D;QAC7E;YACI,MAAM,EAAE,kBAAkB;YAC1B,UAAU,EAAE,kBAAkB;YAC9B,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,cAAc;YACtB,UAAU,EAAE,cAAc;YAC1B,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,UAAU;YAClB,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,aAAa;YACrB,UAAU,EAAE,aAAa;YACzB,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,YAAY;YACxB,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,uBAAuB;YAC/B,UAAU,EAAE,uBAAuB;YACnC,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,0BAA0B;YAClC,UAAU,EAAE,0BAA0B;YACtC,MAAM,EAAE,QAAQ;SACnB;KAAK,CAAC;IAKf,qBAAC;CAAA,AAxED,IAwEC;AAxEY,wCAAc"}
{"version":3,"file":"additionalData.js","sourceRoot":"","sources":["../../../../../src/typings/notification/additionalData.ts"],"names":[],"mappings":";;;AAkCA;IAAA;IAiFA,CAAC;IAHU,kCAAmB,GAA1B;QACI,OAAO,cAAc,CAAC,gBAAgB,CAAC;IAC3C,CAAC;IA9CM,4BAAa,GAAuB,SAAS,CAAC;IAE9C,+BAAgB,GAA0D;QAC7E;YACI,MAAM,EAAE,kBAAkB;YAC1B,UAAU,EAAE,kBAAkB;YAC9B,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,cAAc;YACtB,UAAU,EAAE,cAAc;YAC1B,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,UAAU;YAClB,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,aAAa;YACrB,UAAU,EAAE,aAAa;YACzB,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,YAAY;YACxB,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,uBAAuB;YAC/B,UAAU,EAAE,uBAAuB;YACnC,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,0BAA0B;YAClC,UAAU,EAAE,0BAA0B;YACtC,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,eAAe;YACvB,UAAU,EAAE,eAAe;YAC3B,MAAM,EAAE,QAAQ;SACnB;KAAK,CAAC;IAKf,qBAAC;CAAA,AAjFD,IAiFC;AAjFY,wCAAc"}

View File

@@ -1 +1 @@
{"version":3,"file":"amount.js","sourceRoot":"","sources":["../../../../../src/typings/notification/amount.ts"],"names":[],"mappings":";;;AAmCA;IAAA;IA2BA,CAAC;IAHU,0BAAmB,GAA1B;QACI,OAAO,MAAM,CAAC,gBAAgB,CAAC;IACnC,CAAC;IAhBM,oBAAa,GAAuB,SAAS,CAAC;IAE9C,uBAAgB,GAA0D;QAC7E;YACI,MAAM,EAAE,UAAU;YAClB,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,OAAO;YACf,UAAU,EAAE,OAAO;YACnB,MAAM,EAAE,QAAQ;SACnB;KAAK,CAAC;IAKf,aAAC;CAAA,AA3BD,IA2BC;AA3BY,wBAAM"}
{"version":3,"file":"amount.js","sourceRoot":"","sources":["../../../../../src/typings/notification/amount.ts"],"names":[],"mappings":";;;AAkCA;IAAA;IA2BA,CAAC;IAHU,0BAAmB,GAA1B;QACI,OAAO,MAAM,CAAC,gBAAgB,CAAC;IACnC,CAAC;IAhBM,oBAAa,GAAuB,SAAS,CAAC;IAE9C,uBAAgB,GAA0D;QAC7E;YACI,MAAM,EAAE,UAAU;YAClB,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,QAAQ;SACnB;QACD;YACI,MAAM,EAAE,OAAO;YACf,UAAU,EAAE,OAAO;YACnB,MAAM,EAAE,QAAQ;SACnB;KAAK,CAAC;IAKf,aAAC;CAAA,AA3BD,IA2BC;AA3BY,wBAAM"}

View File

@@ -18,10 +18,13 @@ var HmacValidator = (function () {
return crypto_1.createHmac(HmacValidator.HMAC_SHA256_ALGORITHM, rawKey).update(dataString, "utf8").digest("base64");
};
HmacValidator.prototype.validateHMAC = function (notificationRequestItem, key) {
var _a;
var expectedSign = this.calculateHmac(notificationRequestItem, key);
var merchantSign = (_a = notificationRequestItem.additionalData) === null || _a === void 0 ? void 0 : _a[apiConstants_1.ApiConstants.HMAC_SIGNATURE];
return expectedSign === merchantSign;
var _a, _b;
if ((_a = notificationRequestItem.additionalData) === null || _a === void 0 ? void 0 : _a[apiConstants_1.ApiConstants.HMAC_SIGNATURE]) {
var expectedSign = this.calculateHmac(notificationRequestItem, key);
var merchantSign = (_b = notificationRequestItem.additionalData) === null || _b === void 0 ? void 0 : _b[apiConstants_1.ApiConstants.HMAC_SIGNATURE];
return expectedSign === merchantSign;
}
throw Error("Missing " + apiConstants_1.ApiConstants.HMAC_SIGNATURE);
};
HmacValidator.prototype.isNotificationRequestItem = function (item) {
return !Object.values(item).every(function (value) { return typeof value === "string"; });

View File

@@ -1 +1 @@
{"version":3,"file":"hmacValidator.js","sourceRoot":"","sources":["../../../../src/utils/hmacValidator.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"hmacValidator.js","sourceRoot":"","sources":["../../../../src/utils/hmacValidator.ts"],"names":[],"mappings":"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"}

View File

@@ -1,6 +1,6 @@
{
"name": "@adyen/api-library",
"version": "4.0.0",
"version": "4.0.1",
"description": "The Adyen API Library for NodeJS enables you to work with Adyen APIs.",
"main": "dist/lib/src/index.js",
"types": "dist/lib/src/index.d.ts",

View File

@@ -18,24 +18,32 @@
*/
import HmacValidator from "../utils/hmacValidator";
import {AdditionalData, NotificationRequestItem} from "../typings/notification/models";
import {AdditionalData, NotificationItem, NotificationRequestItem} from "../typings/notification/models";
import {ApiConstants} from "../constants/apiConstants";
import NotificationRequest from "../notification/notificationRequest";
const key = "DFB1EB5485895CFA84146406857104ABB4CBCABDC8AAF103A624C8F6A3EAAB00";
const expectedSign = "xhpHvYq2u2Np0rstbZ6QjLGu7JWhvf7Iwaa6EviJSX0=";
const notificationRequestItem: NotificationRequestItem = {
pspReference: "pspReference",
originalReference: "originalReference",
merchantAccountCode: "merchantAccount",
merchantReference: "reference",
amount: {currency: "EUR", value: 1000},
eventCode: NotificationRequestItem.EventCodeEnum.CAPTURE,
eventDate: new Date("01-01-1970").toISOString(),
paymentMethod: "VISA",
reason: "reason",
success: NotificationRequestItem.SuccessEnum.True,
additionalData: { [ApiConstants.HMAC_SIGNATURE as keyof AdditionalData]: expectedSign },
const expectedSign = "ZNBPtI+oDyyRrLyD1XirkKnQgIAlFc07Vj27TeHsDRE=";
const notificationRequestItem: { NotificationRequestItem: NotificationRequestItem } = {
NotificationRequestItem :{
pspReference: "pspReference",
originalReference: "originalReference",
merchantAccountCode: "merchantAccount",
merchantReference: "reference",
amount: {currency: "EUR", value: 1000},
eventCode: NotificationRequestItem.EventCodeEnum.REPORTAVAILABLE,
eventDate: "2019-09-21T11:45:24.637Z",
paymentMethod: "VISA",
reason: "reason",
success: NotificationRequestItem.SuccessEnum.True,
additionalData: { [ApiConstants.HMAC_SIGNATURE]: expectedSign },
}
};
const notification = new NotificationRequest({
live: "false",
notificationItems: [notificationRequestItem as unknown as NotificationItem]
});
describe("HMAC Validator", function (): void {
let hmacValidator: HmacValidator;
@@ -57,22 +65,59 @@ describe("HMAC Validator", function (): void {
expect(encrypted).toEqual("34oR8T1whkQWTv9P+SzKyp8zhusf9n0dpqrm9nsqSJs=");
});
it("should get correct data to sign", function (): void {
const data = hmacValidator.getDataToSign(notificationRequestItem);
expect(data).toEqual("pspReference:originalReference:merchantAccount:reference:1000:EUR:CAPTURE:true");
const data = hmacValidator.getDataToSign(notification.notificationItems![0]);
expect(data).toEqual("pspReference:originalReference:merchantAccount:reference:1000:EUR:REPORT_AVAILABLE:true");
});
it("should have valid hmac", function (): void {
const encrypted = hmacValidator.calculateHmac(notificationRequestItem, key);
const encrypted = hmacValidator.calculateHmac(notification.notificationItems![0], key);
expect(expectedSign).toEqual(encrypted);
expect(hmacValidator.validateHMAC(notificationRequestItem, key)).toBeTruthy();
expect(hmacValidator.validateHMAC(notification.notificationItems![0], key)).toBeTruthy();
});
it("should have invalid hmac", function (): void {
const invalidNotification = {
...notificationRequestItem,
additionalData: { [ApiConstants.HMAC_SIGNATURE as keyof NotificationRequestItem]: "notValidSign" }
...notification.notificationItems![0],
additionalData: { [ApiConstants.HMAC_SIGNATURE as keyof AdditionalData]: "notValidSign" }
};
const result = hmacValidator.validateHMAC(invalidNotification, key);
expect(result).toBeFalsy();
});
it("should test hmac", function () {
const data = "countryCode:currencyCode:merchantAccount:merchantReference:paymentAmount:sessionValidity:skinCode:NL:EUR:MagentoMerchantTest2:TEST-PAYMENT-2017-02-01-14\\:02\\:05:199:2017-02-02T14\\:02\\:05+01\\:00:PKz2KML1";
const key = "DFB1EB5485895CFA84146406857104ABB4CBCABDC8AAF103A624C8F6A3EAAB00";
const hmacValidator = new HmacValidator();
const encrypted = hmacValidator.calculateHmac(data, key);
expect(encrypted).toEqual("34oR8T1whkQWTv9P+SzKyp8zhusf9n0dpqrm9nsqSJs=");
});
it("should validate HMAC", function () {
expect(hmacValidator.validateHMAC(notification.notificationItems![0], key)).toBeTruthy();
});
it("should have valid notification request item HMAC", function () {
const expectedSign = "ipnxGCaUZ4l8TUW75a71/ghd2Fe5ffvX0pV4TLTntIc=";
const notificationRequestItem = { NotificationRequestItem: {
pspReference: "pspReference",
originalReference: "originalReference",
merchantAccountCode: "merchantAccount",
merchantReference: "reference",
amount: { currency: "EUR", value: 1000 },
eventCode: "EVENT",
success: "true",
additionalData: { [ApiConstants.HMAC_SIGNATURE]: expectedSign }
}} as unknown as NotificationItem;
const notification = new NotificationRequest({
live: "false",
notificationItems: [notificationRequestItem]
});
const data = hmacValidator.getDataToSign(notification.notificationItems![0]);
expect("pspReference:originalReference:merchantAccount:reference:1000:EUR:EVENT:true").toEqual(data);
const encrypted = hmacValidator.calculateHmac(notification.notificationItems![0], key);
expect(expectedSign).toEqual(encrypted);
expect(hmacValidator.validateHMAC(notification.notificationItems![0], key)).toBeTruthy();
notification.notificationItems![0].additionalData![ApiConstants.HMAC_SIGNATURE] = "notValidSign";
expect(hmacValidator.validateHMAC(notification.notificationItems![0], key)).toBeFalsy();
});
});

View File

@@ -61,6 +61,10 @@ export class AdditionalData {
* Currency of the authorised amount.
*/
'authorisedAmountCurrency'?: string;
/**
* HMAC Key from customer area
*/
'hmacSignature'?: string;
static discriminator: string | undefined = undefined;
@@ -99,6 +103,11 @@ export class AdditionalData {
"name": "authorisedAmountCurrency",
"baseName": "authorisedAmountCurrency",
"type": "string"
},
{
"name": "hmacSignature",
"baseName": "hmacSignature",
"type": "string"
} ];
static getAttributeTypeMap() {

View File

@@ -29,7 +29,6 @@
* Do not edit the class manually.
*/
/**
* A container object for the payable amount information for the transaction.For HTTP POST notifications, currency and value are returned as URL parameters.
*/

View File

@@ -165,3 +165,4 @@ export class ObjectSerializer {
}
}
}

View File

@@ -34,10 +34,12 @@ class HmacValidator {
}
public validateHMAC(notificationRequestItem: NotificationRequestItem, key: string): boolean {
const expectedSign = this.calculateHmac(notificationRequestItem, key);
const merchantSign = notificationRequestItem.additionalData?.[ApiConstants.HMAC_SIGNATURE];
return expectedSign === merchantSign;
if (notificationRequestItem.additionalData?.[ApiConstants.HMAC_SIGNATURE]) {
const expectedSign = this.calculateHmac(notificationRequestItem, key);
const merchantSign = notificationRequestItem.additionalData?.[ApiConstants.HMAC_SIGNATURE];
return expectedSign === merchantSign;
}
throw Error(`Missing ${ApiConstants.HMAC_SIGNATURE}`);
}
private isNotificationRequestItem(item: DataToSign): item is NotificationRequestItem {