@agent-cards/sdk 0.23.18 → 0.23.19
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 +10 -0
- package/README.md +12 -3
- package/dist/aci.d.ts +0 -7
- package/dist/aci.js +0 -19
- package/dist/card-fields.generated.js +498 -35
- package/dist/client.d.ts +13 -1
- package/dist/client.js +110 -31
- package/dist/datatrans.d.ts +2 -2
- package/dist/datatrans.generated.js +16 -11
- package/dist/datatrans.js +2 -2
- package/dist/pelecard.generated.d.ts +2 -1
- package/dist/pelecard.generated.js +14 -5
- package/dist/primer.generated.js +515 -52
- package/dist/stripe-checkout.generated.js +197 -1
- package/package.json +1 -1
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: 16332ca203bb18be112c4fb3f5605a1e7520cdef85c954bed2f14292c8284212
|
|
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
|
|
@@ -310,11 +310,11 @@ var MONERIS_TOKENIZE_PATH = "/HPPtoken/request.php";
|
|
|
310
310
|
function monerisTokenizeEnvironment(url) {
|
|
311
311
|
if (typeof url !== "string")
|
|
312
312
|
return null;
|
|
313
|
-
for (const
|
|
313
|
+
for (const environment2 of
|
|
314
314
|
/** @type {const} */
|
|
315
315
|
["production", "sandbox"]) {
|
|
316
|
-
if (MONERIS_TOKENIZE_HOSTS[
|
|
317
|
-
return
|
|
316
|
+
if (MONERIS_TOKENIZE_HOSTS[environment2].some((host) => url === `https://${host}${MONERIS_TOKENIZE_PATH}`))
|
|
317
|
+
return environment2;
|
|
318
318
|
}
|
|
319
319
|
return null;
|
|
320
320
|
}
|
|
@@ -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 own3 = Object.keys(value);
|
|
369
|
+
return own3.length === keys.length && own3.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" });
|
|
@@ -754,13 +754,13 @@ var PADDLE_TOKENEX_KEYS = /* @__PURE__ */ Object.freeze({
|
|
|
754
754
|
sha256: "92529bd289bb24d52a1bdcc42edc9ac0bb1dacbb58f7568573d44771e1287762"
|
|
755
755
|
})
|
|
756
756
|
});
|
|
757
|
-
function paddleTokenexKey(
|
|
758
|
-
if (
|
|
757
|
+
function paddleTokenexKey(environment2) {
|
|
758
|
+
if (environment2 !== "sandbox" && environment2 !== "production")
|
|
759
759
|
return null;
|
|
760
|
-
return PADDLE_TOKENEX_KEYS[
|
|
760
|
+
return PADDLE_TOKENEX_KEYS[environment2] ?? null;
|
|
761
761
|
}
|
|
762
|
-
function paddleTokenexKeyBytes(
|
|
763
|
-
const key = paddleTokenexKey(
|
|
762
|
+
function paddleTokenexKeyBytes(environment2) {
|
|
763
|
+
const key = paddleTokenexKey(environment2);
|
|
764
764
|
if (!key)
|
|
765
765
|
return null;
|
|
766
766
|
try {
|
|
@@ -775,8 +775,8 @@ var PADDLE_TOKENEX_PSP = "paddle_tokenex";
|
|
|
775
775
|
var PADDLE_TOKENEX_FACT_KEYS = /* @__PURE__ */ Object.freeze(["card_first_six", "card_last_four", "expiry_month", "expiry_year", "card_brand"]);
|
|
776
776
|
var record4 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
777
777
|
var sameKeys2 = (value, keys) => {
|
|
778
|
-
const
|
|
779
|
-
return
|
|
778
|
+
const own3 = Object.keys(value);
|
|
779
|
+
return own3.length === keys.length && own3.every((key, at) => key === keys[at]);
|
|
780
780
|
};
|
|
781
781
|
var refuse7 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
782
782
|
var CARD6 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -821,11 +821,11 @@ function isBase64OfBytes(value, bytes) {
|
|
|
821
821
|
const pad = value.endsWith("==") ? 2 : value.endsWith("=") ? 1 : 0;
|
|
822
822
|
return value.length / 4 * 3 - pad === bytes && btoa(atob(value)) === value;
|
|
823
823
|
}
|
|
824
|
-
function isPaddleTokenexCiphertext(value,
|
|
825
|
-
const bytes = paddleTokenexKeyBytes(
|
|
824
|
+
function isPaddleTokenexCiphertext(value, environment2) {
|
|
825
|
+
const bytes = paddleTokenexKeyBytes(environment2);
|
|
826
826
|
return bytes !== null && isBase64OfBytes(value, bytes);
|
|
827
827
|
}
|
|
828
|
-
function readPay(body, line,
|
|
828
|
+
function readPay(body, line, environment2) {
|
|
829
829
|
if (typeof body !== "string" || body === "" || body.length > PAY_BODY_LIMIT)
|
|
830
830
|
return null;
|
|
831
831
|
let value;
|
|
@@ -857,11 +857,11 @@ function readPay(body, line, environment) {
|
|
|
857
857
|
return null;
|
|
858
858
|
for (const name of CARD_KEYS3) {
|
|
859
859
|
const blob = tokenex[name];
|
|
860
|
-
if (
|
|
860
|
+
if (environment2 === void 0) {
|
|
861
861
|
if (typeof blob !== "string" || !BASE642.test(blob) || blob.length < 4 || blob.length > 4096)
|
|
862
862
|
return null;
|
|
863
863
|
}
|
|
864
|
-
else if (!isPaddleTokenexCiphertext(blob,
|
|
864
|
+
else if (!isPaddleTokenexCiphertext(blob, environment2))
|
|
865
865
|
return null;
|
|
866
866
|
}
|
|
867
867
|
if (tokenex.encrypted_card_number === tokenex.encrypted_cvv)
|
|
@@ -1265,8 +1265,8 @@ var TEXT_LIMIT = 256;
|
|
|
1265
1265
|
var CONTROL4 = /[\u0000-\u001f\u007f]/;
|
|
1266
1266
|
var record6 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
1267
1267
|
var sameKeys3 = (value, keys) => {
|
|
1268
|
-
const
|
|
1269
|
-
return
|
|
1268
|
+
const own3 = Object.keys(value);
|
|
1269
|
+
return own3.length === keys.length && own3.every((key, at) => key === keys[at]);
|
|
1270
1270
|
};
|
|
1271
1271
|
var plainText = (value) => typeof value === "string" && value.length <= TEXT_LIMIT && !CONTROL4.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
|
|
1272
1272
|
var refuse9 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
@@ -1468,8 +1468,8 @@ var EXPIRATION = /^[0-9]{2}(?:0[1-9]|1[0-2])$/;
|
|
|
1468
1468
|
var CARD_PAYMENT = "PAYMENT_CARD";
|
|
1469
1469
|
var record8 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
1470
1470
|
var sameKeys4 = (value, keys) => {
|
|
1471
|
-
const
|
|
1472
|
-
return
|
|
1471
|
+
const own3 = Object.keys(value);
|
|
1472
|
+
return own3.length === keys.length && own3.every((key, at) => key === keys[at]);
|
|
1473
1473
|
};
|
|
1474
1474
|
var refuse11 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
1475
1475
|
var CARD10 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -1498,8 +1498,8 @@ function gopayCardFormUrl(url) {
|
|
|
1498
1498
|
}
|
|
1499
1499
|
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password)
|
|
1500
1500
|
return null;
|
|
1501
|
-
const
|
|
1502
|
-
if (
|
|
1501
|
+
const environment2 = Object.prototype.hasOwnProperty.call(GOPAY_CARD_FORM_HOSTS, parsed.hostname) ? GOPAY_CARD_FORM_HOSTS[parsed.hostname] : null;
|
|
1502
|
+
if (environment2 === null || !parsed.pathname.startsWith(GOPAY_CARD_FORM_PATH))
|
|
1503
1503
|
return null;
|
|
1504
1504
|
if (!TOKEN2.test(parsed.pathname.slice(GOPAY_CARD_FORM_PATH.length)))
|
|
1505
1505
|
return null;
|
|
@@ -1511,7 +1511,7 @@ function gopayCardFormUrl(url) {
|
|
|
1511
1511
|
const version = parsed.searchParams.get("ver");
|
|
1512
1512
|
if (signature === null || !SIGNATURE.test(signature) || language !== null && !LANGUAGE.test(language) || version !== null && !VERSION.test(version))
|
|
1513
1513
|
return null;
|
|
1514
|
-
return Object.freeze({ host: parsed.hostname, environment, signature });
|
|
1514
|
+
return Object.freeze({ host: parsed.hostname, environment: environment2, signature });
|
|
1515
1515
|
}
|
|
1516
1516
|
function readBody4(body) {
|
|
1517
1517
|
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT7)
|
|
@@ -1693,8 +1693,8 @@ var LOCALE = /^[a-z]{2}(?:-[A-Za-z]{2,4})?$/;
|
|
|
1693
1693
|
var PAN_LIKE3 = /(?:[0-9][ _.:-]*){12,}/;
|
|
1694
1694
|
var record9 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
1695
1695
|
var sameKeys5 = (value, keys) => {
|
|
1696
|
-
const
|
|
1697
|
-
return
|
|
1696
|
+
const own3 = Object.keys(value);
|
|
1697
|
+
return own3.length === keys.length && own3.every((key, at) => key === keys[at]);
|
|
1698
1698
|
};
|
|
1699
1699
|
var refuse13 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
1700
1700
|
var CARD12 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -1851,14 +1851,14 @@ function paygentBodyVerdict(body) {
|
|
|
1851
1851
|
return code === null ? CARD13 : refuse14(code);
|
|
1852
1852
|
}
|
|
1853
1853
|
function paygentRequestVerdict(url, body) {
|
|
1854
|
-
const
|
|
1855
|
-
if (
|
|
1854
|
+
const environment2 = paygentEnvironment(url);
|
|
1855
|
+
if (environment2 === null)
|
|
1856
1856
|
return refuse14("paygent_url_refused");
|
|
1857
1857
|
const { code, pairs } = judgeBody3(body);
|
|
1858
1858
|
if (code !== null)
|
|
1859
1859
|
return refuse14(code);
|
|
1860
1860
|
const key = pairs[1][1];
|
|
1861
|
-
return (
|
|
1861
|
+
return (environment2 === "production" ? LIVE_KEY : SANDBOX_KEY).test(key) ? CARD13 : refuse14("paygent_key_environment");
|
|
1862
1862
|
}
|
|
1863
1863
|
// src/multipart-form.js
|
|
1864
1864
|
var BODY_LIMIT11 = 65536;
|
|
@@ -2002,6 +2002,462 @@ function payNlBodyVerdict(body, contentType) {
|
|
|
2002
2002
|
}
|
|
2003
2003
|
var ERROR_KEYS = /* @__PURE__ */ Object.freeze(["errorId", "errorTag", "errorMessage", "errorFieldName"]);
|
|
2004
2004
|
var REQUEST_KEYS = /* @__PURE__ */ Object.freeze(["result", ...ERROR_KEYS]);
|
|
2005
|
+
// src/revolut.js
|
|
2006
|
+
var REVOLUT_PSP = "revolut";
|
|
2007
|
+
var REVOLUT_HOSTS = /* @__PURE__ */ Object.freeze(["merchant.revolut.com", "sandbox-merchant.revolut.com"]);
|
|
2008
|
+
var REVOLUT_BODY_KEYS = /* @__PURE__ */ Object.freeze(["payment_method", "customer", "amount", "channel"]);
|
|
2009
|
+
var REVOLUT_CARD_FIELD_KEYS = /* @__PURE__ */ Object.freeze([
|
|
2010
|
+
"type",
|
|
2011
|
+
"number",
|
|
2012
|
+
"expiry_month",
|
|
2013
|
+
"expiry_year",
|
|
2014
|
+
"cvv",
|
|
2015
|
+
"kount_session_id",
|
|
2016
|
+
"billing_address",
|
|
2017
|
+
"cardholder_name",
|
|
2018
|
+
"shipping_address",
|
|
2019
|
+
"save_for",
|
|
2020
|
+
"environment"
|
|
2021
|
+
]);
|
|
2022
|
+
var REVOLUT_CARD_POPUP_KEYS = /* @__PURE__ */ Object.freeze([
|
|
2023
|
+
"type",
|
|
2024
|
+
"number",
|
|
2025
|
+
"expiry_month",
|
|
2026
|
+
"expiry_year",
|
|
2027
|
+
"cvv",
|
|
2028
|
+
"kount_session_id",
|
|
2029
|
+
"cardholder_name",
|
|
2030
|
+
"billing_address",
|
|
2031
|
+
"shipping_address",
|
|
2032
|
+
"save_for",
|
|
2033
|
+
"environment"
|
|
2034
|
+
]);
|
|
2035
|
+
var REVOLUT_CHANNELS = /* @__PURE__ */ Object.freeze(["WEB_SDK", "REV_CHECKOUT", "HOSTED_PAYMENT_PAGE"]);
|
|
2036
|
+
var BODY_LIMIT12 = 16384;
|
|
2037
|
+
var URL_LIMIT6 = 128;
|
|
2038
|
+
var UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
2039
|
+
var PAYMENTS_PATH = /^\/api\/public\/orders\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\/payments$/;
|
|
2040
|
+
var CARD_NUMBER8 = /^[0-9]{12,19}$/;
|
|
2041
|
+
var SECURITY_CODE11 = /^[0-9]{3,4}$/;
|
|
2042
|
+
var KOUNT_SESSION = /^[0-9a-f]{32}$/;
|
|
2043
|
+
var AMOUNT_LIMIT = 1e11;
|
|
2044
|
+
var ADDRESS_KEYS = /* @__PURE__ */ Object.freeze(["country", "region", "city", "postcode", "street_line_1", "street_line_2"]);
|
|
2045
|
+
var ENVIRONMENT_KEYS = /* @__PURE__ */ Object.freeze([
|
|
2046
|
+
"type",
|
|
2047
|
+
"color_depth",
|
|
2048
|
+
"screen_width",
|
|
2049
|
+
"screen_height",
|
|
2050
|
+
"java_enabled",
|
|
2051
|
+
"time_zone_utc_offset",
|
|
2052
|
+
"challenge_window_width",
|
|
2053
|
+
"browser_url",
|
|
2054
|
+
"referrer_url"
|
|
2055
|
+
]);
|
|
2056
|
+
var NEW_CUSTOMER_KEYS = /* @__PURE__ */ Object.freeze(["type", "email", "name", "phone"]);
|
|
2057
|
+
var COUNTRY = /^[A-Z]{2}$/;
|
|
2058
|
+
var PHONE = /^\+?[0-9 \u00a0\/().-]{6,32}$/;
|
|
2059
|
+
var EMAIL3 = /^[^\s@]{1,64}@[^\s@]{1,255}$/;
|
|
2060
|
+
var TEXT_LIMIT2 = 256;
|
|
2061
|
+
var CONTROL5 = /[\u0000-\u001f\u007f]/;
|
|
2062
|
+
var CARD_MEMBER2 = /^(?:number|card_?number|cardnumber|cardnum|card_num|pan|cvv|cvc|cvv2)$/i;
|
|
2063
|
+
var record10 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
2064
|
+
var own2 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
2065
|
+
var inOrder = (value, keys) => {
|
|
2066
|
+
let at = 0;
|
|
2067
|
+
for (const name of Object.keys(value)) {
|
|
2068
|
+
while (at < keys.length && keys[at] !== name)
|
|
2069
|
+
at += 1;
|
|
2070
|
+
if (at === keys.length)
|
|
2071
|
+
return false;
|
|
2072
|
+
at += 1;
|
|
2073
|
+
}
|
|
2074
|
+
return true;
|
|
2075
|
+
};
|
|
2076
|
+
var wellFormed = (value) => {
|
|
2077
|
+
try {
|
|
2078
|
+
encodeURIComponent(value);
|
|
2079
|
+
return true;
|
|
2080
|
+
}
|
|
2081
|
+
catch {
|
|
2082
|
+
return false;
|
|
2083
|
+
}
|
|
2084
|
+
};
|
|
2085
|
+
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);
|
|
2086
|
+
var between = (value, min, max) => Number.isSafeInteger(value) && value >= min && value <= max;
|
|
2087
|
+
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})$/;
|
|
2088
|
+
var luhn2 = (digits2) => {
|
|
2089
|
+
let sum = 0;
|
|
2090
|
+
for (let at = 0; at < digits2.length; at += 1) {
|
|
2091
|
+
let d = digits2.charCodeAt(digits2.length - 1 - at) - 48;
|
|
2092
|
+
if (at % 2 === 1) {
|
|
2093
|
+
d *= 2;
|
|
2094
|
+
if (d > 9)
|
|
2095
|
+
d -= 9;
|
|
2096
|
+
}
|
|
2097
|
+
sum += d;
|
|
2098
|
+
}
|
|
2099
|
+
return sum % 10 === 0;
|
|
2100
|
+
};
|
|
2101
|
+
var ANY_NETWORK = /^[2-6][0-9]{12,18}$/;
|
|
2102
|
+
var holdsCardShape = (text3, shape = NETWORK) => (text3.match(/[0-9]{13,}/g) ?? []).some((run) => run.length > 19 || shape.test(run) && luhn2(run));
|
|
2103
|
+
var phone = (value) => typeof value === "string" && PHONE.test(value) && (value.match(/[0-9]/g) ?? []).length >= 6 && (value.match(/[0-9]/g) ?? []).length <= 15;
|
|
2104
|
+
var refuse16 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
2105
|
+
var CARD15 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
2106
|
+
var CONTINUE7 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
|
|
2107
|
+
function revolutPaymentsTarget(url) {
|
|
2108
|
+
if (typeof url !== "string" || url.length > URL_LIMIT6 || url.includes("?") || url.includes("#"))
|
|
2109
|
+
return null;
|
|
2110
|
+
let parsed;
|
|
2111
|
+
try {
|
|
2112
|
+
parsed = new URL(url);
|
|
2113
|
+
}
|
|
2114
|
+
catch {
|
|
2115
|
+
return null;
|
|
2116
|
+
}
|
|
2117
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !REVOLUT_HOSTS.includes(parsed.hostname))
|
|
2118
|
+
return null;
|
|
2119
|
+
const match = PAYMENTS_PATH.exec(parsed.pathname);
|
|
2120
|
+
return match ? Object.freeze({ host: parsed.hostname, order: match[1] }) : null;
|
|
2121
|
+
}
|
|
2122
|
+
function isRevolutPaymentsUrl(url) {
|
|
2123
|
+
return revolutPaymentsTarget(url) !== null;
|
|
2124
|
+
}
|
|
2125
|
+
function readBody7(body) {
|
|
2126
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT12)
|
|
2127
|
+
return null;
|
|
2128
|
+
let value;
|
|
2129
|
+
try {
|
|
2130
|
+
value = JSON.parse(body);
|
|
2131
|
+
if (!record10(value) || JSON.stringify(value) !== body)
|
|
2132
|
+
return null;
|
|
2133
|
+
}
|
|
2134
|
+
catch {
|
|
2135
|
+
return null;
|
|
2136
|
+
}
|
|
2137
|
+
return value;
|
|
2138
|
+
}
|
|
2139
|
+
function address(value) {
|
|
2140
|
+
if (!record10(value) || !inOrder(value, ADDRESS_KEYS))
|
|
2141
|
+
return false;
|
|
2142
|
+
const names = Object.keys(value);
|
|
2143
|
+
if (!names.some((key) => typeof value[key] === "string" && value[key].trim() !== ""))
|
|
2144
|
+
return false;
|
|
2145
|
+
return names.every((key) => value[key] === "" || (key === "country" ? typeof value[key] === "string" && COUNTRY.test(value[key]) : plainText2(value[key])));
|
|
2146
|
+
}
|
|
2147
|
+
function pageUrl(value) {
|
|
2148
|
+
if (typeof value !== "string" || value.length > 2048 || CONTROL5.test(value) || holdsCardShape(value, ANY_NETWORK) || !wellFormed(value))
|
|
2149
|
+
return false;
|
|
2150
|
+
let parsed;
|
|
2151
|
+
try {
|
|
2152
|
+
parsed = new URL(value);
|
|
2153
|
+
}
|
|
2154
|
+
catch {
|
|
2155
|
+
return false;
|
|
2156
|
+
}
|
|
2157
|
+
return parsed.protocol === "https:" || parsed.protocol === "http:";
|
|
2158
|
+
}
|
|
2159
|
+
function referrerOrigin(value) {
|
|
2160
|
+
if (value === "" || value === "null")
|
|
2161
|
+
return true;
|
|
2162
|
+
if (typeof value !== "string" || value.length > 512 || holdsCardShape(value, ANY_NETWORK))
|
|
2163
|
+
return false;
|
|
2164
|
+
let parsed;
|
|
2165
|
+
try {
|
|
2166
|
+
parsed = new URL(value);
|
|
2167
|
+
}
|
|
2168
|
+
catch {
|
|
2169
|
+
return false;
|
|
2170
|
+
}
|
|
2171
|
+
return (parsed.protocol === "https:" || parsed.protocol === "http:") && parsed.origin === value;
|
|
2172
|
+
}
|
|
2173
|
+
function environment(value) {
|
|
2174
|
+
if (!record10(value) || !inOrder(value, ENVIRONMENT_KEYS))
|
|
2175
|
+
return false;
|
|
2176
|
+
return value.type === "browser" && between(value.color_depth, 0, 256) && between(value.screen_width, 0, 1e5) && between(value.screen_height, 0, 1e5) && typeof value.java_enabled === "boolean" && between(value.time_zone_utc_offset, -1440, 1440) && between(value.challenge_window_width, 1, 1e4) && (!own2(value, "browser_url") || pageUrl(value.browser_url)) && (!own2(value, "referrer_url") || referrerOrigin(value.referrer_url));
|
|
2177
|
+
}
|
|
2178
|
+
function customer(value) {
|
|
2179
|
+
if (!record10(value))
|
|
2180
|
+
return false;
|
|
2181
|
+
if (value.type === "existing") {
|
|
2182
|
+
const names = Object.keys(value);
|
|
2183
|
+
return names.length === 2 && names[0] === "type" && names[1] === "id" && typeof value.id === "string" && UUID.test(value.id);
|
|
2184
|
+
}
|
|
2185
|
+
if (value.type !== "new" || !inOrder(value, NEW_CUSTOMER_KEYS) || !own2(value, "email"))
|
|
2186
|
+
return false;
|
|
2187
|
+
if (typeof value.email !== "string" || !EMAIL3.test(value.email) || !plainText2(value.email))
|
|
2188
|
+
return false;
|
|
2189
|
+
if (own2(value, "name") && !plainText2(value.name))
|
|
2190
|
+
return false;
|
|
2191
|
+
return !own2(value, "phone") || phone(value.phone);
|
|
2192
|
+
}
|
|
2193
|
+
function cardMethod(value) {
|
|
2194
|
+
if (!record10(value) || value.type !== "card")
|
|
2195
|
+
return "revolut_body_unsupported";
|
|
2196
|
+
if (!inOrder(value, REVOLUT_CARD_FIELD_KEYS) && !inOrder(value, REVOLUT_CARD_POPUP_KEYS))
|
|
2197
|
+
return "revolut_body_unsupported";
|
|
2198
|
+
if (typeof value.number !== "string" || !CARD_NUMBER8.test(value.number) || !between(value.expiry_month, 1, 12) || !between(value.expiry_year, 2e3, 2099) || typeof value.cvv !== "string" || !SECURITY_CODE11.test(value.cvv))
|
|
2199
|
+
return "revolut_body_unsupported";
|
|
2200
|
+
if (!own2(value, "environment") || !environment(value.environment))
|
|
2201
|
+
return "revolut_body_unsupported";
|
|
2202
|
+
if (own2(value, "kount_session_id") && (typeof value.kount_session_id !== "string" || !KOUNT_SESSION.test(value.kount_session_id))) {
|
|
2203
|
+
return "revolut_body_unsupported";
|
|
2204
|
+
}
|
|
2205
|
+
for (const key of ["billing_address", "shipping_address"]) {
|
|
2206
|
+
if (own2(value, key) && !address(value[key]))
|
|
2207
|
+
return "revolut_body_unsupported";
|
|
2208
|
+
}
|
|
2209
|
+
if (own2(value, "cardholder_name") && !plainText2(value.cardholder_name))
|
|
2210
|
+
return "revolut_body_unsupported";
|
|
2211
|
+
if (own2(value, "save_for")) {
|
|
2212
|
+
if (value.save_for === "CUSTOMER" || value.save_for === "MERCHANT")
|
|
2213
|
+
return "revolut_card_on_file";
|
|
2214
|
+
if (value.save_for !== "NONE")
|
|
2215
|
+
return "revolut_body_unsupported";
|
|
2216
|
+
}
|
|
2217
|
+
return null;
|
|
2218
|
+
}
|
|
2219
|
+
function namesCardValue2(parsed) {
|
|
2220
|
+
const pending = record10(parsed) || Array.isArray(parsed) ? [parsed] : [];
|
|
2221
|
+
while (pending.length > 0) {
|
|
2222
|
+
const node = pending.pop();
|
|
2223
|
+
for (const key of Object.keys(node)) {
|
|
2224
|
+
if (!Array.isArray(node) && CARD_MEMBER2.test(key))
|
|
2225
|
+
return true;
|
|
2226
|
+
const value = node[key];
|
|
2227
|
+
if (value !== null && typeof value === "object")
|
|
2228
|
+
pending.push(value);
|
|
2229
|
+
}
|
|
2230
|
+
}
|
|
2231
|
+
return false;
|
|
2232
|
+
}
|
|
2233
|
+
function revolutBodyVerdict(body) {
|
|
2234
|
+
const value = readBody7(body);
|
|
2235
|
+
if (value === null) {
|
|
2236
|
+
return body === void 0 || body === null || body === "" ? CONTINUE7 : refuse16("revolut_body_unsupported");
|
|
2237
|
+
}
|
|
2238
|
+
const method = record10(value.payment_method) ? value.payment_method.type : void 0;
|
|
2239
|
+
if (method !== "card")
|
|
2240
|
+
return namesCardValue2(value) ? refuse16("revolut_body_unsupported") : CONTINUE7;
|
|
2241
|
+
if (!inOrder(value, REVOLUT_BODY_KEYS) || Object.keys(value).length !== REVOLUT_BODY_KEYS.length)
|
|
2242
|
+
return refuse16("revolut_body_unsupported");
|
|
2243
|
+
const code = cardMethod(value.payment_method);
|
|
2244
|
+
if (code !== null)
|
|
2245
|
+
return refuse16(code);
|
|
2246
|
+
if (!customer(value.customer) || !between(value.amount, 1, AMOUNT_LIMIT) || !REVOLUT_CHANNELS.includes(value.channel)) {
|
|
2247
|
+
return refuse16("revolut_body_unsupported");
|
|
2248
|
+
}
|
|
2249
|
+
return CARD15;
|
|
2250
|
+
}
|
|
2251
|
+
// src/sumup.js
|
|
2252
|
+
var SUMUP_PSP = "sumup";
|
|
2253
|
+
var SUMUP_API_HOST = "api.sumup.com";
|
|
2254
|
+
var SUMUP_CHECKOUT_PATH = "/v0.2/checkouts/";
|
|
2255
|
+
var BODY_LIMIT13 = 16384;
|
|
2256
|
+
var CHECKOUT_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
2257
|
+
var ROOT_KEYS5 = /* @__PURE__ */ Object.freeze([
|
|
2258
|
+
"payment_type",
|
|
2259
|
+
"device_information",
|
|
2260
|
+
"method_details",
|
|
2261
|
+
"personal_details",
|
|
2262
|
+
"card",
|
|
2263
|
+
"installments",
|
|
2264
|
+
"mandate",
|
|
2265
|
+
"lxn_session_token",
|
|
2266
|
+
"customer_details",
|
|
2267
|
+
"sca_experience"
|
|
2268
|
+
]);
|
|
2269
|
+
var CARD_KEYS7 = /* @__PURE__ */ Object.freeze(["zip_code", "name", "number", "expiry_month", "expiry_year", "cvv"]);
|
|
2270
|
+
var PERSONAL_KEYS = /* @__PURE__ */ Object.freeze(["first_name", "last_name", "email", "address", "birth_date", "phone"]);
|
|
2271
|
+
var ADDRESS_KEYS2 = /* @__PURE__ */ Object.freeze(["country", "city", "line1", "line2", "postal_code", "state"]);
|
|
2272
|
+
var CUSTOMER_KEYS = /* @__PURE__ */ Object.freeze(["first_name", "last_name", "email", "note_for_merchant"]);
|
|
2273
|
+
var CARD_NUMBER9 = /^[0-9]{12,19}$/;
|
|
2274
|
+
var MONTH7 = /^(?:0[1-9]|1[0-2])$/;
|
|
2275
|
+
var YEAR7 = /^(?:[0-9]{2}|[0-9]{4})$/;
|
|
2276
|
+
var CODE2 = /^[0-9]{3,4}$/;
|
|
2277
|
+
var BASE643 = /^[A-Za-z0-9+/]{4,4096}={0,2}$/;
|
|
2278
|
+
var BASE64_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
2279
|
+
var DEVICE_KEYS2 = /* @__PURE__ */ Object.freeze([
|
|
2280
|
+
"user_agent",
|
|
2281
|
+
"language",
|
|
2282
|
+
"timezone_offset",
|
|
2283
|
+
"screen_width",
|
|
2284
|
+
"screen_height",
|
|
2285
|
+
"color_depth",
|
|
2286
|
+
"modal_width",
|
|
2287
|
+
"modal_height",
|
|
2288
|
+
"adblock",
|
|
2289
|
+
"realIp",
|
|
2290
|
+
"route"
|
|
2291
|
+
]);
|
|
2292
|
+
var RISK_TOKEN = /^[A-Za-z0-9_+/=-]+\.[A-Za-z0-9_+/=-]+\.[A-Za-z0-9_+/=-]*$/;
|
|
2293
|
+
var RISK_TOKEN_LIMIT = 4096;
|
|
2294
|
+
var PAN_LIKE4 = /(?:[0-9][ _.:-]*){12,}/;
|
|
2295
|
+
var DATE = /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/;
|
|
2296
|
+
var COUNTRY2 = /^[A-Z]{2}$/;
|
|
2297
|
+
var PHONE2 = /^[ #0-9_+\/().-]{1,32}$/;
|
|
2298
|
+
var CARD_PAYMENT2 = "card";
|
|
2299
|
+
var SCA_EXPERIENCE = "iframe";
|
|
2300
|
+
var record11 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
2301
|
+
var refuse17 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
2302
|
+
var CARD16 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
2303
|
+
function orderedSubset(value, keys) {
|
|
2304
|
+
let at = -1;
|
|
2305
|
+
for (const key of Object.keys(value)) {
|
|
2306
|
+
const next = keys.indexOf(key);
|
|
2307
|
+
if (next <= at)
|
|
2308
|
+
return false;
|
|
2309
|
+
at = next;
|
|
2310
|
+
}
|
|
2311
|
+
return true;
|
|
2312
|
+
}
|
|
2313
|
+
function luhn3(digits2) {
|
|
2314
|
+
let sum = 0;
|
|
2315
|
+
for (let at = 0; at < digits2.length; at += 1) {
|
|
2316
|
+
let digit = Number(digits2[digits2.length - 1 - at]);
|
|
2317
|
+
if (at % 2 === 1) {
|
|
2318
|
+
digit *= 2;
|
|
2319
|
+
if (digit > 9)
|
|
2320
|
+
digit -= 9;
|
|
2321
|
+
}
|
|
2322
|
+
sum += digit;
|
|
2323
|
+
}
|
|
2324
|
+
return sum % 10 === 0 && sum > 0;
|
|
2325
|
+
}
|
|
2326
|
+
var printable = (value) => [...value].every((ch) => ch.charCodeAt(0) >= 32 && ch.charCodeAt(0) !== 127);
|
|
2327
|
+
function typed(value, limit = 256) {
|
|
2328
|
+
return typeof value === "string" && value.length >= 1 && value.length <= limit && !PAN_LIKE4.test(value) && printable(value);
|
|
2329
|
+
}
|
|
2330
|
+
function decodeBase64(text3) {
|
|
2331
|
+
if (typeof text3 !== "string" || !BASE643.test(text3) || text3.length % 4 !== 0)
|
|
2332
|
+
return null;
|
|
2333
|
+
let bits = 0;
|
|
2334
|
+
let value = 0;
|
|
2335
|
+
let out = "";
|
|
2336
|
+
for (const ch of text3.replace(/=+$/, "")) {
|
|
2337
|
+
value = (value << 6 | BASE64_ALPHABET.indexOf(ch)) & 16777215;
|
|
2338
|
+
bits += 6;
|
|
2339
|
+
if (bits >= 8) {
|
|
2340
|
+
bits -= 8;
|
|
2341
|
+
out += String.fromCharCode(value >> bits & 255);
|
|
2342
|
+
}
|
|
2343
|
+
}
|
|
2344
|
+
return out;
|
|
2345
|
+
}
|
|
2346
|
+
function soundDevice(text3) {
|
|
2347
|
+
const json = decodeBase64(text3);
|
|
2348
|
+
if (json === null)
|
|
2349
|
+
return false;
|
|
2350
|
+
let value;
|
|
2351
|
+
try {
|
|
2352
|
+
value = JSON.parse(json);
|
|
2353
|
+
if (JSON.stringify(value) !== json)
|
|
2354
|
+
return false;
|
|
2355
|
+
}
|
|
2356
|
+
catch {
|
|
2357
|
+
return false;
|
|
2358
|
+
}
|
|
2359
|
+
if (!record11(value) || Object.keys(value).join() !== "deviceId,components" || typeof value.deviceId !== "string" || value.deviceId.length > 256 || PAN_LIKE4.test(value.deviceId) || !printable(value.deviceId) || !Array.isArray(value.components) || value.components.length !== DEVICE_KEYS2.length) {
|
|
2360
|
+
return false;
|
|
2361
|
+
}
|
|
2362
|
+
return value.components.every((component, at) => record11(component) && Object.keys(component).join() === "key,value" && component.key === DEVICE_KEYS2[at] && typeof component.value === "string" && component.value.length <= 1024 && !PAN_LIKE4.test(component.value) && printable(component.value));
|
|
2363
|
+
}
|
|
2364
|
+
var soundRiskToken = (token) => typeof token === "string" && token.length <= RISK_TOKEN_LIMIT && RISK_TOKEN.test(token) && !PAN_LIKE4.test(token);
|
|
2365
|
+
function sumupCheckoutUrl(url) {
|
|
2366
|
+
if (typeof url !== "string" || url.length > 256 || url.includes("#") || url.includes("?"))
|
|
2367
|
+
return null;
|
|
2368
|
+
let parsed;
|
|
2369
|
+
try {
|
|
2370
|
+
parsed = new URL(url);
|
|
2371
|
+
}
|
|
2372
|
+
catch {
|
|
2373
|
+
return null;
|
|
2374
|
+
}
|
|
2375
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password)
|
|
2376
|
+
return null;
|
|
2377
|
+
if (parsed.hostname !== SUMUP_API_HOST || !parsed.pathname.startsWith(SUMUP_CHECKOUT_PATH))
|
|
2378
|
+
return null;
|
|
2379
|
+
const checkoutId = parsed.pathname.slice(SUMUP_CHECKOUT_PATH.length);
|
|
2380
|
+
return CHECKOUT_ID.test(checkoutId) ? Object.freeze({ checkoutId }) : null;
|
|
2381
|
+
}
|
|
2382
|
+
function readBody8(body) {
|
|
2383
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT13)
|
|
2384
|
+
return null;
|
|
2385
|
+
let value;
|
|
2386
|
+
try {
|
|
2387
|
+
value = JSON.parse(body);
|
|
2388
|
+
if (!record11(value) || JSON.stringify(value) !== body)
|
|
2389
|
+
return null;
|
|
2390
|
+
}
|
|
2391
|
+
catch {
|
|
2392
|
+
return null;
|
|
2393
|
+
}
|
|
2394
|
+
return value;
|
|
2395
|
+
}
|
|
2396
|
+
function soundCard(card) {
|
|
2397
|
+
if (!record11(card) || !orderedSubset(card, CARD_KEYS7))
|
|
2398
|
+
return false;
|
|
2399
|
+
if (typeof card.number !== "string" || !CARD_NUMBER9.test(card.number) || !luhn3(card.number))
|
|
2400
|
+
return false;
|
|
2401
|
+
if (typeof card.expiry_month !== "string" || !MONTH7.test(card.expiry_month))
|
|
2402
|
+
return false;
|
|
2403
|
+
if (typeof card.expiry_year !== "string" || !YEAR7.test(card.expiry_year))
|
|
2404
|
+
return false;
|
|
2405
|
+
if (typeof card.cvv !== "string" || !CODE2.test(card.cvv))
|
|
2406
|
+
return false;
|
|
2407
|
+
if (card.name !== void 0 && (!typed(card.name, 129) || /[0-9]/.test(card.name)))
|
|
2408
|
+
return false;
|
|
2409
|
+
if (card.zip_code !== void 0 && !typed(card.zip_code, 10))
|
|
2410
|
+
return false;
|
|
2411
|
+
return true;
|
|
2412
|
+
}
|
|
2413
|
+
function soundPersonal(details) {
|
|
2414
|
+
if (!record11(details) || !orderedSubset(details, PERSONAL_KEYS) || Object.keys(details).length === 0)
|
|
2415
|
+
return false;
|
|
2416
|
+
for (const key of ["first_name", "last_name", "email"]) {
|
|
2417
|
+
if (details[key] !== void 0 && !typed(details[key]))
|
|
2418
|
+
return false;
|
|
2419
|
+
}
|
|
2420
|
+
if (details.birth_date !== void 0 && (typeof details.birth_date !== "string" || !DATE.test(details.birth_date)))
|
|
2421
|
+
return false;
|
|
2422
|
+
if (details.phone !== void 0 && (typeof details.phone !== "string" || !PHONE2.test(details.phone) || (details.phone.match(/[0-9]/g) ?? []).length > 15))
|
|
2423
|
+
return false;
|
|
2424
|
+
if (details.address === void 0)
|
|
2425
|
+
return true;
|
|
2426
|
+
const address2 = details.address;
|
|
2427
|
+
if (!record11(address2) || !orderedSubset(address2, ADDRESS_KEYS2) || Object.keys(address2).length === 0)
|
|
2428
|
+
return false;
|
|
2429
|
+
if (address2.country !== void 0 && (typeof address2.country !== "string" || !COUNTRY2.test(address2.country)))
|
|
2430
|
+
return false;
|
|
2431
|
+
return ["city", "line1", "line2", "postal_code", "state"].every((key) => address2[key] === void 0 || typed(address2[key]));
|
|
2432
|
+
}
|
|
2433
|
+
function soundCustomer(details) {
|
|
2434
|
+
if (!record11(details) || !orderedSubset(details, CUSTOMER_KEYS) || Object.keys(details).length === 0)
|
|
2435
|
+
return false;
|
|
2436
|
+
return CUSTOMER_KEYS.every((key) => details[key] === void 0 || typed(details[key], key === "note_for_merchant" ? 1024 : 256));
|
|
2437
|
+
}
|
|
2438
|
+
function sumupBodyVerdict(body, url) {
|
|
2439
|
+
if (url !== void 0 && sumupCheckoutUrl(url) === null)
|
|
2440
|
+
return refuse17("sumup_url_refused");
|
|
2441
|
+
const value = readBody8(body);
|
|
2442
|
+
if (value === null || !orderedSubset(value, ROOT_KEYS5))
|
|
2443
|
+
return refuse17("sumup_body_unsupported");
|
|
2444
|
+
if (value.payment_type !== CARD_PAYMENT2 || !soundDevice(value.device_information) || !soundCard(value.card) || value.installments !== 1) {
|
|
2445
|
+
return refuse17("sumup_body_unsupported");
|
|
2446
|
+
}
|
|
2447
|
+
if (value.method_details !== void 0 && !(record11(value.method_details) && orderedSubset(value.method_details, ["zip_code"]) && typed(value.method_details.zip_code, 10)))
|
|
2448
|
+
return refuse17("sumup_body_unsupported");
|
|
2449
|
+
if (value.personal_details !== void 0 && !soundPersonal(value.personal_details))
|
|
2450
|
+
return refuse17("sumup_body_unsupported");
|
|
2451
|
+
if (value.customer_details !== void 0 && !soundCustomer(value.customer_details))
|
|
2452
|
+
return refuse17("sumup_body_unsupported");
|
|
2453
|
+
if (value.lxn_session_token !== void 0 && !soundRiskToken(value.lxn_session_token))
|
|
2454
|
+
return refuse17("sumup_body_unsupported");
|
|
2455
|
+
if (value.sca_experience !== void 0 && value.sca_experience !== SCA_EXPERIENCE)
|
|
2456
|
+
return refuse17("sumup_body_unsupported");
|
|
2457
|
+
if (value.mandate !== void 0)
|
|
2458
|
+
return refuse17("sumup_card_saving_refused");
|
|
2459
|
+
return CARD16;
|
|
2460
|
+
}
|
|
2005
2461
|
// src/card-fields.js
|
|
2006
2462
|
function processorGate(recognizer, url, body) {
|
|
2007
2463
|
if (recognizer && recognizer.psp === LYRA_PSP)
|
|
@@ -2048,6 +2504,13 @@ function processorGate(recognizer, url, body) {
|
|
|
2048
2504
|
}
|
|
2049
2505
|
if (recognizer && recognizer.psp === GOPAY_PSP)
|
|
2050
2506
|
return gopayBodyVerdict(body, url);
|
|
2507
|
+
if (recognizer && recognizer.psp === REVOLUT_PSP) {
|
|
2508
|
+
if (url !== void 0 && !isRevolutPaymentsUrl(url))
|
|
2509
|
+
return { verdict: "refuse", code: "revolut_url_refused" };
|
|
2510
|
+
return revolutBodyVerdict(body);
|
|
2511
|
+
}
|
|
2512
|
+
if (recognizer && recognizer.psp === SUMUP_PSP)
|
|
2513
|
+
return sumupBodyVerdict(body, url);
|
|
2051
2514
|
if (recognizer && recognizer.psp === GRAVY_PSP)
|
|
2052
2515
|
return gravyBodyVerdict(body);
|
|
2053
2516
|
if (recognizer && recognizer.psp === MONERIS_PSP) {
|
|
@@ -2168,21 +2631,21 @@ var KEEP_ON_FILE_REFUSAL = "Refusing to pay: this Primer payment would keep the
|
|
|
2168
2631
|
var UNSUPPORTED_SDK_REFUSAL = "Refusing to pay: this checkout uses a Primer SDK Agentcard does not support yet. Nothing was sent.";
|
|
2169
2632
|
var NETWORK_MISMATCH_REFUSAL = "Refusing to pay: this Primer payment names a card network that is not your card's. Nothing was sent.";
|
|
2170
2633
|
var FILL_REFUSAL = "Could not fill the card fields for Primer. Nothing was sent.";
|
|
2171
|
-
var
|
|
2634
|
+
var BODY_LIMIT14 = 16384;
|
|
2172
2635
|
var RESPONSE_LIMIT = 32768;
|
|
2173
|
-
var
|
|
2636
|
+
var ROOT_KEYS6 = ["paymentInstrument", "userDescription", "tokenType", "paymentFlow"];
|
|
2174
2637
|
var INSTRUMENT_KEYS = ["number", "cvv", "expirationMonth", "expirationYear", "cardholderName", "preferredNetwork"];
|
|
2175
2638
|
var REQUIRED_INSTRUMENT_KEYS = ["number", "cvv", "expirationMonth", "expirationYear"];
|
|
2176
|
-
var
|
|
2639
|
+
var record12 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
2177
2640
|
var owns5 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
2178
2641
|
var exact = (pattern, value) => typeof value === "string" && pattern.exec(value)?.[0] === value;
|
|
2179
2642
|
var text2 = (value, max) => typeof value === "string" && value.length <= max && !/[\u0000-\u001f\u007f]/.test(value);
|
|
2180
2643
|
var digits = (value, min, max) => typeof value === "string" && value.length >= min && value.length <= max && !/[^0-9]/.test(value);
|
|
2181
2644
|
var panLike = (value) => /(?:[0-9][ _.:-]*){12,}/.test(value);
|
|
2182
2645
|
var plain = (value, max) => text2(value, max) && !panLike(value);
|
|
2183
|
-
var
|
|
2184
|
-
var
|
|
2185
|
-
var
|
|
2646
|
+
var MONTH8 = /^(?:0[1-9]|1[0-2])$/;
|
|
2647
|
+
var YEAR8 = /^20[0-9]{2}$/;
|
|
2648
|
+
var NETWORK2 = /^[A-Z][A-Z_]{1,31}$/;
|
|
2186
2649
|
function isPrimerTokenizeUrl(url, method = "POST") {
|
|
2187
2650
|
if (method !== "POST" || typeof url !== "string" || url.length > 256 || url.includes("?") || url.includes("#"))
|
|
2188
2651
|
return false;
|
|
@@ -2196,7 +2659,7 @@ function isPrimerTokenizeUrl(url, method = "POST") {
|
|
|
2196
2659
|
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;
|
|
2197
2660
|
}
|
|
2198
2661
|
function judgeBody4(body) {
|
|
2199
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
2662
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT14)
|
|
2200
2663
|
return null;
|
|
2201
2664
|
let value;
|
|
2202
2665
|
try {
|
|
@@ -2205,16 +2668,16 @@ function judgeBody4(body) {
|
|
|
2205
2668
|
catch {
|
|
2206
2669
|
return null;
|
|
2207
2670
|
}
|
|
2208
|
-
if (!
|
|
2671
|
+
if (!record12(value) || !roundTrips(value, body))
|
|
2209
2672
|
return null;
|
|
2210
|
-
if (!Object.keys(value).every((key) =>
|
|
2673
|
+
if (!Object.keys(value).every((key) => ROOT_KEYS6.includes(key)) || !owns5(value, "paymentInstrument"))
|
|
2211
2674
|
return null;
|
|
2212
2675
|
const instrument = value.paymentInstrument;
|
|
2213
|
-
if (!
|
|
2676
|
+
if (!record12(instrument) || !Object.keys(instrument).every((key) => INSTRUMENT_KEYS.includes(key)) || !REQUIRED_INSTRUMENT_KEYS.every((key) => owns5(instrument, key)))
|
|
2214
2677
|
return null;
|
|
2215
|
-
if (!digits(instrument.number, 12, 19) || !digits(instrument.cvv, 3, 4) || !exact(
|
|
2678
|
+
if (!digits(instrument.number, 12, 19) || !digits(instrument.cvv, 3, 4) || !exact(MONTH8, instrument.expirationMonth) || !exact(YEAR8, instrument.expirationYear))
|
|
2216
2679
|
return null;
|
|
2217
|
-
if (owns5(instrument, "cardholderName") && instrument.cardholderName !== null && !plain(instrument.cardholderName, 256) || owns5(instrument, "preferredNetwork") && instrument.preferredNetwork !== null && !exact(
|
|
2680
|
+
if (owns5(instrument, "cardholderName") && instrument.cardholderName !== null && !plain(instrument.cardholderName, 256) || owns5(instrument, "preferredNetwork") && instrument.preferredNetwork !== null && !exact(NETWORK2, instrument.preferredNetwork) || owns5(value, "userDescription") && value.userDescription !== null && !plain(value.userDescription, 256) || owns5(value, "tokenType") && value.tokenType !== "MULTI_USE" || owns5(value, "paymentFlow") && value.paymentFlow !== "VAULT")
|
|
2218
2681
|
return null;
|
|
2219
2682
|
return { value, keepOnFile: owns5(value, "tokenType") || owns5(value, "paymentFlow") };
|
|
2220
2683
|
}
|
|
@@ -2238,7 +2701,7 @@ var CLIENT_TOKEN = /^[A-Za-z0-9._~+/=-]{16,4096}$/;
|
|
|
2238
2701
|
var REQUEST_ID = /^[A-Za-z0-9-]{1,64}$/;
|
|
2239
2702
|
var API_VERSION = /^2\.[0-9]{1,2}$/;
|
|
2240
2703
|
function readHeaders(headers) {
|
|
2241
|
-
if (!
|
|
2704
|
+
if (!record12(headers))
|
|
2242
2705
|
return null;
|
|
2243
2706
|
const folded = /* @__PURE__ */ new Map();
|
|
2244
2707
|
for (const [name, value] of Object.entries(headers)) {
|
|
@@ -2285,7 +2748,7 @@ function onTokenizePath(url) {
|
|
|
2285
2748
|
}
|
|
2286
2749
|
}
|
|
2287
2750
|
function primerTokenizeRefusal(request) {
|
|
2288
|
-
if (!
|
|
2751
|
+
if (!record12(request) || request.method !== "POST" || !isPrimerTokenizeUrl(request.url))
|
|
2289
2752
|
return "unsupported";
|
|
2290
2753
|
return headersRefusal(request.headers) ?? primerBodyRefusal(request.body);
|
|
2291
2754
|
}
|
|
@@ -2300,7 +2763,7 @@ function primerCardOnFileRefusal(url, options, policy = PRIMER_SESSION_CARD_ON_F
|
|
|
2300
2763
|
return "unsupported";
|
|
2301
2764
|
if (new URL(url).hostname !== LIVE_PCI_HOST)
|
|
2302
2765
|
return null;
|
|
2303
|
-
return primerCardOnFileDisclosure(url, policy) &&
|
|
2766
|
+
return primerCardOnFileDisclosure(url, policy) && record12(options) && options.keepOnFile === true ? null : "keep_on_file";
|
|
2304
2767
|
}
|
|
2305
2768
|
function primerRefusalMessage(reason) {
|
|
2306
2769
|
if (reason === "keep_on_file")
|
|
@@ -2361,7 +2824,7 @@ function injectPrimerCard(body, card) {
|
|
|
2361
2824
|
}
|
|
2362
2825
|
var TOKEN3 = /^[A-Za-z0-9_-]{8,256}$/;
|
|
2363
2826
|
var ERROR_ID = /^[A-Za-z][A-Za-z0-9_.-]{0,63}$/;
|
|
2364
|
-
var
|
|
2827
|
+
var CODE3 = /^[A-Z][A-Z0-9_]{0,63}$/;
|
|
2365
2828
|
var NETWORK_NAME = /^[A-Za-z][A-Za-z0-9 _-]{0,31}$/;
|
|
2366
2829
|
var RESPONSE_MONTH = /^(?:0?[1-9]|1[0-2])$/;
|
|
2367
2830
|
var RESPONSE_YEAR = /^(?:[0-9]{2}|20[0-9]{2})$/;
|
|
@@ -2384,7 +2847,7 @@ function readAnswer(body) {
|
|
|
2384
2847
|
return null;
|
|
2385
2848
|
try {
|
|
2386
2849
|
const value = JSON.parse(body);
|
|
2387
|
-
return
|
|
2850
|
+
return record12(value) ? value : null;
|
|
2388
2851
|
}
|
|
2389
2852
|
catch {
|
|
2390
2853
|
return null;
|
|
@@ -2393,16 +2856,16 @@ function readAnswer(body) {
|
|
|
2393
2856
|
var tokenValue = (value) => exact(TOKEN3, value) && !panLike(value);
|
|
2394
2857
|
var optional = (value, key, check) => !owns5(value, key) || value[key] === null || check(value[key]);
|
|
2395
2858
|
function cardDetails(data) {
|
|
2396
|
-
if (!
|
|
2859
|
+
if (!record12(data) || !exact(/^[0-9]{4}$/, data.last4Digits))
|
|
2397
2860
|
return null;
|
|
2398
|
-
if (!optional(data, "first6Digits", (v) => exact(/^[0-9]{6}$/, v)) || !optional(data, "expirationMonth", (v) => exact(RESPONSE_MONTH, v)) || !optional(data, "expirationYear", (v) => exact(RESPONSE_YEAR, v)) || !optional(data, "cardholderName", (v) => plain(v, 256)) || !optional(data, "network", (v) => exact(NETWORK_NAME, v)) || !optional(data, "isNetworkTokenized", (v) => typeof v === "boolean") || !optional(data, "binData",
|
|
2861
|
+
if (!optional(data, "first6Digits", (v) => exact(/^[0-9]{6}$/, v)) || !optional(data, "expirationMonth", (v) => exact(RESPONSE_MONTH, v)) || !optional(data, "expirationYear", (v) => exact(RESPONSE_YEAR, v)) || !optional(data, "cardholderName", (v) => plain(v, 256)) || !optional(data, "network", (v) => exact(NETWORK_NAME, v)) || !optional(data, "isNetworkTokenized", (v) => typeof v === "boolean") || !optional(data, "binData", record12))
|
|
2399
2862
|
return null;
|
|
2400
2863
|
const safe = { last4Digits: data.last4Digits };
|
|
2401
2864
|
for (const key of ["first6Digits", "expirationMonth", "expirationYear", "cardholderName", "network", "isNetworkTokenized"]) {
|
|
2402
2865
|
if (owns5(data, key) && data[key] !== null)
|
|
2403
2866
|
safe[key] = data[key];
|
|
2404
2867
|
}
|
|
2405
|
-
if (
|
|
2868
|
+
if (record12(data.binData)) {
|
|
2406
2869
|
const bin = {};
|
|
2407
2870
|
for (const key of BIN_KEYS) {
|
|
2408
2871
|
if (!owns5(data.binData, key) || data.binData[key] === null)
|
|
@@ -2418,7 +2881,7 @@ function cardDetails(data) {
|
|
|
2418
2881
|
function threeDsSummary(value) {
|
|
2419
2882
|
if (value === void 0 || value === null)
|
|
2420
2883
|
return null;
|
|
2421
|
-
if (!
|
|
2884
|
+
if (!record12(value) || !exact(CODE3, value.responseCode) || !optional(value, "reasonCode", (v) => exact(CODE3, v)) || !optional(value, "reasonText", (v) => plain(v, 256)) || !optional(value, "protocolVersion", (v) => v === "" || exact(PROTOCOL, v)) || !optional(value, "challengeIssued", (v) => typeof v === "boolean"))
|
|
2422
2885
|
return void 0;
|
|
2423
2886
|
const safe = { responseCode: value.responseCode };
|
|
2424
2887
|
for (const key of ["reasonCode", "reasonText", "protocolVersion", "challengeIssued"]) {
|
|
@@ -2446,7 +2909,7 @@ function rebuildToken(value) {
|
|
|
2446
2909
|
}
|
|
2447
2910
|
function primerErrorId(body) {
|
|
2448
2911
|
const value = readAnswer(body);
|
|
2449
|
-
const id = value &&
|
|
2912
|
+
const id = value && record12(value.error) ? value.error.errorId : null;
|
|
2450
2913
|
return exact(ERROR_ID, id) && !panLike(id) ? id : null;
|
|
2451
2914
|
}
|
|
2452
2915
|
function matchesCard(details, card) {
|