Skip to content

Commit 8d23e23

Browse files
committed
Support event notification and async response in decryptNotification
1 parent 0574adb commit 8d23e23

File tree

2 files changed

+132
-10
lines changed

2 files changed

+132
-10
lines changed

src/__tests__/cloudDevice/cloudDeviceAPI.spec.ts

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,109 @@ describe("Cloud device API", (): void => {
255255
).rejects.toThrow(CloudDeviceApiError);
256256
});
257257

258+
test("should decrypt event notification", async (): Promise<void> => {
259+
260+
const encryptionCredentialDetails: EncryptionCredentialDetails = {
261+
AdyenCryptoVersion: 1,
262+
KeyIdentifier: "ncrkey",
263+
KeyVersion: 1,
264+
Passphrase: "ncrpass",
265+
};
266+
267+
// encrypted notification (SaleToPOIRequest) sent by the terminal
268+
const encryptedNotification = `{
269+
"SaleToPOIRequest": {
270+
"SecurityTrailer": {
271+
"AdyenCryptoVersion": 1,
272+
"Nonce": "Be6rAx+vRju2aCHwPh6lrg==",
273+
"KeyIdentifier": "ncrkey",
274+
"Hmac": "LG8A9Re1M8xLMr7rDUk0NwsnvAOX+VLjHv9sPHWTl34=",
275+
"KeyVersion": 1
276+
},
277+
"NexoBlob": "x2DY8J2M9ZCyjOZ8Gt7JdLBA/6bT/KXvvAbJf9kzguqO8dWp1I1pPLQpLstpdIiAVqSwG3PR0PrP/lF82UmhmCnUJGCuEXilqvBNF1tF/yEgnFOklNc1myR2IPW/+2oZOWKFXlTo/gX89EbODXOOGUqaJfSdpDhlqjyMz7mGczobTPvPGqCVx2BDHU8VTxI9nicwQv+QV48GqVZzxnP8ZOdQOQ5cac+bcS0Y3l7SmWpIoQsoicnjahTY9ICosLJmN4DvDHsN4Kh2DAetFO5b9I9Lqgm/dvnXUVhb9tPbM7Pn+ratjYpaNbonbO5M+Tm8rDEIyKoUUuFXPWISymrCXtCDVKEb2B5S5pilUmokrXVa9Ldtsv3BKG7rbrglYEuql4WVs6kzr6ybgAKh1Q0LsAXEve3pydt72ay4U3FOJSBxJ3gNqmnG8mVW2HCXQVo1RgVaZmP5TBWYuksCKXYypnMulu1PlRI++oeW/J2qjQU=",
278+
"MessageHeader": {
279+
"ProtocolVersion": "3.0",
280+
"SaleID": "null",
281+
"MessageClass": "Event",
282+
"MessageCategory": "Event",
283+
"POIID": "P400Plus-275102806",
284+
"MessageType": "Notification",
285+
"DeviceID": "5"
286+
}
287+
}
288+
}`;
289+
290+
// expected notification (SaleToPOIRequest) sent by the terminal
291+
const expectedDecryption = `{
292+
"SaleToPOIRequest": {
293+
"EventNotification": {
294+
"EventDetails": "reference_id=9876",
295+
"TimeStamp": "2020-11-13T09:02:35.697Z",
296+
"EventToNotify": "SaleWakeUp"
297+
},
298+
"MessageHeader": {
299+
"ProtocolVersion": "3.0",
300+
"SaleID": "null",
301+
"MessageClass": "Event",
302+
"MessageCategory": "Event",
303+
"POIID": "P400Plus-275102806",
304+
"MessageType": "Notification",
305+
"DeviceID": "5"
306+
}
307+
}
308+
}`;
309+
310+
const decryptedEventNotification = cloudDeviceAPI.decryptNotification(encryptedNotification, encryptionCredentialDetails);
311+
312+
expect(JSON.parse(decryptedEventNotification)).toEqual(JSON.parse(expectedDecryption));
313+
314+
});
315+
316+
test("should decrypt an async response", async (): Promise<void> => {
317+
318+
const encryptionCredentialDetails: EncryptionCredentialDetails = {
319+
AdyenCryptoVersion: 1,
320+
KeyIdentifier: "Key123456789crypt",
321+
KeyVersion: 1,
322+
Passphrase: "P@ssw0rd123456",
323+
};
324+
325+
// encrypted async respomse (SaleToPOIResponse)
326+
const payload = `{
327+
"SaleToPOIResponse": {
328+
"MessageHeader": {
329+
"MessageCategory": "Payment",
330+
"MessageClass": "Service",
331+
"MessageType": "Response",
332+
"POIID": "V400m-347374578",
333+
"ProtocolVersion": "3.0",
334+
"SaleID": "6167012",
335+
"ServiceID": "6167012"
336+
},
337+
"NexoBlob": "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",
338+
"SecurityTrailer": {
339+
"AdyenCryptoVersion": 1,
340+
"Hmac": "6B8R+dZyeUFDWAr46hVWb6nB6IbfmKzomAqw1vv8uns=",
341+
"KeyIdentifier": "Key123456789crypt",
342+
"KeyVersion": 1,
343+
"Nonce": "oaOGhOiNdT6qz3pI5afHBg=="
344+
}
345+
}
346+
}`;
347+
348+
const decryptedEventNotification = cloudDeviceAPI.decryptNotification(payload, encryptionCredentialDetails);
349+
350+
const res = JSON.parse(decryptedEventNotification);
351+
expect(res.SaleToPOIResponse).toBeDefined();
352+
expect(res.SaleToPOIResponse.MessageHeader).toBeDefined();
353+
expect(res.SaleToPOIResponse.MessageHeader.POIID).toBe("V400m-347374578");
354+
355+
expect(res.SaleToPOIResponse.PaymentResponse).toBeDefined();
356+
expect(res.SaleToPOIResponse.PaymentResponse.PaymentResult).toBeDefined();
357+
expect(res.SaleToPOIResponse.PaymentResponse.PaymentResult.CustomerLanguage).toBe("en");
358+
359+
});
360+
258361
});
259362

260363
describe("should build the expected CloudDeviceAPI endpoints", () => {

src/services/cloudDevice/cloudDeviceApi.ts

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class CloudDeviceAPI extends Service {
6969
POIID: deviceId
7070
}
7171
};
72-
}
72+
}
7373

7474
return ObjectSerializer.serialize(request, "CloudDeviceApiRequest");
7575
}
@@ -236,12 +236,12 @@ class CloudDeviceAPI extends Service {
236236
);
237237

238238
console.log(jsonResponse);
239-
239+
240240
const cloudDeviceApiSecuredResponse: CloudDeviceApiSecuredResponse =
241241
ObjectSerializer.deserialize(jsonResponse, "CloudDeviceApiSecuredResponse");
242242

243243
console.log(cloudDeviceApiSecuredResponse);
244-
244+
245245
// decrypt SaleToPOISecuredMessage
246246
const decryptedPayload = NexoSecurityManager.decrypt(
247247
cloudDeviceApiSecuredResponse.SaleToPOIResponse,
@@ -306,20 +306,39 @@ class CloudDeviceAPI extends Service {
306306

307307
/**
308308
* Decrypt event notification
309-
* @param payload Event notification in JSON string format
309+
* @param payload Event notification in JSON string format: it can be SaleToPOIResponse (async response) or SaleToPOIRequest (event notification)
310310
* @param encryptionCredentialDetails The details of the encryption credential used for decrypting the payload (nexoBlob)
311311
* @returns
312312
*/
313-
public decryptNotification(payload: string, encryptionCredentialDetails: EncryptionCredentialDetails) : String {
314-
315-
const decryptedMessage = ObjectSerializer.deserialize(JSON.parse(payload), "CloudDeviceApiSecuredResponse");
316-
317-
return NexoSecurityManager.decrypt(
313+
public decryptNotification(
314+
payload: string,
315+
encryptionCredentialDetails: EncryptionCredentialDetails
316+
): string {
317+
const parsed = JSON.parse(payload);
318+
319+
let decryptedMessage;
320+
321+
if (parsed.SaleToPOIResponse) {
322+
// includes SaleToPOIResponse (response after /async)
323+
decryptedMessage = ObjectSerializer.deserialize(parsed, "CloudDeviceApiSecuredResponse");
324+
return NexoSecurityManager.decrypt(
318325
decryptedMessage.SaleToPOIResponse,
319-
encryptionCredentialDetails,
326+
encryptionCredentialDetails
327+
);
328+
} else if (parsed.SaleToPOIRequest) {
329+
// includes SaleToPOIRequest (event notification )
330+
decryptedMessage = ObjectSerializer.deserialize(parsed, "CloudDeviceApiSecuredRequest");
331+
return NexoSecurityManager.decrypt(
332+
decryptedMessage.SaleToPOIRequest,
333+
encryptionCredentialDetails
320334
);
335+
} else {
336+
console.log("Invalid payload: must be CloudDeviceApiSecuredRequest or CloudDeviceApiSecuredResponse");
337+
return "";
338+
}
321339
}
322340

341+
323342
/**
324343
* Get Device API /sync endpoint
325344
* @param merchantAccount The unique identifier of the merchant account.

0 commit comments

Comments
 (0)