@agent-cards/sdk 0.24.1 → 0.25.0
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 +6 -0
- package/dist/approvals.d.ts +44 -0
- package/dist/approvals.js +10 -0
- package/dist/capabilities.generated.js +1 -1
- package/dist/card-fields.generated.js +357 -263
- package/dist/cdp.js +34 -13
- package/dist/client.d.ts +9 -0
- package/dist/client.js +9 -0
- package/dist/datatrans.generated.js +3 -1
- package/dist/index.d.ts +1 -1
- package/dist/lifecycle.d.ts +23 -5
- package/dist/lifecycle.js +45 -22
- package/dist/merchant-card-endpoints.generated.js +30 -3
- package/dist/payrails.generated.js +3 -1
- package/dist/pre-claim.d.ts +3 -0
- package/dist/pre-claim.js +45 -1
- package/dist/preflight-catalog.json +25 -0
- package/dist/preflight-schemas.json +2 -0
- package/dist/preflight.generated.js +10 -1
- package/dist/primer.generated.js +366 -273
- package/dist/stripe-checkout.generated.js +336 -242
- package/dist/stripe-continuation.d.ts +45 -0
- package/dist/stripe-continuation.js +106 -0
- package/dist/stripe-setup.d.ts +5 -10
- package/dist/stripe-setup.js +11 -39
- package/dist/token-repeats.d.ts +32 -0
- package/dist/token-repeats.js +64 -0
- package/examples/preflight/kernel-native/inventory.json +1 -1
- package/package.json +2 -2
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: 8c51d9a96bc459152335ed188a90bb7d6b3548469c16938af3e384afdad5370b
|
|
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
|
|
@@ -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 own24 = Object.keys(value);
|
|
369
|
+
return own24.length === keys.length && own24.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" });
|
|
@@ -784,8 +784,8 @@ var PADDLE_TOKENEX_PSP = "paddle_tokenex";
|
|
|
784
784
|
var PADDLE_TOKENEX_FACT_KEYS = /* @__PURE__ */ Object.freeze(["card_first_six", "card_last_four", "expiry_month", "expiry_year", "card_brand"]);
|
|
785
785
|
var record4 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
786
786
|
var sameKeys2 = (value, keys) => {
|
|
787
|
-
const
|
|
788
|
-
return
|
|
787
|
+
const own24 = Object.keys(value);
|
|
788
|
+
return own24.length === keys.length && own24.every((key, at) => key === keys[at]);
|
|
789
789
|
};
|
|
790
790
|
var refuse7 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
791
791
|
var CARD6 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -1274,8 +1274,8 @@ var TEXT_LIMIT = 256;
|
|
|
1274
1274
|
var CONTROL4 = /[\u0000-\u001f\u007f]/;
|
|
1275
1275
|
var record6 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
1276
1276
|
var sameKeys3 = (value, keys) => {
|
|
1277
|
-
const
|
|
1278
|
-
return
|
|
1277
|
+
const own24 = Object.keys(value);
|
|
1278
|
+
return own24.length === keys.length && own24.every((key, at) => key === keys[at]);
|
|
1279
1279
|
};
|
|
1280
1280
|
var plainText = (value) => typeof value === "string" && value.length <= TEXT_LIMIT && !CONTROL4.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
|
|
1281
1281
|
var refuse9 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
@@ -1477,8 +1477,8 @@ var EXPIRATION = /^[0-9]{2}(?:0[1-9]|1[0-2])$/;
|
|
|
1477
1477
|
var CARD_PAYMENT = "PAYMENT_CARD";
|
|
1478
1478
|
var record8 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
1479
1479
|
var sameKeys4 = (value, keys) => {
|
|
1480
|
-
const
|
|
1481
|
-
return
|
|
1480
|
+
const own24 = Object.keys(value);
|
|
1481
|
+
return own24.length === keys.length && own24.every((key, at) => key === keys[at]);
|
|
1482
1482
|
};
|
|
1483
1483
|
var refuse11 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
1484
1484
|
var CARD10 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -1708,8 +1708,8 @@ var LOCALE = /^[a-z]{2}(?:-[A-Za-z]{2,4})?$/;
|
|
|
1708
1708
|
var PAN_LIKE3 = /(?:[0-9][ _.:-]*){12,}/;
|
|
1709
1709
|
var record9 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
1710
1710
|
var sameKeys5 = (value, keys) => {
|
|
1711
|
-
const
|
|
1712
|
-
return
|
|
1711
|
+
const own24 = Object.keys(value);
|
|
1712
|
+
return own24.length === keys.length && own24.every((key, at) => key === keys[at]);
|
|
1713
1713
|
};
|
|
1714
1714
|
var refuse13 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
1715
1715
|
var CARD12 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -1992,6 +1992,8 @@ function enclosedValue(char) {
|
|
|
1992
1992
|
var asciiDigits = (text11) => (typeof text11.normalize === "function" ? text11.normalize("NFKC") : text11).replace(ENCLOSED_CHAR, enclosedValue).replace(/\p{Nd}/gu, (char) => char >= "0" && char <= "9" ? char : digitValue(char));
|
|
1993
1993
|
var digitCount = (text11) => (asciiDigits(String(text11)).match(/\p{N}/gu) ?? []).length;
|
|
1994
1994
|
var NAME_DIGITS = 3;
|
|
1995
|
+
var UTF8_SEQUENCE = "[\\x00-\\x7f]|[\\xc2-\\xdf][\\x80-\\xbf]|\\xe0[\\xa0-\\xbf][\\x80-\\xbf]|[\\xe1-\\xec\\xee\\xef][\\x80-\\xbf]{2}|\\xed[\\x80-\\x9f][\\x80-\\xbf]|\\xf0[\\x90-\\xbf][\\x80-\\xbf]{2}|[\\xf1-\\xf3][\\x80-\\xbf]{3}|\\xf4[\\x80-\\x8f][\\x80-\\xbf]{2}";
|
|
1996
|
+
var UTF8_WHOLE = /* @__PURE__ */ new RegExp(`^(?:${UTF8_SEQUENCE})*$`);
|
|
1995
1997
|
// src/pay-nl.js
|
|
1996
1998
|
var PAY_NL_PSP = "pay_nl";
|
|
1997
1999
|
var PAY_NL_TOKEN_URL = "https://payment.pay.nl/v1/Payment/getCardToken/json";
|
|
@@ -2759,8 +2761,8 @@ var TEXT_LIMIT3 = 256;
|
|
|
2759
2761
|
var CONTROL7 = /[\u0000-\u001f\u007f]/;
|
|
2760
2762
|
var record13 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
2761
2763
|
var sameKeys7 = (value, keys) => {
|
|
2762
|
-
const
|
|
2763
|
-
return
|
|
2764
|
+
const own24 = Object.keys(value);
|
|
2765
|
+
return own24.length === keys.length && own24.every((key, at) => key === keys[at]);
|
|
2764
2766
|
};
|
|
2765
2767
|
var plainText3 = (value) => typeof value === "string" && value.length <= TEXT_LIMIT3 && !CONTROL7.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
|
|
2766
2768
|
var refuse19 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
@@ -3465,8 +3467,8 @@ var HOSTNAME = /^(?=.{1,253}$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](
|
|
|
3465
3467
|
var PUBLISHABLE_KEY = /^[A-Za-z0-9]{16,64}$/;
|
|
3466
3468
|
var record18 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3467
3469
|
var sameKeys8 = (value, keys) => {
|
|
3468
|
-
const
|
|
3469
|
-
return
|
|
3470
|
+
const own24 = Object.keys(value);
|
|
3471
|
+
return own24.length === keys.length && own24.every((key, at) => key === keys[at]);
|
|
3470
3472
|
};
|
|
3471
3473
|
var refuse24 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
3472
3474
|
var CARD23 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -4157,8 +4159,8 @@ var LONG_TEXT_LIMIT = BODY_LIMIT25;
|
|
|
4157
4159
|
var record22 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4158
4160
|
var owns6 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4159
4161
|
var sameKeys9 = (value, keys) => {
|
|
4160
|
-
const
|
|
4161
|
-
return
|
|
4162
|
+
const own24 = Object.keys(value);
|
|
4163
|
+
return own24.length === keys.length && own24.every((key, at) => key === keys[at]);
|
|
4162
4164
|
};
|
|
4163
4165
|
var exact3 = (pattern, value) => typeof value === "string" && pattern.test(value);
|
|
4164
4166
|
var printable3 = (text11) => [...text11].every((character) => {
|
|
@@ -4557,8 +4559,8 @@ var POSTAL_CODE4 = /^[A-Za-z0-9 -]{0,16}$/;
|
|
|
4557
4559
|
var CIPHERTEXT_B64 = /^[A-Za-z0-9+/]{341}[AQgw]==$/;
|
|
4558
4560
|
var record24 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4559
4561
|
var sameKeys11 = (value, keys) => {
|
|
4560
|
-
const
|
|
4561
|
-
return
|
|
4562
|
+
const own24 = Object.keys(value);
|
|
4563
|
+
return own24.length === keys.length && own24.every((key, at) => key === keys[at]);
|
|
4562
4564
|
};
|
|
4563
4565
|
var refuse29 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4564
4566
|
var failed = (code) => (
|
|
@@ -5890,12 +5892,12 @@ function membersRefusal(root) {
|
|
|
5890
5892
|
const pending = [[root, ""]];
|
|
5891
5893
|
while (pending.length > 0) {
|
|
5892
5894
|
const [node, path] = pending.pop();
|
|
5893
|
-
const
|
|
5895
|
+
const own24 = path === "" ? TRANSACTION_MEMBERS : owns7(RECORD_MEMBERS, path) ? RECORD_MEMBERS[path] : null;
|
|
5894
5896
|
for (const [key, child] of Object.entries(node)) {
|
|
5895
5897
|
const at = Array.isArray(node) ? path : path === "" ? key : `${path}.${key}`;
|
|
5896
5898
|
if (at === "checkoutCreditCard")
|
|
5897
5899
|
continue;
|
|
5898
|
-
if (
|
|
5900
|
+
if (own24 !== null && !own24.includes(key))
|
|
5899
5901
|
return true;
|
|
5900
5902
|
if (TEXT_RECORDS.includes(path) && child !== null && typeof child !== "string")
|
|
5901
5903
|
return true;
|
|
@@ -6262,6 +6264,96 @@ var aurus_default = /* @__PURE__ */ registerProcessor({
|
|
|
6262
6264
|
bodyGate: (url, body) => url !== void 0 && !isAurusTokenUrl(url) ? refuse37("aurus_url_refused") : aurusBodyVerdict(body),
|
|
6263
6265
|
limitations: ["The card frame seals the card in the page under a public key its own script carries; the cardholder's device does not seal for Aurus yet, so a held request opens no approval that pays."]
|
|
6264
6266
|
});
|
|
6267
|
+
// src/processors/bigcommerce.js
|
|
6268
|
+
var BIGCOMMERCE_PSP = "bigcommerce";
|
|
6269
|
+
var BIGCOMMERCE_OPERATION = "bigcommerce.card_request";
|
|
6270
|
+
var BIGCOMMERCE_PAYMENTS_URL = "https://payments.bigcommerce.com/api/public/v1/orders/payments";
|
|
6271
|
+
var BODY_LIMIT36 = 65536;
|
|
6272
|
+
var CARD_KEYS16 = /* @__PURE__ */ new Set([
|
|
6273
|
+
"account_name",
|
|
6274
|
+
"month",
|
|
6275
|
+
"number",
|
|
6276
|
+
"verification_value",
|
|
6277
|
+
"year",
|
|
6278
|
+
"customer_code",
|
|
6279
|
+
"three_d_secure",
|
|
6280
|
+
"hosted_form_nonce"
|
|
6281
|
+
]);
|
|
6282
|
+
var OTHER_INSTRUMENTS = /* @__PURE__ */ Object.freeze(["bigpay_token", "credit_card_token", "credit_card_cryptogram"]);
|
|
6283
|
+
var NUMBER8 = /^[0-9]{12,19}$/;
|
|
6284
|
+
var CURRENCY6 = /^[A-Z]{3}$/;
|
|
6285
|
+
var record32 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
6286
|
+
var own12 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
6287
|
+
var refuse38 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
6288
|
+
var CARD37 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
6289
|
+
var CONTINUE13 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
|
|
6290
|
+
function isBigcommercePaymentsUrl(url) {
|
|
6291
|
+
return url === BIGCOMMERCE_PAYMENTS_URL;
|
|
6292
|
+
}
|
|
6293
|
+
function readBody22(body) {
|
|
6294
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT36)
|
|
6295
|
+
return null;
|
|
6296
|
+
try {
|
|
6297
|
+
const parsed = JSON.parse(body);
|
|
6298
|
+
return record32(parsed) && record32(parsed.payment) ? parsed : null;
|
|
6299
|
+
}
|
|
6300
|
+
catch {
|
|
6301
|
+
return null;
|
|
6302
|
+
}
|
|
6303
|
+
}
|
|
6304
|
+
function bigcommerceBodyVerdict(body, url) {
|
|
6305
|
+
if (url !== void 0 && !isBigcommercePaymentsUrl(url))
|
|
6306
|
+
return refuse38("bigcommerce_url_refused");
|
|
6307
|
+
const parsed = readBody22(body);
|
|
6308
|
+
if (!parsed)
|
|
6309
|
+
return refuse38("bigcommerce_body_unsupported");
|
|
6310
|
+
const { payment } = parsed;
|
|
6311
|
+
if (!own12(payment, "credit_card"))
|
|
6312
|
+
return CONTINUE13;
|
|
6313
|
+
const card = payment.credit_card;
|
|
6314
|
+
if (!record32(card) || OTHER_INSTRUMENTS.some((key) => own12(payment, key)) || Object.keys(card).some((key) => !CARD_KEYS16.has(key)) || typeof card.number !== "string" || !NUMBER8.test(card.number)) {
|
|
6315
|
+
return refuse38("bigcommerce_body_unsupported");
|
|
6316
|
+
}
|
|
6317
|
+
if (payment.vault_payment_instrument === true)
|
|
6318
|
+
return refuse38("bigcommerce_keep_on_file");
|
|
6319
|
+
return CARD37;
|
|
6320
|
+
}
|
|
6321
|
+
function bigcommerceAmount(template) {
|
|
6322
|
+
const parsed = record32(template) ? readBody22(template.body) : null;
|
|
6323
|
+
const order = parsed && record32(parsed.order) ? parsed.order : null;
|
|
6324
|
+
const total = order && record32(order.totals) ? order.totals.grand_total : void 0;
|
|
6325
|
+
if (!Number.isSafeInteger(total) || total <= 0 || typeof order.currency !== "string" || !CURRENCY6.test(order.currency))
|
|
6326
|
+
return null;
|
|
6327
|
+
return { amountCents: total, currency: order.currency.toLowerCase() };
|
|
6328
|
+
}
|
|
6329
|
+
var bigcommerce_default = /* @__PURE__ */ registerProcessor({
|
|
6330
|
+
psp: BIGCOMMERCE_PSP,
|
|
6331
|
+
definitions: [
|
|
6332
|
+
{
|
|
6333
|
+
psp: "bigcommerce",
|
|
6334
|
+
// The card request above. One host serves every BigCommerce store, test and live alike, so no sandbox host is
|
|
6335
|
+
// marked. Ships dark: served only to a client that declares `bigcommerce_card_form`, for a company the backend's
|
|
6336
|
+
// processor gate turns BigCommerce on for. `(?![\w/.%-])` ends the path for a consumer that tests `match`
|
|
6337
|
+
// unanchored; the exact-URL rule holds the rest.
|
|
6338
|
+
capability: "bigcommerce_card_form",
|
|
6339
|
+
match: "payments\\.bigcommerce\\.com/api/public/v1/orders/payments(?![\\w/.%-])",
|
|
6340
|
+
hosts: ["^payments\\.bigcommerce\\.com$"],
|
|
6341
|
+
encoding: "json",
|
|
6342
|
+
// The order's payment token and the JSON Accept. Origin, Referer and cookies never ride.
|
|
6343
|
+
passthroughHeaders: ["^authorization$", "^accept$"],
|
|
6344
|
+
jsonCardFields: [["payment", "credit_card", "number"]],
|
|
6345
|
+
// A payment with no new card on the same URL continues untouched (bigcommerceBodyVerdict says which).
|
|
6346
|
+
passWithoutCard: "payments\\.bigcommerce\\.com/api/public/v1/orders/payments"
|
|
6347
|
+
}
|
|
6348
|
+
],
|
|
6349
|
+
// The request charges the store's gateway at once, so only the cardholder's device sends it, after a person approves.
|
|
6350
|
+
refusedOperations: [BIGCOMMERCE_OPERATION],
|
|
6351
|
+
// Not surveyed: reading a BigCommerce payment back takes the store's own API credentials, which Agentcard never holds.
|
|
6352
|
+
settlementReadback: "not_surveyed",
|
|
6353
|
+
exactUrl: isBigcommercePaymentsUrl,
|
|
6354
|
+
bodyGate: (url, body) => bigcommerceBodyVerdict(body, url),
|
|
6355
|
+
amount: bigcommerceAmount
|
|
6356
|
+
});
|
|
6265
6357
|
// src/processors/bluesnap.js
|
|
6266
6358
|
var BLUESNAP_PSP = "bluesnap";
|
|
6267
6359
|
var BLUESNAP_OPERATION = "bluesnap.card_request";
|
|
@@ -6269,16 +6361,16 @@ var BLUESNAP_HOSTS = /* @__PURE__ */ Object.freeze({ 1: "ws1.bluesnap.com", 2: "
|
|
|
6269
6361
|
var BLUESNAP_SANDBOX_HOST = "sandpay.bluesnap.com";
|
|
6270
6362
|
var BLUESNAP_CARD_KEYS = /* @__PURE__ */ Object.freeze(["cvv", "ccNumber", "expDate"]);
|
|
6271
6363
|
var BLUESNAP_LEG_KEYS = /* @__PURE__ */ Object.freeze(["cvv", "expDate"]);
|
|
6272
|
-
var
|
|
6364
|
+
var BODY_LIMIT37 = 1024;
|
|
6273
6365
|
var TOKEN_URL2 = /^https:\/\/(ws1|ws2|sandpay)\.bluesnap\.com\/services\/2\/payment-fields-tokens\/([0-9a-f]{64}_[12]?)$/;
|
|
6274
6366
|
var CARD_NUMBER18 = /^[0-9]{12,19}$/;
|
|
6275
6367
|
var SECURITY_CODE22 = /^[0-9]{3,4}$/;
|
|
6276
6368
|
var EXPIRY3 = /^(?:0[1-9]|1[0-2])\/20[0-9]{2}$/;
|
|
6277
6369
|
var SAVED_CARD_KEYS2 = ["last4Digits", "lastFourDigits", "ccType"];
|
|
6278
|
-
var
|
|
6279
|
-
var
|
|
6280
|
-
var
|
|
6281
|
-
var
|
|
6370
|
+
var record33 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
6371
|
+
var own13 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
6372
|
+
var refuse39 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
6373
|
+
var CARD38 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
6282
6374
|
var LEG = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
|
|
6283
6375
|
function bluesnapTokenUrl(url) {
|
|
6284
6376
|
const match = typeof url === "string" ? TOKEN_URL2.exec(url) : null;
|
|
@@ -6290,30 +6382,30 @@ function bluesnapTokenUrl(url) {
|
|
|
6290
6382
|
function isBluesnapTokenUrl(url) {
|
|
6291
6383
|
return bluesnapTokenUrl(url) !== null;
|
|
6292
6384
|
}
|
|
6293
|
-
function
|
|
6294
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
6385
|
+
function readBody23(body) {
|
|
6386
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT37)
|
|
6295
6387
|
return null;
|
|
6296
6388
|
try {
|
|
6297
6389
|
const value = JSON.parse(body);
|
|
6298
|
-
return
|
|
6390
|
+
return record33(value) && JSON.stringify(value) === body ? value : null;
|
|
6299
6391
|
}
|
|
6300
6392
|
catch {
|
|
6301
6393
|
return null;
|
|
6302
6394
|
}
|
|
6303
6395
|
}
|
|
6304
6396
|
function bluesnapBodyVerdict(body) {
|
|
6305
|
-
const value =
|
|
6397
|
+
const value = readBody23(body);
|
|
6306
6398
|
if (value === null)
|
|
6307
|
-
return
|
|
6399
|
+
return refuse39("bluesnap_body_unsupported");
|
|
6308
6400
|
const keys = Object.keys(value);
|
|
6309
6401
|
if (keys.some((key) => SAVED_CARD_KEYS2.includes(key)))
|
|
6310
|
-
return
|
|
6402
|
+
return refuse39(own13(value, "ccNumber") ? "bluesnap_body_unsupported" : "bluesnap_saved_card");
|
|
6311
6403
|
if (keys.length === 0 || keys.some((key, i) => !BLUESNAP_CARD_KEYS.includes(key) || i > 0 && BLUESNAP_CARD_KEYS.indexOf(keys[i - 1]) >= BLUESNAP_CARD_KEYS.indexOf(key))) {
|
|
6312
|
-
return
|
|
6404
|
+
return refuse39("bluesnap_body_unsupported");
|
|
6313
6405
|
}
|
|
6314
|
-
if (
|
|
6315
|
-
return
|
|
6316
|
-
return
|
|
6406
|
+
if (own13(value, "ccNumber") && !(typeof value.ccNumber === "string" && CARD_NUMBER18.test(value.ccNumber)) || own13(value, "cvv") && !(typeof value.cvv === "string" && SECURITY_CODE22.test(value.cvv)) || own13(value, "expDate") && !(typeof value.expDate === "string" && EXPIRY3.test(value.expDate)))
|
|
6407
|
+
return refuse39("bluesnap_body_unsupported");
|
|
6408
|
+
return own13(value, "ccNumber") ? CARD38 : LEG;
|
|
6317
6409
|
}
|
|
6318
6410
|
var bluesnap_default = /* @__PURE__ */ registerProcessor({
|
|
6319
6411
|
psp: BLUESNAP_PSP,
|
|
@@ -6417,7 +6509,7 @@ var REQUIRED = Object.freeze([
|
|
|
6417
6509
|
"ekashu_failure_url",
|
|
6418
6510
|
"ekashu_callback_success_url"
|
|
6419
6511
|
]);
|
|
6420
|
-
var
|
|
6512
|
+
var CARD_KEYS17 = Object.freeze([
|
|
6421
6513
|
"ekashu_card_number",
|
|
6422
6514
|
"ekashu_expires_end_month",
|
|
6423
6515
|
"ekashu_expires_end_year",
|
|
@@ -6619,7 +6711,7 @@ var CURRENCIES2 = Object.freeze({ EUR: "eur" });
|
|
|
6619
6711
|
var MAX_URL = 512;
|
|
6620
6712
|
var MAX_ENTRY3 = 8 * 1024;
|
|
6621
6713
|
var MAX_VALUE = 256;
|
|
6622
|
-
var
|
|
6714
|
+
var own14 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
6623
6715
|
var field2 = (name, reason) => ({ ok: false, code: "hosted_form_field_refused", field: name, reason });
|
|
6624
6716
|
function cardlinkVposEntryHost(raw) {
|
|
6625
6717
|
if (typeof raw !== "string" || raw.length > MAX_URL || raw.includes("?") || raw.includes("#"))
|
|
@@ -6631,7 +6723,7 @@ function cardlinkVposEntryHost(raw) {
|
|
|
6631
6723
|
catch {
|
|
6632
6724
|
return null;
|
|
6633
6725
|
}
|
|
6634
|
-
if (url.href !== raw || url.protocol !== "https:" || url.port || url.username || url.password || !
|
|
6726
|
+
if (url.href !== raw || url.protocol !== "https:" || url.port || url.username || url.password || !own14(CARDLINK_VPOS_HOSTS, url.hostname) || url.pathname !== CARDLINK_VPOS_ENTRY_PATH)
|
|
6635
6727
|
return null;
|
|
6636
6728
|
return url.hostname;
|
|
6637
6729
|
}
|
|
@@ -6674,7 +6766,7 @@ function cardlinkVposMerchant(mid, vposHost, merchants = CARDLINK_VPOS_MERCHANTS
|
|
|
6674
6766
|
function entryAmount(values) {
|
|
6675
6767
|
const amount2 = values.get("orderAmount");
|
|
6676
6768
|
const code = values.get("currency");
|
|
6677
|
-
const currency = typeof code === "string" &&
|
|
6769
|
+
const currency = typeof code === "string" && own14(CURRENCIES2, code) ? CURRENCIES2[code] : null;
|
|
6678
6770
|
if (!currency || typeof amount2 !== "string" || !/^(?:0|[1-9]\d{0,11})(?:\.\d{1,2})?$/.test(amount2))
|
|
6679
6771
|
return null;
|
|
6680
6772
|
const [whole2, fraction = ""] = amount2.split(".");
|
|
@@ -6729,7 +6821,7 @@ function checkCardlinkVposEntry(body, { url = null, merchants = CARDLINK_VPOS_ME
|
|
|
6729
6821
|
return field2("payMethod", /^iris$/i.test(method) ? "not_a_card_payment" : "special_flow");
|
|
6730
6822
|
const amount2 = entryAmount(values);
|
|
6731
6823
|
if (!amount2)
|
|
6732
|
-
return field2(
|
|
6824
|
+
return field2(own14(CURRENCIES2, values.get("currency")) ? "orderAmount" : "currency", "malformed");
|
|
6733
6825
|
if (!/^\d{1,30}$/.test(values.get("mid")))
|
|
6734
6826
|
return field2("mid", "malformed");
|
|
6735
6827
|
if (!/^[A-Za-z0-9]{1,50}$/.test(values.get("orderid")))
|
|
@@ -6766,16 +6858,16 @@ var CARDLINK_VPOS_TDS2_FIELDS = Object.freeze([
|
|
|
6766
6858
|
]);
|
|
6767
6859
|
var PAGE_FIELDS = Object.freeze(["trid", "st", "payStep", "cmd", "startbonus", "bonusdata"]);
|
|
6768
6860
|
var WALLET_FIELDS2 = Object.freeze(["walletId", "applePayResponse"]);
|
|
6769
|
-
var
|
|
6770
|
-
var TEXT_CONTROLS = /* @__PURE__ */ new Set([
|
|
6771
|
-
var SELECT_CONTROLS = /* @__PURE__ */ new Set([
|
|
6861
|
+
var CARD39 = Object.freeze({ number: "card.pan", holder: "card.holderName", month: "card.expiryMonth", year: "card.expiryYear", cvc: "card.cvv" });
|
|
6862
|
+
var TEXT_CONTROLS = /* @__PURE__ */ new Set([CARD39.number, CARD39.holder, CARD39.cvc]);
|
|
6863
|
+
var SELECT_CONTROLS = /* @__PURE__ */ new Set([CARD39.month, CARD39.year]);
|
|
6772
6864
|
var MAX_PAGE3 = 256 * 1024;
|
|
6773
6865
|
var COOKIE_DOMAINS = Object.freeze({
|
|
6774
6866
|
"vpos.eurocommerce.gr": "eurocommerce.gr",
|
|
6775
6867
|
"ecommerce.cardlink.gr": "cardlink.gr",
|
|
6776
6868
|
"www.alphaecommerce.gr": "alphaecommerce.gr"
|
|
6777
6869
|
});
|
|
6778
|
-
var POST_REQUIRED = Object.freeze(["trid", "st", "cmd",
|
|
6870
|
+
var POST_REQUIRED = Object.freeze(["trid", "st", "cmd", CARD39.number, CARD39.holder, CARD39.month, CARD39.year, CARD39.cvc, "makepayment"]);
|
|
6779
6871
|
var POST_EMPTY = Object.freeze(["payStep", "startbonus", "bonusdata", ...WALLET_FIELDS2]);
|
|
6780
6872
|
var POST_ALLOWED = /* @__PURE__ */ new Set([...POST_REQUIRED, ...POST_EMPTY, "paymentMethod", ...CARDLINK_VPOS_TDS2_FIELDS]);
|
|
6781
6873
|
var CARDLINK_VPOS_REFUSALS = Object.freeze([
|
|
@@ -6905,7 +6997,7 @@ var REQUIRED4 = Object.freeze([
|
|
|
6905
6997
|
"CurrencyCode",
|
|
6906
6998
|
"HashValue"
|
|
6907
6999
|
]);
|
|
6908
|
-
var
|
|
7000
|
+
var CARD_KEYS18 = /* @__PURE__ */ new Set(["cardno", "cardexp", "cardcvv2", "cardholder", "param2", "param4", "cvv2", "epmonth2", "epyear2", "custocp"]);
|
|
6909
7001
|
var SECRET_KEYS = /* @__PURE__ */ new Set(["password"]);
|
|
6910
7002
|
var STORED_KEYS2 = /* @__PURE__ */ new Set([
|
|
6911
7003
|
"tokentype",
|
|
@@ -6962,7 +7054,7 @@ function checkEghlEntry(body, { url = null, merchants = EGHL_MERCHANTS } = {}) {
|
|
|
6962
7054
|
if (value === "")
|
|
6963
7055
|
continue;
|
|
6964
7056
|
const folded = key.toLowerCase();
|
|
6965
|
-
if (
|
|
7057
|
+
if (CARD_KEYS18.has(folded))
|
|
6966
7058
|
return field3(key, "card_in_entry");
|
|
6967
7059
|
if (SECRET_KEYS.has(folded))
|
|
6968
7060
|
return field3(key, "not_an_entry");
|
|
@@ -7094,7 +7186,7 @@ var FRISBII_REFUSED_PATHS = /* @__PURE__ */ Object.freeze({
|
|
|
7094
7186
|
"/v1/token/cof/": "frisbii_stored_card_unsupported",
|
|
7095
7187
|
"/v1/token/create_click_to_pay": "frisbii_click_to_pay_unsupported"
|
|
7096
7188
|
});
|
|
7097
|
-
var
|
|
7189
|
+
var BODY_LIMIT38 = 8192;
|
|
7098
7190
|
var URL_LIMIT15 = 256;
|
|
7099
7191
|
var CARD_NUMBER19 = /^[0-9]{12,19}$/;
|
|
7100
7192
|
var MONTH19 = /^(?:0[1-9]|1[0-2])$/;
|
|
@@ -7138,13 +7230,13 @@ var BROWSER_ORDER = /* @__PURE__ */ Object.freeze([
|
|
|
7138
7230
|
"tz"
|
|
7139
7231
|
]);
|
|
7140
7232
|
var LABEL = /^[A-Za-z0-9_-]{1,64}$/;
|
|
7141
|
-
var
|
|
7142
|
-
var
|
|
7143
|
-
var
|
|
7144
|
-
var
|
|
7233
|
+
var record34 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
7234
|
+
var own15 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
7235
|
+
var refuse40 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
7236
|
+
var CARD40 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
7145
7237
|
var text9 = (value, max) => typeof value === "string" && value.length <= max;
|
|
7146
7238
|
var absentOrNull = (value) => value === void 0 || value === null;
|
|
7147
|
-
var inOrder6 = (value, order) => Object.keys(value).every((key) => order.includes(key)) && Object.keys(value).join() === order.filter((key) =>
|
|
7239
|
+
var inOrder6 = (value, order) => Object.keys(value).every((key) => order.includes(key)) && Object.keys(value).join() === order.filter((key) => own15(value, key)).join();
|
|
7148
7240
|
function frisbiiTokenUrl(url) {
|
|
7149
7241
|
if (typeof url !== "string" || url.length > URL_LIMIT15 || url.includes("#"))
|
|
7150
7242
|
return null;
|
|
@@ -7155,7 +7247,7 @@ function frisbiiTokenUrl(url) {
|
|
|
7155
7247
|
catch {
|
|
7156
7248
|
return null;
|
|
7157
7249
|
}
|
|
7158
|
-
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !
|
|
7250
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !own15(FRISBII_HOSTS, parsed.hostname) || parsed.pathname !== FRISBII_TOKEN_PATH)
|
|
7159
7251
|
return null;
|
|
7160
7252
|
const match = /^\?session=([A-Za-z0-9_-]{8,128})$/.exec(parsed.search);
|
|
7161
7253
|
return match ? Object.freeze({ host: parsed.hostname, brand: FRISBII_HOSTS[parsed.hostname], session: match[1] }) : null;
|
|
@@ -7171,7 +7263,7 @@ function frisbiiRefusedFlowUrl(url) {
|
|
|
7171
7263
|
catch {
|
|
7172
7264
|
return null;
|
|
7173
7265
|
}
|
|
7174
|
-
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !
|
|
7266
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !own15(FRISBII_HOSTS, parsed.hostname) || !own15(FRISBII_REFUSED_PATHS, parsed.pathname))
|
|
7175
7267
|
return null;
|
|
7176
7268
|
return FRISBII_REFUSED_PATHS[parsed.pathname];
|
|
7177
7269
|
}
|
|
@@ -7185,28 +7277,28 @@ function luhn9(digits4) {
|
|
|
7185
7277
|
}
|
|
7186
7278
|
return sum % 10 === 0;
|
|
7187
7279
|
}
|
|
7188
|
-
function
|
|
7189
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
7280
|
+
function readBody24(body) {
|
|
7281
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT38)
|
|
7190
7282
|
return null;
|
|
7191
7283
|
try {
|
|
7192
7284
|
const value = JSON.parse(body);
|
|
7193
|
-
return
|
|
7285
|
+
return record34(value) && JSON.stringify(value) === body ? value : null;
|
|
7194
7286
|
}
|
|
7195
7287
|
catch {
|
|
7196
7288
|
return null;
|
|
7197
7289
|
}
|
|
7198
7290
|
}
|
|
7199
7291
|
function browserInfo(info) {
|
|
7200
|
-
return
|
|
7292
|
+
return record34(info) && Object.keys(info).join() === BROWSER_ORDER.join() && info.javascriptEnabled === true && typeof info.javaEnabled === "boolean" && /^size_[0-9]{3}x[0-9]{3}$/.test(info.challengeWindowSize) && [info.colorDepth, info.screenHeight, info.screenWidth].every((n) => Number.isSafeInteger(n) && n >= 0 && n <= 1e5) && Number.isSafeInteger(info.tz) && Math.abs(info.tz) <= 1440;
|
|
7201
7293
|
}
|
|
7202
7294
|
function scaBlock(block, target) {
|
|
7203
|
-
if (!
|
|
7295
|
+
if (!record34(block) || !inOrder6(block, SCA_ORDER) || !own15(block, "returnUrl") || !own15(block, "tokenBrowserInfo"))
|
|
7204
7296
|
return false;
|
|
7205
7297
|
if (!Number.isSafeInteger(block.amount) || block.amount < 0 || typeof block.currency !== "string" || !/^[A-Z]{3}$/.test(block.currency))
|
|
7206
7298
|
return false;
|
|
7207
7299
|
if (!(absentOrNull(block.orderId) || text9(block.orderId, 128)) || !(absentOrNull(block.orderText) || text9(block.orderText, 512)))
|
|
7208
7300
|
return false;
|
|
7209
|
-
if (!(absentOrNull(block.merchantScaData) ||
|
|
7301
|
+
if (!(absentOrNull(block.merchantScaData) || record34(block.merchantScaData)))
|
|
7210
7302
|
return false;
|
|
7211
7303
|
if (!text9(block.returnUrl, 2048) || !browserInfo(block.tokenBrowserInfo))
|
|
7212
7304
|
return false;
|
|
@@ -7214,16 +7306,16 @@ function scaBlock(block, target) {
|
|
|
7214
7306
|
return back !== null && (target === null || back[1] === target.brand && back[2] === target.session);
|
|
7215
7307
|
}
|
|
7216
7308
|
function frisbiiBodyVerdict(body, url) {
|
|
7217
|
-
const value =
|
|
7218
|
-
if (value === null || !inOrder6(value, BODY_ORDER) || !BODY_REQUIRED.every((key) =>
|
|
7219
|
-
return
|
|
7309
|
+
const value = readBody24(body);
|
|
7310
|
+
if (value === null || !inOrder6(value, BODY_ORDER) || !BODY_REQUIRED.every((key) => own15(value, key)) || BODY_REFUSED.some((key) => own15(value, key)))
|
|
7311
|
+
return refuse40("frisbii_body_unsupported");
|
|
7220
7312
|
if (value.recurring === true || value.intent === "CHARGE_AND_STORE")
|
|
7221
|
-
return
|
|
7313
|
+
return refuse40("frisbii_card_on_file");
|
|
7222
7314
|
const target = url === void 0 ? null : frisbiiTokenUrl(url);
|
|
7223
7315
|
if (url !== void 0 && target === null)
|
|
7224
|
-
return
|
|
7316
|
+
return refuse40("frisbii_body_unsupported");
|
|
7225
7317
|
const sound = typeof value.number === "string" && CARD_NUMBER19.test(value.number) && luhn9(value.number) && typeof value.month === "string" && MONTH19.test(value.month) && typeof value.year === "string" && YEAR20.test(value.year) && typeof value.cvv === "string" && SECURITY_CODE23.test(value.cvv) && typeof value.pkey === "string" && IDENTIFIER2.test(value.pkey) && value.recurring === false && (value.cardholder_name === void 0 || text9(value.cardholder_name, 64)) && (value.intent === void 0 || value.intent === "CHARGE") && (absentOrNull(value.recurringAverageAmount) || Number.isSafeInteger(value.recurringAverageAmount) && value.recurringAverageAmount >= 0) && (absentOrNull(value.agreementFilter) || typeof value.agreementFilter === "string" && LABEL.test(value.agreementFilter) || Array.isArray(value.agreementFilter) && value.agreementFilter.length <= 16 && value.agreementFilter.every((entry) => typeof entry === "string" && LABEL.test(entry))) && SCA_RULES.includes(value.strongAuthenticationRule) && (value.tokenStrongAuthenticationRequest === void 0 || scaBlock(value.tokenStrongAuthenticationRequest, target));
|
|
7226
|
-
return sound ?
|
|
7318
|
+
return sound ? CARD40 : refuse40("frisbii_body_unsupported");
|
|
7227
7319
|
}
|
|
7228
7320
|
var frisbii_default = /* @__PURE__ */ registerProcessor({
|
|
7229
7321
|
psp: FRISBII_PSP,
|
|
@@ -7258,8 +7350,8 @@ var frisbii_default = /* @__PURE__ */ registerProcessor({
|
|
|
7258
7350
|
return frisbiiBodyVerdict(body);
|
|
7259
7351
|
const flow = frisbiiRefusedFlowUrl(url);
|
|
7260
7352
|
if (flow !== null)
|
|
7261
|
-
return
|
|
7262
|
-
return isFrisbiiTokenUrl(url) ? frisbiiBodyVerdict(body, url) :
|
|
7353
|
+
return refuse40(flow);
|
|
7354
|
+
return isFrisbiiTokenUrl(url) ? frisbiiBodyVerdict(body, url) : refuse40("frisbii_url_refused");
|
|
7263
7355
|
},
|
|
7264
7356
|
limitations: ["A live Frisbii card goes only to a merchant account a reviewed pin lists, and none is pinned yet."]
|
|
7265
7357
|
});
|
|
@@ -7288,7 +7380,7 @@ var IYZICO_CARD_KEYS = /* @__PURE__ */ Object.freeze([
|
|
|
7288
7380
|
"registerConsumerCard",
|
|
7289
7381
|
"registerCard"
|
|
7290
7382
|
]);
|
|
7291
|
-
var
|
|
7383
|
+
var BODY_LIMIT39 = 4096;
|
|
7292
7384
|
var CARD_NUMBER20 = /^[0-9]{12,19}$/;
|
|
7293
7385
|
var SECURITY_CODE24 = /^[0-9]{3,4}$/;
|
|
7294
7386
|
var MONTH20 = /^(?:0?[1-9]|1[0-2])$/;
|
|
@@ -7298,8 +7390,8 @@ var CHANNELS = /* @__PURE__ */ Object.freeze(["WEB", "MOBILE_WEB", "MOBILE_IOS",
|
|
|
7298
7390
|
var METADATA_KEYS3 = /* @__PURE__ */ Object.freeze(["lightRedesign", "pwiGrowthActionDisabled"]);
|
|
7299
7391
|
var FLAG = /^[A-Za-z_]{1,16}$/;
|
|
7300
7392
|
var HOLDER5 = /^[^\x00-\x1f\x7f0-9]{3,100}$/u;
|
|
7301
|
-
var
|
|
7302
|
-
var
|
|
7393
|
+
var record35 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
7394
|
+
var own16 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
7303
7395
|
var inOrder7 = (value, keys) => {
|
|
7304
7396
|
let at = 0;
|
|
7305
7397
|
for (const name of Object.keys(value)) {
|
|
@@ -7311,17 +7403,17 @@ var inOrder7 = (value, keys) => {
|
|
|
7311
7403
|
}
|
|
7312
7404
|
return true;
|
|
7313
7405
|
};
|
|
7314
|
-
var
|
|
7315
|
-
var
|
|
7406
|
+
var refuse41 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
7407
|
+
var CARD41 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
7316
7408
|
function isIyzicoCardUrl(url) {
|
|
7317
7409
|
return typeof url === "string" && IYZICO_CARD_URLS.includes(url);
|
|
7318
7410
|
}
|
|
7319
|
-
function
|
|
7320
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
7411
|
+
function readBody25(body) {
|
|
7412
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT39)
|
|
7321
7413
|
return null;
|
|
7322
7414
|
try {
|
|
7323
7415
|
const value = JSON.parse(body);
|
|
7324
|
-
return
|
|
7416
|
+
return record35(value) && JSON.stringify(value) === body ? value : null;
|
|
7325
7417
|
}
|
|
7326
7418
|
catch {
|
|
7327
7419
|
return null;
|
|
@@ -7333,26 +7425,26 @@ function hundredths(price) {
|
|
|
7333
7425
|
return value > 0 ? value : null;
|
|
7334
7426
|
}
|
|
7335
7427
|
var holderName2 = (name) => typeof name === "string" && HOLDER5.test(name) && name.trim().split(/\s+/).filter((word) => word.length > 1).length > 1;
|
|
7336
|
-
var metadata = (value) =>
|
|
7428
|
+
var metadata = (value) => record35(value) && inOrder7(value, METADATA_KEYS3) && Object.values(value).every((flag3) => Array.isArray(flag3) && flag3.length === 1 && typeof flag3[0] === "string" && FLAG.test(flag3[0]));
|
|
7337
7429
|
function iyzicoBodyVerdict(body) {
|
|
7338
|
-
const value =
|
|
7430
|
+
const value = readBody25(body);
|
|
7339
7431
|
if (value === null)
|
|
7340
|
-
return
|
|
7432
|
+
return refuse41("iyzico_body_unsupported");
|
|
7341
7433
|
const card = value.paymentCard;
|
|
7342
|
-
if (
|
|
7343
|
-
return
|
|
7344
|
-
if (
|
|
7345
|
-
return
|
|
7346
|
-
if (
|
|
7347
|
-
return
|
|
7434
|
+
if (record35(card) && (own16(card, "cardToken") || own16(card, "ucsToken") || own16(card, "consumerToken")) && !own16(card, "cardNumber"))
|
|
7435
|
+
return refuse41("iyzico_saved_card");
|
|
7436
|
+
if (own16(value, "dccPayment") || own16(value, "dccQueryRrn"))
|
|
7437
|
+
return refuse41("iyzico_dcc_refused");
|
|
7438
|
+
if (own16(value, "gsmNumber") || own16(value, "buyerProtected") && value.buyerProtected !== false || record35(card) && (own16(card, "registerCard") && card.registerCard !== 0 || own16(card, "registerConsumerCard") && card.registerConsumerCard !== false)) {
|
|
7439
|
+
return refuse41("iyzico_keeps_card");
|
|
7348
7440
|
}
|
|
7349
7441
|
if (Number.isSafeInteger(value.installment) && value.installment > 1)
|
|
7350
|
-
return
|
|
7351
|
-
if (!inOrder7(value, IYZICO_BODY_KEYS) || !["installment", "paidPrice", "paymentChannel", "paymentCard"].every((key) =>
|
|
7352
|
-
return
|
|
7353
|
-
if (!
|
|
7354
|
-
return
|
|
7355
|
-
return
|
|
7442
|
+
return refuse41("iyzico_installments_refused");
|
|
7443
|
+
if (!inOrder7(value, IYZICO_BODY_KEYS) || !["installment", "paidPrice", "paymentChannel", "paymentCard"].every((key) => own16(value, key)) || value.installment !== 1 || hundredths(value.paidPrice) === null || !CHANNELS.includes(value.paymentChannel) || own16(value, "pwiMetadata") && !metadata(value.pwiMetadata))
|
|
7444
|
+
return refuse41("iyzico_body_unsupported");
|
|
7445
|
+
if (!record35(card) || Object.keys(card).join() !== IYZICO_CARD_KEYS.join() || typeof card.cardNumber !== "string" || !CARD_NUMBER20.test(card.cardNumber) || !holderName2(card.cardHolderName) || typeof card.expireYear !== "string" || !YEAR21.test(card.expireYear) || typeof card.expireMonth !== "string" || !MONTH20.test(card.expireMonth) || typeof card.cvc !== "string" || !SECURITY_CODE24.test(card.cvc))
|
|
7446
|
+
return refuse41("iyzico_body_unsupported");
|
|
7447
|
+
return CARD41;
|
|
7356
7448
|
}
|
|
7357
7449
|
var iyzico_default = /* @__PURE__ */ registerProcessor({
|
|
7358
7450
|
psp: IYZICO_PSP,
|
|
@@ -7385,7 +7477,7 @@ var iyzico_default = /* @__PURE__ */ registerProcessor({
|
|
|
7385
7477
|
source: "https://docs.iyzico.com/en/payment-methods/checkoutform/cf-implementation/cf-retrieve"
|
|
7386
7478
|
},
|
|
7387
7479
|
exactUrl: isIyzicoCardUrl,
|
|
7388
|
-
bodyGate: (url, body) => url !== void 0 && !isIyzicoCardUrl(url) ?
|
|
7480
|
+
bodyGate: (url, body) => url !== void 0 && !isIyzicoCardUrl(url) ? refuse41("iyzico_url_refused") : iyzicoBodyVerdict(body)
|
|
7389
7481
|
});
|
|
7390
7482
|
// src/processors/midtrans.js
|
|
7391
7483
|
var MIDTRANS_PSP = "midtrans";
|
|
@@ -7393,14 +7485,14 @@ var MIDTRANS_OPERATION = "midtrans.card_request";
|
|
|
7393
7485
|
var MIDTRANS_TOKEN_URL = "https://api.midtrans.com/v2/token";
|
|
7394
7486
|
var MIDTRANS_SANDBOX_TOKEN_URL = "https://api.sandbox.midtrans.com/v2/token";
|
|
7395
7487
|
var MIDTRANS_TOKEN_KEYS = /* @__PURE__ */ Object.freeze(["card_cvv", "card_number", "card_exp_month", "card_exp_year", "installment_term"]);
|
|
7396
|
-
var
|
|
7488
|
+
var BODY_LIMIT40 = 4096;
|
|
7397
7489
|
var CARD_NUMBER21 = /^[0-9]{12,19}$/;
|
|
7398
7490
|
var SECURITY_CODE25 = /^[0-9]{3,4}$/;
|
|
7399
7491
|
var MONTH21 = /^(?:0[1-9]|1[0-2])$/;
|
|
7400
7492
|
var YEAR22 = /^20[0-9]{2}$/;
|
|
7401
7493
|
var TERM = /^[0-9]{1,3}$/;
|
|
7402
|
-
var
|
|
7403
|
-
var
|
|
7494
|
+
var record36 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
7495
|
+
var own17 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
7404
7496
|
var inOrder8 = (value, keys) => {
|
|
7405
7497
|
let at = 0;
|
|
7406
7498
|
for (const name of Object.keys(value)) {
|
|
@@ -7412,18 +7504,18 @@ var inOrder8 = (value, keys) => {
|
|
|
7412
7504
|
}
|
|
7413
7505
|
return true;
|
|
7414
7506
|
};
|
|
7415
|
-
var
|
|
7416
|
-
var
|
|
7507
|
+
var refuse42 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
7508
|
+
var CARD42 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
7417
7509
|
function isMidtransTokenUrl(url) {
|
|
7418
7510
|
return url === MIDTRANS_TOKEN_URL || url === MIDTRANS_SANDBOX_TOKEN_URL;
|
|
7419
7511
|
}
|
|
7420
|
-
function
|
|
7421
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
7512
|
+
function readBody26(body) {
|
|
7513
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT40)
|
|
7422
7514
|
return null;
|
|
7423
7515
|
let value;
|
|
7424
7516
|
try {
|
|
7425
7517
|
value = JSON.parse(body);
|
|
7426
|
-
if (!
|
|
7518
|
+
if (!record36(value) || JSON.stringify(value) !== body)
|
|
7427
7519
|
return null;
|
|
7428
7520
|
}
|
|
7429
7521
|
catch {
|
|
@@ -7432,20 +7524,20 @@ function readBody25(body) {
|
|
|
7432
7524
|
return value;
|
|
7433
7525
|
}
|
|
7434
7526
|
function midtransBodyVerdict(body) {
|
|
7435
|
-
const value =
|
|
7527
|
+
const value = readBody26(body);
|
|
7436
7528
|
if (value === null || !inOrder8(value, MIDTRANS_TOKEN_KEYS)) {
|
|
7437
|
-
if (
|
|
7438
|
-
return
|
|
7439
|
-
return
|
|
7529
|
+
if (record36(value) && (own17(value, "token_id") || own17(value, "two_click")) && !own17(value, "card_number"))
|
|
7530
|
+
return refuse42("midtrans_saved_card");
|
|
7531
|
+
return refuse42("midtrans_body_unsupported");
|
|
7440
7532
|
}
|
|
7441
|
-
if (!
|
|
7442
|
-
return
|
|
7533
|
+
if (!own17(value, "card_cvv") || !own17(value, "card_number") || !own17(value, "card_exp_month") || !own17(value, "card_exp_year")) {
|
|
7534
|
+
return refuse42("midtrans_body_unsupported");
|
|
7443
7535
|
}
|
|
7444
7536
|
if (typeof value.card_cvv !== "string" || !SECURITY_CODE25.test(value.card_cvv) || typeof value.card_number !== "string" || !CARD_NUMBER21.test(value.card_number) || typeof value.card_exp_month !== "string" || !MONTH21.test(value.card_exp_month) || typeof value.card_exp_year !== "string" || !YEAR22.test(value.card_exp_year))
|
|
7445
|
-
return
|
|
7446
|
-
if (
|
|
7447
|
-
return
|
|
7448
|
-
return
|
|
7537
|
+
return refuse42("midtrans_body_unsupported");
|
|
7538
|
+
if (own17(value, "installment_term") && (typeof value.installment_term !== "string" || !TERM.test(value.installment_term)))
|
|
7539
|
+
return refuse42("midtrans_body_unsupported");
|
|
7540
|
+
return CARD42;
|
|
7449
7541
|
}
|
|
7450
7542
|
var midtrans_default = /* @__PURE__ */ registerProcessor({
|
|
7451
7543
|
psp: MIDTRANS_PSP,
|
|
@@ -7480,20 +7572,20 @@ var midtrans_default = /* @__PURE__ */ registerProcessor({
|
|
|
7480
7572
|
var MONEI_PSP = "monei";
|
|
7481
7573
|
var MONEI_OPERATION = "monei.card_request";
|
|
7482
7574
|
var MONEI_TOKENS_URL = "https://api.monei.com/v1/tokens";
|
|
7483
|
-
var
|
|
7575
|
+
var BODY_LIMIT41 = 1024;
|
|
7484
7576
|
var PAYMENT_ID = /^(?:[0-9a-f]{32}|[0-9a-f]{40})$/;
|
|
7485
7577
|
var MONEI_CARD_KEYS = /* @__PURE__ */ Object.freeze(["number", "expMonth", "expYear", "cvc"]);
|
|
7486
|
-
var
|
|
7578
|
+
var NUMBER9 = /^[0-9]{12,19}$/;
|
|
7487
7579
|
var MONTH22 = /^(?:0[1-9]|1[0-2])$/;
|
|
7488
7580
|
var YEAR23 = /^[0-9]{2}$/;
|
|
7489
7581
|
var CODE8 = /^[0-9]{3,4}$/;
|
|
7490
|
-
var
|
|
7582
|
+
var record37 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
7491
7583
|
var keysAre2 = (value, keys) => {
|
|
7492
7584
|
const found = Object.keys(value);
|
|
7493
7585
|
return found.length === keys.length && found.every((key, at) => key === keys[at]);
|
|
7494
7586
|
};
|
|
7495
|
-
var
|
|
7496
|
-
var
|
|
7587
|
+
var refuse43 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
7588
|
+
var CARD43 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
7497
7589
|
function luhn10(digits4) {
|
|
7498
7590
|
let sum = 0;
|
|
7499
7591
|
for (let at = 0; at < digits4.length; at += 1) {
|
|
@@ -7510,12 +7602,12 @@ function luhn10(digits4) {
|
|
|
7510
7602
|
function isMoneiTokensUrl(url) {
|
|
7511
7603
|
return url === MONEI_TOKENS_URL;
|
|
7512
7604
|
}
|
|
7513
|
-
function
|
|
7514
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
7605
|
+
function readBody27(body) {
|
|
7606
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT41)
|
|
7515
7607
|
return null;
|
|
7516
7608
|
try {
|
|
7517
7609
|
const value = JSON.parse(body);
|
|
7518
|
-
return
|
|
7610
|
+
return record37(value) && JSON.stringify(value) === body ? value : null;
|
|
7519
7611
|
}
|
|
7520
7612
|
catch {
|
|
7521
7613
|
return null;
|
|
@@ -7523,19 +7615,19 @@ function readBody26(body) {
|
|
|
7523
7615
|
}
|
|
7524
7616
|
function moneiBodyVerdict(body, url) {
|
|
7525
7617
|
if (url !== void 0 && !isMoneiTokensUrl(url))
|
|
7526
|
-
return
|
|
7527
|
-
const value =
|
|
7618
|
+
return refuse43("monei_url_refused");
|
|
7619
|
+
const value = readBody27(body);
|
|
7528
7620
|
if (value === null || !keysAre2(value, ["paymentId", "paymentMethod"]) || typeof value.paymentId !== "string" || !PAYMENT_ID.test(value.paymentId))
|
|
7529
|
-
return
|
|
7621
|
+
return refuse43("monei_body_unsupported");
|
|
7530
7622
|
const method = value.paymentMethod;
|
|
7531
|
-
if (!
|
|
7532
|
-
return
|
|
7623
|
+
if (!record37(method) || !keysAre2(method, ["card"]) || !record37(method.card) || !keysAre2(method.card, MONEI_CARD_KEYS))
|
|
7624
|
+
return refuse43("monei_body_unsupported");
|
|
7533
7625
|
const { number, expMonth, expYear, cvc } = method.card;
|
|
7534
7626
|
if (![number, expMonth, expYear, cvc].every((part) => typeof part === "string"))
|
|
7535
|
-
return
|
|
7536
|
-
if (!
|
|
7537
|
-
return
|
|
7538
|
-
return
|
|
7627
|
+
return refuse43("monei_body_unsupported");
|
|
7628
|
+
if (!NUMBER9.test(number) || !luhn10(number) || !MONTH22.test(expMonth) || !YEAR23.test(expYear) || !CODE8.test(cvc))
|
|
7629
|
+
return refuse43("monei_body_unsupported");
|
|
7630
|
+
return CARD43;
|
|
7539
7631
|
}
|
|
7540
7632
|
var MONEI_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
7541
7633
|
Object.freeze({ merchant: "Genuins", accountIds: Object.freeze(["8d58ab4c-4ad0-4053-b18f-79d80e9ee158"]), merchantUrls: Object.freeze(["https://genuins.com/"]) })
|
|
@@ -7599,9 +7691,9 @@ var OCEANPAYMENT_FORM_FIELDS = /* @__PURE__ */ Object.freeze([
|
|
|
7599
7691
|
"reference"
|
|
7600
7692
|
]);
|
|
7601
7693
|
var URL_LIMIT16 = 2048;
|
|
7602
|
-
var
|
|
7694
|
+
var BODY_LIMIT42 = 8192;
|
|
7603
7695
|
var SEND_PAY = /^\/gateway\/sendPay;jsessionid=[A-Za-z0-9._!-]{16,128}$/;
|
|
7604
|
-
var
|
|
7696
|
+
var own18 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
7605
7697
|
var exact4 = (pattern, value) => typeof value === "string" && pattern.test(value);
|
|
7606
7698
|
var CARD_RUN = /[0-9]{12}/;
|
|
7607
7699
|
var printable5 = (max) => (value) => typeof value === "string" && value.length <= max && /^[\x20-\x7e]*$/.test(value) && !CARD_RUN.test(value);
|
|
@@ -7648,7 +7740,7 @@ function oceanpaymentSendPayUrl(url) {
|
|
|
7648
7740
|
catch {
|
|
7649
7741
|
return null;
|
|
7650
7742
|
}
|
|
7651
|
-
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !
|
|
7743
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !own18(OCEANPAYMENT_HOSTS, parsed.hostname) || !SEND_PAY.test(parsed.pathname))
|
|
7652
7744
|
return null;
|
|
7653
7745
|
return Object.freeze({ host: parsed.hostname, environment: OCEANPAYMENT_HOSTS[parsed.hostname] });
|
|
7654
7746
|
}
|
|
@@ -7676,7 +7768,7 @@ function formDecode2(raw) {
|
|
|
7676
7768
|
return formEncode3(value) === raw ? value : null;
|
|
7677
7769
|
}
|
|
7678
7770
|
function readPairs2(body) {
|
|
7679
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
7771
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT42)
|
|
7680
7772
|
return null;
|
|
7681
7773
|
const pairs = [];
|
|
7682
7774
|
for (const chunk of body.split("&")) {
|
|
@@ -7761,7 +7853,7 @@ var PAYMENTWALL_PSP = "paymentwall";
|
|
|
7761
7853
|
var PAYMENTWALL_OPERATION = "paymentwall.card_request";
|
|
7762
7854
|
var PAYMENTWALL_TOKEN_URL = "https://pwgateway.com/api/token";
|
|
7763
7855
|
var PAYMENTWALL_SANDBOX_TOKEN_URL = "https://api.paymentwall.com/api/brick/token";
|
|
7764
|
-
var
|
|
7856
|
+
var BODY_LIMIT43 = 2048;
|
|
7765
7857
|
var KEY3 = "public_key";
|
|
7766
7858
|
var PUBLIC_KEY2 = /^(?:t_)?[A-Za-z0-9]{16,64}$/;
|
|
7767
7859
|
var SHAPES3 = /* @__PURE__ */ Object.freeze({
|
|
@@ -7771,8 +7863,8 @@ var SHAPES3 = /* @__PURE__ */ Object.freeze({
|
|
|
7771
7863
|
"card[exp_year]": /^(?:[0-9]{2}|20[0-9]{2})$/,
|
|
7772
7864
|
"card[cvv]": /^[0-9]{3,4}$/
|
|
7773
7865
|
});
|
|
7774
|
-
var
|
|
7775
|
-
var
|
|
7866
|
+
var refuse44 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
7867
|
+
var CARD44 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
7776
7868
|
function luhn11(digits4) {
|
|
7777
7869
|
let sum = 0;
|
|
7778
7870
|
for (let at = 0; at < digits4.length; at += 1) {
|
|
@@ -7800,7 +7892,7 @@ function paymentwallKeyEnvironment(publicKey) {
|
|
|
7800
7892
|
return publicKey.startsWith("t_") ? "sandbox" : "production";
|
|
7801
7893
|
}
|
|
7802
7894
|
function readPairs3(body) {
|
|
7803
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
7895
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT43 || !/^[A-Za-z0-9_[\]=&]+$/.test(body))
|
|
7804
7896
|
return null;
|
|
7805
7897
|
const pairs = /* @__PURE__ */ new Map();
|
|
7806
7898
|
for (const chunk of body.split("&")) {
|
|
@@ -7816,21 +7908,21 @@ function readPairs3(body) {
|
|
|
7816
7908
|
}
|
|
7817
7909
|
function paymentwallBodyVerdict(body, url) {
|
|
7818
7910
|
if (url !== void 0 && !isPaymentwallTokenUrl(url))
|
|
7819
|
-
return
|
|
7911
|
+
return refuse44("paymentwall_url_refused");
|
|
7820
7912
|
const pairs = readPairs3(body);
|
|
7821
7913
|
if (pairs === null)
|
|
7822
|
-
return
|
|
7914
|
+
return refuse44("paymentwall_body_unsupported");
|
|
7823
7915
|
if (pairs.has("card[token]") && !pairs.has("card[number]"))
|
|
7824
|
-
return
|
|
7916
|
+
return refuse44("paymentwall_saved_card");
|
|
7825
7917
|
const keys = Object.keys(SHAPES3);
|
|
7826
7918
|
if (pairs.size !== keys.length || !keys.every((key) => pairs.has(key) && SHAPES3[key].test(pairs.get(key)))) {
|
|
7827
|
-
return
|
|
7919
|
+
return refuse44("paymentwall_body_unsupported");
|
|
7828
7920
|
}
|
|
7829
7921
|
if (!luhn11(pairs.get("card[number]")))
|
|
7830
|
-
return
|
|
7922
|
+
return refuse44("paymentwall_body_unsupported");
|
|
7831
7923
|
if (url !== void 0 && paymentwallKeyEnvironment(pairs.get(KEY3)) !== paymentwallUrlEnvironment(url))
|
|
7832
|
-
return
|
|
7833
|
-
return
|
|
7924
|
+
return refuse44("paymentwall_key_refused");
|
|
7925
|
+
return CARD44;
|
|
7834
7926
|
}
|
|
7835
7927
|
var paymentwall_default = /* @__PURE__ */ registerProcessor({
|
|
7836
7928
|
psp: PAYMENTWALL_PSP,
|
|
@@ -7980,7 +8072,7 @@ var PAYSTACK_BODY_KEYS = /* @__PURE__ */ Object.freeze([
|
|
|
7980
8072
|
"transaction_type"
|
|
7981
8073
|
]);
|
|
7982
8074
|
var OPTIONAL = /* @__PURE__ */ new Set(["access_code", "card_holder_name", "transaction_type"]);
|
|
7983
|
-
var
|
|
8075
|
+
var BODY_LIMIT44 = 4096;
|
|
7984
8076
|
var CIPHERTEXT_BYTES2 = [62, 63, 64];
|
|
7985
8077
|
var BASE646 = /^[A-Za-z0-9+/]+={0,2}$/;
|
|
7986
8078
|
var SHAPES4 = /* @__PURE__ */ Object.freeze({
|
|
@@ -7994,8 +8086,8 @@ var SHAPES4 = /* @__PURE__ */ Object.freeze({
|
|
|
7994
8086
|
card_holder_name: /^[^\x00-\x1f\x7f0-9]{1,128}$/u,
|
|
7995
8087
|
transaction_type: /^[a-z_]{1,32}$/
|
|
7996
8088
|
});
|
|
7997
|
-
var
|
|
7998
|
-
var
|
|
8089
|
+
var own19 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
8090
|
+
var refuse45 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
7999
8091
|
function paystackFormValue(value) {
|
|
8000
8092
|
return encodeURIComponent(String(value)).replace(/%20/g, "+").replace(/[!'()*~]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);
|
|
8001
8093
|
}
|
|
@@ -8018,7 +8110,7 @@ function isCiphertext2(value) {
|
|
|
8018
8110
|
return btoa(binary) === value && CIPHERTEXT_BYTES2.includes(binary.length);
|
|
8019
8111
|
}
|
|
8020
8112
|
function readForm3(body) {
|
|
8021
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
8113
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT44)
|
|
8022
8114
|
return null;
|
|
8023
8115
|
const entries = [];
|
|
8024
8116
|
for (const part of body.split("&")) {
|
|
@@ -8037,21 +8129,21 @@ function readForm3(body) {
|
|
|
8037
8129
|
function paystackBodyVerdict(body) {
|
|
8038
8130
|
const entries = readForm3(body);
|
|
8039
8131
|
if (entries === null)
|
|
8040
|
-
return
|
|
8132
|
+
return refuse45("paystack_body_unsupported");
|
|
8041
8133
|
const keys = entries.map(([key]) => key);
|
|
8042
8134
|
if (keys.includes("subscription"))
|
|
8043
|
-
return
|
|
8135
|
+
return refuse45("paystack_subscription");
|
|
8044
8136
|
if (keys.includes("remember_card") && entries.find(([key]) => key === "remember_card")[1] !== "false")
|
|
8045
|
-
return
|
|
8137
|
+
return refuse45("paystack_saved_card");
|
|
8046
8138
|
const expected = PAYSTACK_BODY_KEYS.filter((key) => !OPTIONAL.has(key) || keys.includes(key));
|
|
8047
8139
|
if (keys.length !== expected.length || keys.some((key, i) => key !== expected[i]))
|
|
8048
|
-
return
|
|
8140
|
+
return refuse45("paystack_body_unsupported");
|
|
8049
8141
|
const fields = Object.fromEntries(entries);
|
|
8050
8142
|
if (!isCiphertext2(fields.clientdata))
|
|
8051
|
-
return
|
|
8143
|
+
return refuse45("paystack_body_unsupported");
|
|
8052
8144
|
for (const [key, shape] of Object.entries(SHAPES4)) {
|
|
8053
|
-
if (
|
|
8054
|
-
return
|
|
8145
|
+
if (own19(fields, key) && !shape.test(fields[key]))
|
|
8146
|
+
return refuse45("paystack_body_unsupported");
|
|
8055
8147
|
}
|
|
8056
8148
|
return Object.freeze({ verdict: "card", fields: Object.freeze(fields) });
|
|
8057
8149
|
}
|
|
@@ -8078,7 +8170,7 @@ var paystack_default = /* @__PURE__ */ registerProcessor({
|
|
|
8078
8170
|
// Not surveyed: reading a charge back takes the merchant's secret key, which Agentcard never holds.
|
|
8079
8171
|
settlementReadback: "not_surveyed",
|
|
8080
8172
|
exactUrl: isPaystackChargeUrl,
|
|
8081
|
-
bodyGate: (url, body) => url !== void 0 && !isPaystackChargeUrl(url) ?
|
|
8173
|
+
bodyGate: (url, body) => url !== void 0 && !isPaystackChargeUrl(url) ? refuse45("paystack_url_refused") : paystackBodyVerdict(body),
|
|
8082
8174
|
// No amount reader: the charge names none, so the agent's pair is the figure the cardholder approves.
|
|
8083
8175
|
limitations: ["The charge names no merchant and no amount: Paystack's transaction binds both, so the cardholder approves the agent's figure for whichever Paystack merchant opened the checkout."]
|
|
8084
8176
|
});
|
|
@@ -8086,7 +8178,7 @@ var paystack_default = /* @__PURE__ */ registerProcessor({
|
|
|
8086
8178
|
var PROCESSOUT_PSP = "processout";
|
|
8087
8179
|
var PROCESSOUT_OPERATION = "processout.card_request";
|
|
8088
8180
|
var URL_LIMIT17 = 512;
|
|
8089
|
-
var
|
|
8181
|
+
var BODY_LIMIT45 = 4096;
|
|
8090
8182
|
var CARD_URL2 = /^https:\/\/api\.processout\.com\/cards\?legacyrequest=true&project_id=((?:test-)?proj_[A-Za-z0-9]{16,64})&x-Content-Type=application\/json&x-API-Version=1\.3\.0\.0&x-Authorization=Basic%20([A-Za-z0-9+/]{4,256}={0,2})$/;
|
|
8091
8183
|
var PAGE_KEYS2 = /* @__PURE__ */ Object.freeze(["name", "contact", "preferred_scheme"]);
|
|
8092
8184
|
var CONTACT_KEYS = /* @__PURE__ */ Object.freeze(["address1", "address2", "city", "state", "country_code", "zip"]);
|
|
@@ -8101,7 +8193,7 @@ var DEVICE_KEYS4 = /* @__PURE__ */ Object.freeze([
|
|
|
8101
8193
|
]);
|
|
8102
8194
|
var PROCESSOUT_CARD_KEYS = /* @__PURE__ */ Object.freeze(["number", "exp_month", "exp_year", "cvc2"]);
|
|
8103
8195
|
var BODY_KEYS3 = /* @__PURE__ */ new Set([...PAGE_KEYS2, "device", ...DEVICE_KEYS4, ...PROCESSOUT_CARD_KEYS]);
|
|
8104
|
-
var
|
|
8196
|
+
var NUMBER10 = /^[0-9]{12,19}$/;
|
|
8105
8197
|
var MONTH23 = /^(?:[1-9]|1[0-2])$/;
|
|
8106
8198
|
var YEAR24 = /^20[0-9]{2}$/;
|
|
8107
8199
|
var CODE9 = /^[0-9]{3,4}$/;
|
|
@@ -8109,10 +8201,10 @@ var TEXT_LIMIT14 = 256;
|
|
|
8109
8201
|
var SCHEME = /^[A-Za-z][A-Za-z0-9 _-]{0,31}$/;
|
|
8110
8202
|
var LANGUAGE5 = /^[A-Za-z]{1,8}(?:-[A-Za-z0-9]{1,8}){0,4}$/;
|
|
8111
8203
|
var PAN_LIKE7 = /(?:[0-9][^0-9A-Za-z]*){12,}/;
|
|
8112
|
-
var
|
|
8113
|
-
var
|
|
8114
|
-
var
|
|
8115
|
-
var
|
|
8204
|
+
var record38 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
8205
|
+
var own20 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
8206
|
+
var refuse46 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
8207
|
+
var CARD45 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
8116
8208
|
var BASE647 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
8117
8209
|
function base64Of(text11) {
|
|
8118
8210
|
let out = "";
|
|
@@ -8149,12 +8241,12 @@ function processoutCardTarget(url) {
|
|
|
8149
8241
|
function isProcessoutCardUrl(url) {
|
|
8150
8242
|
return processoutCardTarget(url) !== null;
|
|
8151
8243
|
}
|
|
8152
|
-
function
|
|
8153
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
8244
|
+
function readBody28(body) {
|
|
8245
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT45)
|
|
8154
8246
|
return null;
|
|
8155
8247
|
try {
|
|
8156
8248
|
const value = JSON.parse(body);
|
|
8157
|
-
return
|
|
8249
|
+
return record38(value) && JSON.stringify(value) === body ? value : null;
|
|
8158
8250
|
}
|
|
8159
8251
|
catch {
|
|
8160
8252
|
return null;
|
|
@@ -8172,31 +8264,31 @@ var DEVICE_RULES = /* @__PURE__ */ Object.freeze({
|
|
|
8172
8264
|
});
|
|
8173
8265
|
function soundDevice3(value) {
|
|
8174
8266
|
const device = value.device;
|
|
8175
|
-
if (!
|
|
8267
|
+
if (!record38(device) || !own20(device, "request_origin") || !own20(device, "app_timezone_offset"))
|
|
8176
8268
|
return false;
|
|
8177
|
-
return DEVICE_KEYS4.every((key) =>
|
|
8269
|
+
return DEVICE_KEYS4.every((key) => own20(device, key) ? DEVICE_RULES[key](device[key]) && own20(value, key) && value[key] === device[key] : !own20(value, key)) && Object.keys(device).every((key) => DEVICE_KEYS4.includes(key));
|
|
8178
8270
|
}
|
|
8179
8271
|
function soundPageData(value) {
|
|
8180
|
-
if (
|
|
8272
|
+
if (own20(value, "name") && !pageText2(value.name))
|
|
8181
8273
|
return false;
|
|
8182
|
-
if (
|
|
8274
|
+
if (own20(value, "preferred_scheme") && !(value.preferred_scheme === null || typeof value.preferred_scheme === "string" && SCHEME.test(value.preferred_scheme)))
|
|
8183
8275
|
return false;
|
|
8184
8276
|
const contact = value.contact;
|
|
8185
|
-
return
|
|
8277
|
+
return record38(contact) && Object.keys(contact).every((key) => CONTACT_KEYS.includes(key) && pageText2(contact[key]));
|
|
8186
8278
|
}
|
|
8187
8279
|
function processoutBodyVerdict(body, url) {
|
|
8188
8280
|
if (url !== void 0 && processoutCardTarget(url) === null)
|
|
8189
|
-
return
|
|
8190
|
-
const value =
|
|
8281
|
+
return refuse46("processout_url_refused");
|
|
8282
|
+
const value = readBody28(body);
|
|
8191
8283
|
if (value === null || !Object.keys(value).every((key) => BODY_KEYS3.has(key)))
|
|
8192
|
-
return
|
|
8284
|
+
return refuse46("processout_body_unsupported");
|
|
8193
8285
|
if (!PROCESSOUT_CARD_KEYS.every((key) => typeof value[key] === "string"))
|
|
8194
|
-
return
|
|
8195
|
-
if (!
|
|
8196
|
-
return
|
|
8286
|
+
return refuse46("processout_body_unsupported");
|
|
8287
|
+
if (!NUMBER10.test(value.number) || !luhn12(value.number) || !MONTH23.test(value.exp_month) || !YEAR24.test(value.exp_year) || !CODE9.test(value.cvc2))
|
|
8288
|
+
return refuse46("processout_body_unsupported");
|
|
8197
8289
|
if (!soundPageData(value) || !soundDevice3(value))
|
|
8198
|
-
return
|
|
8199
|
-
return
|
|
8290
|
+
return refuse46("processout_body_unsupported");
|
|
8291
|
+
return CARD45;
|
|
8200
8292
|
}
|
|
8201
8293
|
var processout_default = /* @__PURE__ */ registerProcessor({
|
|
8202
8294
|
psp: PROCESSOUT_PSP,
|
|
@@ -8239,15 +8331,15 @@ var USAEPAY_HOSTS = /* @__PURE__ */ Object.freeze({
|
|
|
8239
8331
|
"sandbox.usaepay.com": "sandbox"
|
|
8240
8332
|
});
|
|
8241
8333
|
var USAEPAY_PAYMENT_KEYS_PATH = "/api/v2/pub/payment_keys";
|
|
8242
|
-
var
|
|
8334
|
+
var BODY_LIMIT46 = 512;
|
|
8243
8335
|
var URL_LIMIT18 = 256;
|
|
8244
8336
|
var CARD_NUMBER22 = /^[0-9]{13,19}$/;
|
|
8245
8337
|
var EXPIRATION2 = /^(?:0[1-9]|1[0-2])[0-9]{2}$/;
|
|
8246
8338
|
var SECURITY_CODE26 = /^(?:[0-9]{3,4})?$/;
|
|
8247
|
-
var
|
|
8248
|
-
var
|
|
8249
|
-
var
|
|
8250
|
-
var
|
|
8339
|
+
var record39 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
8340
|
+
var own21 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
8341
|
+
var refuse47 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
8342
|
+
var CARD46 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
8251
8343
|
function usaepayPaymentKeysUrl(url) {
|
|
8252
8344
|
if (typeof url !== "string" || url.length > URL_LIMIT18 || url.includes("?") || url.includes("#"))
|
|
8253
8345
|
return null;
|
|
@@ -8258,7 +8350,7 @@ function usaepayPaymentKeysUrl(url) {
|
|
|
8258
8350
|
catch {
|
|
8259
8351
|
return null;
|
|
8260
8352
|
}
|
|
8261
|
-
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !
|
|
8353
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !own21(USAEPAY_HOSTS, parsed.hostname) || parsed.pathname !== USAEPAY_PAYMENT_KEYS_PATH)
|
|
8262
8354
|
return null;
|
|
8263
8355
|
return Object.freeze({ host: parsed.hostname, environment: USAEPAY_HOSTS[parsed.hostname] });
|
|
8264
8356
|
}
|
|
@@ -8273,23 +8365,23 @@ function luhn13(digits4) {
|
|
|
8273
8365
|
}
|
|
8274
8366
|
return sum % 10 === 0;
|
|
8275
8367
|
}
|
|
8276
|
-
function
|
|
8277
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
8368
|
+
function readBody29(body) {
|
|
8369
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT46)
|
|
8278
8370
|
return null;
|
|
8279
8371
|
try {
|
|
8280
8372
|
const value = JSON.parse(body);
|
|
8281
|
-
return
|
|
8373
|
+
return record39(value) && JSON.stringify(value) === body ? value : null;
|
|
8282
8374
|
}
|
|
8283
8375
|
catch {
|
|
8284
8376
|
return null;
|
|
8285
8377
|
}
|
|
8286
8378
|
}
|
|
8287
8379
|
function usaepayBodyVerdict(body) {
|
|
8288
|
-
const value =
|
|
8380
|
+
const value = readBody29(body);
|
|
8289
8381
|
const card = value === null ? null : value.creditcard;
|
|
8290
|
-
if (value === null || Object.keys(value).join() !== "creditcard" || !
|
|
8291
|
-
return
|
|
8292
|
-
return
|
|
8382
|
+
if (value === null || Object.keys(value).join() !== "creditcard" || !record39(card) || Object.keys(card).join() !== "number,expiration,cvc" || typeof card.number !== "string" || !CARD_NUMBER22.test(card.number) || !luhn13(card.number) || typeof card.expiration !== "string" || !EXPIRATION2.test(card.expiration) || typeof card.cvc !== "string" || !SECURITY_CODE26.test(card.cvc))
|
|
8383
|
+
return refuse47("usaepay_body_unsupported");
|
|
8384
|
+
return CARD46;
|
|
8293
8385
|
}
|
|
8294
8386
|
var usaepay_default = /* @__PURE__ */ registerProcessor({
|
|
8295
8387
|
psp: USAEPAY_PSP,
|
|
@@ -8321,7 +8413,7 @@ var usaepay_default = /* @__PURE__ */ registerProcessor({
|
|
|
8321
8413
|
source: "https://help.usaepay.info/developer/payjs-v2/ , https://help.usaepay.info/api/rest/"
|
|
8322
8414
|
},
|
|
8323
8415
|
exactUrl: isUsaepayPaymentKeysUrl,
|
|
8324
|
-
bodyGate: (url, body) => url !== void 0 && !isUsaepayPaymentKeysUrl(url) ?
|
|
8416
|
+
bodyGate: (url, body) => url !== void 0 && !isUsaepayPaymentKeysUrl(url) ? refuse47("usaepay_url_refused") : usaepayBodyVerdict(body)
|
|
8325
8417
|
// No amount reader: the request names none, so the agent's pair is the figure the cardholder approves.
|
|
8326
8418
|
});
|
|
8327
8419
|
// src/processors/viva_wallet.js
|
|
@@ -8357,7 +8449,7 @@ var VIVA_WALLET_BODY_KEYS = /* @__PURE__ */ Object.freeze([
|
|
|
8357
8449
|
"merchantTrns",
|
|
8358
8450
|
"captchaToken"
|
|
8359
8451
|
]);
|
|
8360
|
-
var
|
|
8452
|
+
var BODY_LIMIT47 = 16384;
|
|
8361
8453
|
var URL_LIMIT19 = 256;
|
|
8362
8454
|
var ORDER_CODE = /^[0-9]{16}$/;
|
|
8363
8455
|
var CARD_NUMBER23 = /^[0-9]{13,19}$/;
|
|
@@ -8369,10 +8461,10 @@ var MEMBER_NAME = /^[A-Za-z][A-Za-z0-9]{0,31}$/;
|
|
|
8369
8461
|
var SHORT_ID = /^[A-Za-z0-9_-]{1,64}$/;
|
|
8370
8462
|
var TEXT4 = /^[^\u0000-\u001f\u007f]{0,200}$/;
|
|
8371
8463
|
var CARD_DIGITS2 = /[0-9]{12,}/;
|
|
8372
|
-
var
|
|
8373
|
-
var
|
|
8374
|
-
var
|
|
8375
|
-
var
|
|
8464
|
+
var record40 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
8465
|
+
var own22 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
8466
|
+
var refuse48 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
8467
|
+
var CARD47 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
8376
8468
|
var inOrder9 = (value, keys) => {
|
|
8377
8469
|
let at = 0;
|
|
8378
8470
|
for (const name of Object.keys(value)) {
|
|
@@ -8387,7 +8479,7 @@ var inOrder9 = (value, keys) => {
|
|
|
8387
8479
|
var cardDigits2 = (text11) => CARD_DIGITS2.test(text11.replace(/[^0-9A-Za-z]/g, ""));
|
|
8388
8480
|
var plainText8 = (value) => typeof value === "string" && TEXT4.test(value) && !cardDigits2(value);
|
|
8389
8481
|
var scalar = (value) => value === null || typeof value === "boolean" || Number.isSafeInteger(value) && Math.abs(value) < 1e9 || plainText8(value);
|
|
8390
|
-
var flatRecord = (value, limit) =>
|
|
8482
|
+
var flatRecord = (value, limit) => record40(value) && Object.keys(value).length <= limit && Object.entries(value).every(([key, item]) => MEMBER_NAME.test(key) && scalar(item));
|
|
8391
8483
|
function vivaWalletChargeTokensUrl(url) {
|
|
8392
8484
|
if (typeof url !== "string" || url.length > URL_LIMIT19 || url.includes("?") || url.includes("#"))
|
|
8393
8485
|
return null;
|
|
@@ -8398,7 +8490,7 @@ function vivaWalletChargeTokensUrl(url) {
|
|
|
8398
8490
|
catch {
|
|
8399
8491
|
return null;
|
|
8400
8492
|
}
|
|
8401
|
-
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !
|
|
8493
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !own22(VIVA_WALLET_HOSTS, parsed.hostname) || parsed.pathname !== VIVA_WALLET_CHARGE_TOKENS_PATH)
|
|
8402
8494
|
return null;
|
|
8403
8495
|
return Object.freeze({ host: parsed.hostname, environment: VIVA_WALLET_HOSTS[parsed.hostname] });
|
|
8404
8496
|
}
|
|
@@ -8416,12 +8508,12 @@ function luhn14(digits4) {
|
|
|
8416
8508
|
function vivaWalletMaskedNumber(number) {
|
|
8417
8509
|
return `${number.slice(0, 6)}${"X".repeat(Math.max(0, number.length - 10))}${number.slice(-4)}`;
|
|
8418
8510
|
}
|
|
8419
|
-
function
|
|
8420
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
8511
|
+
function readBody30(body) {
|
|
8512
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT47)
|
|
8421
8513
|
return null;
|
|
8422
8514
|
try {
|
|
8423
8515
|
const value = JSON.parse(body);
|
|
8424
|
-
return
|
|
8516
|
+
return record40(value) && JSON.stringify(value) === body ? value : null;
|
|
8425
8517
|
}
|
|
8426
8518
|
catch {
|
|
8427
8519
|
return null;
|
|
@@ -8433,26 +8525,26 @@ function currencyNumber(value) {
|
|
|
8433
8525
|
return typeof value === "string" && /^[0-9]{3}$/.test(value) ? Number(value) : null;
|
|
8434
8526
|
}
|
|
8435
8527
|
function vivaWalletBodyVerdict(body) {
|
|
8436
|
-
const value =
|
|
8528
|
+
const value = readBody30(body);
|
|
8437
8529
|
if (value === null || !Object.keys(value).every((key) => VIVA_WALLET_BODY_KEYS.includes(key))) {
|
|
8438
|
-
return value !== null && (
|
|
8530
|
+
return value !== null && (own22(value, "creditCardId") || own22(value, "token")) ? refuse48("viva_wallet_stored_card") : refuse48("viva_wallet_body_unsupported");
|
|
8439
8531
|
}
|
|
8440
8532
|
if (value.rememberCard !== false)
|
|
8441
|
-
return
|
|
8533
|
+
return refuse48(value.rememberCard === true ? "viva_wallet_keep_on_file" : "viva_wallet_body_unsupported");
|
|
8442
8534
|
if (value.dccAccepted === true)
|
|
8443
|
-
return
|
|
8444
|
-
if (
|
|
8445
|
-
return
|
|
8446
|
-
if (
|
|
8447
|
-
return
|
|
8535
|
+
return refuse48("viva_wallet_currency_conversion");
|
|
8536
|
+
if (own22(value, "dccAccepted") && value.dccAccepted !== false)
|
|
8537
|
+
return refuse48("viva_wallet_body_unsupported");
|
|
8538
|
+
if (own22(value, "scaRequestedTransactionId"))
|
|
8539
|
+
return refuse48("viva_wallet_retry_refused");
|
|
8448
8540
|
if (!(value.installments === 0 || value.installments === 1)) {
|
|
8449
|
-
return
|
|
8541
|
+
return refuse48(Number.isSafeInteger(value.installments) && value.installments > 1 ? "viva_wallet_installments" : "viva_wallet_body_unsupported");
|
|
8450
8542
|
}
|
|
8451
|
-
if (!inOrder9(value, VIVA_WALLET_BODY_KEYS) || ["offerCodes", "loyaltySupported", "redeemedAmount", "retrievalReferenceNumber", "merchantTrns"].some((key) =>
|
|
8452
|
-
return
|
|
8543
|
+
if (!inOrder9(value, VIVA_WALLET_BODY_KEYS) || ["offerCodes", "loyaltySupported", "redeemedAmount", "retrievalReferenceNumber", "merchantTrns"].some((key) => own22(value, key)))
|
|
8544
|
+
return refuse48("viva_wallet_body_unsupported");
|
|
8453
8545
|
const number = value.number;
|
|
8454
|
-
const sound = typeof value.orderCode === "string" && ORDER_CODE.test(value.orderCode) && Number.isSafeInteger(value.amount) && value.amount > 0 && currencyNumber(value.currencyCode) !== null && plainText8(value.holderName) && value.holderName.trim() !== "" && plainText8(value.holderMail) && (value.cvc === null || typeof value.cvc === "string" && SECURITY_CODE27.test(value.cvc)) && typeof number === "string" && CARD_NUMBER23.test(number) && luhn14(number) && typeof value.expirationMonth === "string" && MONTH24.test(value.expirationMonth) && typeof value.expirationYear === "string" && YEAR25.test(value.expirationYear) && flatRecord(value.customer, 12) && (!
|
|
8455
|
-
return sound ?
|
|
8546
|
+
const sound = typeof value.orderCode === "string" && ORDER_CODE.test(value.orderCode) && Number.isSafeInteger(value.amount) && value.amount > 0 && currencyNumber(value.currencyCode) !== null && plainText8(value.holderName) && value.holderName.trim() !== "" && plainText8(value.holderMail) && (value.cvc === null || typeof value.cvc === "string" && SECURITY_CODE27.test(value.cvc)) && typeof number === "string" && CARD_NUMBER23.test(number) && luhn14(number) && typeof value.expirationMonth === "string" && MONTH24.test(value.expirationMonth) && typeof value.expirationYear === "string" && YEAR25.test(value.expirationYear) && flatRecord(value.customer, 12) && (!own22(value, "friendlyName") || plainText8(value.friendlyName)) && value.maskedNumber === vivaWalletMaskedNumber(number) && (!own22(value, "bankId") || typeof value.bankId === "string" && SHORT_ID.test(value.bankId) || Number.isSafeInteger(value.bankId) && value.bankId >= 0) && (!own22(value, "selectedBrand") || value.selectedBrand === null || flatRecord(value.selectedBrand, 16)) && (!own22(value, "cardholderBrandSelection") || typeof value.cardholderBrandSelection === "boolean") && (!own22(value, "dccOptions") || flatRecord(value.dccOptions, 16)) && (!own22(value, "captchaToken") || typeof value.captchaToken === "string" && CAPTCHA_TOKEN.test(value.captchaToken));
|
|
8547
|
+
return sound ? CARD47 : refuse48("viva_wallet_body_unsupported");
|
|
8456
8548
|
}
|
|
8457
8549
|
var VIVA_WALLET_CURRENCIES = /* @__PURE__ */ Object.freeze({
|
|
8458
8550
|
978: "eur",
|
|
@@ -8515,9 +8607,9 @@ var viva_wallet_default = /* @__PURE__ */ registerProcessor({
|
|
|
8515
8607
|
refusedOperations: [VIVA_WALLET_OPERATION],
|
|
8516
8608
|
settlementReadback: "not_surveyed",
|
|
8517
8609
|
exactUrl: isVivaWalletChargeTokensUrl,
|
|
8518
|
-
bodyGate: (url, body) => url !== void 0 && !isVivaWalletChargeTokensUrl(url) ?
|
|
8610
|
+
bodyGate: (url, body) => url !== void 0 && !isVivaWalletChargeTokensUrl(url) ? refuse48("viva_wallet_url_refused") : vivaWalletBodyVerdict(body),
|
|
8519
8611
|
// The body names the order's amount in cents and its numeric currency, which the page's card-free charge repeats.
|
|
8520
|
-
amount: (template) =>
|
|
8612
|
+
amount: (template) => record40(template) && isVivaWalletChargeTokensUrl(template.url) ? vivaWalletAmount(template.body) : null
|
|
8521
8613
|
});
|
|
8522
8614
|
// src/processors/vtex_payments.js
|
|
8523
8615
|
var VTEX_PAYMENTS_PSP = "vtex_payments";
|
|
@@ -8567,7 +8659,7 @@ var VTEX_PAYMENTS_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
|
8567
8659
|
Object.freeze({ account: "alssports", origin: "https://www.als.com", merchant: "Al's Sporting Goods", currency: "USD" }),
|
|
8568
8660
|
Object.freeze({ account: "roadrunnersports", origin: "https://www.roadrunnersports.com", merchant: "Road Runner Sports", currency: "USD" })
|
|
8569
8661
|
]);
|
|
8570
|
-
var
|
|
8662
|
+
var BODY_LIMIT48 = 16384;
|
|
8571
8663
|
var ACCOUNT_HOST = /^([a-z0-9]{1,63})\.vtexvault\.com$/;
|
|
8572
8664
|
var PATH = /^\/api\/payments\/transactions\/([0-9A-Fa-f]{32})\/payments$/;
|
|
8573
8665
|
var ORDER_GROUP = /^[0-9]{6,24}$/;
|
|
@@ -8575,7 +8667,7 @@ var BASE648 = /^[A-Za-z0-9+/]{4,1020}={0,2}$/;
|
|
|
8575
8667
|
var CARD_NUMBER24 = /^[0-9]{12,19}$/;
|
|
8576
8668
|
var SECURITY_CODE28 = /^[0-9]{3,4}$/;
|
|
8577
8669
|
var DUE_DATE = /^(?:0[1-9]|1[0-2])\/[0-9]{2}$/;
|
|
8578
|
-
var
|
|
8670
|
+
var CURRENCY7 = /^[A-Z]{3}$/;
|
|
8579
8671
|
var TRANSACTION_ID = /^[0-9A-Fa-f]{32}$/;
|
|
8580
8672
|
var MERCHANT_NAME = /^[A-Za-z0-9_.-]{1,64}$/;
|
|
8581
8673
|
var SHORT_ID2 = /^[A-Za-z0-9_-]{1,64}$/;
|
|
@@ -8583,10 +8675,10 @@ var FINGERPRINT4 = /^[A-Za-z0-9_.:=+/-]{1,256}$/;
|
|
|
8583
8675
|
var TEXT5 = /^[^\u0000-\u001f\u007f]{1,200}$/;
|
|
8584
8676
|
var CARD_DIGITS3 = /[0-9]{12,}/;
|
|
8585
8677
|
var DEVICE_INFO_KEYS = Object.freeze(["sw", "sh", "cd", "tz", "lang", "java", "sourceApplication"]);
|
|
8586
|
-
var
|
|
8587
|
-
var
|
|
8588
|
-
var
|
|
8589
|
-
var
|
|
8678
|
+
var record41 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
8679
|
+
var own23 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
8680
|
+
var refuse49 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
8681
|
+
var CARD48 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
8590
8682
|
var inOrder10 = (value, keys) => {
|
|
8591
8683
|
let at = 0;
|
|
8592
8684
|
for (const name of Object.keys(value)) {
|
|
@@ -8636,18 +8728,18 @@ function deviceInfoSound(text11) {
|
|
|
8636
8728
|
catch {
|
|
8637
8729
|
return false;
|
|
8638
8730
|
}
|
|
8639
|
-
if (!
|
|
8731
|
+
if (!record41(info) || !Object.keys(info).every((key) => DEVICE_INFO_KEYS.includes(key)))
|
|
8640
8732
|
return false;
|
|
8641
8733
|
for (const key of ["sw", "sh", "cd"])
|
|
8642
|
-
if (
|
|
8734
|
+
if (own23(info, key) && !(count(info[key]) && info[key] <= 1e5))
|
|
8643
8735
|
return false;
|
|
8644
|
-
if (
|
|
8736
|
+
if (own23(info, "tz") && !(Number.isSafeInteger(info.tz) && Math.abs(info.tz) <= 1440))
|
|
8645
8737
|
return false;
|
|
8646
|
-
if (
|
|
8738
|
+
if (own23(info, "lang") && !(typeof info.lang === "string" && /^[A-Za-z]{0,8}$/.test(info.lang)))
|
|
8647
8739
|
return false;
|
|
8648
|
-
if (
|
|
8740
|
+
if (own23(info, "java") && typeof info.java !== "boolean")
|
|
8649
8741
|
return false;
|
|
8650
|
-
return !
|
|
8742
|
+
return !own23(info, "sourceApplication") || typeof info.sourceApplication === "string" && /^[A-Za-z0-9_.-]{1,32}$/.test(info.sourceApplication);
|
|
8651
8743
|
}
|
|
8652
8744
|
function vtexPaymentsCardTarget(url) {
|
|
8653
8745
|
if (typeof url !== "string" || url.length > 8192)
|
|
@@ -8693,8 +8785,8 @@ function isVtexPaymentsCardUrl(url) {
|
|
|
8693
8785
|
const target = vtexPaymentsCardTarget(url);
|
|
8694
8786
|
return target !== null && !target.fallback;
|
|
8695
8787
|
}
|
|
8696
|
-
function
|
|
8697
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
8788
|
+
function readBody31(body) {
|
|
8789
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT48)
|
|
8698
8790
|
return null;
|
|
8699
8791
|
let value;
|
|
8700
8792
|
try {
|
|
@@ -8708,13 +8800,13 @@ function readBody30(body) {
|
|
|
8708
8800
|
return value;
|
|
8709
8801
|
}
|
|
8710
8802
|
function cardLine(line) {
|
|
8711
|
-
if (!
|
|
8803
|
+
if (!record41(line))
|
|
8712
8804
|
return false;
|
|
8713
|
-
const fields =
|
|
8714
|
-
return line.groupName === "creditCardPaymentGroup" || line.groupName === "debitCardPaymentGroup" ||
|
|
8805
|
+
const fields = record41(line.fields) ? line.fields : {};
|
|
8806
|
+
return line.groupName === "creditCardPaymentGroup" || line.groupName === "debitCardPaymentGroup" || own23(line, "accountId") || own23(fields, "accountId") || own23(fields, "cardNumber") || own23(fields, "validationCode") || own23(fields, "dueDate");
|
|
8715
8807
|
}
|
|
8716
8808
|
function addressSound(address2) {
|
|
8717
|
-
if (!
|
|
8809
|
+
if (!record41(address2) || !inOrder10(address2, VTEX_PAYMENTS_ADDRESS_KEYS))
|
|
8718
8810
|
return false;
|
|
8719
8811
|
for (const [key, value] of Object.entries(address2)) {
|
|
8720
8812
|
if (key === "addressType") {
|
|
@@ -8735,7 +8827,7 @@ function addressSound(address2) {
|
|
|
8735
8827
|
return true;
|
|
8736
8828
|
}
|
|
8737
8829
|
function fieldsSound(fields) {
|
|
8738
|
-
if (!
|
|
8830
|
+
if (!record41(fields) || !inOrder10(fields, VTEX_PAYMENTS_FIELD_KEYS) || own23(fields, "metadata"))
|
|
8739
8831
|
return false;
|
|
8740
8832
|
if (!(typeof fields.cardNumber === "string" && CARD_NUMBER24.test(fields.cardNumber)))
|
|
8741
8833
|
return false;
|
|
@@ -8745,38 +8837,38 @@ function fieldsSound(fields) {
|
|
|
8745
8837
|
return false;
|
|
8746
8838
|
if (!plainText9(fields.holderName))
|
|
8747
8839
|
return false;
|
|
8748
|
-
if (
|
|
8840
|
+
if (own23(fields, "document") && !(fields.document === "" || plainText9(fields.document) && fields.document.length <= 32))
|
|
8749
8841
|
return false;
|
|
8750
|
-
if (
|
|
8842
|
+
if (own23(fields, "address") && !addressSound(fields.address))
|
|
8751
8843
|
return false;
|
|
8752
|
-
if (
|
|
8844
|
+
if (own23(fields, "deviceFingerprint") && !(typeof fields.deviceFingerprint === "string" && FINGERPRINT4.test(fields.deviceFingerprint)))
|
|
8753
8845
|
return false;
|
|
8754
|
-
return !
|
|
8846
|
+
return !own23(fields, "addressId") || typeof fields.addressId === "string" && SHORT_ID2.test(fields.addressId);
|
|
8755
8847
|
}
|
|
8756
8848
|
function vtexPaymentsBodyVerdict(body, target) {
|
|
8757
|
-
const lines =
|
|
8758
|
-
if (lines === null || lines.length === 0 || !lines.every(
|
|
8759
|
-
return
|
|
8849
|
+
const lines = readBody31(body);
|
|
8850
|
+
if (lines === null || lines.length === 0 || !lines.every(record41))
|
|
8851
|
+
return refuse49("vtex_payments_body_unsupported");
|
|
8760
8852
|
const cards = lines.filter(cardLine);
|
|
8761
|
-
if (cards.some((line2) =>
|
|
8762
|
-
return
|
|
8853
|
+
if (cards.some((line2) => own23(line2, "accountId") || own23(line2.fields ?? {}, "accountId")))
|
|
8854
|
+
return refuse49("vtex_payments_saved_card");
|
|
8763
8855
|
if (cards.length === 0)
|
|
8764
|
-
return
|
|
8765
|
-
if (lines.length !== 1 ||
|
|
8766
|
-
return
|
|
8856
|
+
return refuse49("vtex_payments_body_unsupported");
|
|
8857
|
+
if (lines.length !== 1 || own23(lines[0], "id"))
|
|
8858
|
+
return refuse49("vtex_payments_split_payment");
|
|
8767
8859
|
const line = lines[0];
|
|
8768
8860
|
if (!inOrder10(line, VTEX_PAYMENTS_LINE_KEYS) || line.groupName !== "creditCardPaymentGroup")
|
|
8769
|
-
return
|
|
8770
|
-
if (!(typeof line.currencyCode === "string" &&
|
|
8771
|
-
return
|
|
8772
|
-
if (line.installments !== 1 || line.referenceValue !== line.value ||
|
|
8773
|
-
return
|
|
8861
|
+
return refuse49("vtex_payments_body_unsupported");
|
|
8862
|
+
if (!(typeof line.currencyCode === "string" && CURRENCY7.test(line.currencyCode)) || !own23(VTEX_PAYMENTS_NETWORKS, line.paymentSystem) || !Number.isSafeInteger(line.paymentSystem) || !(count(line.value) && line.value > 0))
|
|
8863
|
+
return refuse49("vtex_payments_body_unsupported");
|
|
8864
|
+
if (line.installments !== 1 || line.referenceValue !== line.value || own23(line, "installmentsInterestRate") && line.installmentsInterestRate !== 0 || own23(line, "installmentsValue") && line.installmentsValue !== line.value)
|
|
8865
|
+
return refuse49("vtex_payments_installments");
|
|
8774
8866
|
const transaction = line.transaction;
|
|
8775
|
-
if (!
|
|
8776
|
-
return
|
|
8867
|
+
if (!record41(transaction) || Object.keys(transaction).join() !== "id,merchantName" || !(typeof transaction.id === "string" && TRANSACTION_ID.test(transaction.id)) || !(typeof transaction.merchantName === "string" && MERCHANT_NAME.test(transaction.merchantName)))
|
|
8868
|
+
return refuse49("vtex_payments_body_unsupported");
|
|
8777
8869
|
if (target && transaction.id.toUpperCase() !== target.transactionId.toUpperCase())
|
|
8778
|
-
return
|
|
8779
|
-
return fieldsSound(line.fields) ?
|
|
8870
|
+
return refuse49("vtex_payments_split_payment");
|
|
8871
|
+
return fieldsSound(line.fields) ? CARD48 : refuse49("vtex_payments_body_unsupported");
|
|
8780
8872
|
}
|
|
8781
8873
|
function vtexPaymentsAmount(body) {
|
|
8782
8874
|
if (vtexPaymentsBodyVerdict(body).verdict !== "card")
|
|
@@ -8821,14 +8913,15 @@ var vtex_payments_default = /* @__PURE__ */ registerProcessor({
|
|
|
8821
8913
|
return vtexPaymentsBodyVerdict(body);
|
|
8822
8914
|
const target = vtexPaymentsCardTarget(url);
|
|
8823
8915
|
if (target === null)
|
|
8824
|
-
return
|
|
8825
|
-
return target.fallback ?
|
|
8916
|
+
return refuse49("vtex_payments_url_refused");
|
|
8917
|
+
return target.fallback ? refuse49("vtex_payments_fallback_refused") : vtexPaymentsBodyVerdict(body, target);
|
|
8826
8918
|
},
|
|
8827
|
-
amount: (template) =>
|
|
8919
|
+
amount: (template) => record41(template) && isVtexPaymentsCardUrl(template.url) ? vtexPaymentsAmount(template.body) : null
|
|
8828
8920
|
});
|
|
8829
8921
|
// src/processors/index.generated.js
|
|
8830
8922
|
var REGISTERED_MODULES = Object.freeze({
|
|
8831
8923
|
aurus: aurus_default,
|
|
8924
|
+
bigcommerce: bigcommerce_default,
|
|
8832
8925
|
bluesnap: bluesnap_default,
|
|
8833
8926
|
cardlink_vpos: cardlink_vpos_default,
|
|
8834
8927
|
eghl: eghl_default,
|
|
@@ -9122,12 +9215,12 @@ var KEEP_ON_FILE_REFUSAL = "Refusing to pay: this Primer payment would keep the
|
|
|
9122
9215
|
var UNSUPPORTED_SDK_REFUSAL = "Refusing to pay: this checkout uses a Primer SDK Agentcard does not support yet. Nothing was sent.";
|
|
9123
9216
|
var NETWORK_MISMATCH_REFUSAL = "Refusing to pay: this Primer payment names a card network that is not your card's. Nothing was sent.";
|
|
9124
9217
|
var FILL_REFUSAL = "Could not fill the card fields for Primer. Nothing was sent.";
|
|
9125
|
-
var
|
|
9218
|
+
var BODY_LIMIT49 = 16384;
|
|
9126
9219
|
var RESPONSE_LIMIT = 32768;
|
|
9127
9220
|
var ROOT_KEYS10 = ["paymentInstrument", "userDescription", "tokenType", "paymentFlow"];
|
|
9128
9221
|
var INSTRUMENT_KEYS = ["number", "cvv", "expirationMonth", "expirationYear", "cardholderName", "preferredNetwork"];
|
|
9129
9222
|
var REQUIRED_INSTRUMENT_KEYS = ["number", "cvv", "expirationMonth", "expirationYear"];
|
|
9130
|
-
var
|
|
9223
|
+
var record42 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
9131
9224
|
var owns8 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
9132
9225
|
var exact5 = (pattern, value) => typeof value === "string" && pattern.exec(value)?.[0] === value;
|
|
9133
9226
|
var text10 = (value, max) => typeof value === "string" && value.length <= max && !/[\u0000-\u001f\u007f]/.test(value);
|
|
@@ -9150,7 +9243,7 @@ function isPrimerTokenizeUrl(url, method = "POST") {
|
|
|
9150
9243
|
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;
|
|
9151
9244
|
}
|
|
9152
9245
|
function judgeBody6(body) {
|
|
9153
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
9246
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT49)
|
|
9154
9247
|
return null;
|
|
9155
9248
|
let value;
|
|
9156
9249
|
try {
|
|
@@ -9159,12 +9252,12 @@ function judgeBody6(body) {
|
|
|
9159
9252
|
catch {
|
|
9160
9253
|
return null;
|
|
9161
9254
|
}
|
|
9162
|
-
if (!
|
|
9255
|
+
if (!record42(value) || !roundTrips(value, body))
|
|
9163
9256
|
return null;
|
|
9164
9257
|
if (!Object.keys(value).every((key) => ROOT_KEYS10.includes(key)) || !owns8(value, "paymentInstrument"))
|
|
9165
9258
|
return null;
|
|
9166
9259
|
const instrument = value.paymentInstrument;
|
|
9167
|
-
if (!
|
|
9260
|
+
if (!record42(instrument) || !Object.keys(instrument).every((key) => INSTRUMENT_KEYS.includes(key)) || !REQUIRED_INSTRUMENT_KEYS.every((key) => owns8(instrument, key)))
|
|
9168
9261
|
return null;
|
|
9169
9262
|
if (!digits3(instrument.number, 12, 19) || !digits3(instrument.cvv, 3, 4) || !exact5(MONTH25, instrument.expirationMonth) || !exact5(YEAR26, instrument.expirationYear))
|
|
9170
9263
|
return null;
|
|
@@ -9192,7 +9285,7 @@ var CLIENT_TOKEN = /^[A-Za-z0-9._~+/=-]{16,4096}$/;
|
|
|
9192
9285
|
var REQUEST_ID = /^[A-Za-z0-9-]{1,64}$/;
|
|
9193
9286
|
var API_VERSION = /^2\.[0-9]{1,2}$/;
|
|
9194
9287
|
function readHeaders(headers) {
|
|
9195
|
-
if (!
|
|
9288
|
+
if (!record42(headers))
|
|
9196
9289
|
return null;
|
|
9197
9290
|
const folded = /* @__PURE__ */ new Map();
|
|
9198
9291
|
for (const [name, value] of Object.entries(headers)) {
|
|
@@ -9239,7 +9332,7 @@ function onTokenizePath(url) {
|
|
|
9239
9332
|
}
|
|
9240
9333
|
}
|
|
9241
9334
|
function primerTokenizeRefusal(request) {
|
|
9242
|
-
if (!
|
|
9335
|
+
if (!record42(request) || request.method !== "POST" || !isPrimerTokenizeUrl(request.url))
|
|
9243
9336
|
return "unsupported";
|
|
9244
9337
|
return headersRefusal(request.headers) ?? primerBodyRefusal(request.body);
|
|
9245
9338
|
}
|
|
@@ -9254,7 +9347,7 @@ function primerCardOnFileRefusal(url, options, policy = PRIMER_SESSION_CARD_ON_F
|
|
|
9254
9347
|
return "unsupported";
|
|
9255
9348
|
if (new URL(url).hostname !== LIVE_PCI_HOST)
|
|
9256
9349
|
return null;
|
|
9257
|
-
return primerCardOnFileDisclosure(url, policy) &&
|
|
9350
|
+
return primerCardOnFileDisclosure(url, policy) && record42(options) && options.keepOnFile === true ? null : "keep_on_file";
|
|
9258
9351
|
}
|
|
9259
9352
|
function primerRefusalMessage(reason) {
|
|
9260
9353
|
if (reason === "keep_on_file")
|
|
@@ -9338,7 +9431,7 @@ function readAnswer(body) {
|
|
|
9338
9431
|
return null;
|
|
9339
9432
|
try {
|
|
9340
9433
|
const value = JSON.parse(body);
|
|
9341
|
-
return
|
|
9434
|
+
return record42(value) ? value : null;
|
|
9342
9435
|
}
|
|
9343
9436
|
catch {
|
|
9344
9437
|
return null;
|
|
@@ -9347,16 +9440,16 @@ function readAnswer(body) {
|
|
|
9347
9440
|
var tokenValue = (value) => exact5(TOKEN4, value) && !panLike2(value);
|
|
9348
9441
|
var optional = (value, key, check) => !owns8(value, key) || value[key] === null || check(value[key]);
|
|
9349
9442
|
function cardDetails(data) {
|
|
9350
|
-
if (!
|
|
9443
|
+
if (!record42(data) || !exact5(/^[0-9]{4}$/, data.last4Digits))
|
|
9351
9444
|
return null;
|
|
9352
|
-
if (!optional(data, "first6Digits", (v) => exact5(/^[0-9]{6}$/, v)) || !optional(data, "expirationMonth", (v) => exact5(RESPONSE_MONTH, v)) || !optional(data, "expirationYear", (v) => exact5(RESPONSE_YEAR, v)) || !optional(data, "cardholderName", (v) => plain2(v, 256)) || !optional(data, "network", (v) => exact5(NETWORK_NAME2, v)) || !optional(data, "isNetworkTokenized", (v) => typeof v === "boolean") || !optional(data, "binData",
|
|
9445
|
+
if (!optional(data, "first6Digits", (v) => exact5(/^[0-9]{6}$/, v)) || !optional(data, "expirationMonth", (v) => exact5(RESPONSE_MONTH, v)) || !optional(data, "expirationYear", (v) => exact5(RESPONSE_YEAR, v)) || !optional(data, "cardholderName", (v) => plain2(v, 256)) || !optional(data, "network", (v) => exact5(NETWORK_NAME2, v)) || !optional(data, "isNetworkTokenized", (v) => typeof v === "boolean") || !optional(data, "binData", record42))
|
|
9353
9446
|
return null;
|
|
9354
9447
|
const safe = { last4Digits: data.last4Digits };
|
|
9355
9448
|
for (const key of ["first6Digits", "expirationMonth", "expirationYear", "cardholderName", "network", "isNetworkTokenized"]) {
|
|
9356
9449
|
if (owns8(data, key) && data[key] !== null)
|
|
9357
9450
|
safe[key] = data[key];
|
|
9358
9451
|
}
|
|
9359
|
-
if (
|
|
9452
|
+
if (record42(data.binData)) {
|
|
9360
9453
|
const bin = {};
|
|
9361
9454
|
for (const key of BIN_KEYS) {
|
|
9362
9455
|
if (!owns8(data.binData, key) || data.binData[key] === null)
|
|
@@ -9374,7 +9467,7 @@ function cardDetails(data) {
|
|
|
9374
9467
|
function threeDsSummary(value) {
|
|
9375
9468
|
if (value === void 0 || value === null)
|
|
9376
9469
|
return null;
|
|
9377
|
-
if (!
|
|
9470
|
+
if (!record42(value) || !exact5(CODE10, value.responseCode) || !optional(value, "reasonCode", (v) => exact5(CODE10, v)) || !optional(value, "reasonText", (v) => plain2(v, 256)) || !optional(value, "protocolVersion", (v) => v === "" || exact5(PROTOCOL2, v)) || !optional(value, "challengeIssued", (v) => typeof v === "boolean"))
|
|
9378
9471
|
return void 0;
|
|
9379
9472
|
const safe = { responseCode: value.responseCode };
|
|
9380
9473
|
for (const key of ["reasonCode", "reasonText", "protocolVersion", "challengeIssued"]) {
|
|
@@ -9402,7 +9495,7 @@ function rebuildToken(value) {
|
|
|
9402
9495
|
}
|
|
9403
9496
|
function primerErrorId(body) {
|
|
9404
9497
|
const value = readAnswer(body);
|
|
9405
|
-
const id = value &&
|
|
9498
|
+
const id = value && record42(value.error) ? value.error.errorId : null;
|
|
9406
9499
|
return exact5(ERROR_ID, id) && !panLike2(id) ? id : null;
|
|
9407
9500
|
}
|
|
9408
9501
|
function matchesCard(details, card) {
|