@agent-cards/sdk 0.23.20 → 0.23.22
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/CHANGELOG.md +55 -2
- package/PREFLIGHT.md +6 -0
- package/README.md +169 -5
- package/dist/amadeus-checkout.generated.d.ts +6 -1
- package/dist/amadeus-checkout.generated.js +26 -2
- package/dist/card-fields.generated.js +2341 -127
- package/dist/cdp.js +199 -28
- package/dist/client.d.ts +177 -9
- package/dist/client.js +387 -37
- package/dist/comgate.d.ts +50 -0
- package/dist/comgate.js +80 -0
- package/dist/creditguard.generated.js +4 -2
- package/dist/cse-body.js +11 -0
- package/dist/cybersource-secure-acceptance.generated.d.ts +1 -1
- package/dist/ebanx.d.ts +1 -1
- package/dist/ebanx.js +1 -1
- package/dist/eprotect.generated.d.ts +1 -1
- package/dist/eximbay.d.ts +46 -0
- package/dist/eximbay.js +69 -0
- package/dist/gmo.generated.js +7 -3
- package/dist/hipay.generated.d.ts +5 -5
- package/dist/hipay.generated.js +5 -2
- package/dist/hold.d.ts +1 -1
- package/dist/hold.js +10 -4
- package/dist/hosted-entry.d.ts +4 -0
- package/dist/hosted-entry.js +32 -0
- package/dist/index.d.ts +1 -0
- package/dist/lifecycle.d.ts +9 -4
- package/dist/lifecycle.js +16 -4
- package/dist/paddle-tokenex.generated.js +7 -3
- package/dist/paygent.generated.d.ts +60 -0
- package/dist/paygent.generated.js +425 -0
- package/dist/payrails.generated.js +7 -3
- package/dist/payrexx.d.ts +91 -0
- package/dist/payrexx.generated.d.ts +91 -0
- package/dist/payrexx.generated.js +536 -0
- package/dist/payrexx.js +141 -0
- package/dist/pre-claim.d.ts +30 -1
- package/dist/pre-claim.js +257 -39
- package/dist/preflight-catalog.json +58 -0
- package/dist/preflight-schemas.json +4 -0
- package/dist/preflight.generated.js +26 -2
- package/dist/prepared-processor.d.ts +7 -2
- package/dist/prepared-processor.js +16 -2
- package/dist/primer.generated.js +2469 -255
- package/dist/przelewy24.d.ts +47 -0
- package/dist/przelewy24.js +88 -0
- package/dist/registry.d.ts +6 -5
- package/dist/registry.js +27 -7
- package/dist/shiji-sts.generated.js +7 -3
- package/dist/stripe-checkout.generated.js +896 -19
- package/dist/toast-seal.generated.d.ts +37 -0
- package/dist/toast-seal.generated.js +625 -0
- package/dist/toast.generated.d.ts +41 -0
- package/dist/toast.generated.js +113 -0
- package/dist/tokenex-iframe.d.ts +93 -0
- package/dist/tokenex-iframe.generated.d.ts +81 -0
- package/dist/tokenex-iframe.generated.js +403 -0
- package/dist/tokenex-iframe.js +195 -0
- package/dist/transbank.d.ts +45 -0
- package/dist/transbank.js +73 -0
- package/dist/twoc2p.generated.js +7 -3
- package/examples/preflight/kernel-native/inventory.json +1 -1
- package/package.json +3 -3
package/dist/primer.generated.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
2
|
// Generated from @agent-cards/payment-core. Do not edit.
|
|
3
|
-
// artifact-sha256:
|
|
3
|
+
// artifact-sha256: 2163d0faf9f17cfd1ca85cb205df104d44da2436468a05413932b6386c56d75d
|
|
4
4
|
// src/card-number-key.js
|
|
5
5
|
var CARD_NUMBER_KEY = /^(number|card_number|cardnumber|cardNum|card_num|pan)$/i;
|
|
6
6
|
// src/json-path.js
|
|
@@ -109,12 +109,12 @@ function parseConvergeBody(body) {
|
|
|
109
109
|
return parsed;
|
|
110
110
|
}
|
|
111
111
|
function convergeAmountCents(value) {
|
|
112
|
-
const
|
|
113
|
-
const m = typeof
|
|
112
|
+
const text9 = typeof value === "number" && Number.isFinite(value) ? String(value) : value;
|
|
113
|
+
const m = typeof text9 === "string" ? AMOUNT.exec(text9) : null;
|
|
114
114
|
if (!m)
|
|
115
115
|
return null;
|
|
116
|
-
const
|
|
117
|
-
return Number.isSafeInteger(
|
|
116
|
+
const cents2 = Number(m[1]) * 100 + Number(((m[2] ?? "") + "00").slice(0, 2));
|
|
117
|
+
return Number.isSafeInteger(cents2) && cents2 > 0 ? cents2 : null;
|
|
118
118
|
}
|
|
119
119
|
function convergeBodyVerdict(body) {
|
|
120
120
|
const parsed = parseConvergeBody(body);
|
|
@@ -365,8 +365,8 @@ var CONTROL = /[\u0000-\u001f\u007f]/;
|
|
|
365
365
|
var cardLikeName = (name) => (name.match(/[0-9]/g) ?? []).length >= 12;
|
|
366
366
|
var record3 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
367
367
|
var sameKeys = (value, keys) => {
|
|
368
|
-
const
|
|
369
|
-
return
|
|
368
|
+
const own10 = Object.keys(value);
|
|
369
|
+
return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
|
|
370
370
|
};
|
|
371
371
|
var refuse4 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
372
372
|
var CARD4 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -590,9 +590,9 @@ var K = /* @__PURE__ */ new Uint32Array([
|
|
|
590
590
|
3329325298
|
|
591
591
|
]);
|
|
592
592
|
var rotr = (x, n) => x >>> n | x << 32 - n;
|
|
593
|
-
function utf8(
|
|
593
|
+
function utf8(text9) {
|
|
594
594
|
const out = [];
|
|
595
|
-
for (const char of
|
|
595
|
+
for (const char of text9) {
|
|
596
596
|
let cp = char.codePointAt(0);
|
|
597
597
|
if (cp >= 55296 && cp <= 57343)
|
|
598
598
|
cp = 65533;
|
|
@@ -671,10 +671,13 @@ var TYPED_ARRAY = Object.getPrototypeOf(Uint8Array.prototype);
|
|
|
671
671
|
var typedArrayName = Object.getOwnPropertyDescriptor(TYPED_ARRAY, Symbol.toStringTag).get;
|
|
672
672
|
function parseRsaPublicKey(key) {
|
|
673
673
|
const spki = key && typeof key === "object" ? key.spki : void 0;
|
|
674
|
-
const
|
|
674
|
+
const pin11 = key && typeof key === "object" ? key.sha256 : void 0;
|
|
675
|
+
const named = key && typeof key === "object" && Object.prototype.hasOwnProperty.call(key, "exponent") ? key.exponent : void 0;
|
|
676
|
+
if (named !== void 0 && named !== 17)
|
|
677
|
+
throw refuse6("key");
|
|
675
678
|
if (typeof spki !== "string" || spki.length > 1024 || spki.length % 4 !== 0 || !BASE64.test(spki))
|
|
676
679
|
throw refuse6("key");
|
|
677
|
-
if (typeof
|
|
680
|
+
if (typeof pin11 !== "string" || !SHA256_HEX.test(pin11))
|
|
678
681
|
throw refuse6("key");
|
|
679
682
|
let binary;
|
|
680
683
|
try {
|
|
@@ -686,7 +689,7 @@ function parseRsaPublicKey(key) {
|
|
|
686
689
|
if (btoa(binary) !== spki)
|
|
687
690
|
throw refuse6("key");
|
|
688
691
|
const der = Uint8Array.from(binary, (c) => c.charCodeAt(0));
|
|
689
|
-
if (sha256Hex(der) !==
|
|
692
|
+
if (sha256Hex(der) !== pin11)
|
|
690
693
|
throw refuse6("key");
|
|
691
694
|
const outer = readElement(der, 0, 48);
|
|
692
695
|
if (outer.end !== der.length || outer.start + RSA_ALGORITHM.length > der.length)
|
|
@@ -707,9 +710,10 @@ function parseRsaPublicKey(key) {
|
|
|
707
710
|
if (!MODULUS_BYTES.includes(n.length) || !(n[0] & 128) || !(n[n.length - 1] & 1))
|
|
708
711
|
throw refuse6("key");
|
|
709
712
|
const e = exponent.bytes;
|
|
710
|
-
|
|
713
|
+
const expected = named === 17 ? [17] : [1, 0, 1];
|
|
714
|
+
if (e.length !== expected.length || !expected.every((byte, i) => e[i] === byte))
|
|
711
715
|
throw refuse6("key");
|
|
712
|
-
return Object.freeze({ n: toBigInt(n), e: 65537n, size: n.length });
|
|
716
|
+
return Object.freeze({ n: toBigInt(n), e: named === 17 ? 17n : 65537n, size: n.length });
|
|
713
717
|
}
|
|
714
718
|
function readElement(der, at, tag) {
|
|
715
719
|
if (at + 2 > der.length || der[at] !== tag)
|
|
@@ -775,8 +779,8 @@ var PADDLE_TOKENEX_PSP = "paddle_tokenex";
|
|
|
775
779
|
var PADDLE_TOKENEX_FACT_KEYS = /* @__PURE__ */ Object.freeze(["card_first_six", "card_last_four", "expiry_month", "expiry_year", "card_brand"]);
|
|
776
780
|
var record4 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
777
781
|
var sameKeys2 = (value, keys) => {
|
|
778
|
-
const
|
|
779
|
-
return
|
|
782
|
+
const own10 = Object.keys(value);
|
|
783
|
+
return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
|
|
780
784
|
};
|
|
781
785
|
var refuse7 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
782
786
|
var CARD6 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -1265,8 +1269,8 @@ var TEXT_LIMIT = 256;
|
|
|
1265
1269
|
var CONTROL4 = /[\u0000-\u001f\u007f]/;
|
|
1266
1270
|
var record6 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
1267
1271
|
var sameKeys3 = (value, keys) => {
|
|
1268
|
-
const
|
|
1269
|
-
return
|
|
1272
|
+
const own10 = Object.keys(value);
|
|
1273
|
+
return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
|
|
1270
1274
|
};
|
|
1271
1275
|
var plainText = (value) => typeof value === "string" && value.length <= TEXT_LIMIT && !CONTROL4.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
|
|
1272
1276
|
var refuse9 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
@@ -1296,13 +1300,13 @@ function billingFields(value) {
|
|
|
1296
1300
|
if (names.length > MAX_FIELDS)
|
|
1297
1301
|
return false;
|
|
1298
1302
|
return names.every((name) => {
|
|
1299
|
-
const
|
|
1303
|
+
const field2 = value[name];
|
|
1300
1304
|
if (!FIELD_NAME.test(name))
|
|
1301
1305
|
return false;
|
|
1302
|
-
if (!record6(
|
|
1303
|
-
return billingText(
|
|
1304
|
-
const nested = Object.keys(
|
|
1305
|
-
return nested.length <= MAX_NESTED_FIELDS && nested.every((key) => FIELD_NAME.test(key) && billingText(
|
|
1306
|
+
if (!record6(field2))
|
|
1307
|
+
return billingText(field2);
|
|
1308
|
+
const nested = Object.keys(field2);
|
|
1309
|
+
return nested.length <= MAX_NESTED_FIELDS && nested.every((key) => FIELD_NAME.test(key) && billingText(field2[key]));
|
|
1306
1310
|
});
|
|
1307
1311
|
}
|
|
1308
1312
|
function wixPaymentsBodyVerdict(body) {
|
|
@@ -1376,14 +1380,14 @@ function readJson2(body) {
|
|
|
1376
1380
|
catch {
|
|
1377
1381
|
return { parsed: null, exact: false };
|
|
1378
1382
|
}
|
|
1379
|
-
let
|
|
1383
|
+
let exact5 = false;
|
|
1380
1384
|
try {
|
|
1381
|
-
|
|
1385
|
+
exact5 = body.length <= BODY_LIMIT6 && JSON.stringify(parsed) === body;
|
|
1382
1386
|
}
|
|
1383
1387
|
catch {
|
|
1384
|
-
|
|
1388
|
+
exact5 = false;
|
|
1385
1389
|
}
|
|
1386
|
-
return { parsed, exact:
|
|
1390
|
+
return { parsed, exact: exact5 };
|
|
1387
1391
|
}
|
|
1388
1392
|
function billingValue(value) {
|
|
1389
1393
|
if (value === UNDEFINED)
|
|
@@ -1438,14 +1442,14 @@ function attachType(parsed) {
|
|
|
1438
1442
|
return typeof type === "string" ? type : null;
|
|
1439
1443
|
}
|
|
1440
1444
|
function paymongoBodyVerdict(body, session) {
|
|
1441
|
-
const { parsed, exact:
|
|
1445
|
+
const { parsed, exact: exact5 } = readJson2(body);
|
|
1442
1446
|
const type = parsed === null ? null : attachType(parsed);
|
|
1443
1447
|
if (type !== "card") {
|
|
1444
1448
|
if (parsed === null)
|
|
1445
1449
|
return body === void 0 || body === null || body === "" ? CONTINUE4 : refuse10("paymongo_body_unsupported");
|
|
1446
1450
|
return namesCardValue(parsed) ? refuse10("paymongo_body_unsupported") : CONTINUE4;
|
|
1447
1451
|
}
|
|
1448
|
-
if (!
|
|
1452
|
+
if (!exact5)
|
|
1449
1453
|
return refuse10("paymongo_body_unsupported");
|
|
1450
1454
|
const code = judgeCardAttach(parsed, session);
|
|
1451
1455
|
return code === null ? CARD9 : refuse10(code);
|
|
@@ -1468,15 +1472,15 @@ var EXPIRATION = /^[0-9]{2}(?:0[1-9]|1[0-2])$/;
|
|
|
1468
1472
|
var CARD_PAYMENT = "PAYMENT_CARD";
|
|
1469
1473
|
var record8 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
1470
1474
|
var sameKeys4 = (value, keys) => {
|
|
1471
|
-
const
|
|
1472
|
-
return
|
|
1475
|
+
const own10 = Object.keys(value);
|
|
1476
|
+
return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
|
|
1473
1477
|
};
|
|
1474
1478
|
var refuse11 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
1475
1479
|
var CARD10 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
1476
|
-
function luhn(
|
|
1480
|
+
function luhn(digits4) {
|
|
1477
1481
|
let sum = 0;
|
|
1478
|
-
for (let at = 0; at <
|
|
1479
|
-
let digit = Number(
|
|
1482
|
+
for (let at = 0; at < digits4.length; at += 1) {
|
|
1483
|
+
let digit = Number(digits4[digits4.length - 1 - at]);
|
|
1480
1484
|
if (at % 2 === 1) {
|
|
1481
1485
|
digit *= 2;
|
|
1482
1486
|
if (digit > 9)
|
|
@@ -1484,7 +1488,7 @@ function luhn(digits2) {
|
|
|
1484
1488
|
}
|
|
1485
1489
|
sum += digit;
|
|
1486
1490
|
}
|
|
1487
|
-
return sum % 10 === 0;
|
|
1491
|
+
return sum > 0 && sum % 10 === 0;
|
|
1488
1492
|
}
|
|
1489
1493
|
function gopayCardFormUrl(url) {
|
|
1490
1494
|
if (typeof url !== "string" || url.length > 2048 || url.includes("#"))
|
|
@@ -1548,6 +1552,9 @@ function gopayBodyVerdict(body, url) {
|
|
|
1548
1552
|
return refuse11("gopay_signature_mismatch");
|
|
1549
1553
|
return CARD10;
|
|
1550
1554
|
}
|
|
1555
|
+
var GOPAY_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
1556
|
+
Object.freeze({ id: "caramilla", merchant: "Caramilla.cz", origins: Object.freeze(["https://www.caramilla.cz"]) })
|
|
1557
|
+
]);
|
|
1551
1558
|
// src/payrexx.js
|
|
1552
1559
|
var PAYREXX_PSP = "payrexx";
|
|
1553
1560
|
var PAYREXX_FRAME_HOST = "checkout.payrexx.com";
|
|
@@ -1620,10 +1627,10 @@ function readForm2(body) {
|
|
|
1620
1627
|
return null;
|
|
1621
1628
|
}
|
|
1622
1629
|
}
|
|
1623
|
-
function cardNetwork2(
|
|
1624
|
-
if (VISA2.test(
|
|
1630
|
+
function cardNetwork2(digits4) {
|
|
1631
|
+
if (VISA2.test(digits4))
|
|
1625
1632
|
return "visa";
|
|
1626
|
-
return MASTERCARD2.test(
|
|
1633
|
+
return MASTERCARD2.test(digits4) ? "mastercard" : null;
|
|
1627
1634
|
}
|
|
1628
1635
|
function judgeBody2(body) {
|
|
1629
1636
|
const pairs = readForm2(body);
|
|
@@ -1647,7 +1654,7 @@ function judgeBody2(body) {
|
|
|
1647
1654
|
}
|
|
1648
1655
|
const number = value["card[number]"];
|
|
1649
1656
|
const network = GROUPED.test(number) ? cardNetwork2(number.replace(/ /g, "")) : null;
|
|
1650
|
-
if (network === null || value["card[brand]"] !== network || !SECURITY_CODE7.test(value["card[cvc]"]) || !MONTH3.test(value["card[exp_month]"]) || !YEAR3.test(value["card[exp_year]"]) || !HOLDER2.test(value["card[cardholder]"]) || !INSTANCE.test(value.instance) || !AMOUNT2.test(value.amount) || !CURRENCY.test(value.currency) || !(value.email === "" || value.email.length <= 254 && EMAIL.test(value.email)) || !FLAGS.every((
|
|
1657
|
+
if (network === null || value["card[brand]"] !== network || !SECURITY_CODE7.test(value["card[cvc]"]) || !MONTH3.test(value["card[exp_month]"]) || !YEAR3.test(value["card[exp_year]"]) || !HOLDER2.test(value["card[cardholder]"]) || !INSTANCE.test(value.instance) || !AMOUNT2.test(value.amount) || !CURRENCY.test(value.currency) || !(value.email === "" || value.email.length <= 254 && EMAIL.test(value.email)) || !FLAGS.every((flag3) => value[flag3] === "true" || value[flag3] === "false")) {
|
|
1651
1658
|
return { verdict: refuse12("payrexx_body_unsupported"), pairs: null };
|
|
1652
1659
|
}
|
|
1653
1660
|
if (value.isTokenization === "true" || value.isSubscription === "true")
|
|
@@ -1696,8 +1703,8 @@ var LOCALE = /^[a-z]{2}(?:-[A-Za-z]{2,4})?$/;
|
|
|
1696
1703
|
var PAN_LIKE3 = /(?:[0-9][ _.:-]*){12,}/;
|
|
1697
1704
|
var record9 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
1698
1705
|
var sameKeys5 = (value, keys) => {
|
|
1699
|
-
const
|
|
1700
|
-
return
|
|
1706
|
+
const own10 = Object.keys(value);
|
|
1707
|
+
return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
|
|
1701
1708
|
};
|
|
1702
1709
|
var refuse13 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
1703
1710
|
var CARD12 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -1863,6 +1870,17 @@ function paygentRequestVerdict(url, body) {
|
|
|
1863
1870
|
const key = pairs[1][1];
|
|
1864
1871
|
return (environment2 === "production" ? LIVE_KEY : SANDBOX_KEY).test(key) ? CARD13 : refuse14("paygent_key_environment");
|
|
1865
1872
|
}
|
|
1873
|
+
var pin4 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]) });
|
|
1874
|
+
var PAYGENT_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
1875
|
+
pin4({
|
|
1876
|
+
id: "fundex_tcs_eng",
|
|
1877
|
+
merchant: "Tokyo Chinese School",
|
|
1878
|
+
merchantId: "60362",
|
|
1879
|
+
keySha256: "6073dee112b1e4089025d1c1f3c4cfad818c314a81943ffa55b839cb2df51018",
|
|
1880
|
+
origins: ["https://fundexapp.jp"],
|
|
1881
|
+
currency: "jpy"
|
|
1882
|
+
})
|
|
1883
|
+
]);
|
|
1866
1884
|
// src/multipart-form.js
|
|
1867
1885
|
var BODY_LIMIT11 = 65536;
|
|
1868
1886
|
var CRLF = "\r\n";
|
|
@@ -1970,9 +1988,9 @@ var PAY_NL_CARD_PARTS = /* @__PURE__ */ Object.freeze([
|
|
|
1970
1988
|
"payment[card][expire_month]",
|
|
1971
1989
|
"payment[card][expire_year]"
|
|
1972
1990
|
]);
|
|
1973
|
-
var
|
|
1991
|
+
var pin5 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), serviceIds: Object.freeze([...fields.serviceIds]) });
|
|
1974
1992
|
var PAY_NL_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
1975
|
-
|
|
1993
|
+
pin5({ id: "weeztix", merchant: "Weeztix", origins: ["https://shop.weeztix.com"], serviceIds: ["SL-6399-2740"] })
|
|
1976
1994
|
]);
|
|
1977
1995
|
var RULE = /* @__PURE__ */ Object.freeze({ parts: PAY_NL_PARTS, card: PAY_NL_CARD_PARTS });
|
|
1978
1996
|
var SERVICE_ID = /^SL-\d{4}-\d{4}$/;
|
|
@@ -1982,7 +2000,7 @@ var HOLDER3 = /^\p{L}+(?: \p{L}+)*$/u;
|
|
|
1982
2000
|
var HOLDER_LIMIT2 = 256;
|
|
1983
2001
|
var SECURITY_CODE10 = /^[0-9]{3,4}$/;
|
|
1984
2002
|
var MONTH6 = /^(?:0[1-9]|1[0-2])$/;
|
|
1985
|
-
var YEAR6 = /^[0-9]{2}$/;
|
|
2003
|
+
var YEAR6 = /^(?:[0-9]{2}|20[0-9]{2})$/;
|
|
1986
2004
|
var refuse15 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
1987
2005
|
var CARD14 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
1988
2006
|
function isPayNlTokenUrl(url) {
|
|
@@ -2088,10 +2106,10 @@ var wellFormed = (value) => {
|
|
|
2088
2106
|
var plainText2 = (value) => typeof value === "string" && value.length >= 1 && value.length <= TEXT_LIMIT2 && !CONTROL5.test(value) && (value.match(/[0-9]/g) ?? []).length < 12 && wellFormed(value);
|
|
2089
2107
|
var between = (value, min, max) => Number.isSafeInteger(value) && value >= min && value <= max;
|
|
2090
2108
|
var NETWORK = /^(?:4[0-9]{15}|4[0-9]{12}|5[1-5][0-9]{14}|2(?:2(?:2[1-9]|[3-9][0-9])|[3-6][0-9]{2}|7(?:[01][0-9]|20))[0-9]{12}|3[47][0-9]{13})$/;
|
|
2091
|
-
var luhn2 = (
|
|
2109
|
+
var luhn2 = (digits4) => {
|
|
2092
2110
|
let sum = 0;
|
|
2093
|
-
for (let at = 0; at <
|
|
2094
|
-
let d =
|
|
2111
|
+
for (let at = 0; at < digits4.length; at += 1) {
|
|
2112
|
+
let d = digits4.charCodeAt(digits4.length - 1 - at) - 48;
|
|
2095
2113
|
if (at % 2 === 1) {
|
|
2096
2114
|
d *= 2;
|
|
2097
2115
|
if (d > 9)
|
|
@@ -2102,7 +2120,7 @@ var luhn2 = (digits2) => {
|
|
|
2102
2120
|
return sum % 10 === 0;
|
|
2103
2121
|
};
|
|
2104
2122
|
var ANY_NETWORK = /^[2-6][0-9]{12,18}$/;
|
|
2105
|
-
var holdsCardShape = (
|
|
2123
|
+
var holdsCardShape = (text9, shape = NETWORK) => (text9.match(/[0-9]{13,}/g) ?? []).some((run) => run.length > 19 || shape.test(run) && luhn2(run));
|
|
2106
2124
|
var phone = (value) => typeof value === "string" && PHONE.test(value) && (value.match(/[0-9]/g) ?? []).length >= 6 && (value.match(/[0-9]/g) ?? []).length <= 15;
|
|
2107
2125
|
var refuse16 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
2108
2126
|
var CARD15 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -2313,10 +2331,10 @@ function orderedSubset(value, keys) {
|
|
|
2313
2331
|
}
|
|
2314
2332
|
return true;
|
|
2315
2333
|
}
|
|
2316
|
-
function luhn3(
|
|
2334
|
+
function luhn3(digits4) {
|
|
2317
2335
|
let sum = 0;
|
|
2318
|
-
for (let at = 0; at <
|
|
2319
|
-
let digit = Number(
|
|
2336
|
+
for (let at = 0; at < digits4.length; at += 1) {
|
|
2337
|
+
let digit = Number(digits4[digits4.length - 1 - at]);
|
|
2320
2338
|
if (at % 2 === 1) {
|
|
2321
2339
|
digit *= 2;
|
|
2322
2340
|
if (digit > 9)
|
|
@@ -2330,13 +2348,13 @@ var printable = (value) => [...value].every((ch) => ch.charCodeAt(0) >= 32 && ch
|
|
|
2330
2348
|
function typed(value, limit = 256) {
|
|
2331
2349
|
return typeof value === "string" && value.length >= 1 && value.length <= limit && !PAN_LIKE4.test(value) && printable(value);
|
|
2332
2350
|
}
|
|
2333
|
-
function decodeBase64(
|
|
2334
|
-
if (typeof
|
|
2351
|
+
function decodeBase64(text9) {
|
|
2352
|
+
if (typeof text9 !== "string" || !BASE643.test(text9) || text9.length % 4 !== 0)
|
|
2335
2353
|
return null;
|
|
2336
2354
|
let bits = 0;
|
|
2337
2355
|
let value = 0;
|
|
2338
2356
|
let out = "";
|
|
2339
|
-
for (const ch of
|
|
2357
|
+
for (const ch of text9.replace(/=+$/, "")) {
|
|
2340
2358
|
value = (value << 6 | BASE64_ALPHABET.indexOf(ch)) & 16777215;
|
|
2341
2359
|
bits += 6;
|
|
2342
2360
|
if (bits >= 8) {
|
|
@@ -2346,8 +2364,8 @@ function decodeBase64(text4) {
|
|
|
2346
2364
|
}
|
|
2347
2365
|
return out;
|
|
2348
2366
|
}
|
|
2349
|
-
function soundDevice(
|
|
2350
|
-
const json = decodeBase64(
|
|
2367
|
+
function soundDevice(text9) {
|
|
2368
|
+
const json = decodeBase64(text9);
|
|
2351
2369
|
if (json === null)
|
|
2352
2370
|
return false;
|
|
2353
2371
|
let value;
|
|
@@ -2465,17 +2483,17 @@ function sumupBodyVerdict(body, url) {
|
|
|
2465
2483
|
var SALTED = /* @__PURE__ */ Object.freeze([83, 97, 108, 116, 101, 100, 95, 95]);
|
|
2466
2484
|
var B64 = /^[A-Za-z0-9+/]+={0,2}$/;
|
|
2467
2485
|
var FIELD_LIMIT = 1024;
|
|
2468
|
-
function decodeCanonical(
|
|
2469
|
-
if (typeof
|
|
2486
|
+
function decodeCanonical(text9) {
|
|
2487
|
+
if (typeof text9 !== "string" || text9.length === 0 || text9.length % 4 !== 0 || !B64.test(text9))
|
|
2470
2488
|
return null;
|
|
2471
2489
|
let binary;
|
|
2472
2490
|
try {
|
|
2473
|
-
binary = atob(
|
|
2491
|
+
binary = atob(text9);
|
|
2474
2492
|
}
|
|
2475
2493
|
catch {
|
|
2476
2494
|
return null;
|
|
2477
2495
|
}
|
|
2478
|
-
if (btoa(binary) !==
|
|
2496
|
+
if (btoa(binary) !== text9)
|
|
2479
2497
|
return null;
|
|
2480
2498
|
return Uint8Array.from(binary, (char) => char.charCodeAt(0));
|
|
2481
2499
|
}
|
|
@@ -2717,8 +2735,8 @@ var TEXT_LIMIT3 = 256;
|
|
|
2717
2735
|
var CONTROL7 = /[\u0000-\u001f\u007f]/;
|
|
2718
2736
|
var record13 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
2719
2737
|
var sameKeys7 = (value, keys) => {
|
|
2720
|
-
const
|
|
2721
|
-
return
|
|
2738
|
+
const own10 = Object.keys(value);
|
|
2739
|
+
return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
|
|
2722
2740
|
};
|
|
2723
2741
|
var plainText3 = (value) => typeof value === "string" && value.length <= TEXT_LIMIT3 && !CONTROL7.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
|
|
2724
2742
|
var refuse19 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
@@ -2762,6 +2780,10 @@ function hipayBodyVerdict(body) {
|
|
|
2762
2780
|
return refuse19("hipay_keeps_card");
|
|
2763
2781
|
return value.multi_use === 0 ? CARD18 : refuse19("hipay_body_unsupported");
|
|
2764
2782
|
}
|
|
2783
|
+
var pin6 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), usernames: Object.freeze([...fields.usernames]) });
|
|
2784
|
+
var HIPAY_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
2785
|
+
pin6({ id: "happybulle", merchant: "HappyBulle", origins: ["https://www.happybulle.com"], usernames: ["94683309.secure-gateway.hipay-tpp.com"] })
|
|
2786
|
+
]);
|
|
2765
2787
|
// src/amazon-payment-services.js
|
|
2766
2788
|
var APS_PSP = "amazon_payment_services";
|
|
2767
2789
|
var APS_HOSTS = /* @__PURE__ */ Object.freeze({ "checkout.payfort.com": "production", "sbcheckout.payfort.com": "sandbox" });
|
|
@@ -2906,176 +2928,2368 @@ function apsBodyVerdict(body, url) {
|
|
|
2906
2928
|
return code ? { verdict: "refuse", code } : { verdict: "card" };
|
|
2907
2929
|
}
|
|
2908
2930
|
var ANSWER_LIMIT = 64 * 1024;
|
|
2909
|
-
// src/
|
|
2910
|
-
|
|
2911
|
-
|
|
2912
|
-
|
|
2913
|
-
|
|
2914
|
-
|
|
2915
|
-
|
|
2916
|
-
|
|
2917
|
-
|
|
2918
|
-
|
|
2919
|
-
|
|
2920
|
-
|
|
2921
|
-
|
|
2922
|
-
|
|
2923
|
-
|
|
2924
|
-
|
|
2925
|
-
|
|
2926
|
-
|
|
2927
|
-
|
|
2928
|
-
|
|
2929
|
-
|
|
2930
|
-
|
|
2931
|
-
|
|
2932
|
-
|
|
2933
|
-
|
|
2934
|
-
|
|
2935
|
-
|
|
2936
|
-
|
|
2937
|
-
|
|
2938
|
-
|
|
2939
|
-
|
|
2931
|
+
// src/paypal.js
|
|
2932
|
+
var PAYPAL_PSP = "paypal";
|
|
2933
|
+
var PAYPAL_CONFIRM_HOSTS = /* @__PURE__ */ Object.freeze(["www.paypal.com", "www.sandbox.paypal.com", "api-m.paypal.com", "api-m.sandbox.paypal.com"]);
|
|
2934
|
+
var CONFIRM_PATH = /^\/v2\/checkout\/orders\/([A-Z0-9]{1,36})\/confirm-payment-source$/;
|
|
2935
|
+
var BODY_LIMIT17 = 8192;
|
|
2936
|
+
var CARD_KEYS8 = /* @__PURE__ */ Object.freeze(["number", "expiry", "security_code", "name", "billing_address", "attributes", "brand_preference"]);
|
|
2937
|
+
var ADDRESS_KEYS3 = /* @__PURE__ */ Object.freeze([
|
|
2938
|
+
"address_line_1",
|
|
2939
|
+
"address_line_2",
|
|
2940
|
+
"address_line_3",
|
|
2941
|
+
"admin_area_1",
|
|
2942
|
+
"admin_area_2",
|
|
2943
|
+
"admin_area_3",
|
|
2944
|
+
"admin_area_4",
|
|
2945
|
+
"postal_code",
|
|
2946
|
+
"country_code"
|
|
2947
|
+
]);
|
|
2948
|
+
var CONTROL8 = /[\u0000-\u001f\u007f]/;
|
|
2949
|
+
var TEXT_LIMIT4 = 300;
|
|
2950
|
+
var cardLike = (value) => (value.match(/[0-9]/g) ?? []).length >= 12;
|
|
2951
|
+
var text3 = (value) => typeof value === "string" && value.length <= TEXT_LIMIT4 && !CONTROL8.test(value) && !cardLike(value);
|
|
2952
|
+
var record14 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
2953
|
+
var own3 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
2954
|
+
var keysWithin2 = (value, allowed) => record14(value) && Object.keys(value).every((key) => allowed.includes(key));
|
|
2955
|
+
var refuse20 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
2956
|
+
var CARD19 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
2957
|
+
var CONTINUE9 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
|
|
2958
|
+
function paypalConfirmOrderId(url) {
|
|
2959
|
+
if (typeof url !== "string" || url.length > 256 || url.includes("?") || url.includes("#"))
|
|
2960
|
+
return null;
|
|
2961
|
+
let parsed;
|
|
2962
|
+
try {
|
|
2963
|
+
parsed = new URL(url);
|
|
2940
2964
|
}
|
|
2941
|
-
|
|
2942
|
-
|
|
2943
|
-
return { verdict: "refuse", code: "pay_nl_url_refused" };
|
|
2944
|
-
return payNlBodyVerdict(body);
|
|
2965
|
+
catch {
|
|
2966
|
+
return null;
|
|
2945
2967
|
}
|
|
2946
|
-
if (
|
|
2947
|
-
|
|
2948
|
-
|
|
2949
|
-
|
|
2950
|
-
|
|
2951
|
-
|
|
2952
|
-
|
|
2953
|
-
|
|
2954
|
-
|
|
2955
|
-
return
|
|
2968
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !PAYPAL_CONFIRM_HOSTS.includes(parsed.hostname))
|
|
2969
|
+
return null;
|
|
2970
|
+
return CONFIRM_PATH.exec(parsed.pathname)?.[1] ?? null;
|
|
2971
|
+
}
|
|
2972
|
+
function isPaypalConfirmUrl(url) {
|
|
2973
|
+
return paypalConfirmOrderId(url) !== null;
|
|
2974
|
+
}
|
|
2975
|
+
function readBody10(body) {
|
|
2976
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT17)
|
|
2977
|
+
return null;
|
|
2978
|
+
let value;
|
|
2979
|
+
try {
|
|
2980
|
+
value = JSON.parse(body);
|
|
2981
|
+
if (!record14(value) || JSON.stringify(value) !== body)
|
|
2982
|
+
return null;
|
|
2956
2983
|
}
|
|
2957
|
-
|
|
2958
|
-
return
|
|
2959
|
-
if (recognizer && recognizer.psp === PADDLE_TOKENEX_PSP) {
|
|
2960
|
-
const target = url !== void 0 ? paddleTokenexPayTarget(url) : null;
|
|
2961
|
-
if (url !== void 0 && target === null)
|
|
2962
|
-
return { verdict: "refuse", code: "paddle_tokenex_pay_unsupported" };
|
|
2963
|
-
return paddleTokenexBodyVerdict(body, target ? target.line : void 0);
|
|
2984
|
+
catch {
|
|
2985
|
+
return null;
|
|
2964
2986
|
}
|
|
2965
|
-
|
|
2966
|
-
|
|
2967
|
-
|
|
2968
|
-
|
|
2969
|
-
|
|
2987
|
+
return value;
|
|
2988
|
+
}
|
|
2989
|
+
var typedNumber = (value) => typeof value === "string" && value.length <= 23 && /^[0-9]+(?: [0-9]+)*$/.test(value) && value.replace(/ /g, "").length >= 12 && value.replace(/ /g, "").length <= 19;
|
|
2990
|
+
function installmentsOk(value) {
|
|
2991
|
+
if (!keysWithin2(value, ["term", "interval_duration"]) || Object.keys(value).length === 0)
|
|
2992
|
+
return false;
|
|
2993
|
+
if (own3(value, "term") && !(Number.isSafeInteger(value.term) && value.term >= 1 && value.term <= 99))
|
|
2994
|
+
return false;
|
|
2995
|
+
return !own3(value, "interval_duration") || typeof value.interval_duration === "string" && /^P[0-9]{1,3}[DWMY]$/.test(value.interval_duration);
|
|
2996
|
+
}
|
|
2997
|
+
function paypalBodyVerdict(body) {
|
|
2998
|
+
const value = readBody10(body);
|
|
2999
|
+
if (value === null)
|
|
3000
|
+
return refuse20("paypal_body_unsupported");
|
|
3001
|
+
const source = value.payment_source;
|
|
3002
|
+
const card = record14(source) ? source.card : void 0;
|
|
3003
|
+
const number = record14(card) ? card.number : void 0;
|
|
3004
|
+
if (number === void 0 || number === null || number === "")
|
|
3005
|
+
return CONTINUE9;
|
|
3006
|
+
const context = value.application_context;
|
|
3007
|
+
const attributes = record14(card.attributes) ? card.attributes : null;
|
|
3008
|
+
if (record14(context) && context.vault === true || own3(card, "stored_credential") || attributes && (own3(attributes, "vault") || own3(attributes, "customer")))
|
|
3009
|
+
return refuse20("paypal_card_on_file");
|
|
3010
|
+
if (attributes && record14(attributes.verification) && attributes.verification.method === "SCA_ALWAYS")
|
|
3011
|
+
return refuse20("paypal_three_ds");
|
|
3012
|
+
if (!keysWithin2(value, ["payment_source"]) || !keysWithin2(source, ["card"]) || !keysWithin2(card, CARD_KEYS8) || !typedNumber(card.number) || typeof card.expiry !== "string" || !/^[0-9]{4}-(?:0[1-9]|1[0-2])$/.test(card.expiry))
|
|
3013
|
+
return refuse20("paypal_body_unsupported");
|
|
3014
|
+
if (own3(card, "security_code") && !(typeof card.security_code === "string" && /^[0-9]{3,4}$/.test(card.security_code)))
|
|
3015
|
+
return refuse20("paypal_body_unsupported");
|
|
3016
|
+
if (own3(card, "name") && !(text3(card.name) && card.name.trim() !== ""))
|
|
3017
|
+
return refuse20("paypal_body_unsupported");
|
|
3018
|
+
if (own3(card, "brand_preference") && !(typeof card.brand_preference === "string" && /^[A-Z][A-Z_]{1,31}$/.test(card.brand_preference))) {
|
|
3019
|
+
return refuse20("paypal_body_unsupported");
|
|
3020
|
+
}
|
|
3021
|
+
if (own3(card, "billing_address") && !(keysWithin2(card.billing_address, ADDRESS_KEYS3) && Object.values(card.billing_address).every(text3))) {
|
|
3022
|
+
return refuse20("paypal_body_unsupported");
|
|
3023
|
+
}
|
|
3024
|
+
if (own3(card, "attributes") && !(keysWithin2(attributes, ["installments"]) && installmentsOk(attributes.installments))) {
|
|
3025
|
+
return refuse20("paypal_body_unsupported");
|
|
3026
|
+
}
|
|
3027
|
+
return CARD19;
|
|
3028
|
+
}
|
|
3029
|
+
// src/clover.js
|
|
3030
|
+
var CLOVER_PSP = "clover";
|
|
3031
|
+
var CLOVER_TOKEN_HOSTS = /* @__PURE__ */ Object.freeze({ "token.clover.com": "production", "token-sandbox.dev.clover.com": "test" });
|
|
3032
|
+
var CLOVER_TOKEN_PATH = "/v1/tokens";
|
|
3033
|
+
var BODY_LIMIT18 = 4096;
|
|
3034
|
+
var REQUIRED_KEYS = /* @__PURE__ */ Object.freeze(["encrypted_pan", "exp_month", "exp_year", "cvv", "first6", "last4", "brand"]);
|
|
3035
|
+
var OPTIONAL_KEYS = /* @__PURE__ */ Object.freeze(["address_line1", "phone_numbers", "email_address", "name", "address_zip"]);
|
|
3036
|
+
var CARD_ORDER = /* @__PURE__ */ Object.freeze([...REQUIRED_KEYS, ...OPTIONAL_KEYS]);
|
|
3037
|
+
var ENCRYPTED_PAN = /^[A-Za-z0-9+/]{341}[AQgw]==$/;
|
|
3038
|
+
var MONTH9 = /^(?:[1-9]|1[0-2])$/;
|
|
3039
|
+
var YEAR9 = /^(?:[0-9]|[1-9][0-9])$/;
|
|
3040
|
+
var CODE3 = /^[0-9]{3,4}$/;
|
|
3041
|
+
var FIRST6 = /^[0-9]{6}$/;
|
|
3042
|
+
var LAST4 = /^[0-9]{4}$/;
|
|
3043
|
+
var BRANDS = /* @__PURE__ */ new Set(["VISA", "MC", "AMEX", "DISCOVER", "DINERS_CLUB", "JCB"]);
|
|
3044
|
+
var PHONE_TYPES = /* @__PURE__ */ new Set(["home_number", "mobile_number", "work_number"]);
|
|
3045
|
+
var COUNTRY_CODE2 = /^[0-9]{1,4}$/;
|
|
3046
|
+
var SUBSCRIBER = /^[0-9]{1,11}$/;
|
|
3047
|
+
var POSTAL_CODE2 = /^[A-Za-z0-9]{1,10}$/;
|
|
3048
|
+
var TEXT_LIMIT5 = 256;
|
|
3049
|
+
var EMAIL_LIMIT = 254;
|
|
3050
|
+
var CARD_LIKE_RUN = /[0-9]{12,}/;
|
|
3051
|
+
var record15 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3052
|
+
var own4 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
3053
|
+
var refuse21 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
3054
|
+
var CARD20 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
3055
|
+
function cloverTokenUrl(url) {
|
|
3056
|
+
if (typeof url !== "string" || url.length > 256 || url.includes("?") || url.includes("#"))
|
|
3057
|
+
return null;
|
|
3058
|
+
let parsed;
|
|
3059
|
+
try {
|
|
3060
|
+
parsed = new URL(url);
|
|
2970
3061
|
}
|
|
2971
|
-
|
|
2972
|
-
return
|
|
2973
|
-
if (recognizer && recognizer.psp === REVOLUT_PSP) {
|
|
2974
|
-
if (url !== void 0 && !isRevolutPaymentsUrl(url))
|
|
2975
|
-
return { verdict: "refuse", code: "revolut_url_refused" };
|
|
2976
|
-
return revolutBodyVerdict(body);
|
|
3062
|
+
catch {
|
|
3063
|
+
return null;
|
|
2977
3064
|
}
|
|
2978
|
-
if (
|
|
2979
|
-
return
|
|
2980
|
-
if (
|
|
2981
|
-
return
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
|
|
2985
|
-
|
|
3065
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password)
|
|
3066
|
+
return null;
|
|
3067
|
+
if (!own4(CLOVER_TOKEN_HOSTS, parsed.hostname) || parsed.pathname !== CLOVER_TOKEN_PATH)
|
|
3068
|
+
return null;
|
|
3069
|
+
return Object.freeze({ host: parsed.hostname, environment: CLOVER_TOKEN_HOSTS[parsed.hostname] });
|
|
3070
|
+
}
|
|
3071
|
+
function cloverBrand(digits4) {
|
|
3072
|
+
if (typeof digits4 !== "string" || !/^[0-9]{6,19}$/.test(digits4))
|
|
3073
|
+
return null;
|
|
3074
|
+
const two = Number(digits4.slice(0, 2));
|
|
3075
|
+
const three = Number(digits4.slice(0, 3));
|
|
3076
|
+
const four = Number(digits4.slice(0, 4));
|
|
3077
|
+
const six = Number(digits4.slice(0, 6));
|
|
3078
|
+
if (digits4.startsWith("4"))
|
|
3079
|
+
return "VISA";
|
|
3080
|
+
if (two === 34 || two === 37)
|
|
3081
|
+
return "AMEX";
|
|
3082
|
+
if (two >= 51 && two <= 55 || four >= 2221 && four < 2721)
|
|
3083
|
+
return "MC";
|
|
3084
|
+
if (four >= 3528 && four <= 3589)
|
|
3085
|
+
return "JCB";
|
|
3086
|
+
if (two === 64 || three >= 644 && three <= 659 || four === 6011 || six >= 622129 && six <= 622925)
|
|
3087
|
+
return "DISCOVER";
|
|
3088
|
+
if (two === 36 || two === 38 || two === 39 || three === 309 || three >= 300 && three <= 305)
|
|
3089
|
+
return "DINERS_CLUB";
|
|
3090
|
+
if ([5018, 5020, 5038, 5893, 6e3, 6304, 6759, 6761, 6762, 6763, 6799].includes(four))
|
|
3091
|
+
return "MAESTRO";
|
|
3092
|
+
return "UNKNOWN";
|
|
3093
|
+
}
|
|
3094
|
+
var isCiphertext = (value) => typeof value === "string" && ENCRYPTED_PAN.test(value);
|
|
3095
|
+
function readBody11(body) {
|
|
3096
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT18)
|
|
3097
|
+
return null;
|
|
3098
|
+
let value;
|
|
3099
|
+
try {
|
|
3100
|
+
value = JSON.parse(body);
|
|
3101
|
+
if (!record15(value) || JSON.stringify(value) !== body)
|
|
3102
|
+
return null;
|
|
2986
3103
|
}
|
|
2987
|
-
|
|
3104
|
+
catch {
|
|
2988
3105
|
return null;
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
return convergeBodyVerdict(body);
|
|
3106
|
+
}
|
|
3107
|
+
return value;
|
|
2992
3108
|
}
|
|
2993
|
-
function
|
|
2994
|
-
|
|
2995
|
-
|
|
2996
|
-
|
|
2997
|
-
|
|
2998
|
-
|
|
2999
|
-
|
|
3109
|
+
function inFrameOrder(keys) {
|
|
3110
|
+
let last = -1;
|
|
3111
|
+
for (const key of keys) {
|
|
3112
|
+
const at = CARD_ORDER.indexOf(key);
|
|
3113
|
+
if (at <= last)
|
|
3114
|
+
return false;
|
|
3115
|
+
last = at;
|
|
3000
3116
|
}
|
|
3001
|
-
|
|
3002
|
-
|
|
3003
|
-
|
|
3004
|
-
|
|
3005
|
-
|
|
3006
|
-
if (typeof body !== "string" || body === "")
|
|
3117
|
+
return REQUIRED_KEYS.every((key) => keys.includes(key));
|
|
3118
|
+
}
|
|
3119
|
+
var sideText = (value, limit = TEXT_LIMIT5) => typeof value === "string" && value.length <= limit && !CARD_LIKE_RUN.test(value);
|
|
3120
|
+
function isPhoneNumbers(value) {
|
|
3121
|
+
if (!record15(value))
|
|
3007
3122
|
return false;
|
|
3008
|
-
const
|
|
3009
|
-
|
|
3010
|
-
|
|
3011
|
-
|
|
3012
|
-
|
|
3013
|
-
|
|
3014
|
-
|
|
3015
|
-
|
|
3016
|
-
|
|
3017
|
-
|
|
3018
|
-
|
|
3019
|
-
|
|
3123
|
+
const types = Object.keys(value);
|
|
3124
|
+
if (types.length !== 1 || !PHONE_TYPES.has(types[0]))
|
|
3125
|
+
return false;
|
|
3126
|
+
const phone2 = value[types[0]];
|
|
3127
|
+
if (!record15(phone2))
|
|
3128
|
+
return false;
|
|
3129
|
+
const keys = Object.keys(phone2);
|
|
3130
|
+
return keys.length === 2 && keys[0] === "country_code" && keys[1] === "subscriber" && typeof phone2.country_code === "string" && COUNTRY_CODE2.test(phone2.country_code) && typeof phone2.subscriber === "string" && SUBSCRIBER.test(phone2.subscriber);
|
|
3131
|
+
}
|
|
3132
|
+
function isCardMember(card) {
|
|
3133
|
+
if (!record15(card) || !inFrameOrder(Object.keys(card)))
|
|
3134
|
+
return false;
|
|
3135
|
+
if (!isCiphertext(card.encrypted_pan))
|
|
3136
|
+
return false;
|
|
3137
|
+
if (typeof card.exp_month !== "string" || !MONTH9.test(card.exp_month))
|
|
3138
|
+
return false;
|
|
3139
|
+
if (typeof card.exp_year !== "string" || !YEAR9.test(card.exp_year))
|
|
3140
|
+
return false;
|
|
3141
|
+
if (typeof card.cvv !== "string" || !CODE3.test(card.cvv))
|
|
3142
|
+
return false;
|
|
3143
|
+
if (typeof card.first6 !== "string" || !FIRST6.test(card.first6))
|
|
3144
|
+
return false;
|
|
3145
|
+
if (typeof card.last4 !== "string" || !LAST4.test(card.last4))
|
|
3146
|
+
return false;
|
|
3147
|
+
if (typeof card.brand !== "string" || !BRANDS.has(card.brand) || cloverBrand(card.first6) !== card.brand)
|
|
3148
|
+
return false;
|
|
3149
|
+
if (own4(card, "address_line1") && !sideText(card.address_line1))
|
|
3150
|
+
return false;
|
|
3151
|
+
if (own4(card, "phone_numbers") && !isPhoneNumbers(card.phone_numbers))
|
|
3152
|
+
return false;
|
|
3153
|
+
if (own4(card, "email_address") && !(sideText(card.email_address, EMAIL_LIMIT) && /^[^\s@]+@[^\s@]+$/.test(card.email_address)))
|
|
3154
|
+
return false;
|
|
3155
|
+
if (own4(card, "name") && !(sideText(card.name) && card.name !== "" && card.name === card.name.trim()))
|
|
3156
|
+
return false;
|
|
3157
|
+
if (own4(card, "address_zip") && !(typeof card.address_zip === "string" && POSTAL_CODE2.test(card.address_zip)))
|
|
3158
|
+
return false;
|
|
3159
|
+
return true;
|
|
3160
|
+
}
|
|
3161
|
+
function cloverBodyVerdict(body, url) {
|
|
3162
|
+
if (url !== void 0 && cloverTokenUrl(url) === null)
|
|
3163
|
+
return refuse21("clover_url_refused");
|
|
3164
|
+
const value = readBody11(body);
|
|
3165
|
+
if (value === null)
|
|
3166
|
+
return refuse21("clover_body_unsupported");
|
|
3167
|
+
const keys = Object.keys(value);
|
|
3168
|
+
if (keys.length !== 1 || keys[0] !== "card" || !isCardMember(value.card))
|
|
3169
|
+
return refuse21("clover_body_unsupported");
|
|
3170
|
+
return CARD20;
|
|
3171
|
+
}
|
|
3172
|
+
// src/tap-payments.js
|
|
3173
|
+
var TAP_PAYMENTS_PSP = "tap_payments";
|
|
3174
|
+
var TAP_PAYMENTS_TOKEN_URL = "https://sdk.tap.company/v2/card/token";
|
|
3175
|
+
var TAP_PAYMENTS_PURPOSES = /* @__PURE__ */ Object.freeze(["CHARGE", "AUTHORIZE"]);
|
|
3176
|
+
var record16 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3177
|
+
function isTapPaymentsTokenUrl(url) {
|
|
3178
|
+
return url === TAP_PAYMENTS_TOKEN_URL;
|
|
3179
|
+
}
|
|
3180
|
+
var pin7 = (fields) => Object.freeze({
|
|
3181
|
+
...fields,
|
|
3182
|
+
origins: Object.freeze([...fields.origins]),
|
|
3183
|
+
sessions: Object.freeze({ ...fields.sessions }),
|
|
3184
|
+
key: Object.freeze({ ...fields.key })
|
|
3185
|
+
});
|
|
3186
|
+
var TAP_PAYMENTS_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
3187
|
+
pin7({
|
|
3188
|
+
id: "casefilegame",
|
|
3189
|
+
merchant: "Casefilegame",
|
|
3190
|
+
tapMerchantId: "67977048",
|
|
3191
|
+
publishableKey: "pk_live_ydlRjrWcLXaVvpsSBQKOie86",
|
|
3192
|
+
environment: "production",
|
|
3193
|
+
origins: ["https://checkout.tap.company"],
|
|
3194
|
+
// The WooCommerce plugin's redirect (Plugin-WooCommerce-All-in-one tap.php 567-586, read 2026-10-17)
|
|
3195
|
+
// creates the src_all charge with save_card false and names no agreement, subscription or destinations.
|
|
3196
|
+
sessions: { saveCard: false, agreement: false, subscription: false, destinations: false },
|
|
3197
|
+
key: {
|
|
3198
|
+
spki: "MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAzja2vB+Iyafj2Mm3pFg65z7Yvj9ZeoFLdMBgWFyyjF020r5HSPKVhuZ39uJkjs0U/kWgEpKDzHZAKdtGv36dS33NjMAzYpgFkD8j+9/YWqpvAGRj5nv1b/q7NaiZk3b1wm7aXHJOx5L6rPQf2qDQxhcSNHocU+Uy8wGmGxRRu6QRKN3khaz4o4jJDzqxns4h/ShzHjdZeWIVfpCAyVoED0IESBYrvGEhJeyKnga5XdHdBU2yP8P1huO4RbSKcZv00ZgxVHAQQ9CqArW3TE8SyLLnJPkSpSHHBnIPSQS1z3ld1mImy/zqTd4ltkV6XHpYqVvoPmys2EuZX3pMvCcPGwIBEQ==",
|
|
3199
|
+
sha256: "6eb4e89a1e05a06a39d631f6fb450c052a9cad9935edc1921e84e80207470552",
|
|
3200
|
+
// The shared parser takes exponent 17 only under a pin that names it (rsa-pkcs1v15.js).
|
|
3201
|
+
exponent: 17
|
|
3020
3202
|
}
|
|
3021
|
-
|
|
3022
|
-
|
|
3203
|
+
})
|
|
3204
|
+
]);
|
|
3205
|
+
var BODY_LIMIT19 = 16384;
|
|
3206
|
+
var ROOT_KEYS7 = /* @__PURE__ */ Object.freeze([
|
|
3207
|
+
"encryptedData",
|
|
3208
|
+
"purpose",
|
|
3209
|
+
"customer",
|
|
3210
|
+
"consent",
|
|
3211
|
+
"merchant",
|
|
3212
|
+
"order",
|
|
3213
|
+
"payment_agreement",
|
|
3214
|
+
"client_ip",
|
|
3215
|
+
"device",
|
|
3216
|
+
"browser",
|
|
3217
|
+
"app"
|
|
3218
|
+
]);
|
|
3219
|
+
var REQUIRED_KEYS2 = /* @__PURE__ */ Object.freeze(["encryptedData", "purpose", "order", "device", "browser", "app"]);
|
|
3220
|
+
var SAVE_PURPOSES = /* @__PURE__ */ Object.freeze(["SAVE_TOKEN", "SAVE_AUTHENTICATED_TOKEN"]);
|
|
3221
|
+
var ORDER_KEYS = /* @__PURE__ */ Object.freeze(["amount", "currency", "id", "description", "metadata", "reference"]);
|
|
3222
|
+
var DEVICE_KEYS3 = /* @__PURE__ */ Object.freeze(["source", "ip"]);
|
|
3223
|
+
var BROWSER_KEYS = /* @__PURE__ */ Object.freeze(["name", "id"]);
|
|
3224
|
+
var APP_KEYS = /* @__PURE__ */ Object.freeze(["identifier", "name", "version", "iframe_version", "sdk_version"]);
|
|
3225
|
+
var CIPHERTEXT_BYTES = /* @__PURE__ */ Object.freeze([128, 256, 384, 512]);
|
|
3226
|
+
var BASE644 = /^[A-Za-z0-9+/]+={0,2}$/;
|
|
3227
|
+
var CURRENCY3 = /^[A-Z]{3}$/;
|
|
3228
|
+
var TEXT_LIMIT6 = 512;
|
|
3229
|
+
var CONTROL9 = /[\u0000-\u001f\u007f]/;
|
|
3230
|
+
var CARD_LONG_DIGITS = /(?:\p{Nd}[\s-]?){12}\p{Nd}/u;
|
|
3231
|
+
var NESTING_LIMIT = 4;
|
|
3232
|
+
var MEMBERS_LIMIT = 64;
|
|
3233
|
+
var refuse22 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
3234
|
+
var CARD21 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
3235
|
+
function decodedBytes(value) {
|
|
3236
|
+
if (typeof value !== "string" || value.length % 4 !== 0 || !BASE644.test(value))
|
|
3237
|
+
return -1;
|
|
3238
|
+
try {
|
|
3239
|
+
if (btoa(atob(value)) !== value)
|
|
3240
|
+
return -1;
|
|
3023
3241
|
}
|
|
3024
|
-
|
|
3242
|
+
catch {
|
|
3243
|
+
return -1;
|
|
3244
|
+
}
|
|
3245
|
+
const pad = value.endsWith("==") ? 2 : value.endsWith("=") ? 1 : 0;
|
|
3246
|
+
return value.length / 4 * 3 - pad;
|
|
3025
3247
|
}
|
|
3026
|
-
|
|
3027
|
-
|
|
3028
|
-
|
|
3029
|
-
|
|
3030
|
-
if (
|
|
3031
|
-
return
|
|
3032
|
-
let parsed;
|
|
3248
|
+
function isTapPaymentsCiphertext(value) {
|
|
3249
|
+
return CIPHERTEXT_BYTES.includes(decodedBytes(value));
|
|
3250
|
+
}
|
|
3251
|
+
function readBody12(body) {
|
|
3252
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT19)
|
|
3253
|
+
return null;
|
|
3033
3254
|
try {
|
|
3034
|
-
|
|
3255
|
+
const value = JSON.parse(body);
|
|
3256
|
+
return record16(value) && JSON.stringify(value) === body ? value : null;
|
|
3035
3257
|
}
|
|
3036
3258
|
catch {
|
|
3037
|
-
return
|
|
3259
|
+
return null;
|
|
3038
3260
|
}
|
|
3039
|
-
|
|
3040
|
-
|
|
3041
|
-
|
|
3042
|
-
|
|
3043
|
-
|
|
3044
|
-
|
|
3045
|
-
|
|
3046
|
-
|
|
3047
|
-
for (const path of paths) {
|
|
3048
|
-
const last = path[path.length - 1];
|
|
3049
|
-
if (typeof last === "string")
|
|
3050
|
-
declared.add(last.toLowerCase());
|
|
3261
|
+
}
|
|
3262
|
+
var inOrder3 = (keys, order) => {
|
|
3263
|
+
let at = -1;
|
|
3264
|
+
for (const key of keys) {
|
|
3265
|
+
const next = order.indexOf(key);
|
|
3266
|
+
if (next <= at)
|
|
3267
|
+
return false;
|
|
3268
|
+
at = next;
|
|
3051
3269
|
}
|
|
3052
|
-
return
|
|
3270
|
+
return true;
|
|
3271
|
+
};
|
|
3272
|
+
var onlyKeys = (value, allowed) => record16(value) && Object.keys(value).every((key) => allowed.includes(key));
|
|
3273
|
+
var plainText4 = (value) => typeof value === "string" && value.length <= TEXT_LIMIT6 && !CONTROL9.test(value) && !CARD_LONG_DIGITS.test(value);
|
|
3274
|
+
var plainScalar = (value) => value === null || typeof value === "boolean" || typeof value === "number" && Number.isFinite(value) && !CARD_LONG_DIGITS.test(String(value)) || plainText4(value);
|
|
3275
|
+
function plainJson(value, depth = 0, budget = { members: 0 }) {
|
|
3276
|
+
if (depth > NESTING_LIMIT)
|
|
3277
|
+
return false;
|
|
3278
|
+
if (Array.isArray(value)) {
|
|
3279
|
+
budget.members += value.length;
|
|
3280
|
+
return budget.members <= MEMBERS_LIMIT && value.every((item) => plainJson(item, depth + 1, budget));
|
|
3281
|
+
}
|
|
3282
|
+
if (record16(value)) {
|
|
3283
|
+
const keys = Object.keys(value);
|
|
3284
|
+
budget.members += keys.length;
|
|
3285
|
+
return budget.members <= MEMBERS_LIMIT && keys.every((key) => plainText4(key) && plainJson(value[key], depth + 1, budget));
|
|
3286
|
+
}
|
|
3287
|
+
return plainScalar(value);
|
|
3053
3288
|
}
|
|
3054
|
-
function
|
|
3055
|
-
if (
|
|
3289
|
+
function soundOrder(order) {
|
|
3290
|
+
if (!onlyKeys(order, ORDER_KEYS) || !inOrder3(Object.keys(order), ORDER_KEYS))
|
|
3056
3291
|
return false;
|
|
3057
|
-
|
|
3292
|
+
if ("amount" in order && !(typeof order.amount === "number" && Number.isFinite(order.amount) && order.amount >= 0 && !CARD_LONG_DIGITS.test(String(order.amount))))
|
|
3293
|
+
return false;
|
|
3294
|
+
if ("currency" in order && !(typeof order.currency === "string" && CURRENCY3.test(order.currency)))
|
|
3295
|
+
return false;
|
|
3296
|
+
if ("id" in order && !plainText4(order.id))
|
|
3297
|
+
return false;
|
|
3298
|
+
if ("description" in order && !plainText4(order.description))
|
|
3299
|
+
return false;
|
|
3300
|
+
if ("metadata" in order && !plainJson(order.metadata))
|
|
3301
|
+
return false;
|
|
3302
|
+
return !("reference" in order) || plainJson(order.reference);
|
|
3303
|
+
}
|
|
3304
|
+
var soundDevice2 = (device) => onlyKeys(device, DEVICE_KEYS3) && inOrder3(Object.keys(device), DEVICE_KEYS3) && (device.source === "web" || device.source === "app") && (!("ip" in device) || plainText4(device.ip));
|
|
3305
|
+
var soundBrowser = (browser) => onlyKeys(browser, BROWSER_KEYS) && inOrder3(Object.keys(browser), BROWSER_KEYS) && (!("name" in browser) || plainText4(browser.name)) && plainText4(browser.id);
|
|
3306
|
+
var versionValue = (value) => plainText4(value) || typeof value === "number" && Number.isFinite(value) && !CARD_LONG_DIGITS.test(String(value));
|
|
3307
|
+
var soundApp = (app) => onlyKeys(app, APP_KEYS) && inOrder3(Object.keys(app), APP_KEYS) && app.identifier === "card_sdk" && app.name === "card_sdk" && ["version", "iframe_version", "sdk_version"].every((key) => !(key in app) || versionValue(app[key]));
|
|
3308
|
+
function tapPaymentsBodyVerdict(body) {
|
|
3309
|
+
const value = readBody12(body);
|
|
3310
|
+
if (value === null)
|
|
3311
|
+
return refuse22("tap_payments_body_unsupported");
|
|
3312
|
+
const keys = Object.keys(value);
|
|
3313
|
+
if (!keys.every((key) => ROOT_KEYS7.includes(key)) || !inOrder3(keys, ROOT_KEYS7) || !REQUIRED_KEYS2.every((key) => keys.includes(key))) {
|
|
3314
|
+
return refuse22("tap_payments_body_unsupported");
|
|
3315
|
+
}
|
|
3316
|
+
if (!isTapPaymentsCiphertext(value.encryptedData))
|
|
3317
|
+
return refuse22("tap_payments_body_unsupported");
|
|
3318
|
+
if (typeof value.purpose !== "string")
|
|
3319
|
+
return refuse22("tap_payments_body_unsupported");
|
|
3320
|
+
if (SAVE_PURPOSES.includes(value.purpose))
|
|
3321
|
+
return refuse22("tap_payments_keep_on_file");
|
|
3322
|
+
if (!TAP_PAYMENTS_PURPOSES.includes(value.purpose))
|
|
3323
|
+
return refuse22("tap_payments_body_unsupported");
|
|
3324
|
+
if ("payment_agreement" in value && value.payment_agreement !== null)
|
|
3325
|
+
return refuse22("tap_payments_keep_on_file");
|
|
3326
|
+
if ("consent" in value) {
|
|
3327
|
+
const consent = value.consent;
|
|
3328
|
+
if (!record16(consent) || Object.keys(consent).length !== 1 || typeof consent.acknowledge !== "boolean")
|
|
3329
|
+
return refuse22("tap_payments_body_unsupported");
|
|
3330
|
+
if (consent.acknowledge)
|
|
3331
|
+
return refuse22("tap_payments_keep_on_file");
|
|
3332
|
+
}
|
|
3333
|
+
if ("customer" in value && !(record16(value.customer) && plainJson(value.customer)) || "merchant" in value && !(record16(value.merchant) && plainJson(value.merchant)) || "client_ip" in value && value.client_ip !== null && !plainText4(value.client_ip) || !soundOrder(value.order) || !soundDevice2(value.device) || !soundBrowser(value.browser) || !soundApp(value.app)) {
|
|
3334
|
+
return refuse22("tap_payments_body_unsupported");
|
|
3335
|
+
}
|
|
3336
|
+
return CARD21;
|
|
3337
|
+
}
|
|
3338
|
+
// src/conekta.js
|
|
3339
|
+
var CONEKTA_PSP = "conekta";
|
|
3340
|
+
var CONEKTA_TOKENS_URL = "https://api.conekta.io/tokens";
|
|
3341
|
+
var CONEKTA_COMPONENT_TOKEN_URLS = /* @__PURE__ */ Object.freeze(["https://pay.conekta.com/api/tokens", "https://pay.conekta.com/api/tokens/"]);
|
|
3342
|
+
var CONEKTA_CARD_KEYS = /* @__PURE__ */ Object.freeze(["number", "name", "cvc", "exp_month", "exp_year", "exp", "address", "device_fingerprint"]);
|
|
3343
|
+
var CONEKTA_ADDRESS_KEYS = /* @__PURE__ */ Object.freeze(["street1", "street2", "street3", "city", "state", "zip", "country"]);
|
|
3344
|
+
var BODY_LIMIT20 = 4096;
|
|
3345
|
+
var URL_LIMIT8 = 64;
|
|
3346
|
+
var NUMBER5 = /^[0-9]{12,19}$/;
|
|
3347
|
+
var SECURITY_CODE13 = /^[0-9]{3,4}$/;
|
|
3348
|
+
var MONTH10 = /^(?:0?[1-9]|1[0-2])$/;
|
|
3349
|
+
var YEAR10 = /^(?:[0-9]{2}|20[0-9]{2})$/;
|
|
3350
|
+
var EXPIRY2 = /^(?:0[1-9]|1[0-2])\/(?:[0-9]{2}|20[0-9]{2})$/;
|
|
3351
|
+
var FINGERPRINT = /^(?:[a-z0-9]{31,32})?$/;
|
|
3352
|
+
var LETTERS = "A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u017F";
|
|
3353
|
+
var PAGE_NAME2 = new RegExp(`^[${LETTERS} .'-]{1,64}$`);
|
|
3354
|
+
var HAS_LETTER = new RegExp(`[${LETTERS}]`);
|
|
3355
|
+
var ADDRESS_VALUE = new RegExp(`^[\\x20-\\x7e\\u00a0-\\u017f]{0,128}$`);
|
|
3356
|
+
var PAN_LIKE5 = new RegExp(`(?:[0-9][^0-9${LETTERS}]*){12,}`);
|
|
3357
|
+
var record17 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3358
|
+
var refuse23 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
3359
|
+
var CARD22 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
3360
|
+
function conektaTarget(url) {
|
|
3361
|
+
if (typeof url !== "string" || url.length > URL_LIMIT8)
|
|
3362
|
+
return null;
|
|
3363
|
+
if (url === CONEKTA_TOKENS_URL)
|
|
3364
|
+
return Object.freeze({ kind: "tokens" });
|
|
3365
|
+
return CONEKTA_COMPONENT_TOKEN_URLS.includes(url) ? Object.freeze({ kind: "component" }) : null;
|
|
3366
|
+
}
|
|
3367
|
+
function readJson4(body) {
|
|
3368
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT20)
|
|
3369
|
+
return null;
|
|
3058
3370
|
try {
|
|
3059
|
-
|
|
3371
|
+
const value = JSON.parse(body);
|
|
3372
|
+
return record17(value) && JSON.stringify(value) === body ? value : null;
|
|
3060
3373
|
}
|
|
3061
3374
|
catch {
|
|
3062
|
-
return
|
|
3375
|
+
return null;
|
|
3063
3376
|
}
|
|
3064
|
-
return paths.some((path) => {
|
|
3065
|
-
const at = jsonAt(parsed, path);
|
|
3066
|
-
return at.found && (typeof at.value === "string" && at.value !== "" || typeof at.value === "number");
|
|
3067
|
-
});
|
|
3068
3377
|
}
|
|
3069
|
-
function
|
|
3070
|
-
const
|
|
3071
|
-
|
|
3072
|
-
|
|
3073
|
-
|
|
3074
|
-
|
|
3075
|
-
|
|
3076
|
-
|
|
3077
|
-
|
|
3078
|
-
|
|
3378
|
+
function componentBody(value) {
|
|
3379
|
+
const keys = Object.keys(value);
|
|
3380
|
+
return keys.length === 2 && keys[0] === "data" && keys[1] === "key" && typeof value.data === "string" && typeof value.key === "string";
|
|
3381
|
+
}
|
|
3382
|
+
function soundAddress(address2) {
|
|
3383
|
+
if (!record17(address2))
|
|
3384
|
+
return false;
|
|
3385
|
+
const keys = Object.keys(address2);
|
|
3386
|
+
return keys.length > 0 && keys.every((key) => CONEKTA_ADDRESS_KEYS.includes(key) && typeof address2[key] === "string" && ADDRESS_VALUE.test(address2[key]) && !PAN_LIKE5.test(address2[key])) && keys.some((key) => address2[key] !== "");
|
|
3387
|
+
}
|
|
3388
|
+
function judgeCard(card) {
|
|
3389
|
+
if (!record17(card))
|
|
3390
|
+
return "conekta_body_unsupported";
|
|
3391
|
+
const keys = Object.keys(card);
|
|
3392
|
+
if (!keys.every((key) => CONEKTA_CARD_KEYS.includes(key)) || keys[keys.length - 1] !== "device_fingerprint" || !["number", "name", "cvc", "exp_month", "exp_year"].every((key) => keys.includes(key)))
|
|
3393
|
+
return "conekta_body_unsupported";
|
|
3394
|
+
if (typeof card.number !== "string" || !NUMBER5.test(card.number) || typeof card.cvc !== "string" || !SECURITY_CODE13.test(card.cvc) || typeof card.exp_month !== "string" || !MONTH10.test(card.exp_month) || typeof card.exp_year !== "string" || !YEAR10.test(card.exp_year) || typeof card.name !== "string" || !PAGE_NAME2.test(card.name) || !HAS_LETTER.test(card.name) || typeof card.device_fingerprint !== "string" || !FINGERPRINT.test(card.device_fingerprint))
|
|
3395
|
+
return "conekta_body_unsupported";
|
|
3396
|
+
if (keys.includes("exp") && (typeof card.exp !== "string" || !EXPIRY2.test(card.exp) || card.exp !== `${card.exp_month}/${card.exp_year}`)) {
|
|
3397
|
+
return "conekta_body_unsupported";
|
|
3398
|
+
}
|
|
3399
|
+
if (keys.includes("address") && !soundAddress(card.address))
|
|
3400
|
+
return "conekta_body_unsupported";
|
|
3401
|
+
return null;
|
|
3402
|
+
}
|
|
3403
|
+
function conektaBodyVerdict(body, url) {
|
|
3404
|
+
if (url !== void 0) {
|
|
3405
|
+
const target = conektaTarget(url);
|
|
3406
|
+
if (target === null)
|
|
3407
|
+
return refuse23("conekta_url_refused");
|
|
3408
|
+
if (target.kind === "component")
|
|
3409
|
+
return refuse23("conekta_component_unsupported");
|
|
3410
|
+
}
|
|
3411
|
+
const value = readJson4(body);
|
|
3412
|
+
if (value === null)
|
|
3413
|
+
return refuse23("conekta_body_unsupported");
|
|
3414
|
+
if (componentBody(value))
|
|
3415
|
+
return refuse23("conekta_component_unsupported");
|
|
3416
|
+
const keys = Object.keys(value);
|
|
3417
|
+
if (keys.length !== 1 || keys[0] !== "card")
|
|
3418
|
+
return refuse23("conekta_body_unsupported");
|
|
3419
|
+
const code = judgeCard(value.card);
|
|
3420
|
+
return code === null ? CARD22 : refuse23(code);
|
|
3421
|
+
}
|
|
3422
|
+
var HOLDER4 = new RegExp(`^[${LETTERS}](?:[${LETTERS} .'-]{0,62}[${LETTERS}.])?$`);
|
|
3423
|
+
var ERROR_TYPE_STATUS = /* @__PURE__ */ Object.freeze({
|
|
3424
|
+
malformed_request_error: 400,
|
|
3425
|
+
authentication_error: 401,
|
|
3426
|
+
processing_error: 402,
|
|
3427
|
+
resource_not_found_error: 404,
|
|
3428
|
+
conflict_error: 409,
|
|
3429
|
+
precondition_required_error: 412,
|
|
3430
|
+
parameter_validation_error: 422
|
|
3431
|
+
});
|
|
3432
|
+
var CONEKTA_ANSWER_ERROR_TYPES = /* @__PURE__ */ Object.freeze(Object.keys(ERROR_TYPE_STATUS));
|
|
3433
|
+
// src/makecommerce.js
|
|
3434
|
+
var MAKECOMMERCE_PSP = "makecommerce";
|
|
3435
|
+
var MAKECOMMERCE_CARD_HOSTS = /* @__PURE__ */ Object.freeze({ "cc.maksekeskus.ee": "production", "cc-test.maksekeskus.ee": "test" });
|
|
3436
|
+
var MAKECOMMERCE_CARD_PATH = "/card-payment";
|
|
3437
|
+
var MAKECOMMERCE_FRAME_VERSIONS = /* @__PURE__ */ Object.freeze(["cde.31", "cde.35"]);
|
|
3438
|
+
var BODY_LIMIT21 = 4096;
|
|
3439
|
+
var HEAD_KEYS = /* @__PURE__ */ Object.freeze(["transaction", "customer", "ocp", "checkout"]);
|
|
3440
|
+
var TAIL_KEYS = /* @__PURE__ */ Object.freeze(["card", "tokenizer", "shop_id", "client_data", "hostname", "public_key"]);
|
|
3441
|
+
var CARD_KEYS9 = /* @__PURE__ */ Object.freeze(["name", "number", "exp_month", "exp_year", "cvc"]);
|
|
3442
|
+
var CLIENT_KEYS = /* @__PURE__ */ Object.freeze(["client_fingerprint", "client_tz_offset", "client_time"]);
|
|
3443
|
+
var UUID3 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
3444
|
+
var EMAIL4 = /^(?!.*\.\.)(?!.*-$)(?!^-)[A-Za-z0-9._%+-]+@[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*(?:\.[A-Za-z]{2,})+$/;
|
|
3445
|
+
var CARD_NUMBER11 = /^[0-9]{13,19}$/;
|
|
3446
|
+
var MONTH11 = /^(?:0[1-9]|1[0-2])$/;
|
|
3447
|
+
var YEAR11 = /^[0-9]{2}$/;
|
|
3448
|
+
var CODE4 = /^[0-9]{3}$/;
|
|
3449
|
+
var NAME_LIMIT3 = 100;
|
|
3450
|
+
var NAME_WORD = /[a-z]+/gi;
|
|
3451
|
+
var printable2 = (text9) => [...text9].every((character) => {
|
|
3452
|
+
const point = character.codePointAt(0);
|
|
3453
|
+
return point >= 32 && !(point >= 127 && point <= 159) && point !== 8232 && point !== 8233;
|
|
3454
|
+
});
|
|
3455
|
+
var FINGERPRINT2 = /^[0-9a-f]{40}$/i;
|
|
3456
|
+
var HOSTNAME = /^(?=.{1,253}$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)+$/;
|
|
3457
|
+
var PUBLISHABLE_KEY = /^[A-Za-z0-9]{16,64}$/;
|
|
3458
|
+
var record18 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3459
|
+
var sameKeys8 = (value, keys) => {
|
|
3460
|
+
const own10 = Object.keys(value);
|
|
3461
|
+
return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
|
|
3462
|
+
};
|
|
3463
|
+
var refuse24 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
3464
|
+
var CARD23 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
3465
|
+
function luhn4(digits4) {
|
|
3466
|
+
let sum = 0;
|
|
3467
|
+
for (let at = 0; at < digits4.length; at += 1) {
|
|
3468
|
+
let digit = Number(digits4[digits4.length - 1 - at]);
|
|
3469
|
+
if (at % 2 === 1) {
|
|
3470
|
+
digit *= 2;
|
|
3471
|
+
if (digit > 9)
|
|
3472
|
+
digit -= 9;
|
|
3473
|
+
}
|
|
3474
|
+
sum += digit;
|
|
3475
|
+
}
|
|
3476
|
+
return sum % 10 === 0;
|
|
3477
|
+
}
|
|
3478
|
+
function makecommerceCardUrl(url) {
|
|
3479
|
+
if (typeof url !== "string" || url.length > 256 || url.includes("?") || url.includes("#"))
|
|
3480
|
+
return null;
|
|
3481
|
+
let parsed;
|
|
3482
|
+
try {
|
|
3483
|
+
parsed = new URL(url);
|
|
3484
|
+
}
|
|
3485
|
+
catch {
|
|
3486
|
+
return null;
|
|
3487
|
+
}
|
|
3488
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || parsed.search || parsed.hash || parsed.pathname !== MAKECOMMERCE_CARD_PATH)
|
|
3489
|
+
return null;
|
|
3490
|
+
if (!Object.prototype.hasOwnProperty.call(MAKECOMMERCE_CARD_HOSTS, parsed.hostname))
|
|
3491
|
+
return null;
|
|
3492
|
+
return Object.freeze({ host: parsed.hostname, environment: MAKECOMMERCE_CARD_HOSTS[parsed.hostname] });
|
|
3493
|
+
}
|
|
3494
|
+
function isMakecommerceCardUrl(url) {
|
|
3495
|
+
return makecommerceCardUrl(url) !== null;
|
|
3496
|
+
}
|
|
3497
|
+
function readBody13(body) {
|
|
3498
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT21)
|
|
3499
|
+
return null;
|
|
3500
|
+
let value;
|
|
3501
|
+
try {
|
|
3502
|
+
value = JSON.parse(body);
|
|
3503
|
+
if (!record18(value) || JSON.stringify(value) !== body)
|
|
3504
|
+
return null;
|
|
3505
|
+
}
|
|
3506
|
+
catch {
|
|
3507
|
+
return null;
|
|
3508
|
+
}
|
|
3509
|
+
return value;
|
|
3510
|
+
}
|
|
3511
|
+
var box = (value) => record18(value) && sameKeys8(value, ["requested"]) && typeof value.requested === "boolean";
|
|
3512
|
+
var holderName = (name) => typeof name === "string" && name.length <= NAME_LIMIT3 && printable2(name) && (name.match(NAME_WORD) ?? []).length > 1;
|
|
3513
|
+
function frameCardValues(card) {
|
|
3514
|
+
return record18(card) && sameKeys8(card, CARD_KEYS9) && holderName(card.name) && typeof card.number === "string" && CARD_NUMBER11.test(card.number) && luhn4(card.number) && typeof card.exp_month === "string" && MONTH11.test(card.exp_month) && typeof card.exp_year === "string" && YEAR11.test(card.exp_year) && typeof card.cvc === "string" && CODE4.test(card.cvc);
|
|
3515
|
+
}
|
|
3516
|
+
function clientData(value) {
|
|
3517
|
+
return record18(value) && sameKeys8(value, CLIENT_KEYS) && typeof value.client_fingerprint === "string" && FINGERPRINT2.test(value.client_fingerprint) && Number.isFinite(value.client_tz_offset) && Math.abs(value.client_tz_offset) <= 14 && Number.isSafeInteger(value.client_time) && value.client_time > 0;
|
|
3518
|
+
}
|
|
3519
|
+
function makecommerceBodyVerdict(body, url) {
|
|
3520
|
+
if (url !== void 0 && !isMakecommerceCardUrl(url))
|
|
3521
|
+
return refuse24("makecommerce_url_refused");
|
|
3522
|
+
const value = readBody13(body);
|
|
3523
|
+
if (value === null)
|
|
3524
|
+
return refuse24("makecommerce_body_unsupported");
|
|
3525
|
+
const recurring = Object.prototype.hasOwnProperty.call(value, "recurring");
|
|
3526
|
+
if (!sameKeys8(value, [...HEAD_KEYS, ...recurring ? ["recurring"] : [], ...TAIL_KEYS]))
|
|
3527
|
+
return refuse24("makecommerce_body_unsupported");
|
|
3528
|
+
if (!record18(value.transaction) || !sameKeys8(value.transaction, ["id"]) || typeof value.transaction.id !== "string" || !UUID3.test(value.transaction.id) || !record18(value.customer) || !sameKeys8(value.customer, ["email"]) || typeof value.customer.email !== "string" || value.customer.email.length > 254 || !EMAIL4.test(value.customer.email) || !box(value.ocp) || recurring && !box(value.recurring) || !MAKECOMMERCE_FRAME_VERSIONS.includes(value.checkout) || value.tokenizer !== value.checkout || !frameCardValues(value.card) || typeof value.shop_id !== "string" || !UUID3.test(value.shop_id) || !clientData(value.client_data) || typeof value.hostname !== "string" || !HOSTNAME.test(value.hostname) || typeof value.public_key !== "string" || !PUBLISHABLE_KEY.test(value.public_key))
|
|
3529
|
+
return refuse24("makecommerce_body_unsupported");
|
|
3530
|
+
if (value.ocp.requested || recurring && value.recurring.requested)
|
|
3531
|
+
return refuse24("makecommerce_card_saving_refused");
|
|
3532
|
+
return CARD23;
|
|
3533
|
+
}
|
|
3534
|
+
// src/tokenex-iframe.js
|
|
3535
|
+
var TOKENEX_IFRAME_PSP = "tokenex_iframe";
|
|
3536
|
+
var TOKENEX_IFRAME_HOSTS = Object.freeze(["htp.tokenex.com", "test-htp.tokenex.com"]);
|
|
3537
|
+
var TOKENEX_IFRAME_PATH = "/iframe/v3";
|
|
3538
|
+
var TOKENEX_IFRAME_REFUSAL_REASONS = Object.freeze(["unsupported", "brand_mismatch", "unreviewed_account"]);
|
|
3539
|
+
var TOKENEX_IFRAME_BODY_KEYS = Object.freeze([
|
|
3540
|
+
"TokenExID",
|
|
3541
|
+
"Origin",
|
|
3542
|
+
"AuthenticationKey",
|
|
3543
|
+
"Timestamp",
|
|
3544
|
+
"Data",
|
|
3545
|
+
"CvvValue",
|
|
3546
|
+
"TokenScheme",
|
|
3547
|
+
"CvvOnly",
|
|
3548
|
+
"PCI",
|
|
3549
|
+
"ReturnHash",
|
|
3550
|
+
"use3DS",
|
|
3551
|
+
"ThreeDSMethodNotificationUrl",
|
|
3552
|
+
"kountSessionId",
|
|
3553
|
+
"fraudMerchantId",
|
|
3554
|
+
"UseKount",
|
|
3555
|
+
"kountMode",
|
|
3556
|
+
"kountAnId",
|
|
3557
|
+
"FraudServicesRiskRequestModel",
|
|
3558
|
+
"EnforceLuhnCompliance",
|
|
3559
|
+
"CustomDataLuhnCheck"
|
|
3560
|
+
]);
|
|
3561
|
+
var TOKENEX_IFRAME_TOKEN_SCHEMES = Object.freeze(["sixTOKENfour"]);
|
|
3562
|
+
var TOKENEX_IFRAME_REVIEWED_ACCOUNTS = Object.freeze({
|
|
3563
|
+
"htp.tokenex.com": Object.freeze({}),
|
|
3564
|
+
"test-htp.tokenex.com": Object.freeze({})
|
|
3565
|
+
});
|
|
3566
|
+
var TOKENEX_IFRAME_ACCOUNT_NAMES = Object.freeze({
|
|
3567
|
+
"htp.tokenex.com": Object.freeze({}),
|
|
3568
|
+
"test-htp.tokenex.com": Object.freeze({})
|
|
3569
|
+
});
|
|
3570
|
+
var BODY_LIMIT22 = 8192;
|
|
3571
|
+
var URL_LIMIT9 = 2048;
|
|
3572
|
+
var record19 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3573
|
+
var owns5 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
3574
|
+
var exact2 = (pattern, value) => typeof value === "string" && pattern.exec(value)?.[0] === value;
|
|
3575
|
+
var text4 = (value, max) => typeof value === "string" && value.length <= max && !/[\u0000-\u001f\u007f]/.test(value);
|
|
3576
|
+
var digits = (value, min, max) => typeof value === "string" && value.length >= min && value.length <= max && !/[^0-9]/.test(value);
|
|
3577
|
+
var panLike = (value) => (value.match(/\p{Nd}/gu) ?? []).length >= 12;
|
|
3578
|
+
var plain = (value, max) => text4(value, max) && !panLike(value);
|
|
3579
|
+
var TOKENEX_ID = /^[0-9]{16}$/;
|
|
3580
|
+
var AUTHENTICATION_KEY = /^[A-Za-z0-9+/]{43}=$/;
|
|
3581
|
+
var TIMESTAMP = /^20[0-9]{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12][0-9]|3[01])(?:[01][0-9]|2[0-3])[0-5][0-9][0-5][0-9]$/;
|
|
3582
|
+
function isOrigin(value) {
|
|
3583
|
+
if (typeof value !== "string" || value.length > 255 || !value.startsWith("https://"))
|
|
3584
|
+
return false;
|
|
3585
|
+
try {
|
|
3586
|
+
return new URL(value).origin === value;
|
|
3587
|
+
}
|
|
3588
|
+
catch {
|
|
3589
|
+
return false;
|
|
3590
|
+
}
|
|
3591
|
+
}
|
|
3592
|
+
var BOUND = {
|
|
3593
|
+
TokenExID: (value) => exact2(TOKENEX_ID, value),
|
|
3594
|
+
Origin: isOrigin,
|
|
3595
|
+
AuthenticationKey: (value) => exact2(AUTHENTICATION_KEY, value),
|
|
3596
|
+
Timestamp: (value) => exact2(TIMESTAMP, value),
|
|
3597
|
+
TokenScheme: (value) => TOKENEX_IFRAME_TOKEN_SCHEMES.includes(value)
|
|
3598
|
+
};
|
|
3599
|
+
var BOUND_KEYS = Object.keys(BOUND);
|
|
3600
|
+
var BOOLEAN = /^(?:true|false)$/i;
|
|
3601
|
+
var QUERY_RULES = {
|
|
3602
|
+
...BOUND,
|
|
3603
|
+
Mode: (value) => value === "Data",
|
|
3604
|
+
PCI: (value) => exact2(/^true$/i, value),
|
|
3605
|
+
CVV: (value) => exact2(/^true$/i, value),
|
|
3606
|
+
Container: (value) => exact2(/^[A-Za-z][A-Za-z0-9_-]{0,63}$/, value),
|
|
3607
|
+
CvvContainer: (value) => exact2(/^[A-Za-z][A-Za-z0-9_-]{0,63}$/, value),
|
|
3608
|
+
EnforceLuhnCompliance: (value) => exact2(BOOLEAN, value),
|
|
3609
|
+
CustomDataLabel: (value) => plain(value, 64),
|
|
3610
|
+
CustomCvvDataLabel: (value) => plain(value, 64),
|
|
3611
|
+
ExpiresInSeconds: (value) => exact2(/^[1-9][0-9]{0,3}$/, value),
|
|
3612
|
+
ReturnAutoCompleteValues: (value) => exact2(BOOLEAN, value)
|
|
3613
|
+
};
|
|
3614
|
+
var QUERY_REQUIRED = [...BOUND_KEYS, "Mode", "PCI", "CVV"];
|
|
3615
|
+
function readQuery(search) {
|
|
3616
|
+
if (typeof search !== "string" || !search.startsWith("?") || search.length < 2)
|
|
3617
|
+
return null;
|
|
3618
|
+
const query = /* @__PURE__ */ new Map();
|
|
3619
|
+
for (const chunk of search.slice(1).split("&")) {
|
|
3620
|
+
const eq = chunk.indexOf("=");
|
|
3621
|
+
if (eq < 1)
|
|
3622
|
+
return null;
|
|
3623
|
+
let key, value;
|
|
3624
|
+
try {
|
|
3625
|
+
key = decodeURIComponent(chunk.slice(0, eq));
|
|
3626
|
+
value = decodeURIComponent(chunk.slice(eq + 1));
|
|
3627
|
+
}
|
|
3628
|
+
catch {
|
|
3629
|
+
return null;
|
|
3630
|
+
}
|
|
3631
|
+
if (query.has(key) || !owns5(QUERY_RULES, key) || !QUERY_RULES[key](value))
|
|
3632
|
+
return null;
|
|
3633
|
+
query.set(key, value);
|
|
3634
|
+
}
|
|
3635
|
+
return QUERY_REQUIRED.every((key) => query.has(key)) ? query : null;
|
|
3636
|
+
}
|
|
3637
|
+
function tokenexIframeTarget(url) {
|
|
3638
|
+
if (typeof url !== "string" || url.length > URL_LIMIT9 || url.includes("#"))
|
|
3639
|
+
return null;
|
|
3640
|
+
let parsed;
|
|
3641
|
+
try {
|
|
3642
|
+
parsed = new URL(url);
|
|
3643
|
+
}
|
|
3644
|
+
catch {
|
|
3645
|
+
return null;
|
|
3646
|
+
}
|
|
3647
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password)
|
|
3648
|
+
return null;
|
|
3649
|
+
if (!TOKENEX_IFRAME_HOSTS.includes(parsed.hostname) || parsed.pathname !== TOKENEX_IFRAME_PATH)
|
|
3650
|
+
return null;
|
|
3651
|
+
const query = readQuery(parsed.search);
|
|
3652
|
+
return query ? { host: parsed.hostname, query } : null;
|
|
3653
|
+
}
|
|
3654
|
+
var PLACEHOLDER = /^[0-9]{1,19}(?: [0-9]{1,19}){0,5}$/;
|
|
3655
|
+
var placeholderDigits = (value) => exact2(PLACEHOLDER, value) && value.length <= 23 ? value.replace(/ /g, "") : null;
|
|
3656
|
+
var RULES = {
|
|
3657
|
+
...BOUND,
|
|
3658
|
+
Data: (value) => {
|
|
3659
|
+
const pan = placeholderDigits(value);
|
|
3660
|
+
return pan !== null && pan.length >= 13 && pan.length <= 19;
|
|
3661
|
+
},
|
|
3662
|
+
CvvValue: (value) => digits(value, 3, 4),
|
|
3663
|
+
CvvOnly: (value) => value === "False",
|
|
3664
|
+
PCI: (value) => value === "True",
|
|
3665
|
+
ReturnHash: (value) => value === null,
|
|
3666
|
+
use3DS: (value) => value === "False",
|
|
3667
|
+
ThreeDSMethodNotificationUrl: (value) => value === "",
|
|
3668
|
+
kountSessionId: (value) => value === "",
|
|
3669
|
+
fraudMerchantId: (value) => value === "",
|
|
3670
|
+
UseKount: (value) => value === "False",
|
|
3671
|
+
kountMode: (value) => value === "",
|
|
3672
|
+
kountAnId: (value) => value === "",
|
|
3673
|
+
FraudServicesRiskRequestModel: (value) => value === "",
|
|
3674
|
+
EnforceLuhnCompliance: (value) => value === "true" || value === "false",
|
|
3675
|
+
CustomDataLuhnCheck: (value) => value === true
|
|
3676
|
+
};
|
|
3677
|
+
function readJson5(body, limit) {
|
|
3678
|
+
if (typeof body !== "string" || body === "" || body.length > limit)
|
|
3679
|
+
return null;
|
|
3680
|
+
try {
|
|
3681
|
+
const value = JSON.parse(body);
|
|
3682
|
+
return record19(value) ? value : null;
|
|
3683
|
+
}
|
|
3684
|
+
catch {
|
|
3685
|
+
return null;
|
|
3686
|
+
}
|
|
3687
|
+
}
|
|
3688
|
+
function judgeBody4(body) {
|
|
3689
|
+
const value = readJson5(body, BODY_LIMIT22);
|
|
3690
|
+
if (!value || JSON.stringify(value) !== body)
|
|
3691
|
+
return null;
|
|
3692
|
+
const keys = Object.keys(value);
|
|
3693
|
+
if (keys.length !== TOKENEX_IFRAME_BODY_KEYS.length || keys.some((key, index) => key !== TOKENEX_IFRAME_BODY_KEYS[index]))
|
|
3694
|
+
return null;
|
|
3695
|
+
return keys.every((key) => RULES[key](value[key])) ? value : null;
|
|
3696
|
+
}
|
|
3697
|
+
function carriesCard2(body) {
|
|
3698
|
+
const value = readJson5(body, BODY_LIMIT22 * 4);
|
|
3699
|
+
return value !== null && typeof value.Data === "string" && value.Data !== "";
|
|
3700
|
+
}
|
|
3701
|
+
function bindingRefusal(target, value) {
|
|
3702
|
+
return BOUND_KEYS.every((key) => target.query.get(key) === value[key]) ? null : "unsupported";
|
|
3703
|
+
}
|
|
3704
|
+
var TOKENEX_IFRAME_GATE_CODES = Object.freeze(["tokenex_iframe_url_refused", "tokenex_iframe_body_unsupported", "tokenex_iframe_query_mismatch"]);
|
|
3705
|
+
function tokenexIframeBodyVerdict(body, url) {
|
|
3706
|
+
if (!carriesCard2(body))
|
|
3707
|
+
return { verdict: "continue" };
|
|
3708
|
+
const target = url !== void 0 ? tokenexIframeTarget(url) : null;
|
|
3709
|
+
if (url !== void 0 && !target)
|
|
3710
|
+
return { verdict: "refuse", code: "tokenex_iframe_url_refused" };
|
|
3711
|
+
const value = judgeBody4(body);
|
|
3712
|
+
if (!value)
|
|
3713
|
+
return { verdict: "refuse", code: "tokenex_iframe_body_unsupported" };
|
|
3714
|
+
if (target && bindingRefusal(target, value))
|
|
3715
|
+
return { verdict: "refuse", code: "tokenex_iframe_query_mismatch" };
|
|
3716
|
+
return { verdict: "card" };
|
|
3717
|
+
}
|
|
3718
|
+
var SUCCESS_RULES = {
|
|
3719
|
+
token: (value) => digits(value, 13, 19),
|
|
3720
|
+
firstSix: (value) => digits(value, 6, 6),
|
|
3721
|
+
lastFour: (value) => digits(value, 4, 4),
|
|
3722
|
+
referenceNumber: (value) => exact2(/^[A-Za-z0-9-]{1,64}$/, value),
|
|
3723
|
+
tokenHMAC: (value) => exact2(/^[A-Za-z0-9+/]{1,128}={0,2}$/, value),
|
|
3724
|
+
cvvIncluded: (value) => typeof value === "boolean"
|
|
3725
|
+
};
|
|
3726
|
+
var SUCCESS_KEYS = Object.keys(SUCCESS_RULES);
|
|
3727
|
+
// src/openpay.js
|
|
3728
|
+
var OPENPAY_PSP = "openpay_bbva";
|
|
3729
|
+
var OPENPAY_API_HOSTS = /* @__PURE__ */ Object.freeze({
|
|
3730
|
+
"api.openpay.mx": "production",
|
|
3731
|
+
"api.openpay.co": "production",
|
|
3732
|
+
"api.openpay.pe": "production",
|
|
3733
|
+
"sandbox-api.openpay.mx": "sandbox",
|
|
3734
|
+
"sandbox-api.openpay.co": "sandbox",
|
|
3735
|
+
"sandbox-api.openpay.pe": "sandbox"
|
|
3736
|
+
});
|
|
3737
|
+
var OPENPAY_CARD_KEYS = /* @__PURE__ */ Object.freeze(["card_number", "holder_name", "cvv2", "expiration_month", "expiration_year", "address"]);
|
|
3738
|
+
var OPENPAY_ADDRESS_KEYS = /* @__PURE__ */ Object.freeze(["line1", "line2", "line3", "state", "city", "postal_code", "country_code"]);
|
|
3739
|
+
var BODY_LIMIT23 = 4096;
|
|
3740
|
+
var URL_LIMIT10 = 96;
|
|
3741
|
+
var TOKEN_URL = /^https:\/\/((?:sandbox-)?api\.openpay\.(?:mx|co|pe))\/v1\/([a-z0-9]{10,40})\/tokens$/;
|
|
3742
|
+
var NUMBER6 = /^[0-9]{12,19}$/;
|
|
3743
|
+
var SECURITY_CODE14 = /^[0-9]{3,4}$/;
|
|
3744
|
+
var MONTH_TEXT = /^(?:0?[1-9]|1[0-2])$/;
|
|
3745
|
+
var YEAR12 = /^[0-9]{2}$/;
|
|
3746
|
+
var COUNTRY3 = /^[A-Z]{2}$/;
|
|
3747
|
+
var LETTERS2 = "A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u017F";
|
|
3748
|
+
var PAGE_NAME3 = new RegExp(`^[${LETTERS2} .'-]{1,64}$`);
|
|
3749
|
+
var HAS_LETTER2 = new RegExp(`[${LETTERS2}]`);
|
|
3750
|
+
var ADDRESS_VALUE2 = new RegExp(`^[\\x20-\\x7e\\u00a0-\\u017f]{0,128}$`);
|
|
3751
|
+
var PAN_LIKE6 = new RegExp(`(?:[0-9][^0-9${LETTERS2}]*){12,}`);
|
|
3752
|
+
var record20 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3753
|
+
var hasOwn = (object, key) => Object.prototype.hasOwnProperty.call(object, key);
|
|
3754
|
+
var refuse25 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
3755
|
+
var CARD24 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
3756
|
+
function openpayTokenTarget(url) {
|
|
3757
|
+
if (typeof url !== "string" || url.length > URL_LIMIT10)
|
|
3758
|
+
return null;
|
|
3759
|
+
const match = TOKEN_URL.exec(url);
|
|
3760
|
+
if (!match)
|
|
3761
|
+
return null;
|
|
3762
|
+
return Object.freeze({ environment: OPENPAY_API_HOSTS[match[1]], host: match[1], merchantId: match[2] });
|
|
3763
|
+
}
|
|
3764
|
+
function readJson6(body) {
|
|
3765
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT23)
|
|
3766
|
+
return null;
|
|
3767
|
+
try {
|
|
3768
|
+
const value = JSON.parse(body);
|
|
3769
|
+
return record20(value) && JSON.stringify(value) === body ? value : null;
|
|
3770
|
+
}
|
|
3771
|
+
catch {
|
|
3772
|
+
return null;
|
|
3773
|
+
}
|
|
3774
|
+
}
|
|
3775
|
+
var soundMonth = (value) => Number.isInteger(value) && value >= 1 && value <= 12 || typeof value === "string" && MONTH_TEXT.test(value);
|
|
3776
|
+
function soundAddress2(address2) {
|
|
3777
|
+
if (!record20(address2))
|
|
3778
|
+
return false;
|
|
3779
|
+
const keys = Object.keys(address2);
|
|
3780
|
+
return keys.length > 0 && keys.every((key) => OPENPAY_ADDRESS_KEYS.includes(key) && typeof address2[key] === "string" && ADDRESS_VALUE2.test(address2[key]) && !PAN_LIKE6.test(address2[key])) && keys.some((key) => address2[key] !== "") && (!hasOwn(address2, "country_code") || COUNTRY3.test(address2.country_code));
|
|
3781
|
+
}
|
|
3782
|
+
function openpayBodyVerdict(body, url) {
|
|
3783
|
+
if (url !== void 0 && openpayTokenTarget(url) === null)
|
|
3784
|
+
return refuse25("openpay_url_refused");
|
|
3785
|
+
const value = readJson6(body);
|
|
3786
|
+
if (value === null)
|
|
3787
|
+
return refuse25("openpay_body_unsupported");
|
|
3788
|
+
const keys = Object.keys(value);
|
|
3789
|
+
if (!keys.every((key) => OPENPAY_CARD_KEYS.includes(key)) || !["card_number", "holder_name", "cvv2", "expiration_month", "expiration_year"].every((key) => keys.includes(key))) {
|
|
3790
|
+
return refuse25("openpay_body_unsupported");
|
|
3791
|
+
}
|
|
3792
|
+
if (typeof value.card_number !== "string" || !NUMBER6.test(value.card_number) || typeof value.cvv2 !== "string" || !SECURITY_CODE14.test(value.cvv2) || !soundMonth(value.expiration_month) || typeof value.expiration_year !== "string" || !YEAR12.test(value.expiration_year) || typeof value.holder_name !== "string" || !PAGE_NAME3.test(value.holder_name) || !HAS_LETTER2.test(value.holder_name) || keys.includes("address") && !soundAddress2(value.address)) {
|
|
3793
|
+
return refuse25("openpay_body_unsupported");
|
|
3794
|
+
}
|
|
3795
|
+
return CARD24;
|
|
3796
|
+
}
|
|
3797
|
+
var pin8 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), publicKeys: Object.freeze([...fields.publicKeys]) });
|
|
3798
|
+
var OPENPAY_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
3799
|
+
pin8({
|
|
3800
|
+
id: "diario_de_yucatan",
|
|
3801
|
+
merchant: "Diario de Yucatán",
|
|
3802
|
+
origins: ["https://www.yucatan.com.mx"],
|
|
3803
|
+
host: "api.openpay.mx",
|
|
3804
|
+
merchantId: "mqyloyrm8tsvtsgcrj0d",
|
|
3805
|
+
publicKeys: ["pk_260aa43616a445bb98472e6ca51da968"]
|
|
3806
|
+
})
|
|
3807
|
+
]);
|
|
3808
|
+
// src/poynt.js
|
|
3809
|
+
var POYNT_PSP = "poynt";
|
|
3810
|
+
var UUID4 = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
|
|
3811
|
+
var NONCE_URL = new RegExp(`^https://services\\.poynt\\.net/v1/commerce/stores/(${UUID4})/payment-tokens/generate-nonce$`);
|
|
3812
|
+
var STORE_ID = new RegExp(`^${UUID4}$`);
|
|
3813
|
+
var BODY_LIMIT24 = 8192;
|
|
3814
|
+
var ROOT_KEYS8 = /* @__PURE__ */ Object.freeze(["applicationId", "channelId", "card", "verificationData"]);
|
|
3815
|
+
var CARD_KEYS10 = /* @__PURE__ */ Object.freeze(["number", "expirationMonth", "expirationYear", "type", "cardHolderFirstName", "cardHolderLastName", "cardHolderFullName"]);
|
|
3816
|
+
var ADDRESS_KEYS4 = /* @__PURE__ */ Object.freeze(["postalCode", "line1", "line2", "city", "territory", "countryCode", "postalCodeExtension"]);
|
|
3817
|
+
var REQUIRED_ROOT = /* @__PURE__ */ Object.freeze(["applicationId", "card", "verificationData"]);
|
|
3818
|
+
var REQUIRED_CARD = /* @__PURE__ */ Object.freeze(["number", "expirationMonth", "expirationYear", "type", "cardHolderFullName"]);
|
|
3819
|
+
var CARD_ON_FILE_KEYS = /* @__PURE__ */ Object.freeze(["saveFinancialInstrumentOnFile", "financialInstrumentAgreement"]);
|
|
3820
|
+
var CARD_TYPES = /* @__PURE__ */ Object.freeze(["VISA", "MASTERCARD", "AMERICAN_EXPRESS", "DINERS_CLUB", "DISCOVER", "JCB", "UNIONPAY", "MAESTRO", "ELO", "HIPERCARD", "TROY", ""]);
|
|
3821
|
+
var CARD_NUMBER12 = /^[0-9]{12,19}$/;
|
|
3822
|
+
var MONTH12 = /^(?:0[1-9]|1[0-2])$/;
|
|
3823
|
+
var YEAR13 = /^20[0-9]{2}$/;
|
|
3824
|
+
var SECURITY_CODE15 = /^[0-9]{3,4}$/;
|
|
3825
|
+
var IDENTIFIER = /^[A-Za-z0-9:._-]{1,128}$/;
|
|
3826
|
+
var APPLICATION_ID = new RegExp(`^urn:aid:${UUID4}$`);
|
|
3827
|
+
var POSTAL_CODE3 = /^[A-Za-z0-9_]{0,16}$/;
|
|
3828
|
+
var COUNTRY4 = /^[A-Z]{2}$/;
|
|
3829
|
+
var TEXT_LIMIT7 = 256;
|
|
3830
|
+
var CONTROL10 = /[\u0000-\u001f\u007f]/;
|
|
3831
|
+
var cardLike2 = (text9) => (text9.match(/[0-9]/g) ?? []).length >= 12;
|
|
3832
|
+
var text5 = (value) => typeof value === "string" && value.length <= TEXT_LIMIT7 && !CONTROL10.test(value) && !cardLike2(value);
|
|
3833
|
+
var record21 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3834
|
+
var own5 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
3835
|
+
var inOrder4 = (value, order, required) => {
|
|
3836
|
+
const keys = Object.keys(value);
|
|
3837
|
+
let at = -1;
|
|
3838
|
+
for (const key of keys) {
|
|
3839
|
+
const next = order.indexOf(key);
|
|
3840
|
+
if (next <= at)
|
|
3841
|
+
return false;
|
|
3842
|
+
at = next;
|
|
3843
|
+
}
|
|
3844
|
+
return required.every((key) => keys.includes(key));
|
|
3845
|
+
};
|
|
3846
|
+
var refuse26 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
3847
|
+
var CARD25 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
3848
|
+
function poyntStoreId(url) {
|
|
3849
|
+
const match = typeof url === "string" ? NONCE_URL.exec(url) : null;
|
|
3850
|
+
return match ? match[1] : null;
|
|
3851
|
+
}
|
|
3852
|
+
function isPoyntNonceUrl(url) {
|
|
3853
|
+
return poyntStoreId(url) !== null;
|
|
3854
|
+
}
|
|
3855
|
+
function readBody14(body) {
|
|
3856
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT24)
|
|
3857
|
+
return null;
|
|
3858
|
+
let value;
|
|
3859
|
+
try {
|
|
3860
|
+
value = JSON.parse(body);
|
|
3861
|
+
if (!record21(value) || JSON.stringify(value) !== body)
|
|
3862
|
+
return null;
|
|
3863
|
+
}
|
|
3864
|
+
catch {
|
|
3865
|
+
return null;
|
|
3866
|
+
}
|
|
3867
|
+
return value;
|
|
3868
|
+
}
|
|
3869
|
+
function poyntBodyVerdict(body) {
|
|
3870
|
+
const value = readBody14(body);
|
|
3871
|
+
if (value === null)
|
|
3872
|
+
return refuse26("poynt_body_unsupported");
|
|
3873
|
+
if (CARD_ON_FILE_KEYS.some((key) => own5(value, key)))
|
|
3874
|
+
return refuse26("poynt_card_on_file");
|
|
3875
|
+
if (!inOrder4(value, ROOT_KEYS8, REQUIRED_ROOT) || typeof value.applicationId !== "string" || !APPLICATION_ID.test(value.applicationId) || own5(value, "channelId") && (typeof value.channelId !== "string" || !IDENTIFIER.test(value.channelId))) {
|
|
3876
|
+
return refuse26("poynt_body_unsupported");
|
|
3877
|
+
}
|
|
3878
|
+
const { card, verificationData: verification } = value;
|
|
3879
|
+
if (!record21(card) || !inOrder4(card, CARD_KEYS10, REQUIRED_CARD) || typeof card.number !== "string" || !CARD_NUMBER12.test(card.number) || typeof card.expirationMonth !== "string" || !MONTH12.test(card.expirationMonth) || typeof card.expirationYear !== "string" || !YEAR13.test(card.expirationYear) || !CARD_TYPES.includes(card.type) || !["cardHolderFirstName", "cardHolderLastName", "cardHolderFullName"].every((key) => !own5(card, key) || text5(card[key]))) {
|
|
3880
|
+
return refuse26("poynt_body_unsupported");
|
|
3881
|
+
}
|
|
3882
|
+
if (!record21(verification) || Object.keys(verification).join() !== "cardHolderBillingAddress,cvData" || typeof verification.cvData !== "string" || !SECURITY_CODE15.test(verification.cvData))
|
|
3883
|
+
return refuse26("poynt_body_unsupported");
|
|
3884
|
+
const address2 = verification.cardHolderBillingAddress;
|
|
3885
|
+
if (!record21(address2) || !inOrder4(address2, ADDRESS_KEYS4, []) || !Object.values(address2).every(text5) || own5(address2, "postalCode") && !POSTAL_CODE3.test(address2.postalCode) || own5(address2, "postalCodeExtension") && !POSTAL_CODE3.test(address2.postalCodeExtension) || own5(address2, "countryCode") && !COUNTRY4.test(address2.countryCode))
|
|
3886
|
+
return refuse26("poynt_body_unsupported");
|
|
3887
|
+
return CARD25;
|
|
3888
|
+
}
|
|
3889
|
+
var pin9 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), storeIds: Object.freeze([...fields.storeIds]) });
|
|
3890
|
+
var POYNT_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
3891
|
+
pin9({
|
|
3892
|
+
id: "yearning_for_learning",
|
|
3893
|
+
merchant: "Yearning for Learning Publishing & Coaching",
|
|
3894
|
+
origins: ["https://ff305485-ba6c-423a-87b0-cebe3f83ffe9.mysimplestore.com"],
|
|
3895
|
+
storeIds: ["71ac12ed-e61f-4318-95db-db0e7c649d6f"]
|
|
3896
|
+
}),
|
|
3897
|
+
pin9({
|
|
3898
|
+
id: "timber_ridge_bookkeeping",
|
|
3899
|
+
merchant: "Timber Ridge Bookkeeping",
|
|
3900
|
+
origins: ["https://d7d64ac3-0352-4e53-af9a-f6d8e7b5fb71.mysimplestore.com"],
|
|
3901
|
+
storeIds: ["27be984a-0a03-4a54-8675-e64bbbe1c43e"]
|
|
3902
|
+
})
|
|
3903
|
+
]);
|
|
3904
|
+
var MAX_ANSWER_CHARS = 16 * 1024;
|
|
3905
|
+
// src/cardcom.js
|
|
3906
|
+
var CARDCOM_PSP = "cardcom";
|
|
3907
|
+
var CARDCOM_HOST = "secure.cardcom.solutions";
|
|
3908
|
+
var CARDCOM_ORIGIN = "https://secure.cardcom.solutions";
|
|
3909
|
+
var CARDCOM_SUBMIT_PATH = "/api/EA5/SubmitPayment";
|
|
3910
|
+
var CARDCOM_CURRENCIES = /* @__PURE__ */ Object.freeze({ 1: "ils", 826: "gbp", 840: "usd", 978: "eur" });
|
|
3911
|
+
var BODY_LIMIT25 = 65536;
|
|
3912
|
+
var TOP_KEYS2 = /* @__PURE__ */ Object.freeze(["GoogleToken", "UserAgent", "NumberOfTries", "GooglePayToken", "Store", "_3DSecureReq", "HooxReference"]);
|
|
3913
|
+
var STORE_KEYS = /* @__PURE__ */ Object.freeze([
|
|
3914
|
+
"CommonStore",
|
|
3915
|
+
"CompanyInfoStore",
|
|
3916
|
+
"ProductsStore",
|
|
3917
|
+
"DeliveryStore",
|
|
3918
|
+
"DocumentStore",
|
|
3919
|
+
"DetailsStore",
|
|
3920
|
+
"PaymentStore"
|
|
3921
|
+
]);
|
|
3922
|
+
var THREE_DS_KEYS = /* @__PURE__ */ Object.freeze([
|
|
3923
|
+
"TerminalNum",
|
|
3924
|
+
"CoinId",
|
|
3925
|
+
"CardNumber",
|
|
3926
|
+
"CardholderFullName",
|
|
3927
|
+
"CardholderPhone",
|
|
3928
|
+
"CardHolderEmail",
|
|
3929
|
+
"CVV",
|
|
3930
|
+
"CardExpireMonth",
|
|
3931
|
+
"CardExpireYear",
|
|
3932
|
+
"RequestedBillingAmount",
|
|
3933
|
+
"UserAgentHeader",
|
|
3934
|
+
"browserLanguage",
|
|
3935
|
+
"_3ds_browserjavaenabled",
|
|
3936
|
+
"_3ds_browserscreenheight",
|
|
3937
|
+
"_3ds_browserscreenwidth",
|
|
3938
|
+
"_3ds_browsercolordepth",
|
|
3939
|
+
"_3ds_challengewindowsize",
|
|
3940
|
+
"_3ds_channel",
|
|
3941
|
+
"_3ds_category",
|
|
3942
|
+
"_3ds_transtype",
|
|
3943
|
+
"ExternalAisurit4DealPageUID",
|
|
3944
|
+
"DealToSaveJSON",
|
|
3945
|
+
"GooglePayToken",
|
|
3946
|
+
"DirectDebitSplitPaymentsSum",
|
|
3947
|
+
"SapakMutav"
|
|
3948
|
+
]);
|
|
3949
|
+
var COMMON_KEYS = /* @__PURE__ */ Object.freeze([
|
|
3950
|
+
"Uid",
|
|
3951
|
+
"OldUid",
|
|
3952
|
+
"TerminalNumber",
|
|
3953
|
+
"TerminalType",
|
|
3954
|
+
"StoreInitialized",
|
|
3955
|
+
"SuccessRedirectUrl",
|
|
3956
|
+
"ErrorRedirectUrl",
|
|
3957
|
+
"BackgroundImageUrl",
|
|
3958
|
+
"AdditionalDataJson",
|
|
3959
|
+
"Language",
|
|
3960
|
+
"UniqTempDealID",
|
|
3961
|
+
"IsError",
|
|
3962
|
+
"ErrorCode",
|
|
3963
|
+
"ErrorMessage",
|
|
3964
|
+
"OpeningText",
|
|
3965
|
+
"IsEA5SinglePage",
|
|
3966
|
+
"CurrentCardcomBitIntervalId",
|
|
3967
|
+
"SapakMutav",
|
|
3968
|
+
"ShowCookiesBanner",
|
|
3969
|
+
"HideFooter",
|
|
3970
|
+
"LPVersion"
|
|
3971
|
+
]);
|
|
3972
|
+
var COMPANY_KEYS = /* @__PURE__ */ Object.freeze([
|
|
3973
|
+
"CompanyNumber",
|
|
3974
|
+
"Name",
|
|
3975
|
+
"Address1",
|
|
3976
|
+
"Address2",
|
|
3977
|
+
"Address3",
|
|
3978
|
+
"Tel",
|
|
3979
|
+
"Email",
|
|
3980
|
+
"LogoURL",
|
|
3981
|
+
"LogoAlt",
|
|
3982
|
+
"YoutubeLink",
|
|
3983
|
+
"InstagramLink",
|
|
3984
|
+
"FacebookLink",
|
|
3985
|
+
"WhatsappLink",
|
|
3986
|
+
"Comments",
|
|
3987
|
+
"ShowGPayLogo",
|
|
3988
|
+
"ShowMasterCardLogo",
|
|
3989
|
+
"ShowVisaLogo",
|
|
3990
|
+
"ShowAmexLogo",
|
|
3991
|
+
"ShowDinersLogo",
|
|
3992
|
+
"ShowIsracardLogo",
|
|
3993
|
+
"MetaTitle",
|
|
3994
|
+
"MetaDescription",
|
|
3995
|
+
"MetaImage"
|
|
3996
|
+
]);
|
|
3997
|
+
var DELIVERY_KEYS = /* @__PURE__ */ Object.freeze([
|
|
3998
|
+
"ShowDeliveryForm",
|
|
3999
|
+
"DeliveryMethodField",
|
|
4000
|
+
"CityField",
|
|
4001
|
+
"StreetField",
|
|
4002
|
+
"BuildingNumberField",
|
|
4003
|
+
"ApartmentNumberField",
|
|
4004
|
+
"FloorField",
|
|
4005
|
+
"EntranceField",
|
|
4006
|
+
"DeliveryNotesField",
|
|
4007
|
+
"Cities",
|
|
4008
|
+
"Streets"
|
|
4009
|
+
]);
|
|
4010
|
+
var DOCUMENT_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4011
|
+
"ShowInvoiceForm",
|
|
4012
|
+
"Comments",
|
|
4013
|
+
"Title",
|
|
4014
|
+
"NameField",
|
|
4015
|
+
"IdField",
|
|
4016
|
+
"MobileField",
|
|
4017
|
+
"AdditionalPhoneField",
|
|
4018
|
+
"EmailField",
|
|
4019
|
+
"EmailConfirmField",
|
|
4020
|
+
"CityField",
|
|
4021
|
+
"StreetField",
|
|
4022
|
+
"ZipcodeField",
|
|
4023
|
+
"SendPreBuyDataToServer",
|
|
4024
|
+
"DocTypeToCreate"
|
|
4025
|
+
]);
|
|
4026
|
+
var DETAILS_KEYS = /* @__PURE__ */ Object.freeze(["ShowDetailsForm", "ShowCancelBtn", "CancelUrl", "Comments", "FormFields"]);
|
|
4027
|
+
var PAYMENT_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4028
|
+
"Comments",
|
|
4029
|
+
"ButtonText",
|
|
4030
|
+
"ButtonTextZeroSum",
|
|
4031
|
+
"HideCreditCardFieldsOnZeroSum",
|
|
4032
|
+
"EmailField",
|
|
4033
|
+
"MobileField",
|
|
4034
|
+
"CardNumberField",
|
|
4035
|
+
"YearsField",
|
|
4036
|
+
"MonthsField",
|
|
4037
|
+
"CvvField",
|
|
4038
|
+
"CardOwnerNameField",
|
|
4039
|
+
"CardTZField",
|
|
4040
|
+
"PaymentsField",
|
|
4041
|
+
"OpenSumField",
|
|
4042
|
+
"CardOwnerCityField",
|
|
4043
|
+
"CardOwnerAddressField",
|
|
4044
|
+
"CardOwnerZipcodeField",
|
|
4045
|
+
"ApprovedTermsAndConditions",
|
|
4046
|
+
"ShowTermsAndConditions",
|
|
4047
|
+
"TermsAndConditionsUrl",
|
|
4048
|
+
"AllowMerchantMessages",
|
|
4049
|
+
"MustAllowMerchantMessages",
|
|
4050
|
+
"ShowMerchantMessages",
|
|
4051
|
+
"ShowPayPal",
|
|
4052
|
+
"ShowUpayBitButton",
|
|
4053
|
+
"ShowPayMeBitButton",
|
|
4054
|
+
"ShowCardcomBitButton",
|
|
4055
|
+
"ShowApplePay",
|
|
4056
|
+
"MerchantApplePayLogoUrl",
|
|
4057
|
+
"ShowGooglePay",
|
|
4058
|
+
"ShowRecaptcha",
|
|
4059
|
+
"RecaptchaVersion",
|
|
4060
|
+
"IsCredit",
|
|
4061
|
+
"NumOfRetriesAllowed",
|
|
4062
|
+
"Commissions",
|
|
4063
|
+
"Is3DSecureEnabled",
|
|
4064
|
+
"Was3DSActiveOnPageLoad",
|
|
4065
|
+
"ThreeDSecureTransactionId",
|
|
4066
|
+
"ShowSuccessPopup",
|
|
4067
|
+
"ShowErrorPopup",
|
|
4068
|
+
"DonationType",
|
|
4069
|
+
"ThreeDSecureCavv",
|
|
4070
|
+
"GoogleCardNumber",
|
|
4071
|
+
"GoogleExpirationYear",
|
|
4072
|
+
"GoogleExpirationMonth",
|
|
4073
|
+
"CanSkipAuthentication",
|
|
4074
|
+
"CartTitle",
|
|
4075
|
+
"IsDirectDebit",
|
|
4076
|
+
"EnableHooxOffers",
|
|
4077
|
+
"HooxID",
|
|
4078
|
+
"SupportedCardBrands",
|
|
4079
|
+
"IsDirectDebitSplitPayments",
|
|
4080
|
+
"ApplePayApplicationData",
|
|
4081
|
+
"ShowPaymentButton",
|
|
4082
|
+
"OrderSummeryTitle",
|
|
4083
|
+
"AllowBitEmptyCardOwnerName",
|
|
4084
|
+
"IsCreateToken",
|
|
4085
|
+
"TurnstileSiteKey",
|
|
4086
|
+
"PrivacyPolicyUrl",
|
|
4087
|
+
"DualCardsBINs",
|
|
4088
|
+
"IsHideCart",
|
|
4089
|
+
"IsJ5"
|
|
4090
|
+
]);
|
|
4091
|
+
var FIELD_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4092
|
+
"Ref",
|
|
4093
|
+
"Id",
|
|
4094
|
+
"Order",
|
|
4095
|
+
"InputType",
|
|
4096
|
+
"Required",
|
|
4097
|
+
"PreventPaste",
|
|
4098
|
+
"Show",
|
|
4099
|
+
"Data",
|
|
4100
|
+
"Value",
|
|
4101
|
+
"Direction",
|
|
4102
|
+
"Disabled"
|
|
4103
|
+
]);
|
|
4104
|
+
var PRODUCT_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4105
|
+
"MinQuantity",
|
|
4106
|
+
"MaxQuantity",
|
|
4107
|
+
"JumpsInQuantity",
|
|
4108
|
+
"SelectedBuyQuantity",
|
|
4109
|
+
"QuantityOptions",
|
|
4110
|
+
"Comments",
|
|
4111
|
+
"IsManualSum",
|
|
4112
|
+
"PaymentsOptions",
|
|
4113
|
+
"IsCouponActive",
|
|
4114
|
+
"ManualPrice",
|
|
4115
|
+
"ManualPriceTxt",
|
|
4116
|
+
"IsVatFree",
|
|
4117
|
+
"SpecialPrices",
|
|
4118
|
+
"PreConfiguredPrice",
|
|
4119
|
+
"IsPreSelected",
|
|
4120
|
+
"CurrentInventory",
|
|
4121
|
+
"CheckInventory",
|
|
4122
|
+
"uid",
|
|
4123
|
+
"imageUrl",
|
|
4124
|
+
"name",
|
|
4125
|
+
"description",
|
|
4126
|
+
"BasePrice",
|
|
4127
|
+
"PriceBeforeDiscount",
|
|
4128
|
+
"BaseISOCurrency",
|
|
4129
|
+
"PriceToShow",
|
|
4130
|
+
"PriceBeforeDiscountToShow",
|
|
4131
|
+
"IsCurrent"
|
|
4132
|
+
]);
|
|
4133
|
+
var CURRENCY_KEYS = /* @__PURE__ */ Object.freeze(["Code", "AlphabeticCode", "ValueToNis", "NameHeb", "NameEn", "CoinSing"]);
|
|
4134
|
+
var NO_COUPON = '{"IsActivatedByUser":false,"IsActive":false,"CouponCode":"","IsValid":false,"DiscountType":0,"DiscountValue":0,"CouponType":1}';
|
|
4135
|
+
var FRESH_MANUAL_SUM = '{"Ref":"","Id":0,"Order":0,"InputType":0,"Required":false,"PreventPaste":false,"Show":true,"Data":{"Label":"","validators":[],"SelectList":[]},"Value":"","Direction":0,"Disabled":false}';
|
|
4136
|
+
var DONATION = /* @__PURE__ */ Object.freeze({ none: 0, monthly: 1, multiple: 2, single: 3 });
|
|
4137
|
+
var PAGE_ID = /^[A-Za-z0-9_-]{16,32}$/;
|
|
4138
|
+
var DEAL_ID = /^[0-9a-z]{6,40}$/;
|
|
4139
|
+
var PRODUCT_ID = /^[A-Za-z0-9_-]{8,64}$/;
|
|
4140
|
+
var TOKEN3 = /^[A-Za-z0-9_.:+/=-]{1,8192}$/;
|
|
4141
|
+
var SCREEN = /^[0-9]{1,5}$/;
|
|
4142
|
+
var LANGUAGE2 = /^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{1,8}){0,3}$/;
|
|
4143
|
+
var CARD_NUMBER13 = /^[0-9]{12,19}$/;
|
|
4144
|
+
var MONTH13 = /^(?:[1-9]|1[0-2])$/;
|
|
4145
|
+
var YEAR14 = /^20[0-9]{2}$/;
|
|
4146
|
+
var CODE5 = /^[0-9]{3,4}$/;
|
|
4147
|
+
var TEXT_LIMIT8 = 256;
|
|
4148
|
+
var LONG_TEXT_LIMIT = BODY_LIMIT25;
|
|
4149
|
+
var record22 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4150
|
+
var owns6 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4151
|
+
var sameKeys9 = (value, keys) => {
|
|
4152
|
+
const own10 = Object.keys(value);
|
|
4153
|
+
return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
|
|
4154
|
+
};
|
|
4155
|
+
var exact3 = (pattern, value) => typeof value === "string" && pattern.test(value);
|
|
4156
|
+
var printable3 = (text9) => [...text9].every((character) => {
|
|
4157
|
+
const point = character.codePointAt(0);
|
|
4158
|
+
return point >= 32 && !(point >= 127 && point <= 159) && point !== 8232 && point !== 8233;
|
|
4159
|
+
});
|
|
4160
|
+
var text6 = (value, limit = TEXT_LIMIT8) => typeof value === "string" && value.length <= limit && printable3(value);
|
|
4161
|
+
var pageText = (value, limit = LONG_TEXT_LIMIT) => value === null || typeof value === "string" && value.length <= limit;
|
|
4162
|
+
var whole = (value, min = 0, max = Number.MAX_SAFE_INTEGER) => Number.isSafeInteger(value) && value >= min && value <= max;
|
|
4163
|
+
var flag = (value) => typeof value === "boolean";
|
|
4164
|
+
var optionalFlag = (value) => value === null || flag(value);
|
|
4165
|
+
var refuse27 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4166
|
+
var CARD26 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
4167
|
+
function luhn5(digits4) {
|
|
4168
|
+
let sum = 0;
|
|
4169
|
+
for (let at = 0; at < digits4.length; at += 1) {
|
|
4170
|
+
let digit = Number(digits4[digits4.length - 1 - at]);
|
|
4171
|
+
if (at % 2 === 1) {
|
|
4172
|
+
digit *= 2;
|
|
4173
|
+
if (digit > 9)
|
|
4174
|
+
digit -= 9;
|
|
4175
|
+
}
|
|
4176
|
+
sum += digit;
|
|
4177
|
+
}
|
|
4178
|
+
return sum % 10 === 0;
|
|
4179
|
+
}
|
|
4180
|
+
function cents(value) {
|
|
4181
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0 || value > 1e7)
|
|
4182
|
+
return null;
|
|
4183
|
+
const minor = Math.round(value * 100);
|
|
4184
|
+
return Math.abs(minor - value * 100) < 1e-6 ? minor : null;
|
|
4185
|
+
}
|
|
4186
|
+
function isCardcomSubmitUrl(url) {
|
|
4187
|
+
if (typeof url !== "string" || url.length > 256 || url.includes("?") || url.includes("#"))
|
|
4188
|
+
return false;
|
|
4189
|
+
let parsed;
|
|
4190
|
+
try {
|
|
4191
|
+
parsed = new URL(url);
|
|
4192
|
+
}
|
|
4193
|
+
catch {
|
|
4194
|
+
return false;
|
|
4195
|
+
}
|
|
4196
|
+
return parsed.href === url && parsed.protocol === "https:" && !parsed.port && !parsed.username && !parsed.password && !parsed.search && !parsed.hash && parsed.hostname === CARDCOM_HOST && parsed.pathname === CARDCOM_SUBMIT_PATH;
|
|
4197
|
+
}
|
|
4198
|
+
function readBody15(body) {
|
|
4199
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT25)
|
|
4200
|
+
return null;
|
|
4201
|
+
let value;
|
|
4202
|
+
try {
|
|
4203
|
+
value = JSON.parse(body);
|
|
4204
|
+
if (!record22(value) || JSON.stringify(value) !== body)
|
|
4205
|
+
return null;
|
|
4206
|
+
}
|
|
4207
|
+
catch {
|
|
4208
|
+
return null;
|
|
4209
|
+
}
|
|
4210
|
+
return value;
|
|
4211
|
+
}
|
|
4212
|
+
function field(value) {
|
|
4213
|
+
return record22(value) && sameKeys9(value, FIELD_KEYS) && text6(value.Ref, 64) && whole(value.Id) && whole(value.Order) && whole(value.InputType) && flag(value.Required) && flag(value.PreventPaste) && flag(value.Show) && record22(value.Data) && typeof value.Value === "string" && value.Value.length <= 4096 && whole(value.Direction) && flag(value.Disabled);
|
|
4214
|
+
}
|
|
4215
|
+
var optionalField = (value) => value === null || field(value);
|
|
4216
|
+
function selectValues(value) {
|
|
4217
|
+
const list = field(value) ? value.Data.SelectList : null;
|
|
4218
|
+
if (!Array.isArray(list) || list.length === 0)
|
|
4219
|
+
return null;
|
|
4220
|
+
return list.map((option) => record22(option) && typeof option.value === "string" ? option.value : null);
|
|
4221
|
+
}
|
|
4222
|
+
function commonStore(value) {
|
|
4223
|
+
return record22(value) && sameKeys9(value, COMMON_KEYS) && exact3(PAGE_ID, value.Uid) && (value.OldUid === null || value.OldUid === "" || value.OldUid === value.Uid) && whole(value.TerminalNumber, 1, 99999999) && whole(value.TerminalType) && value.StoreInitialized === true && pageText(value.SuccessRedirectUrl) && pageText(value.ErrorRedirectUrl) && pageText(value.BackgroundImageUrl) && pageText(value.AdditionalDataJson) && exact3(LANGUAGE2, value.Language) && exact3(DEAL_ID, value.UniqTempDealID) && value.IsError === false && value.ErrorCode === 0 && value.ErrorMessage === "" && value.OpeningText === "" && flag(value.IsEA5SinglePage) && whole(value.CurrentCardcomBitIntervalId) && value.SapakMutav === "" && flag(value.ShowCookiesBanner) && flag(value.HideFooter) && value.LPVersion === 0;
|
|
4224
|
+
}
|
|
4225
|
+
function companyStore(value) {
|
|
4226
|
+
return record22(value) && sameKeys9(value, COMPANY_KEYS) && whole(value.CompanyNumber, 1) && COMPANY_KEYS.slice(1).every((key) => key.startsWith("Show") ? flag(value[key]) : pageText(value[key]));
|
|
4227
|
+
}
|
|
4228
|
+
var SUM_TEXT = /^(?:0*[1-9][0-9]*(?:\.[0-9]+)?|0+\.[0-9]*[1-9][0-9]*)$/;
|
|
4229
|
+
var sumText = (text9, sum) => text9 === null || typeof text9 === "string" && SUM_TEXT.test(text9) && Number.parseFloat(text9) === sum;
|
|
4230
|
+
function chosenProduct(value) {
|
|
4231
|
+
return record22(value) && sameKeys9(value, PRODUCT_KEYS) && whole(value.MinQuantity) && whole(value.MaxQuantity) && whole(value.JumpsInQuantity) && value.SelectedBuyQuantity === 1 && Array.isArray(value.QuantityOptions) && value.QuantityOptions.length === 0 && pageText(value.Comments) && flag(value.IsManualSum) && Array.isArray(value.PaymentsOptions) && flag(value.IsCouponActive) && typeof value.ManualPrice === "number" && sumText(value.ManualPriceTxt, value.ManualPrice) && flag(value.IsVatFree) && Array.isArray(value.SpecialPrices) && (value.PreConfiguredPrice === null || typeof value.PreConfiguredPrice === "number") && flag(value.IsPreSelected) && typeof value.CurrentInventory === "number" && flag(value.CheckInventory) && exact3(PRODUCT_ID, value.uid) && pageText(value.imageUrl) && typeof value.name === "string" && pageText(value.name) && pageText(value.description) && typeof value.BasePrice === "number" && typeof value.PriceBeforeDiscount === "number" && whole(value.BaseISOCurrency) && typeof value.PriceToShow === "number" && typeof value.PriceBeforeDiscountToShow === "number" && flag(value.IsCurrent);
|
|
4232
|
+
}
|
|
4233
|
+
var DAY_RATES = /* @__PURE__ */ Object.freeze({ 1: 1, 826: 4.1194, 840: 3.089, 978: 3.4769 });
|
|
4234
|
+
var dayRate = (code, rate) => typeof rate === "number" && Number.isFinite(rate) && (code === 1 ? rate === 1 : rate >= DAY_RATES[code] * 0.75 && rate <= DAY_RATES[code] * 1.25);
|
|
4235
|
+
function chargedCurrency(value) {
|
|
4236
|
+
return record22(value) && sameKeys9(value, CURRENCY_KEYS) && whole(value.Code) && owns6(CARDCOM_CURRENCIES, value.Code) && value.AlphabeticCode === CARDCOM_CURRENCIES[value.Code].toUpperCase() && dayRate(value.Code, value.ValueToNis) && pageText(value.NameHeb) && pageText(value.NameEn) && pageText(value.CoinSing);
|
|
4237
|
+
}
|
|
4238
|
+
function freshProductsStore(products) {
|
|
4239
|
+
return {
|
|
4240
|
+
Title: "",
|
|
4241
|
+
isDonation: false,
|
|
4242
|
+
showCurrencyConvert: false,
|
|
4243
|
+
currencies: [],
|
|
4244
|
+
selectedCurrency: products.selectedCurrency,
|
|
4245
|
+
coupon: products.coupon,
|
|
4246
|
+
couponCalculatedDiscount: 0,
|
|
4247
|
+
CurrentCouponCode: "",
|
|
4248
|
+
products: products.products,
|
|
4249
|
+
deliveryMethods: products.deliveryMethods,
|
|
4250
|
+
haveImages: false,
|
|
4251
|
+
isCouponActive: false,
|
|
4252
|
+
ShowProductPrice: false,
|
|
4253
|
+
ShowTotalPrice: false,
|
|
4254
|
+
ItemsDisplayType: 0,
|
|
4255
|
+
ManualSumField: JSON.parse(FRESH_MANUAL_SUM),
|
|
4256
|
+
ShowVatInfo: false,
|
|
4257
|
+
Vat: 0,
|
|
4258
|
+
TotalPriceNotRequireVat: 0,
|
|
4259
|
+
TotalPriceRequireVat: 0,
|
|
4260
|
+
TotalVat: 0,
|
|
4261
|
+
DiscountSum: 0,
|
|
4262
|
+
ShowDonationAmountsButtons: false,
|
|
4263
|
+
DonationDescription: ""
|
|
4264
|
+
};
|
|
4265
|
+
}
|
|
4266
|
+
function productsStore(value) {
|
|
4267
|
+
if (!record22(value) || !Array.isArray(value.products) || value.products.length !== 1 || !chosenProduct(value.products[0]) || !chargedCurrency(value.selectedCurrency) || !Array.isArray(value.deliveryMethods) || !value.deliveryMethods.every((method) => record22(method) && method.IsCurrent === false && typeof method.PriceToShow === "number") || JSON.stringify(value.coupon) !== NO_COUPON)
|
|
4268
|
+
return false;
|
|
4269
|
+
return JSON.stringify(freshProductsStore(value)) === JSON.stringify(value);
|
|
4270
|
+
}
|
|
4271
|
+
function deliveryStore(value) {
|
|
4272
|
+
return record22(value) && sameKeys9(value, DELIVERY_KEYS) && flag(value.ShowDeliveryForm) && DELIVERY_KEYS.slice(1, 9).every((key) => optionalField(value[key])) && Array.isArray(value.Cities) && value.Cities.length === 0 && Array.isArray(value.Streets) && value.Streets.length === 0;
|
|
4273
|
+
}
|
|
4274
|
+
function documentStore(value) {
|
|
4275
|
+
return record22(value) && sameKeys9(value, DOCUMENT_KEYS) && flag(value.ShowInvoiceForm) && pageText(value.Comments) && pageText(value.Title) && DOCUMENT_KEYS.slice(3, 12).every((key) => optionalField(value[key])) && flag(value.SendPreBuyDataToServer) && whole(value.DocTypeToCreate);
|
|
4276
|
+
}
|
|
4277
|
+
function detailsStore(value) {
|
|
4278
|
+
return record22(value) && sameKeys9(value, DETAILS_KEYS) && flag(value.ShowDetailsForm) && value.ShowCancelBtn === false && value.CancelUrl === "" && pageText(value.Comments) && Array.isArray(value.FormFields) && value.FormFields.every(field);
|
|
4279
|
+
}
|
|
4280
|
+
function pageCard(payment) {
|
|
4281
|
+
const number = payment.CardNumberField.Value;
|
|
4282
|
+
const years = selectValues(payment.YearsField);
|
|
4283
|
+
return CARD_NUMBER13.test(number) && luhn5(number) && MONTH13.test(payment.MonthsField.Value) && YEAR14.test(payment.YearsField.Value) && (years === null || years.includes(payment.YearsField.Value)) && CODE5.test(payment.CvvField.Value) && payment.CardOwnerNameField.Value.length >= 2 && text6(payment.CardOwnerNameField.Value, 100);
|
|
4284
|
+
}
|
|
4285
|
+
function paymentStore(value) {
|
|
4286
|
+
if (!record22(value) || !sameKeys9(value, PAYMENT_KEYS))
|
|
4287
|
+
return false;
|
|
4288
|
+
const fields = [
|
|
4289
|
+
"EmailField",
|
|
4290
|
+
"MobileField",
|
|
4291
|
+
"CardNumberField",
|
|
4292
|
+
"YearsField",
|
|
4293
|
+
"MonthsField",
|
|
4294
|
+
"CvvField",
|
|
4295
|
+
"CardOwnerNameField",
|
|
4296
|
+
"CardTZField",
|
|
4297
|
+
"PaymentsField",
|
|
4298
|
+
"OpenSumField"
|
|
4299
|
+
];
|
|
4300
|
+
const untouched = ["CardOwnerCityField", "CardOwnerAddressField", "CardOwnerZipcodeField"];
|
|
4301
|
+
const flags = [
|
|
4302
|
+
"HideCreditCardFieldsOnZeroSum",
|
|
4303
|
+
"ApprovedTermsAndConditions",
|
|
4304
|
+
"ShowTermsAndConditions",
|
|
4305
|
+
"AllowMerchantMessages",
|
|
4306
|
+
"MustAllowMerchantMessages",
|
|
4307
|
+
"ShowMerchantMessages",
|
|
4308
|
+
"ShowPayPal",
|
|
4309
|
+
"ShowUpayBitButton",
|
|
4310
|
+
"ShowPayMeBitButton",
|
|
4311
|
+
"ShowCardcomBitButton",
|
|
4312
|
+
"ShowApplePay",
|
|
4313
|
+
"ShowGooglePay",
|
|
4314
|
+
"ShowRecaptcha",
|
|
4315
|
+
"IsCredit",
|
|
4316
|
+
"Is3DSecureEnabled",
|
|
4317
|
+
"ShowSuccessPopup",
|
|
4318
|
+
"ShowErrorPopup",
|
|
4319
|
+
"CanSkipAuthentication",
|
|
4320
|
+
"IsDirectDebit",
|
|
4321
|
+
"EnableHooxOffers",
|
|
4322
|
+
"IsDirectDebitSplitPayments",
|
|
4323
|
+
"ShowPaymentButton",
|
|
4324
|
+
"AllowBitEmptyCardOwnerName",
|
|
4325
|
+
"IsCreateToken",
|
|
4326
|
+
"IsHideCart",
|
|
4327
|
+
"IsJ5"
|
|
4328
|
+
];
|
|
4329
|
+
const texts = [
|
|
4330
|
+
"Comments",
|
|
4331
|
+
"ButtonText",
|
|
4332
|
+
"ButtonTextZeroSum",
|
|
4333
|
+
"TermsAndConditionsUrl",
|
|
4334
|
+
"MerchantApplePayLogoUrl",
|
|
4335
|
+
"RecaptchaVersion",
|
|
4336
|
+
"CartTitle",
|
|
4337
|
+
"HooxID",
|
|
4338
|
+
"ApplePayApplicationData",
|
|
4339
|
+
"OrderSummeryTitle",
|
|
4340
|
+
"TurnstileSiteKey",
|
|
4341
|
+
"PrivacyPolicyUrl"
|
|
4342
|
+
];
|
|
4343
|
+
return fields.every((key) => field(value[key])) && untouched.every((key) => JSON.stringify(value[key]) === "{}") && flags.every((key) => flag(value[key])) && texts.every((key) => pageText(value[key])) && whole(value.NumOfRetriesAllowed, 0, 99) && Array.isArray(value.Commissions) && value.Commissions.every(record22) && optionalFlag(value.Was3DSActiveOnPageLoad) && pageText(value.ThreeDSecureTransactionId) && pageText(value.ThreeDSecureCavv) && Object.values(DONATION).includes(value.DonationType) && value.GoogleCardNumber === "" && value.GoogleExpirationYear === "0" && value.GoogleExpirationMonth === "0" && Array.isArray(value.SupportedCardBrands) && value.SupportedCardBrands.every((brand) => text6(brand, 32)) && Array.isArray(value.DualCardsBINs) && value.DualCardsBINs.every(record22) && pageCard(value);
|
|
4344
|
+
}
|
|
4345
|
+
function threeDsBlock(value, block) {
|
|
4346
|
+
const { CommonStore: common, ProductsStore: products, PaymentStore: payment } = value.Store;
|
|
4347
|
+
if (!record22(block) || !sameKeys9(block, THREE_DS_KEYS) || typeof block.RequestedBillingAmount !== "number" || !exact3(LANGUAGE2, block.browserLanguage) || !exact3(SCREEN, block._3ds_browserscreenheight) || !exact3(SCREEN, block._3ds_browserscreenwidth) || !exact3(SCREEN, block._3ds_browsercolordepth))
|
|
4348
|
+
return false;
|
|
4349
|
+
const rebuilt = {
|
|
4350
|
+
TerminalNum: common.TerminalNumber,
|
|
4351
|
+
CoinId: products.selectedCurrency.Code,
|
|
4352
|
+
CardNumber: payment.CardNumberField.Value,
|
|
4353
|
+
CardholderFullName: payment.CardOwnerNameField.Value,
|
|
4354
|
+
CardholderPhone: payment.MobileField.Value,
|
|
4355
|
+
CardHolderEmail: payment.EmailField.Value,
|
|
4356
|
+
CVV: payment.CvvField.Value,
|
|
4357
|
+
CardExpireMonth: payment.MonthsField.Value,
|
|
4358
|
+
CardExpireYear: payment.YearsField.Value.substr(2, 2),
|
|
4359
|
+
RequestedBillingAmount: block.RequestedBillingAmount,
|
|
4360
|
+
UserAgentHeader: value.UserAgent,
|
|
4361
|
+
browserLanguage: block.browserLanguage,
|
|
4362
|
+
_3ds_browserjavaenabled: "true",
|
|
4363
|
+
_3ds_browserscreenheight: block._3ds_browserscreenheight,
|
|
4364
|
+
_3ds_browserscreenwidth: block._3ds_browserscreenwidth,
|
|
4365
|
+
_3ds_browsercolordepth: block._3ds_browsercolordepth,
|
|
4366
|
+
_3ds_challengewindowsize: "05",
|
|
4367
|
+
_3ds_channel: "02",
|
|
4368
|
+
_3ds_category: "01",
|
|
4369
|
+
_3ds_transtype: "01",
|
|
4370
|
+
ExternalAisurit4DealPageUID: common.Uid,
|
|
4371
|
+
DealToSaveJSON: "",
|
|
4372
|
+
GooglePayToken: "",
|
|
4373
|
+
DirectDebitSplitPaymentsSum: 0,
|
|
4374
|
+
SapakMutav: ""
|
|
4375
|
+
};
|
|
4376
|
+
return JSON.stringify(rebuilt) === JSON.stringify(block);
|
|
4377
|
+
}
|
|
4378
|
+
var hooxReference = (value) => value === null || value === "" || whole(value) || typeof value === "string" && /^[\x21-\x7e]{1,256}$/.test(value);
|
|
4379
|
+
function pageBody(body) {
|
|
4380
|
+
const value = readBody15(body);
|
|
4381
|
+
if (value === null || !sameKeys9(value, TOP_KEYS2) || typeof value.GoogleToken !== "string" || value.GoogleToken !== "" && !TOKEN3.test(value.GoogleToken) || value.UserAgent === "" || !text6(value.UserAgent, 1024) || !whole(value.NumberOfTries, 1, 10) || value.GooglePayToken !== "" || !hooxReference(value.HooxReference) || !record22(value.Store) || !sameKeys9(value.Store, STORE_KEYS))
|
|
4382
|
+
return null;
|
|
4383
|
+
const store = value.Store;
|
|
4384
|
+
if (!commonStore(store.CommonStore) || !companyStore(store.CompanyInfoStore) || !productsStore(store.ProductsStore) || !deliveryStore(store.DeliveryStore) || !documentStore(store.DocumentStore) || !detailsStore(store.DetailsStore) || !paymentStore(store.PaymentStore) || !threeDsBlock(value, value._3DSecureReq))
|
|
4385
|
+
return null;
|
|
4386
|
+
const product = store.ProductsStore.products[0];
|
|
4387
|
+
const price = cents(product.PriceToShow);
|
|
4388
|
+
if (price === null || cents(value._3DSecureReq.RequestedBillingAmount) !== price || product.BaseISOCurrency !== store.ProductsStore.selectedCurrency.Code || product.IsManualSum && product.ManualPrice !== product.PriceToShow)
|
|
4389
|
+
return null;
|
|
4390
|
+
if (store.PaymentStore.ShowRecaptcha !== (value.GoogleToken !== ""))
|
|
4391
|
+
return null;
|
|
4392
|
+
return value;
|
|
4393
|
+
}
|
|
4394
|
+
function cardcomBodyVerdict(body, url) {
|
|
4395
|
+
if (url !== void 0 && !isCardcomSubmitUrl(url))
|
|
4396
|
+
return refuse27("cardcom_url_refused");
|
|
4397
|
+
const value = pageBody(body);
|
|
4398
|
+
if (value === null)
|
|
4399
|
+
return refuse27("cardcom_body_unsupported");
|
|
4400
|
+
const payment = value.Store.PaymentStore;
|
|
4401
|
+
const receiptId = value.Store.DocumentStore.IdField;
|
|
4402
|
+
if (payment.Is3DSecureEnabled || payment.Was3DSActiveOnPageLoad === true || payment.ThreeDSecureTransactionId || payment.ThreeDSecureCavv) {
|
|
4403
|
+
return refuse27("cardcom_three_d_secure_refused");
|
|
4404
|
+
}
|
|
4405
|
+
if (payment.IsCreateToken || payment.IsJ5)
|
|
4406
|
+
return refuse27("cardcom_card_saving_refused");
|
|
4407
|
+
if (payment.IsDirectDebitSplitPayments || payment.PaymentsField.Value !== "1" || payment.DonationType === DONATION.monthly || payment.DonationType === DONATION.multiple || payment.IsDirectDebit && payment.DonationType !== DONATION.single) {
|
|
4408
|
+
return refuse27("cardcom_recurring_refused");
|
|
4409
|
+
}
|
|
4410
|
+
if (payment.CardTZField.Value !== "" || payment.CardTZField.Show && payment.CardTZField.Required || receiptId !== null && (receiptId.Value !== "" || receiptId.Show && receiptId.Required))
|
|
4411
|
+
return refuse27("cardcom_id_required");
|
|
4412
|
+
if (payment.ShowRecaptcha && payment.RecaptchaVersion !== "v3")
|
|
4413
|
+
return refuse27("cardcom_captcha_unsupported");
|
|
4414
|
+
return CARD26;
|
|
4415
|
+
}
|
|
4416
|
+
var CARDCOM_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
4417
|
+
Object.freeze({
|
|
4418
|
+
id: "machon_alte_usd",
|
|
4419
|
+
merchant: "Machon Alte",
|
|
4420
|
+
origins: Object.freeze([CARDCOM_ORIGIN]),
|
|
4421
|
+
page: "kzR5pTyr0kC3oqjpGbCMiQ",
|
|
4422
|
+
terminal: 162226,
|
|
4423
|
+
products: Object.freeze([Object.freeze({ uid: "JoQrlcuGCUWYM4I66eX7pw", currency: "usd", price: null })]),
|
|
4424
|
+
settings: "e38d7c7abce83a3a994a707e345595cf6ec2a15d77794a8eea70c0d5ce4773ab"
|
|
4425
|
+
})
|
|
4426
|
+
]);
|
|
4427
|
+
// src/nexi-checkout.js
|
|
4428
|
+
var NEXI_CHECKOUT_PSP = "nexi_checkout";
|
|
4429
|
+
var NEXI_CHECKOUT_PAY_HOSTS = /* @__PURE__ */ Object.freeze({ "checkout.dibspayment.eu": "production", "test.checkout.dibspayment.eu": "test" });
|
|
4430
|
+
var NEXI_CHECKOUT_PAY_PATH = "/api/v1/pay";
|
|
4431
|
+
var BODY_LIMIT26 = 4096;
|
|
4432
|
+
var BODY_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4433
|
+
"type",
|
|
4434
|
+
"paymentType",
|
|
4435
|
+
"acceptedTermsAndConditions",
|
|
4436
|
+
"amountConfirmedByConsumer",
|
|
4437
|
+
"surchargeAmount",
|
|
4438
|
+
"consumerCheckedSaveNewPaymentMethod",
|
|
4439
|
+
"consumerHasConsentedToRememberingNewDevice",
|
|
4440
|
+
"consumerWantsToBeAnonymous",
|
|
4441
|
+
"language"
|
|
4442
|
+
]);
|
|
4443
|
+
var CARD_KEYS11 = /* @__PURE__ */ Object.freeze(["cardNumber", "cardVerificationCode", "cardholderName", "expiryMonth", "expiryYear"]);
|
|
4444
|
+
var CARD_NUMBER14 = /^[0-9]{13,19}$/;
|
|
4445
|
+
var MONTH14 = /^(?:0[1-9]|1[0-2])$/;
|
|
4446
|
+
var YEAR15 = /^[0-9]{2}$/;
|
|
4447
|
+
var CODE6 = /^[0-9]{3,4}$/;
|
|
4448
|
+
var TEXT_LIMIT9 = 128;
|
|
4449
|
+
var EMAIL_LIMIT2 = 254;
|
|
4450
|
+
var LANGUAGE3 = /^[a-z]{2}-[a-z]{2}$/i;
|
|
4451
|
+
var AMOUNT_LIMIT2 = 2147483647;
|
|
4452
|
+
var record23 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4453
|
+
var own6 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4454
|
+
var sameKeys10 = (value, keys) => {
|
|
4455
|
+
const found = Object.keys(value);
|
|
4456
|
+
return found.length === keys.length && found.every((key, at) => key === keys[at]);
|
|
4457
|
+
};
|
|
4458
|
+
var refuse28 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4459
|
+
var CARD27 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
4460
|
+
var printable4 = (text9) => [...text9].every((character) => {
|
|
4461
|
+
const point = character.codePointAt(0);
|
|
4462
|
+
return point >= 32 && !(point >= 127 && point <= 159) && point !== 8232 && point !== 8233;
|
|
4463
|
+
});
|
|
4464
|
+
var text7 = (value, limit) => typeof value === "string" && value.length <= limit && printable4(value);
|
|
4465
|
+
function luhn6(digits4) {
|
|
4466
|
+
let sum = 0;
|
|
4467
|
+
for (let at = 0; at < digits4.length; at += 1) {
|
|
4468
|
+
let digit = Number(digits4[digits4.length - 1 - at]);
|
|
4469
|
+
if (at % 2 === 1) {
|
|
4470
|
+
digit *= 2;
|
|
4471
|
+
if (digit > 9)
|
|
4472
|
+
digit -= 9;
|
|
4473
|
+
}
|
|
4474
|
+
sum += digit;
|
|
4475
|
+
}
|
|
4476
|
+
return sum % 10 === 0;
|
|
4477
|
+
}
|
|
4478
|
+
function nexiCheckoutPayUrl(url) {
|
|
4479
|
+
if (typeof url !== "string" || url.length > 256 || url.includes("?") || url.includes("#"))
|
|
4480
|
+
return null;
|
|
4481
|
+
let parsed;
|
|
4482
|
+
try {
|
|
4483
|
+
parsed = new URL(url);
|
|
4484
|
+
}
|
|
4485
|
+
catch {
|
|
4486
|
+
return null;
|
|
4487
|
+
}
|
|
4488
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || parsed.search || parsed.hash || parsed.pathname !== NEXI_CHECKOUT_PAY_PATH)
|
|
4489
|
+
return null;
|
|
4490
|
+
if (!own6(NEXI_CHECKOUT_PAY_HOSTS, parsed.hostname))
|
|
4491
|
+
return null;
|
|
4492
|
+
return Object.freeze({ host: parsed.hostname, environment: NEXI_CHECKOUT_PAY_HOSTS[parsed.hostname] });
|
|
4493
|
+
}
|
|
4494
|
+
function isNexiCheckoutPayUrl(url) {
|
|
4495
|
+
return nexiCheckoutPayUrl(url) !== null;
|
|
4496
|
+
}
|
|
4497
|
+
function readBody16(body) {
|
|
4498
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT26)
|
|
4499
|
+
return null;
|
|
4500
|
+
let value;
|
|
4501
|
+
try {
|
|
4502
|
+
value = JSON.parse(body);
|
|
4503
|
+
if (!record23(value) || JSON.stringify(value) !== body)
|
|
4504
|
+
return null;
|
|
4505
|
+
}
|
|
4506
|
+
catch {
|
|
4507
|
+
return null;
|
|
4508
|
+
}
|
|
4509
|
+
return value;
|
|
4510
|
+
}
|
|
4511
|
+
function cardFormValues(card) {
|
|
4512
|
+
if (!record23(card))
|
|
4513
|
+
return false;
|
|
4514
|
+
const keys = Object.keys(card);
|
|
4515
|
+
const expected = own6(card, "email") ? CARD_KEYS11.length + 1 : CARD_KEYS11.length;
|
|
4516
|
+
if (keys.length !== expected || !CARD_KEYS11.every((key) => own6(card, key)))
|
|
4517
|
+
return false;
|
|
4518
|
+
if (own6(card, "email") && !text7(card.email, EMAIL_LIMIT2))
|
|
4519
|
+
return false;
|
|
4520
|
+
return typeof card.cardNumber === "string" && CARD_NUMBER14.test(card.cardNumber) && luhn6(card.cardNumber) && typeof card.cardVerificationCode === "string" && CODE6.test(card.cardVerificationCode) && text7(card.cardholderName, TEXT_LIMIT9) && card.cardholderName.trim() !== "" && typeof card.expiryMonth === "string" && MONTH14.test(card.expiryMonth) && typeof card.expiryYear === "string" && YEAR15.test(card.expiryYear);
|
|
4521
|
+
}
|
|
4522
|
+
var amount = (value, least) => Number.isSafeInteger(value) && value >= least && value <= AMOUNT_LIMIT2;
|
|
4523
|
+
var flag2 = (value) => typeof value === "boolean";
|
|
4524
|
+
function nexiCheckoutBodyVerdict(body, url) {
|
|
4525
|
+
if (url !== void 0 && !isNexiCheckoutPayUrl(url))
|
|
4526
|
+
return refuse28("nexi_checkout_url_refused");
|
|
4527
|
+
const value = readBody16(body);
|
|
4528
|
+
if (value === null || !sameKeys10(value, BODY_KEYS))
|
|
4529
|
+
return refuse28("nexi_checkout_body_unsupported");
|
|
4530
|
+
if (value.type !== "card" || !record23(value.paymentType) || !sameKeys10(value.paymentType, ["card"]) || !cardFormValues(value.paymentType.card) || !flag2(value.acceptedTermsAndConditions) || !amount(value.amountConfirmedByConsumer, 1) || !amount(value.surchargeAmount, 0) || !flag2(value.consumerCheckedSaveNewPaymentMethod) || !flag2(value.consumerHasConsentedToRememberingNewDevice) || !flag2(value.consumerWantsToBeAnonymous) || typeof value.language !== "string" || value.language !== "" && !LANGUAGE3.test(value.language))
|
|
4531
|
+
return refuse28("nexi_checkout_body_unsupported");
|
|
4532
|
+
if (value.consumerCheckedSaveNewPaymentMethod || value.consumerHasConsentedToRememberingNewDevice)
|
|
4533
|
+
return refuse28("nexi_checkout_card_saving_refused");
|
|
4534
|
+
if (value.surchargeAmount !== 0)
|
|
4535
|
+
return refuse28("nexi_checkout_surcharge_refused");
|
|
4536
|
+
return CARD27;
|
|
4537
|
+
}
|
|
4538
|
+
// src/toast.js
|
|
4539
|
+
var TOAST_PSP = "toast";
|
|
4540
|
+
var TOAST_PAYMENT_METHODS_URL = "https://payments.toasttab.com/v1/payment-methods";
|
|
4541
|
+
var TOAST_KEY_ID = "RSA-OAEP-SHA1::bacb4887-8314-4c23-98fc-d5ef7bc99e94_oo-legacy-browsers";
|
|
4542
|
+
var TOAST_SUBSTITUTION = /* @__PURE__ */ Object.freeze({ at: "card", fields: Object.freeze(["cardData"]) });
|
|
4543
|
+
var BODY_LIMIT27 = 8192;
|
|
4544
|
+
var ROOT_KEYS9 = /* @__PURE__ */ Object.freeze(["type", "card", "sessionSecret", "usage", "setupFutureUsage", "billingDetails"]);
|
|
4545
|
+
var CARD_KEYS12 = /* @__PURE__ */ Object.freeze(["keyId", "cardData"]);
|
|
4546
|
+
var WALLETS = /* @__PURE__ */ Object.freeze(["APPLE_PAY", "GOOGLE_PAY"]);
|
|
4547
|
+
var SESSION_SECRET = /^[\x21-\x7e]{1,1024}$/;
|
|
4548
|
+
var POSTAL_CODE4 = /^[A-Za-z0-9 -]{0,16}$/;
|
|
4549
|
+
var CIPHERTEXT_B64 = /^[A-Za-z0-9+/]{341}[AQgw]==$/;
|
|
4550
|
+
var record24 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4551
|
+
var sameKeys11 = (value, keys) => {
|
|
4552
|
+
const own10 = Object.keys(value);
|
|
4553
|
+
return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
|
|
4554
|
+
};
|
|
4555
|
+
var refuse29 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4556
|
+
var failed = (code) => (
|
|
4557
|
+
/** @type {ToastBodyReadJs} */
|
|
4558
|
+
Object.freeze({ ok: false, code }));
|
|
4559
|
+
var CARD28 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
4560
|
+
var CONTINUE10 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
|
|
4561
|
+
function isWalletBody(parsed) {
|
|
4562
|
+
const card = parsed.card;
|
|
4563
|
+
const rootOk = sameKeys11(parsed, ["type", "card", "sessionSecret"]) || sameKeys11(parsed, ["type", "card", "sessionSecret", "billingDetails"]) && record24(parsed.billingDetails);
|
|
4564
|
+
return rootOk && WALLETS.includes(parsed.type) && record24(card) && sameKeys11(card, ["keyId", "cardData", "wallet"]) && card.keyId === null && typeof card.cardData === "string" && record24(card.wallet) && sameKeys11(card.wallet, ["type"]) && card.wallet.type === parsed.type && typeof parsed.sessionSecret === "string";
|
|
4565
|
+
}
|
|
4566
|
+
function isToastPaymentMethodsUrl(url) {
|
|
4567
|
+
return url === TOAST_PAYMENT_METHODS_URL;
|
|
4568
|
+
}
|
|
4569
|
+
function isToastCiphertext(value) {
|
|
4570
|
+
return typeof value === "string" && CIPHERTEXT_B64.test(value);
|
|
4571
|
+
}
|
|
4572
|
+
function readToastBody(body) {
|
|
4573
|
+
const malformed = failed("toast_body_malformed");
|
|
4574
|
+
if (typeof body !== "string" || body.length > BODY_LIMIT27)
|
|
4575
|
+
return malformed;
|
|
4576
|
+
let parsed;
|
|
4577
|
+
try {
|
|
4578
|
+
parsed = JSON.parse(body);
|
|
4579
|
+
}
|
|
4580
|
+
catch {
|
|
4581
|
+
return malformed;
|
|
4582
|
+
}
|
|
4583
|
+
if (!record24(parsed) || JSON.stringify(parsed) !== body)
|
|
4584
|
+
return malformed;
|
|
4585
|
+
if (isWalletBody(parsed))
|
|
4586
|
+
return (
|
|
4587
|
+
/** @type {ToastBodyReadJs} */
|
|
4588
|
+
Object.freeze({ ok: false, wallet: true }));
|
|
4589
|
+
const card = parsed.card;
|
|
4590
|
+
if (!sameKeys11(parsed, ROOT_KEYS9) || parsed.type !== "CARD" || !record24(card) || !sameKeys11(card, CARD_KEYS12))
|
|
4591
|
+
return malformed;
|
|
4592
|
+
if (typeof card.keyId !== "string")
|
|
4593
|
+
return malformed;
|
|
4594
|
+
if (card.keyId !== TOAST_KEY_ID)
|
|
4595
|
+
return failed("toast_foreign_key");
|
|
4596
|
+
if (!isToastCiphertext(card.cardData))
|
|
4597
|
+
return malformed;
|
|
4598
|
+
if (typeof parsed.sessionSecret !== "string" || !SESSION_SECRET.test(parsed.sessionSecret))
|
|
4599
|
+
return malformed;
|
|
4600
|
+
if (parsed.usage !== null || parsed.setupFutureUsage !== null)
|
|
4601
|
+
return failed("toast_keeps_card");
|
|
4602
|
+
const billing = parsed.billingDetails;
|
|
4603
|
+
if (!record24(billing) || !sameKeys11(billing, ["postalCode"]) || typeof billing.postalCode !== "string" || !POSTAL_CODE4.test(billing.postalCode))
|
|
4604
|
+
return malformed;
|
|
4605
|
+
const read = { ok: true, sessionSecret: parsed.sessionSecret, postalCode: billing.postalCode, cardData: card.cardData };
|
|
4606
|
+
return Object.freeze(read);
|
|
4607
|
+
}
|
|
4608
|
+
function toastBodyVerdict(body) {
|
|
4609
|
+
const read = readToastBody(body);
|
|
4610
|
+
if (read.ok)
|
|
4611
|
+
return CARD28;
|
|
4612
|
+
return read.wallet ? CONTINUE10 : refuse29(read.code);
|
|
4613
|
+
}
|
|
4614
|
+
// src/fastspring.js
|
|
4615
|
+
var FASTSPRING_PSP = "fastspring";
|
|
4616
|
+
var FASTSPRING_STORE_PINS = /* @__PURE__ */ Object.freeze([
|
|
4617
|
+
Object.freeze({ environment: "production", store: "daisydisk", storefront: "", merchant: "DaisyDisk" })
|
|
4618
|
+
]);
|
|
4619
|
+
var URL_LIMIT11 = 256;
|
|
4620
|
+
var BODY_LIMIT28 = 32768;
|
|
4621
|
+
var STORE = "[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?";
|
|
4622
|
+
var CARD_URL = new RegExp(`^https://(${STORE})(\\.test)?\\.onfastspring\\.com((?:/(?:popup|embedded)-[A-Za-z0-9_-]{1,64})?)/session/([A-Za-z0-9_-]{16,64})/payment$`);
|
|
4623
|
+
var DIGITS = /^[0-9]{12,19}$/;
|
|
4624
|
+
var MONTH15 = /^(?:0?[1-9]|1[0-2])$/;
|
|
4625
|
+
var YEAR16 = /^(?:[0-9]{2}|[0-9]{4})$/;
|
|
4626
|
+
var SECURITY_CODE16 = /^[0-9]{3,4}$/;
|
|
4627
|
+
var CARD_KEYS13 = /* @__PURE__ */ Object.freeze(["year", "month", "number", "security"]);
|
|
4628
|
+
var SAVED_CARD_KEYS = /* @__PURE__ */ Object.freeze(["savedCardId", "savedCardEnding", "savedCardBin", "variantType"]);
|
|
4629
|
+
var BODY_KEYS2 = /* @__PURE__ */ new Set([
|
|
4630
|
+
"contact",
|
|
4631
|
+
"card",
|
|
4632
|
+
"sepa",
|
|
4633
|
+
"ach",
|
|
4634
|
+
"pad",
|
|
4635
|
+
"bacs",
|
|
4636
|
+
"upi",
|
|
4637
|
+
"mercadopago",
|
|
4638
|
+
"cpfNumber",
|
|
4639
|
+
"dniNumber",
|
|
4640
|
+
"googlepay",
|
|
4641
|
+
"applepay",
|
|
4642
|
+
"paymentKlarna",
|
|
4643
|
+
"paymentType",
|
|
4644
|
+
"subscribe",
|
|
4645
|
+
"captcha",
|
|
4646
|
+
"recipientSelected",
|
|
4647
|
+
"recipient",
|
|
4648
|
+
"customerReference",
|
|
4649
|
+
"autoRenew",
|
|
4650
|
+
"fingerprint",
|
|
4651
|
+
"savedPaypalId",
|
|
4652
|
+
"savedVenmoId",
|
|
4653
|
+
"cashapp"
|
|
4654
|
+
]);
|
|
4655
|
+
var METHOD_KEYS = /* @__PURE__ */ Object.freeze(["sepa", "ach", "pad", "bacs", "upi", "mercadopago", "googlepay", "applepay", "paymentKlarna"]);
|
|
4656
|
+
var SAVED_METHOD_KEYS = /* @__PURE__ */ Object.freeze(["savedPaypalId", "savedVenmoId", "cashapp"]);
|
|
4657
|
+
var TEXT2 = /^[^\x00-\x1f\x7f]{0,256}$/;
|
|
4658
|
+
var IP_ADDRESS = /^[0-9A-Fa-f.:]{2,45}$/;
|
|
4659
|
+
var FINGERPRINT_KEYS = /* @__PURE__ */ Object.freeze(["uniqueId", "fingerprintHash"]);
|
|
4660
|
+
var CARD_MEMBER3 = /^(?:card_?number|cc_?number|pan|cvc2?|cvv2?|security_?code)$/i;
|
|
4661
|
+
var record25 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4662
|
+
var own7 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4663
|
+
var nothing = (value) => value === void 0 || value === null || value === "" || value === false;
|
|
4664
|
+
var refuse30 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4665
|
+
var CARD29 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
4666
|
+
var CONTINUE11 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
|
|
4667
|
+
function fastspringCardUrl(url) {
|
|
4668
|
+
if (typeof url !== "string" || url.length > URL_LIMIT11 || url.includes("?") || url.includes("#"))
|
|
4669
|
+
return null;
|
|
4670
|
+
let parsed;
|
|
4671
|
+
try {
|
|
4672
|
+
parsed = new URL(url);
|
|
4673
|
+
}
|
|
4674
|
+
catch {
|
|
4675
|
+
return null;
|
|
4676
|
+
}
|
|
4677
|
+
if (parsed.href !== url || parsed.port || parsed.username || parsed.password)
|
|
4678
|
+
return null;
|
|
4679
|
+
const match = CARD_URL.exec(url);
|
|
4680
|
+
if (!match)
|
|
4681
|
+
return null;
|
|
4682
|
+
return Object.freeze({
|
|
4683
|
+
environment: match[2] ? "sandbox" : "production",
|
|
4684
|
+
store: match[1],
|
|
4685
|
+
storefront: match[3],
|
|
4686
|
+
session: match[4],
|
|
4687
|
+
sessionUrl: url.slice(0, -"/payment".length)
|
|
4688
|
+
});
|
|
4689
|
+
}
|
|
4690
|
+
function isFastspringCardUrl(url) {
|
|
4691
|
+
return fastspringCardUrl(url) !== null;
|
|
4692
|
+
}
|
|
4693
|
+
function readJson7(body) {
|
|
4694
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT28)
|
|
4695
|
+
return { parsed: null, exact: false };
|
|
4696
|
+
let parsed;
|
|
4697
|
+
try {
|
|
4698
|
+
parsed = JSON.parse(body);
|
|
4699
|
+
}
|
|
4700
|
+
catch {
|
|
4701
|
+
return { parsed: null, exact: false };
|
|
4702
|
+
}
|
|
4703
|
+
let exact5 = false;
|
|
4704
|
+
try {
|
|
4705
|
+
exact5 = JSON.stringify(parsed) === body;
|
|
4706
|
+
}
|
|
4707
|
+
catch {
|
|
4708
|
+
exact5 = false;
|
|
4709
|
+
}
|
|
4710
|
+
return { parsed, exact: exact5 };
|
|
4711
|
+
}
|
|
4712
|
+
function numberDigits(number) {
|
|
4713
|
+
if (typeof number !== "string")
|
|
4714
|
+
return null;
|
|
4715
|
+
const digits4 = number.replace(/ /g, "");
|
|
4716
|
+
if (!DIGITS.test(digits4))
|
|
4717
|
+
return null;
|
|
4718
|
+
return number === digits4 || number === digits4.replace(/(.{4})/g, "$1 ").trim() ? digits4 : null;
|
|
4719
|
+
}
|
|
4720
|
+
function emptyDetails(key, value) {
|
|
4721
|
+
if (nothing(value))
|
|
4722
|
+
return true;
|
|
4723
|
+
if (!record25(value))
|
|
4724
|
+
return false;
|
|
4725
|
+
return Object.entries(value).every(([name, leaf]) => nothing(leaf) || key === "sepa" && name === "ipAddress" && typeof leaf === "string" && IP_ADDRESS.test(leaf));
|
|
4726
|
+
}
|
|
4727
|
+
function namesCardOutside(parsed) {
|
|
4728
|
+
const pending = Object.entries(parsed).filter(([key]) => key !== "card").map(([, value]) => value).filter((value) => value !== null && typeof value === "object");
|
|
4729
|
+
if (Object.keys(parsed).some((key) => key !== "card" && CARD_MEMBER3.test(key)))
|
|
4730
|
+
return true;
|
|
4731
|
+
while (pending.length > 0) {
|
|
4732
|
+
const node = pending.pop();
|
|
4733
|
+
for (const key of Object.keys(node)) {
|
|
4734
|
+
if (!Array.isArray(node) && CARD_MEMBER3.test(key))
|
|
4735
|
+
return true;
|
|
4736
|
+
const value = node[key];
|
|
4737
|
+
if (value !== null && typeof value === "object")
|
|
4738
|
+
pending.push(value);
|
|
4739
|
+
}
|
|
4740
|
+
}
|
|
4741
|
+
return false;
|
|
4742
|
+
}
|
|
4743
|
+
var cardValues = (card) => record25(card) && (!nothing(card.number) || !nothing(card.security));
|
|
4744
|
+
function judgeCard2(parsed) {
|
|
4745
|
+
const card = parsed.card;
|
|
4746
|
+
if (record25(card) && SAVED_CARD_KEYS.some((key) => own7(card, key)))
|
|
4747
|
+
return "fastspring_saved_card";
|
|
4748
|
+
if (SAVED_METHOD_KEYS.some((key) => own7(parsed, key)))
|
|
4749
|
+
return "fastspring_saved_card";
|
|
4750
|
+
if (!Object.keys(parsed).every((key) => BODY_KEYS2.has(key)) || namesCardOutside(parsed))
|
|
4751
|
+
return "fastspring_body_unsupported";
|
|
4752
|
+
if (!record25(card) || Object.keys(card).length !== CARD_KEYS13.length || !CARD_KEYS13.every((key) => own7(card, key)) || numberDigits(card.number) === null || typeof card.month !== "string" || !MONTH15.test(card.month) || typeof card.year !== "string" || !YEAR16.test(card.year) || typeof card.security !== "string" || !SECURITY_CODE16.test(card.security))
|
|
4753
|
+
return "fastspring_body_unsupported";
|
|
4754
|
+
if (parsed.recipientSelected === true || own7(parsed, "recipient"))
|
|
4755
|
+
return "fastspring_gift";
|
|
4756
|
+
if (typeof parsed.recipientSelected !== "boolean")
|
|
4757
|
+
return "fastspring_body_unsupported";
|
|
4758
|
+
if (parsed.autoRenew === true)
|
|
4759
|
+
return "fastspring_keep_on_file";
|
|
4760
|
+
if (!nothing(parsed.autoRenew))
|
|
4761
|
+
return "fastspring_body_unsupported";
|
|
4762
|
+
for (const key of ["cpfNumber", "dniNumber"]) {
|
|
4763
|
+
if (nothing(parsed[key]))
|
|
4764
|
+
continue;
|
|
4765
|
+
return typeof parsed[key] === "string" ? "fastspring_local_route" : "fastspring_body_unsupported";
|
|
4766
|
+
}
|
|
4767
|
+
const captcha = parsed.captcha;
|
|
4768
|
+
if (!record25(captcha) || Object.keys(captcha).length !== 2 || typeof captcha.token !== "string" || typeof captcha.captchaType !== "string")
|
|
4769
|
+
return "fastspring_body_unsupported";
|
|
4770
|
+
if (captcha.token !== "" || captcha.captchaType !== "")
|
|
4771
|
+
return "fastspring_captcha_unsupported";
|
|
4772
|
+
if (own7(parsed, "customerReference"))
|
|
4773
|
+
return "fastspring_body_unsupported";
|
|
4774
|
+
if (!METHOD_KEYS.every((key) => emptyDetails(key, parsed[key])))
|
|
4775
|
+
return "fastspring_body_unsupported";
|
|
4776
|
+
const contact = parsed.contact;
|
|
4777
|
+
if (!record25(contact) || !Object.values(contact).every((value) => value === null || typeof value === "boolean" || typeof value === "string" && TEXT2.test(value)))
|
|
4778
|
+
return "fastspring_body_unsupported";
|
|
4779
|
+
if (!(parsed.subscribe === void 0 || parsed.subscribe === null || typeof parsed.subscribe === "boolean"))
|
|
4780
|
+
return "fastspring_body_unsupported";
|
|
4781
|
+
const fingerprint = parsed.fingerprint;
|
|
4782
|
+
if (fingerprint !== void 0 && !(record25(fingerprint) && Object.keys(fingerprint).every((key) => FINGERPRINT_KEYS.includes(key)) && Object.values(fingerprint).every((value) => value === null || typeof value === "number" && Number.isFinite(value) || typeof value === "string" && TEXT2.test(value))))
|
|
4783
|
+
return "fastspring_body_unsupported";
|
|
4784
|
+
return null;
|
|
4785
|
+
}
|
|
4786
|
+
function fastspringBodyVerdict(body) {
|
|
4787
|
+
const { parsed, exact: exact5 } = readJson7(body);
|
|
4788
|
+
if (!record25(parsed))
|
|
4789
|
+
return body === void 0 || body === null || body === "" ? CONTINUE11 : refuse30("fastspring_body_unsupported");
|
|
4790
|
+
if (parsed.paymentType !== "card") {
|
|
4791
|
+
if (cardValues(parsed.card) || namesCardOutside(parsed))
|
|
4792
|
+
return refuse30("fastspring_body_unsupported");
|
|
4793
|
+
return typeof parsed.paymentType === "string" && parsed.paymentType !== "" ? CONTINUE11 : refuse30("fastspring_body_unsupported");
|
|
4794
|
+
}
|
|
4795
|
+
if (!exact5)
|
|
4796
|
+
return refuse30("fastspring_body_unsupported");
|
|
4797
|
+
const code = judgeCard2(parsed);
|
|
4798
|
+
return code === null ? CARD29 : refuse30(code);
|
|
4799
|
+
}
|
|
4800
|
+
// src/omise.js
|
|
4801
|
+
var OMISE_PSP = "omise";
|
|
4802
|
+
var OMISE_TOKEN_URL = "https://vault.omise.co/tokens";
|
|
4803
|
+
var OMISE_CARD_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4804
|
+
"number",
|
|
4805
|
+
"name",
|
|
4806
|
+
"expiration_month",
|
|
4807
|
+
"expiration_year",
|
|
4808
|
+
"security_code",
|
|
4809
|
+
"email",
|
|
4810
|
+
"phone_number",
|
|
4811
|
+
"country",
|
|
4812
|
+
"state",
|
|
4813
|
+
"city",
|
|
4814
|
+
"postal_code",
|
|
4815
|
+
"street1",
|
|
4816
|
+
"street2"
|
|
4817
|
+
]);
|
|
4818
|
+
var BODY_LIMIT29 = 4096;
|
|
4819
|
+
var SECURITY_CODE17 = /^[0-9]{3,4}$/;
|
|
4820
|
+
var MONTH_TEXT2 = /^(?:0?[1-9]|1[0-2])$/;
|
|
4821
|
+
var YEAR_TEXT = /^(?:[0-9]{2}|20[0-9]{2})$/;
|
|
4822
|
+
var COUNTRY5 = /^[A-Za-z]{2}$/;
|
|
4823
|
+
var PHONE3 = /^\+?[0-9 ()-]{6,24}$/;
|
|
4824
|
+
var POSTAL_NUMBER_LIMIT = 99999999999;
|
|
4825
|
+
var TEXT_LIMIT10 = 256;
|
|
4826
|
+
var CONTROL11 = /[\u0000-\u001f\u007f]/;
|
|
4827
|
+
var NUMBER_FIELD = /^[0-9]+(?: [0-9]+){0,6}$/;
|
|
4828
|
+
var record26 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4829
|
+
var own8 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4830
|
+
var wellFormed2 = (value) => {
|
|
4831
|
+
try {
|
|
4832
|
+
encodeURIComponent(value);
|
|
4833
|
+
return true;
|
|
4834
|
+
}
|
|
4835
|
+
catch {
|
|
4836
|
+
return false;
|
|
4837
|
+
}
|
|
4838
|
+
};
|
|
4839
|
+
var digits2 = (value) => (value.match(/\p{Nd}/gu) ?? []).length;
|
|
4840
|
+
var plainText5 = (value) => typeof value === "string" && value.length >= 1 && value.length <= TEXT_LIMIT10 && !CONTROL11.test(value) && digits2(value) < 12 && wellFormed2(value);
|
|
4841
|
+
var optionalText2 = (value) => value === "" || plainText5(value);
|
|
4842
|
+
function luhnValid(run) {
|
|
4843
|
+
let sum = 0;
|
|
4844
|
+
for (let i = 0; i < run.length; i += 1) {
|
|
4845
|
+
let digit = run.charCodeAt(run.length - 1 - i) - 48;
|
|
4846
|
+
if (i % 2 === 1)
|
|
4847
|
+
digit = digit * 2 > 9 ? digit * 2 - 9 : digit * 2;
|
|
4848
|
+
sum += digit;
|
|
4849
|
+
}
|
|
4850
|
+
return sum % 10 === 0;
|
|
4851
|
+
}
|
|
4852
|
+
function cardShaped(value) {
|
|
4853
|
+
const groups = value.match(/[0-9]+/g) ?? [];
|
|
4854
|
+
for (let first = 0; first < groups.length; first += 1) {
|
|
4855
|
+
let run = "";
|
|
4856
|
+
for (let last = first; last < groups.length && run.length < 19; last += 1) {
|
|
4857
|
+
run += groups[last];
|
|
4858
|
+
if (run.length >= 13 && run.length <= 19 && run[0] >= "2" && run[0] <= "6" && luhnValid(run))
|
|
4859
|
+
return true;
|
|
4860
|
+
}
|
|
4861
|
+
}
|
|
4862
|
+
return false;
|
|
4863
|
+
}
|
|
4864
|
+
var phoneNumber = (value) => typeof value === "string" && PHONE3.test(value) && digits2(value) >= 6 && digits2(value) <= 15 && !cardShaped(value);
|
|
4865
|
+
var numberField = (value) => typeof value === "string" && NUMBER_FIELD.test(value) && digits2(value) >= 12 && digits2(value) <= 19;
|
|
4866
|
+
var refuse31 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4867
|
+
var CARD30 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
4868
|
+
function isOmiseTokenUrl(url) {
|
|
4869
|
+
return url === OMISE_TOKEN_URL;
|
|
4870
|
+
}
|
|
4871
|
+
function readBody17(body) {
|
|
4872
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT29)
|
|
4873
|
+
return null;
|
|
4874
|
+
let value;
|
|
4875
|
+
try {
|
|
4876
|
+
value = JSON.parse(body);
|
|
4877
|
+
if (!record26(value) || JSON.stringify(value) !== body)
|
|
4878
|
+
return null;
|
|
4879
|
+
}
|
|
4880
|
+
catch {
|
|
4881
|
+
return null;
|
|
4882
|
+
}
|
|
4883
|
+
return value;
|
|
4884
|
+
}
|
|
4885
|
+
function monthValue(value) {
|
|
4886
|
+
if (typeof value === "number")
|
|
4887
|
+
return Number.isSafeInteger(value) && value >= 1 && value <= 12;
|
|
4888
|
+
return typeof value === "string" && MONTH_TEXT2.test(value);
|
|
4889
|
+
}
|
|
4890
|
+
function yearValue(value) {
|
|
4891
|
+
if (typeof value === "number")
|
|
4892
|
+
return Number.isSafeInteger(value) && (value >= 0 && value <= 99 || value >= 2e3 && value <= 2099);
|
|
4893
|
+
return typeof value === "string" && YEAR_TEXT.test(value);
|
|
4894
|
+
}
|
|
4895
|
+
function cardMembers(card) {
|
|
4896
|
+
if (!record26(card) || !Object.keys(card).every((key) => OMISE_CARD_KEYS.includes(key)))
|
|
4897
|
+
return false;
|
|
4898
|
+
if (!numberField(card.number) || !plainText5(card.name) || !monthValue(card.expiration_month) || !yearValue(card.expiration_year) || typeof card.security_code !== "string" || !SECURITY_CODE17.test(card.security_code))
|
|
4899
|
+
return false;
|
|
4900
|
+
for (const key of ["email", "state", "city", "street1", "street2"]) {
|
|
4901
|
+
if (own8(card, key) && !optionalText2(card[key]))
|
|
4902
|
+
return false;
|
|
4903
|
+
}
|
|
4904
|
+
if (own8(card, "country") && (typeof card.country !== "string" || !COUNTRY5.test(card.country)))
|
|
4905
|
+
return false;
|
|
4906
|
+
if (own8(card, "phone_number") && !(card.phone_number === "" || phoneNumber(card.phone_number)))
|
|
4907
|
+
return false;
|
|
4908
|
+
if (own8(card, "postal_code")) {
|
|
4909
|
+
const code = card.postal_code;
|
|
4910
|
+
const sound = typeof code === "number" ? Number.isSafeInteger(code) && code >= 0 && code <= POSTAL_NUMBER_LIMIT : optionalText2(code);
|
|
4911
|
+
if (!sound)
|
|
4912
|
+
return false;
|
|
4913
|
+
}
|
|
4914
|
+
return true;
|
|
4915
|
+
}
|
|
4916
|
+
function omiseBodyVerdict(body) {
|
|
4917
|
+
const value = readBody17(body);
|
|
4918
|
+
if (value === null)
|
|
4919
|
+
return refuse31("omise_body_unsupported");
|
|
4920
|
+
const keys = Object.keys(value);
|
|
4921
|
+
if (keys.length !== 1 || keys[0] !== "card" || !cardMembers(value.card))
|
|
4922
|
+
return refuse31("omise_body_unsupported");
|
|
4923
|
+
return CARD30;
|
|
4924
|
+
}
|
|
4925
|
+
var pin10 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), keys: Object.freeze([...fields.keys]) });
|
|
4926
|
+
var OMISE_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
4927
|
+
pin10({ id: "taejai", merchant: "Taejai", origins: ["https://taejai.com"], keys: ["pkey_53q6mm66esjr563ob0h"] }),
|
|
4928
|
+
pin10({ id: "socialgiver", merchant: "Socialgiver", origins: ["https://www.socialgiver.com"], keys: ["pkey_5d5o2iahksmyrkybemg"] }),
|
|
4929
|
+
pin10({ id: "thireq_pecko_links", merchant: "Thireq Pecko", origins: ["https://linksplus.omise.co"], keys: ["pkey_65w70xniwsinf0gm680"] })
|
|
4930
|
+
]);
|
|
4931
|
+
// src/xendit.js
|
|
4932
|
+
var XENDIT_PSP = "xendit";
|
|
4933
|
+
var XENDIT_TOKEN_URL = "https://api.xendit.co/v2/credit_card_tokens";
|
|
4934
|
+
var XENDIT_TOKEN_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4935
|
+
"is_single_use",
|
|
4936
|
+
"card_data",
|
|
4937
|
+
"should_authenticate",
|
|
4938
|
+
"billing_details",
|
|
4939
|
+
"fp_session_id",
|
|
4940
|
+
"metadata",
|
|
4941
|
+
"amount",
|
|
4942
|
+
"card_cvn",
|
|
4943
|
+
"currency",
|
|
4944
|
+
"mid_label",
|
|
4945
|
+
"external_id"
|
|
4946
|
+
]);
|
|
4947
|
+
var XENDIT_CARD_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4948
|
+
"account_number",
|
|
4949
|
+
"exp_month",
|
|
4950
|
+
"exp_year",
|
|
4951
|
+
"cvn",
|
|
4952
|
+
"card_holder_name",
|
|
4953
|
+
"card_holder_email",
|
|
4954
|
+
"card_holder_first_name",
|
|
4955
|
+
"card_holder_last_name",
|
|
4956
|
+
"card_holder_phone_number"
|
|
4957
|
+
]);
|
|
4958
|
+
var BODY_LIMIT30 = 8192;
|
|
4959
|
+
var CARD_NUMBER15 = /^[0-9]{12,19}$/;
|
|
4960
|
+
var SECURITY_CODE18 = /^[0-9]{3,4}$/;
|
|
4961
|
+
var MONTH16 = /^(?:0[1-9]|1[0-2])$/;
|
|
4962
|
+
var YEAR17 = /^20[0-9]{2}$/;
|
|
4963
|
+
var CURRENCY4 = /^[A-Z]{3}$/;
|
|
4964
|
+
var AMOUNT_LIMIT3 = 1e12;
|
|
4965
|
+
var FP_SESSION = /^[A-Za-z0-9._:-]{0,256}$/;
|
|
4966
|
+
var FORTER_TOKEN = /^[A-Za-z0-9._~:+/=-]{1,1024}$/;
|
|
4967
|
+
var MID_LABEL = /^[A-Za-z0-9_.-]{1,64}$/;
|
|
4968
|
+
var EXTERNAL_ID = /^[\x21-\x7e]{1,255}$/;
|
|
4969
|
+
var PHONE4 = /^\+?[0-9]{6,15}$/;
|
|
4970
|
+
var TEXT_LIMIT11 = 256;
|
|
4971
|
+
var CONTROL12 = /[\u0000-\u001f\u007f]/;
|
|
4972
|
+
var BILLING_KEYS = /* @__PURE__ */ Object.freeze(["given_names", "surname", "email", "mobile_number", "phone_number", "address"]);
|
|
4973
|
+
var ADDRESS_KEYS5 = /* @__PURE__ */ Object.freeze(["country", "street_line1", "street_line2", "city", "province_state", "postal_code", "category"]);
|
|
4974
|
+
var AMOUNT_TEXT = /^[0-9]{1,13}(?:\.[0-9]{1,2})?$/;
|
|
4975
|
+
var record27 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4976
|
+
var own9 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4977
|
+
var inOrder5 = (value, keys) => {
|
|
4978
|
+
let at = 0;
|
|
4979
|
+
for (const name of Object.keys(value)) {
|
|
4980
|
+
while (at < keys.length && keys[at] !== name)
|
|
4981
|
+
at += 1;
|
|
4982
|
+
if (at === keys.length)
|
|
4983
|
+
return false;
|
|
4984
|
+
at += 1;
|
|
4985
|
+
}
|
|
4986
|
+
return true;
|
|
4987
|
+
};
|
|
4988
|
+
var wellFormed3 = (value) => {
|
|
4989
|
+
try {
|
|
4990
|
+
encodeURIComponent(value);
|
|
4991
|
+
return true;
|
|
4992
|
+
}
|
|
4993
|
+
catch {
|
|
4994
|
+
return false;
|
|
4995
|
+
}
|
|
4996
|
+
};
|
|
4997
|
+
var plainText6 = (value) => typeof value === "string" && value.length >= 1 && value.length <= TEXT_LIMIT11 && !CONTROL12.test(value) && (value.match(/[0-9]/g) ?? []).length < 12 && wellFormed3(value);
|
|
4998
|
+
var reference = (value) => typeof value === "string" && EXTERNAL_ID.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
|
|
4999
|
+
var refuse32 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
5000
|
+
var CARD31 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
5001
|
+
function isXenditTokenUrl(url) {
|
|
5002
|
+
return url === XENDIT_TOKEN_URL;
|
|
5003
|
+
}
|
|
5004
|
+
function readBody18(body) {
|
|
5005
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT30)
|
|
5006
|
+
return null;
|
|
5007
|
+
let value;
|
|
5008
|
+
try {
|
|
5009
|
+
value = JSON.parse(body);
|
|
5010
|
+
if (!record27(value) || JSON.stringify(value) !== body)
|
|
5011
|
+
return null;
|
|
5012
|
+
}
|
|
5013
|
+
catch {
|
|
5014
|
+
return null;
|
|
5015
|
+
}
|
|
5016
|
+
return value;
|
|
5017
|
+
}
|
|
5018
|
+
function amountValue(value) {
|
|
5019
|
+
if (typeof value === "number" && !Number.isFinite(value))
|
|
5020
|
+
return false;
|
|
5021
|
+
const text9 = typeof value === "number" ? String(value) : value;
|
|
5022
|
+
if (typeof text9 !== "string" || !AMOUNT_TEXT.test(text9))
|
|
5023
|
+
return false;
|
|
5024
|
+
const amount2 = Number(text9);
|
|
5025
|
+
return amount2 > 0 && amount2 <= AMOUNT_LIMIT3;
|
|
5026
|
+
}
|
|
5027
|
+
function billingDetails(value) {
|
|
5028
|
+
if (!record27(value) || !inOrder5(value, BILLING_KEYS))
|
|
5029
|
+
return false;
|
|
5030
|
+
return Object.keys(value).every((key) => {
|
|
5031
|
+
const field2 = value[key];
|
|
5032
|
+
if (key !== "address")
|
|
5033
|
+
return key === "mobile_number" || key === "phone_number" ? typeof field2 === "string" && PHONE4.test(field2) : plainText6(field2);
|
|
5034
|
+
return record27(field2) && inOrder5(field2, ADDRESS_KEYS5) && Object.keys(field2).every((name) => plainText6(field2[name]));
|
|
5035
|
+
});
|
|
5036
|
+
}
|
|
5037
|
+
function cardData(value) {
|
|
5038
|
+
if (!record27(value) || !inOrder5(value, XENDIT_CARD_KEYS))
|
|
5039
|
+
return false;
|
|
5040
|
+
if (typeof value.account_number !== "string" || !CARD_NUMBER15.test(value.account_number) || typeof value.exp_month !== "string" || !MONTH16.test(value.exp_month) || typeof value.exp_year !== "string" || !YEAR17.test(value.exp_year) || typeof value.cvn !== "string" || !SECURITY_CODE18.test(value.cvn))
|
|
5041
|
+
return false;
|
|
5042
|
+
for (const key of ["card_holder_name", "card_holder_email", "card_holder_first_name", "card_holder_last_name"]) {
|
|
5043
|
+
if (own9(value, key) && !plainText6(value[key]))
|
|
5044
|
+
return false;
|
|
5045
|
+
}
|
|
5046
|
+
return !own9(value, "card_holder_phone_number") || typeof value.card_holder_phone_number === "string" && PHONE4.test(value.card_holder_phone_number);
|
|
5047
|
+
}
|
|
5048
|
+
function xenditBodyVerdict(body) {
|
|
5049
|
+
const value = readBody18(body);
|
|
5050
|
+
if (value === null || !inOrder5(value, XENDIT_TOKEN_KEYS) || !own9(value, "is_single_use") || !own9(value, "card_data")) {
|
|
5051
|
+
return refuse32("xendit_body_unsupported");
|
|
5052
|
+
}
|
|
5053
|
+
if (value.is_single_use !== true)
|
|
5054
|
+
return value.is_single_use === false ? refuse32("xendit_multiple_use") : refuse32("xendit_body_unsupported");
|
|
5055
|
+
if (!cardData(value.card_data) || value.should_authenticate !== true || !amountValue(value.amount) || typeof value.currency !== "string" || !CURRENCY4.test(value.currency))
|
|
5056
|
+
return refuse32("xendit_body_unsupported");
|
|
5057
|
+
if (own9(value, "card_cvn") && value.card_cvn !== value.card_data.cvn)
|
|
5058
|
+
return refuse32("xendit_body_unsupported");
|
|
5059
|
+
if (own9(value, "billing_details") && !billingDetails(value.billing_details))
|
|
5060
|
+
return refuse32("xendit_body_unsupported");
|
|
5061
|
+
if (own9(value, "fp_session_id") && (typeof value.fp_session_id !== "string" || !FP_SESSION.test(value.fp_session_id)))
|
|
5062
|
+
return refuse32("xendit_body_unsupported");
|
|
5063
|
+
if (own9(value, "metadata")) {
|
|
5064
|
+
const metadata = value.metadata;
|
|
5065
|
+
if (!record27(metadata) || Object.keys(metadata).length !== 1 || !record27(metadata._forter) || Object.keys(metadata._forter).length !== 1 || typeof metadata._forter.token !== "string" || !FORTER_TOKEN.test(metadata._forter.token))
|
|
5066
|
+
return refuse32("xendit_body_unsupported");
|
|
5067
|
+
}
|
|
5068
|
+
if (own9(value, "mid_label") && (typeof value.mid_label !== "string" || !MID_LABEL.test(value.mid_label)))
|
|
5069
|
+
return refuse32("xendit_body_unsupported");
|
|
5070
|
+
if (own9(value, "external_id") && !reference(value.external_id))
|
|
5071
|
+
return refuse32("xendit_body_unsupported");
|
|
5072
|
+
return CARD31;
|
|
5073
|
+
}
|
|
5074
|
+
// src/card-fields.js
|
|
5075
|
+
function processorGate(recognizer, url, body) {
|
|
5076
|
+
if (recognizer && recognizer.psp === LYRA_PSP)
|
|
5077
|
+
return lyraBodyVerdict(body, url);
|
|
5078
|
+
if (recognizer && recognizer.psp === WIX_PAYMENTS_PSP) {
|
|
5079
|
+
if (url !== void 0 && !isWixPaymentsTokenizeUrl(url))
|
|
5080
|
+
return { verdict: "refuse", code: "wix_payments_url_refused" };
|
|
5081
|
+
return wixPaymentsBodyVerdict(body);
|
|
5082
|
+
}
|
|
5083
|
+
if (recognizer && recognizer.psp === KOMOJU_PSP)
|
|
5084
|
+
return komojuBodyVerdict(body, url);
|
|
5085
|
+
if (recognizer && recognizer.psp === HIPAY_PSP) {
|
|
5086
|
+
if (url !== void 0 && !isHipayTokenUrl(url))
|
|
5087
|
+
return { verdict: "refuse", code: "hipay_url_refused" };
|
|
5088
|
+
return hipayBodyVerdict(body);
|
|
5089
|
+
}
|
|
5090
|
+
if (recognizer && recognizer.psp === PAYPAL_PSP) {
|
|
5091
|
+
if (url !== void 0 && !isPaypalConfirmUrl(url))
|
|
5092
|
+
return { verdict: "refuse", code: "paypal_url_refused" };
|
|
5093
|
+
return paypalBodyVerdict(body);
|
|
5094
|
+
}
|
|
5095
|
+
if (recognizer && recognizer.psp === MAKECOMMERCE_PSP)
|
|
5096
|
+
return makecommerceBodyVerdict(body, url);
|
|
5097
|
+
if (recognizer && recognizer.psp === OPENPAY_PSP)
|
|
5098
|
+
return openpayBodyVerdict(body, url);
|
|
5099
|
+
if (recognizer && recognizer.psp === POYNT_PSP) {
|
|
5100
|
+
if (url !== void 0 && !isPoyntNonceUrl(url))
|
|
5101
|
+
return { verdict: "refuse", code: "poynt_url_refused" };
|
|
5102
|
+
return poyntBodyVerdict(body);
|
|
5103
|
+
}
|
|
5104
|
+
if (recognizer && recognizer.psp === CARDCOM_PSP)
|
|
5105
|
+
return cardcomBodyVerdict(body, url);
|
|
5106
|
+
if (recognizer && recognizer.psp === TOAST_PSP) {
|
|
5107
|
+
if (url !== void 0 && !isToastPaymentMethodsUrl(url))
|
|
5108
|
+
return { verdict: "refuse", code: "toast_url_refused" };
|
|
5109
|
+
return toastBodyVerdict(body);
|
|
5110
|
+
}
|
|
5111
|
+
if (recognizer && recognizer.psp === PADDLE_VGS_PSP) {
|
|
5112
|
+
if (url !== void 0 && !isPaddleVgsCardsUrl(url))
|
|
5113
|
+
return { verdict: "refuse", code: "paddle_vgs_url_refused" };
|
|
5114
|
+
return paddleVgsBodyVerdict(body);
|
|
5115
|
+
}
|
|
5116
|
+
if (recognizer && recognizer.psp === PAYFAST_PSP) {
|
|
5117
|
+
if (url !== void 0 && !isPayfastPayUrl(url))
|
|
5118
|
+
return { verdict: "refuse", code: "payfast_url_refused" };
|
|
5119
|
+
return payfastBodyVerdict(body);
|
|
5120
|
+
}
|
|
5121
|
+
if (recognizer && recognizer.psp === PAYREXX_PSP) {
|
|
5122
|
+
return url !== void 0 ? payrexxGateVerdict(url, body) : payrexxBodyVerdict(body);
|
|
5123
|
+
}
|
|
5124
|
+
if (recognizer && recognizer.psp === PAYGENT_PSP) {
|
|
5125
|
+
return url !== void 0 ? paygentRequestVerdict(url, body) : paygentBodyVerdict(body);
|
|
5126
|
+
}
|
|
5127
|
+
if (recognizer && recognizer.psp === PAY_NL_PSP) {
|
|
5128
|
+
if (url !== void 0 && !isPayNlTokenUrl(url))
|
|
5129
|
+
return { verdict: "refuse", code: "pay_nl_url_refused" };
|
|
5130
|
+
return payNlBodyVerdict(body);
|
|
5131
|
+
}
|
|
5132
|
+
if (recognizer && recognizer.psp === TWOC2P_PSP) {
|
|
5133
|
+
if (url === void 0)
|
|
5134
|
+
return twoC2pBodyVerdict(body);
|
|
5135
|
+
const target = twoC2pPaymentTarget(url);
|
|
5136
|
+
if (target === null)
|
|
5137
|
+
return { verdict: "refuse", code: "twoc2p_url_refused" };
|
|
5138
|
+
if (!target.reviewed)
|
|
5139
|
+
return twoC2pPaymentCarriesCard(body) ? { verdict: "refuse", code: "twoc2p_build_unreviewed" } : { verdict: "continue" };
|
|
5140
|
+
const keyBytes = twoC2pKeyBytes(target.environment);
|
|
5141
|
+
return keyBytes === null ? { verdict: "refuse", code: "twoc2p_field_unreviewed" } : twoC2pBodyVerdict(body, keyBytes, target.environment);
|
|
5142
|
+
}
|
|
5143
|
+
if (recognizer && recognizer.psp === APS_PSP)
|
|
5144
|
+
return apsBodyVerdict(body, url);
|
|
5145
|
+
if (recognizer && recognizer.psp === CONEKTA_PSP)
|
|
5146
|
+
return conektaBodyVerdict(body, url);
|
|
5147
|
+
if (recognizer && recognizer.psp === PADDLE_TOKENEX_PSP) {
|
|
5148
|
+
const target = url !== void 0 ? paddleTokenexPayTarget(url) : null;
|
|
5149
|
+
if (url !== void 0 && target === null)
|
|
5150
|
+
return { verdict: "refuse", code: "paddle_tokenex_pay_unsupported" };
|
|
5151
|
+
return paddleTokenexBodyVerdict(body, target ? target.line : void 0);
|
|
5152
|
+
}
|
|
5153
|
+
if (recognizer && recognizer.psp === PAYMONGO_PSP) {
|
|
5154
|
+
const session = url !== void 0 ? paymongoCheckoutSession(url) : void 0;
|
|
5155
|
+
if (url !== void 0 && session === null)
|
|
5156
|
+
return { verdict: "refuse", code: "paymongo_url_refused" };
|
|
5157
|
+
return paymongoBodyVerdict(body, session);
|
|
5158
|
+
}
|
|
5159
|
+
if (recognizer && recognizer.psp === GOPAY_PSP)
|
|
5160
|
+
return gopayBodyVerdict(body, url);
|
|
5161
|
+
if (recognizer && recognizer.psp === REVOLUT_PSP) {
|
|
5162
|
+
if (url !== void 0 && !isRevolutPaymentsUrl(url))
|
|
5163
|
+
return { verdict: "refuse", code: "revolut_url_refused" };
|
|
5164
|
+
return revolutBodyVerdict(body);
|
|
5165
|
+
}
|
|
5166
|
+
if (recognizer && recognizer.psp === SUMUP_PSP)
|
|
5167
|
+
return sumupBodyVerdict(body, url);
|
|
5168
|
+
if (recognizer && recognizer.psp === CLOVER_PSP)
|
|
5169
|
+
return cloverBodyVerdict(body, url);
|
|
5170
|
+
if (recognizer && recognizer.psp === TAP_PAYMENTS_PSP) {
|
|
5171
|
+
if (url !== void 0 && !isTapPaymentsTokenUrl(url))
|
|
5172
|
+
return { verdict: "refuse", code: "tap_payments_url_refused" };
|
|
5173
|
+
return tapPaymentsBodyVerdict(body);
|
|
5174
|
+
}
|
|
5175
|
+
if (recognizer && recognizer.psp === TOKENEX_IFRAME_PSP)
|
|
5176
|
+
return tokenexIframeBodyVerdict(body, url);
|
|
5177
|
+
if (recognizer && recognizer.psp === NEXI_CHECKOUT_PSP)
|
|
5178
|
+
return nexiCheckoutBodyVerdict(body, url);
|
|
5179
|
+
if (recognizer && recognizer.psp === FASTSPRING_PSP) {
|
|
5180
|
+
if (url !== void 0 && !isFastspringCardUrl(url))
|
|
5181
|
+
return { verdict: "refuse", code: "fastspring_url_refused" };
|
|
5182
|
+
return fastspringBodyVerdict(body);
|
|
5183
|
+
}
|
|
5184
|
+
if (recognizer && recognizer.psp === OMISE_PSP) {
|
|
5185
|
+
if (url !== void 0 && !isOmiseTokenUrl(url))
|
|
5186
|
+
return { verdict: "refuse", code: "omise_url_refused" };
|
|
5187
|
+
return omiseBodyVerdict(body);
|
|
5188
|
+
}
|
|
5189
|
+
if (recognizer && recognizer.psp === XENDIT_PSP) {
|
|
5190
|
+
if (url !== void 0 && !isXenditTokenUrl(url))
|
|
5191
|
+
return { verdict: "refuse", code: "xendit_url_refused" };
|
|
5192
|
+
return xenditBodyVerdict(body);
|
|
5193
|
+
}
|
|
5194
|
+
if (recognizer && recognizer.psp === GRAVY_PSP)
|
|
5195
|
+
return gravyBodyVerdict(body);
|
|
5196
|
+
if (recognizer && recognizer.psp === MONERIS_PSP) {
|
|
5197
|
+
if (url !== void 0 && !isMonerisTokenizeUrl(url))
|
|
5198
|
+
return { verdict: "refuse", code: "moneris_url_refused" };
|
|
5199
|
+
return monerisBodyVerdict(body);
|
|
5200
|
+
}
|
|
5201
|
+
if (!recognizer || recognizer.psp !== "elavon_converge")
|
|
5202
|
+
return null;
|
|
5203
|
+
if (url !== void 0 && !isConvergeProcessUrl(url))
|
|
5204
|
+
return { verdict: "refuse", code: "converge_url_refused" };
|
|
5205
|
+
return convergeBodyVerdict(body);
|
|
5206
|
+
}
|
|
5207
|
+
function carriesCardFields(recognizer, body) {
|
|
5208
|
+
const gate = processorGate(recognizer, void 0, body);
|
|
5209
|
+
if (gate !== null)
|
|
5210
|
+
return gate.verdict === "card";
|
|
5211
|
+
if (recognizer && recognizer.encoding === "json") {
|
|
5212
|
+
const claimed = carriesJsonCardFields(recognizer.jsonCardFields, body, DECLARED_PATHS_ONLY.has(recognizer.psp));
|
|
5213
|
+
return claimed && recognizer.psp === "amadeus_checkout" ? amadeusBodyKind(body) === "card" : claimed;
|
|
5214
|
+
}
|
|
5215
|
+
const fields = recognizer && recognizer.cardFields;
|
|
5216
|
+
if (!Array.isArray(fields) || fields.length === 0)
|
|
5217
|
+
return true;
|
|
5218
|
+
if (recognizer.encoding !== "form")
|
|
5219
|
+
return true;
|
|
5220
|
+
if (typeof body !== "string" || body === "")
|
|
5221
|
+
return false;
|
|
5222
|
+
const anyCase = recognizer.caseInsensitiveFormKeys === true;
|
|
5223
|
+
const wanted = anyCase ? fields.map((field2) => String(field2).toLowerCase()) : fields;
|
|
5224
|
+
for (const chunk of body.split("&")) {
|
|
5225
|
+
const eq = chunk.indexOf("=");
|
|
5226
|
+
if (eq <= 0 || eq === chunk.length - 1)
|
|
5227
|
+
continue;
|
|
5228
|
+
let key;
|
|
5229
|
+
try {
|
|
5230
|
+
key = decodeURIComponent(chunk.slice(0, eq).replace(/\+/g, " "));
|
|
5231
|
+
}
|
|
5232
|
+
catch {
|
|
5233
|
+
continue;
|
|
5234
|
+
}
|
|
5235
|
+
if (wanted.includes(anyCase ? key.trim().toLowerCase() : key))
|
|
5236
|
+
return true;
|
|
5237
|
+
}
|
|
5238
|
+
return false;
|
|
5239
|
+
}
|
|
5240
|
+
var DECLARED_PATHS_ONLY = /* @__PURE__ */ new Set(["primer", "pelecard", "creditguard", "payrails"]);
|
|
5241
|
+
function carriesJsonCardFields(paths, body, declaredOnly) {
|
|
5242
|
+
if (!Array.isArray(paths) || paths.length === 0 || !paths.every((path) => isJsonPath(path) && path.length > 0))
|
|
5243
|
+
return true;
|
|
5244
|
+
if (declaredOnly)
|
|
5245
|
+
return declaredPathHoldsCard(paths, body);
|
|
5246
|
+
let parsed;
|
|
5247
|
+
try {
|
|
5248
|
+
parsed = typeof body === "string" ? JSON.parse(body) : void 0;
|
|
5249
|
+
}
|
|
5250
|
+
catch {
|
|
5251
|
+
return true;
|
|
5252
|
+
}
|
|
5253
|
+
if (!isPlainObject(parsed))
|
|
5254
|
+
return true;
|
|
5255
|
+
if (paths.some((path) => {
|
|
5256
|
+
const at = jsonAt(parsed, path);
|
|
5257
|
+
return at.found && (typeof at.value === "string" && at.value !== "" || typeof at.value === "number");
|
|
5258
|
+
}))
|
|
5259
|
+
return true;
|
|
5260
|
+
const declared = /* @__PURE__ */ new Set();
|
|
5261
|
+
for (const path of paths) {
|
|
5262
|
+
const last = path[path.length - 1];
|
|
5263
|
+
if (typeof last === "string")
|
|
5264
|
+
declared.add(last.toLowerCase());
|
|
5265
|
+
}
|
|
5266
|
+
return namesCardNumber(parsed, declared);
|
|
5267
|
+
}
|
|
5268
|
+
function declaredPathHoldsCard(paths, body) {
|
|
5269
|
+
if (typeof body !== "string" || body === "")
|
|
5270
|
+
return false;
|
|
5271
|
+
let parsed;
|
|
5272
|
+
try {
|
|
5273
|
+
parsed = JSON.parse(body);
|
|
5274
|
+
}
|
|
5275
|
+
catch {
|
|
5276
|
+
return false;
|
|
5277
|
+
}
|
|
5278
|
+
return paths.some((path) => {
|
|
5279
|
+
const at = jsonAt(parsed, path);
|
|
5280
|
+
return at.found && (typeof at.value === "string" && at.value !== "" || typeof at.value === "number");
|
|
5281
|
+
});
|
|
5282
|
+
}
|
|
5283
|
+
function namesCardNumber(root, declared) {
|
|
5284
|
+
const pending = [root];
|
|
5285
|
+
while (pending.length > 0) {
|
|
5286
|
+
const node = pending.pop();
|
|
5287
|
+
const named = !Array.isArray(node);
|
|
5288
|
+
for (const key of Object.keys(node)) {
|
|
5289
|
+
if (named) {
|
|
5290
|
+
const name = key.slice(key.lastIndexOf(".") + 1).toLowerCase();
|
|
5291
|
+
if (declared.has(name) || CARD_NUMBER_KEY.test(name) || name.endsWith("cardnumber"))
|
|
5292
|
+
return true;
|
|
3079
5293
|
}
|
|
3080
5294
|
const value = node[key];
|
|
3081
5295
|
if (value !== null && typeof value === "object")
|
|
@@ -3097,20 +5311,20 @@ var KEEP_ON_FILE_REFUSAL = "Refusing to pay: this Primer payment would keep the
|
|
|
3097
5311
|
var UNSUPPORTED_SDK_REFUSAL = "Refusing to pay: this checkout uses a Primer SDK Agentcard does not support yet. Nothing was sent.";
|
|
3098
5312
|
var NETWORK_MISMATCH_REFUSAL = "Refusing to pay: this Primer payment names a card network that is not your card's. Nothing was sent.";
|
|
3099
5313
|
var FILL_REFUSAL = "Could not fill the card fields for Primer. Nothing was sent.";
|
|
3100
|
-
var
|
|
5314
|
+
var BODY_LIMIT31 = 16384;
|
|
3101
5315
|
var RESPONSE_LIMIT = 32768;
|
|
3102
|
-
var
|
|
5316
|
+
var ROOT_KEYS10 = ["paymentInstrument", "userDescription", "tokenType", "paymentFlow"];
|
|
3103
5317
|
var INSTRUMENT_KEYS = ["number", "cvv", "expirationMonth", "expirationYear", "cardholderName", "preferredNetwork"];
|
|
3104
5318
|
var REQUIRED_INSTRUMENT_KEYS = ["number", "cvv", "expirationMonth", "expirationYear"];
|
|
3105
|
-
var
|
|
3106
|
-
var
|
|
3107
|
-
var
|
|
3108
|
-
var
|
|
3109
|
-
var
|
|
3110
|
-
var
|
|
3111
|
-
var
|
|
3112
|
-
var
|
|
3113
|
-
var
|
|
5319
|
+
var record28 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
5320
|
+
var owns7 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
5321
|
+
var exact4 = (pattern, value) => typeof value === "string" && pattern.exec(value)?.[0] === value;
|
|
5322
|
+
var text8 = (value, max) => typeof value === "string" && value.length <= max && !/[\u0000-\u001f\u007f]/.test(value);
|
|
5323
|
+
var digits3 = (value, min, max) => typeof value === "string" && value.length >= min && value.length <= max && !/[^0-9]/.test(value);
|
|
5324
|
+
var panLike2 = (value) => /(?:[0-9][ _.:-]*){12,}/.test(value);
|
|
5325
|
+
var plain2 = (value, max) => text8(value, max) && !panLike2(value);
|
|
5326
|
+
var MONTH17 = /^(?:0[1-9]|1[0-2])$/;
|
|
5327
|
+
var YEAR18 = /^20[0-9]{2}$/;
|
|
3114
5328
|
var NETWORK2 = /^[A-Z][A-Z_]{1,31}$/;
|
|
3115
5329
|
function isPrimerTokenizeUrl(url, method = "POST") {
|
|
3116
5330
|
if (method !== "POST" || typeof url !== "string" || url.length > 256 || url.includes("?") || url.includes("#"))
|
|
@@ -3124,8 +5338,8 @@ function isPrimerTokenizeUrl(url, method = "POST") {
|
|
|
3124
5338
|
}
|
|
3125
5339
|
return parsed.href === url && parsed.protocol === "https:" && !parsed.port && !parsed.username && !parsed.password && !parsed.search && !parsed.hash && PRIMER_PCI_HOSTS.includes(parsed.hostname) && parsed.pathname === PRIMER_TOKENIZE_PATH;
|
|
3126
5340
|
}
|
|
3127
|
-
function
|
|
3128
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
5341
|
+
function judgeBody5(body) {
|
|
5342
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT31)
|
|
3129
5343
|
return null;
|
|
3130
5344
|
let value;
|
|
3131
5345
|
try {
|
|
@@ -3134,21 +5348,21 @@ function judgeBody4(body) {
|
|
|
3134
5348
|
catch {
|
|
3135
5349
|
return null;
|
|
3136
5350
|
}
|
|
3137
|
-
if (!
|
|
5351
|
+
if (!record28(value) || !roundTrips(value, body))
|
|
3138
5352
|
return null;
|
|
3139
|
-
if (!Object.keys(value).every((key) =>
|
|
5353
|
+
if (!Object.keys(value).every((key) => ROOT_KEYS10.includes(key)) || !owns7(value, "paymentInstrument"))
|
|
3140
5354
|
return null;
|
|
3141
5355
|
const instrument = value.paymentInstrument;
|
|
3142
|
-
if (!
|
|
5356
|
+
if (!record28(instrument) || !Object.keys(instrument).every((key) => INSTRUMENT_KEYS.includes(key)) || !REQUIRED_INSTRUMENT_KEYS.every((key) => owns7(instrument, key)))
|
|
3143
5357
|
return null;
|
|
3144
|
-
if (!
|
|
5358
|
+
if (!digits3(instrument.number, 12, 19) || !digits3(instrument.cvv, 3, 4) || !exact4(MONTH17, instrument.expirationMonth) || !exact4(YEAR18, instrument.expirationYear))
|
|
3145
5359
|
return null;
|
|
3146
|
-
if (
|
|
5360
|
+
if (owns7(instrument, "cardholderName") && instrument.cardholderName !== null && !plain2(instrument.cardholderName, 256) || owns7(instrument, "preferredNetwork") && instrument.preferredNetwork !== null && !exact4(NETWORK2, instrument.preferredNetwork) || owns7(value, "userDescription") && value.userDescription !== null && !plain2(value.userDescription, 256) || owns7(value, "tokenType") && value.tokenType !== "MULTI_USE" || owns7(value, "paymentFlow") && value.paymentFlow !== "VAULT")
|
|
3147
5361
|
return null;
|
|
3148
|
-
return { value, keepOnFile:
|
|
5362
|
+
return { value, keepOnFile: owns7(value, "tokenType") || owns7(value, "paymentFlow") };
|
|
3149
5363
|
}
|
|
3150
5364
|
function primerBodyRefusal(body) {
|
|
3151
|
-
const judged =
|
|
5365
|
+
const judged = judgeBody5(body);
|
|
3152
5366
|
if (!judged)
|
|
3153
5367
|
return "unsupported";
|
|
3154
5368
|
return judged.keepOnFile ? "keep_on_file" : null;
|
|
@@ -3157,7 +5371,7 @@ function isPrimerNewCardBody(body) {
|
|
|
3157
5371
|
return primerBodyRefusal(body) === null;
|
|
3158
5372
|
}
|
|
3159
5373
|
function primerKeepOnFileRequested(body) {
|
|
3160
|
-
const judged =
|
|
5374
|
+
const judged = judgeBody5(body);
|
|
3161
5375
|
return judged ? judged.keepOnFile : null;
|
|
3162
5376
|
}
|
|
3163
5377
|
var CARD_GATE = /* @__PURE__ */ Object.freeze({ psp: "primer", encoding: "json", jsonCardFields: [["paymentInstrument", "number"]] });
|
|
@@ -3167,7 +5381,7 @@ var CLIENT_TOKEN = /^[A-Za-z0-9._~+/=-]{16,4096}$/;
|
|
|
3167
5381
|
var REQUEST_ID = /^[A-Za-z0-9-]{1,64}$/;
|
|
3168
5382
|
var API_VERSION = /^2\.[0-9]{1,2}$/;
|
|
3169
5383
|
function readHeaders(headers) {
|
|
3170
|
-
if (!
|
|
5384
|
+
if (!record28(headers))
|
|
3171
5385
|
return null;
|
|
3172
5386
|
const folded = /* @__PURE__ */ new Map();
|
|
3173
5387
|
for (const [name, value] of Object.entries(headers)) {
|
|
@@ -3185,9 +5399,9 @@ function headersRefusal(headers) {
|
|
|
3185
5399
|
const version = folded.get("primer-sdk-version");
|
|
3186
5400
|
if (typeof version !== "string")
|
|
3187
5401
|
return "unsupported";
|
|
3188
|
-
if (!
|
|
5402
|
+
if (!exact4(LEGACY_SDK_VERSION, version))
|
|
3189
5403
|
return "unsupported_sdk";
|
|
3190
|
-
if (!
|
|
5404
|
+
if (!exact4(CONTENT_TYPE2, folded.get("content-type")) || !exact4(CLIENT_TOKEN, folded.get("primer-client-token")) || folded.has("primer-sdk-client") && folded.get("primer-sdk-client") !== "WEB" || folded.has("x-api-version") && !exact4(API_VERSION, folded.get("x-api-version")) || folded.has("primer-sdk-checkout-session-id") && !exact4(REQUEST_ID, folded.get("primer-sdk-checkout-session-id")) || folded.has("x-request-id") && !exact4(REQUEST_ID, folded.get("x-request-id")))
|
|
3191
5405
|
return "unsupported";
|
|
3192
5406
|
return null;
|
|
3193
5407
|
}
|
|
@@ -3214,7 +5428,7 @@ function onTokenizePath(url) {
|
|
|
3214
5428
|
}
|
|
3215
5429
|
}
|
|
3216
5430
|
function primerTokenizeRefusal(request) {
|
|
3217
|
-
if (!
|
|
5431
|
+
if (!record28(request) || request.method !== "POST" || !isPrimerTokenizeUrl(request.url))
|
|
3218
5432
|
return "unsupported";
|
|
3219
5433
|
return headersRefusal(request.headers) ?? primerBodyRefusal(request.body);
|
|
3220
5434
|
}
|
|
@@ -3229,7 +5443,7 @@ function primerCardOnFileRefusal(url, options, policy = PRIMER_SESSION_CARD_ON_F
|
|
|
3229
5443
|
return "unsupported";
|
|
3230
5444
|
if (new URL(url).hostname !== LIVE_PCI_HOST)
|
|
3231
5445
|
return null;
|
|
3232
|
-
return primerCardOnFileDisclosure(url, policy) &&
|
|
5446
|
+
return primerCardOnFileDisclosure(url, policy) && record28(options) && options.keepOnFile === true ? null : "keep_on_file";
|
|
3233
5447
|
}
|
|
3234
5448
|
function primerRefusalMessage(reason) {
|
|
3235
5449
|
if (reason === "keep_on_file")
|
|
@@ -3241,7 +5455,7 @@ function primerRefusalMessage(reason) {
|
|
|
3241
5455
|
return UNSUPPORTED_REFUSAL;
|
|
3242
5456
|
}
|
|
3243
5457
|
function primerCardNetwork(number) {
|
|
3244
|
-
if (!
|
|
5458
|
+
if (!digits3(number, 12, 19))
|
|
3245
5459
|
return null;
|
|
3246
5460
|
const two = Number(number.slice(0, 2));
|
|
3247
5461
|
const four = Number(number.slice(0, 4));
|
|
@@ -3254,7 +5468,7 @@ function primerCardNetwork(number) {
|
|
|
3254
5468
|
return null;
|
|
3255
5469
|
}
|
|
3256
5470
|
function primerNetworkRefusal(body, card) {
|
|
3257
|
-
const judged =
|
|
5471
|
+
const judged = judgeBody5(body);
|
|
3258
5472
|
if (!judged)
|
|
3259
5473
|
return "unsupported";
|
|
3260
5474
|
const preferred = judged.value.paymentInstrument.preferredNetwork;
|
|
@@ -3264,14 +5478,14 @@ function primerNetworkRefusal(body, card) {
|
|
|
3264
5478
|
return network !== null && network === preferred ? null : "network_mismatch";
|
|
3265
5479
|
}
|
|
3266
5480
|
function injectPrimerCard(body, card) {
|
|
3267
|
-
const judged =
|
|
5481
|
+
const judged = judgeBody5(body);
|
|
3268
5482
|
if (!judged)
|
|
3269
5483
|
throw new Error(UNSUPPORTED_REFUSAL);
|
|
3270
5484
|
if (judged.keepOnFile)
|
|
3271
5485
|
throw new Error(KEEP_ON_FILE_REFUSAL);
|
|
3272
|
-
const month = card && (Number.isInteger(card.month) ||
|
|
3273
|
-
const year = card && (Number.isInteger(card.year) ||
|
|
3274
|
-
if (!card || !
|
|
5486
|
+
const month = card && (Number.isInteger(card.month) || digits3(card.month, 1, 2)) ? Number(card.month) : NaN;
|
|
5487
|
+
const year = card && (Number.isInteger(card.year) || digits3(card.year, 2, 4)) ? Number(card.year) : NaN;
|
|
5488
|
+
if (!card || !digits3(card.number, 12, 19) || !(month >= 1 && month <= 12) || !(year >= 0 && year <= 99 || year >= 2e3 && year <= 2099) || !digits3(card.cvc, 3, 4)) {
|
|
3275
5489
|
throw new Error(FILL_REFUSAL);
|
|
3276
5490
|
}
|
|
3277
5491
|
if (primerNetworkRefusal(body, card) !== null)
|
|
@@ -3282,15 +5496,15 @@ function injectPrimerCard(body, card) {
|
|
|
3282
5496
|
instrument.expirationMonth = String(month).padStart(2, "0");
|
|
3283
5497
|
instrument.expirationYear = String(year < 100 ? 2e3 + year : year);
|
|
3284
5498
|
const where = ["paymentInstrument.number", "paymentInstrument.cvv", "paymentInstrument.expirationMonth", "paymentInstrument.expirationYear"];
|
|
3285
|
-
if (typeof instrument.cardholderName === "string" && typeof card.name === "string" && card.name.trim() !== "" &&
|
|
5499
|
+
if (typeof instrument.cardholderName === "string" && typeof card.name === "string" && card.name.trim() !== "" && plain2(card.name, 256)) {
|
|
3286
5500
|
instrument.cardholderName = card.name;
|
|
3287
5501
|
where.push("paymentInstrument.cardholderName");
|
|
3288
5502
|
}
|
|
3289
5503
|
return { body: JSON.stringify(judged.value), where };
|
|
3290
5504
|
}
|
|
3291
|
-
var
|
|
5505
|
+
var TOKEN4 = /^[A-Za-z0-9_-]{8,256}$/;
|
|
3292
5506
|
var ERROR_ID = /^[A-Za-z][A-Za-z0-9_.-]{0,63}$/;
|
|
3293
|
-
var
|
|
5507
|
+
var CODE7 = /^[A-Z][A-Z0-9_]{0,63}$/;
|
|
3294
5508
|
var NETWORK_NAME = /^[A-Za-z][A-Za-z0-9 _-]{0,31}$/;
|
|
3295
5509
|
var RESPONSE_MONTH = /^(?:0?[1-9]|1[0-2])$/;
|
|
3296
5510
|
var RESPONSE_YEAR = /^(?:[0-9]{2}|20[0-9]{2})$/;
|
|
@@ -3313,30 +5527,30 @@ function readAnswer(body) {
|
|
|
3313
5527
|
return null;
|
|
3314
5528
|
try {
|
|
3315
5529
|
const value = JSON.parse(body);
|
|
3316
|
-
return
|
|
5530
|
+
return record28(value) ? value : null;
|
|
3317
5531
|
}
|
|
3318
5532
|
catch {
|
|
3319
5533
|
return null;
|
|
3320
5534
|
}
|
|
3321
5535
|
}
|
|
3322
|
-
var tokenValue = (value) =>
|
|
3323
|
-
var optional = (value, key, check) => !
|
|
5536
|
+
var tokenValue = (value) => exact4(TOKEN4, value) && !panLike2(value);
|
|
5537
|
+
var optional = (value, key, check) => !owns7(value, key) || value[key] === null || check(value[key]);
|
|
3324
5538
|
function cardDetails(data) {
|
|
3325
|
-
if (!
|
|
5539
|
+
if (!record28(data) || !exact4(/^[0-9]{4}$/, data.last4Digits))
|
|
3326
5540
|
return null;
|
|
3327
|
-
if (!optional(data, "first6Digits", (v) =>
|
|
5541
|
+
if (!optional(data, "first6Digits", (v) => exact4(/^[0-9]{6}$/, v)) || !optional(data, "expirationMonth", (v) => exact4(RESPONSE_MONTH, v)) || !optional(data, "expirationYear", (v) => exact4(RESPONSE_YEAR, v)) || !optional(data, "cardholderName", (v) => plain2(v, 256)) || !optional(data, "network", (v) => exact4(NETWORK_NAME, v)) || !optional(data, "isNetworkTokenized", (v) => typeof v === "boolean") || !optional(data, "binData", record28))
|
|
3328
5542
|
return null;
|
|
3329
5543
|
const safe = { last4Digits: data.last4Digits };
|
|
3330
5544
|
for (const key of ["first6Digits", "expirationMonth", "expirationYear", "cardholderName", "network", "isNetworkTokenized"]) {
|
|
3331
|
-
if (
|
|
5545
|
+
if (owns7(data, key) && data[key] !== null)
|
|
3332
5546
|
safe[key] = data[key];
|
|
3333
5547
|
}
|
|
3334
|
-
if (
|
|
5548
|
+
if (record28(data.binData)) {
|
|
3335
5549
|
const bin = {};
|
|
3336
5550
|
for (const key of BIN_KEYS) {
|
|
3337
|
-
if (!
|
|
5551
|
+
if (!owns7(data.binData, key) || data.binData[key] === null)
|
|
3338
5552
|
continue;
|
|
3339
|
-
if (!
|
|
5553
|
+
if (!plain2(data.binData[key], 128))
|
|
3340
5554
|
return null;
|
|
3341
5555
|
bin[key] = data.binData[key];
|
|
3342
5556
|
}
|
|
@@ -3347,11 +5561,11 @@ function cardDetails(data) {
|
|
|
3347
5561
|
function threeDsSummary(value) {
|
|
3348
5562
|
if (value === void 0 || value === null)
|
|
3349
5563
|
return null;
|
|
3350
|
-
if (!
|
|
5564
|
+
if (!record28(value) || !exact4(CODE7, value.responseCode) || !optional(value, "reasonCode", (v) => exact4(CODE7, v)) || !optional(value, "reasonText", (v) => plain2(v, 256)) || !optional(value, "protocolVersion", (v) => v === "" || exact4(PROTOCOL, v)) || !optional(value, "challengeIssued", (v) => typeof v === "boolean"))
|
|
3351
5565
|
return void 0;
|
|
3352
5566
|
const safe = { responseCode: value.responseCode };
|
|
3353
5567
|
for (const key of ["reasonCode", "reasonText", "protocolVersion", "challengeIssued"]) {
|
|
3354
|
-
if (
|
|
5568
|
+
if (owns7(value, key) && value[key] !== null)
|
|
3355
5569
|
safe[key] = value[key];
|
|
3356
5570
|
}
|
|
3357
5571
|
return safe;
|
|
@@ -3364,7 +5578,7 @@ function rebuildToken(value) {
|
|
|
3364
5578
|
if (!details || threeDs === void 0)
|
|
3365
5579
|
return null;
|
|
3366
5580
|
const safe = { token: value.token };
|
|
3367
|
-
if (
|
|
5581
|
+
if (owns7(value, "analyticsId") && value.analyticsId !== null)
|
|
3368
5582
|
safe.analyticsId = value.analyticsId;
|
|
3369
5583
|
safe.tokenType = "SINGLE_USE";
|
|
3370
5584
|
safe.paymentInstrumentType = "PAYMENT_CARD";
|
|
@@ -3375,8 +5589,8 @@ function rebuildToken(value) {
|
|
|
3375
5589
|
}
|
|
3376
5590
|
function primerErrorId(body) {
|
|
3377
5591
|
const value = readAnswer(body);
|
|
3378
|
-
const id = value &&
|
|
3379
|
-
return
|
|
5592
|
+
const id = value && record28(value.error) ? value.error.errorId : null;
|
|
5593
|
+
return exact4(ERROR_ID, id) && !panLike2(id) ? id : null;
|
|
3380
5594
|
}
|
|
3381
5595
|
function matchesCard(details, card) {
|
|
3382
5596
|
const number = card && typeof card.number === "string" ? card.number : "";
|