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