faire-auth 1.0.4 → 1.1.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/dist/{adapter-factory-lKIOf2OR.mjs → adapter-factory-qPVW8x9-.mjs} +34 -36
- package/dist/{adapter-factory-D1I7joki.cjs → adapter-factory-u8r3oTez.cjs} +66 -68
- package/dist/adapters/drizzle-adapter/index.cjs +34 -40
- package/dist/adapters/drizzle-adapter/index.d.cts +4 -9
- package/dist/adapters/drizzle-adapter/index.d.mts +4 -9
- package/dist/adapters/drizzle-adapter/index.mjs +20 -26
- package/dist/adapters/index.cjs +11 -16
- package/dist/adapters/index.d.cts +11 -37
- package/dist/adapters/index.d.mts +11 -37
- package/dist/adapters/index.mjs +4 -13
- package/dist/adapters/kysely-adapter/index.cjs +270 -11
- package/dist/adapters/kysely-adapter/index.d.cts +9 -19
- package/dist/adapters/kysely-adapter/index.d.mts +9 -19
- package/dist/adapters/kysely-adapter/index.mjs +267 -9
- package/dist/adapters/memory-adapter/index.cjs +146 -9
- package/dist/adapters/memory-adapter/index.d.cts +4 -10
- package/dist/adapters/memory-adapter/index.d.mts +4 -10
- package/dist/adapters/memory-adapter/index.mjs +145 -9
- package/dist/adapters/mongodb-adapter/index.cjs +13 -21
- package/dist/adapters/mongodb-adapter/index.d.cts +3 -8
- package/dist/adapters/mongodb-adapter/index.d.mts +4 -9
- package/dist/adapters/mongodb-adapter/index.mjs +12 -20
- package/dist/adapters/prisma-adapter/index.cjs +12 -20
- package/dist/adapters/prisma-adapter/index.d.cts +4 -8
- package/dist/adapters/prisma-adapter/index.d.mts +4 -8
- package/dist/adapters/prisma-adapter/index.mjs +5 -13
- package/dist/adapters/test.cjs +86 -69
- package/dist/adapters/test.d.cts +7 -11
- package/dist/adapters/test.d.mts +7 -11
- package/dist/adapters/test.mjs +83 -66
- package/dist/api/index.cjs +3 -20
- package/dist/api/index.d.cts +2 -3
- package/dist/api/index.d.mts +2 -3
- package/dist/api/index.mjs +1 -20
- package/dist/api/middleware/index.cjs +4 -11
- package/dist/api/middleware/index.d.cts +3 -9
- package/dist/api/middleware/index.d.mts +3 -9
- package/dist/api/middleware/index.mjs +3 -11
- package/dist/{api-B4RDwBty.mjs → api-0f-F-Fi2.mjs} +292 -189
- package/dist/{api-CaRC1Gio.cjs → api-LjfH6hQi.cjs} +557 -452
- package/dist/{test-utils/bun-sqlite-dialect-BZBvHchL.cjs → bun-sqlite-dialect-BHkarnxN.cjs} +5 -9
- package/dist/{test-utils/bun-sqlite-dialect-BSWhhKNs.mjs → bun-sqlite-dialect-BiZBuEF6.mjs} +6 -9
- package/dist/client/index.cjs +8 -15
- package/dist/client/index.d.cts +9 -14
- package/dist/client/index.d.mts +9 -14
- package/dist/client/index.mjs +7 -15
- package/dist/client/lynx/index.cjs +10 -18
- package/dist/client/lynx/index.d.cts +402 -71
- package/dist/client/lynx/index.d.mts +402 -71
- package/dist/client/lynx/index.mjs +5 -13
- package/dist/client/plugins/index.cjs +3 -5
- package/dist/client/plugins/index.d.cts +5 -10
- package/dist/client/plugins/index.d.mts +5 -10
- package/dist/client/plugins/index.mjs +2 -4
- package/dist/client/react/index.cjs +6 -14
- package/dist/client/react/index.d.cts +402 -71
- package/dist/client/react/index.d.mts +402 -71
- package/dist/client/react/index.mjs +5 -13
- package/dist/client/solid/index.cjs +6 -14
- package/dist/client/solid/index.d.cts +393 -57
- package/dist/client/solid/index.d.mts +393 -57
- package/dist/client/solid/index.mjs +5 -13
- package/dist/client/svelte/index.cjs +5 -10
- package/dist/client/svelte/index.d.cts +400 -67
- package/dist/client/svelte/index.d.mts +400 -67
- package/dist/client/svelte/index.mjs +4 -10
- package/dist/client/vue/index.cjs +6 -14
- package/dist/client/vue/index.d.cts +401 -68
- package/dist/client/vue/index.d.mts +401 -68
- package/dist/client/vue/index.mjs +5 -13
- package/dist/{cookies-BTs1o992.mjs → cookies-D9aY_gJh.mjs} +25 -21
- package/dist/{cookies-BTl72THv.cjs → cookies-DQ52rcOy.cjs} +119 -115
- package/dist/crypto/index.cjs +10 -8
- package/dist/crypto/index.d.cts +5 -13
- package/dist/crypto/index.d.mts +5 -13
- package/dist/crypto/index.mjs +2 -5
- package/dist/{crypto-DH2Aa7jN.mjs → crypto-BH-hD0lJ.mjs} +7 -10
- package/dist/{crypto-DpSCnrTp.cjs → crypto-BITfWVwD.cjs} +24 -27
- package/dist/db/index.cjs +1135 -29
- package/dist/db/index.d.cts +1 -2
- package/dist/db/index.d.mts +1 -2
- package/dist/db/index.mjs +1115 -16
- package/dist/defu-D2h4S3X-.mjs +87 -0
- package/dist/defu-DWS5RPWt.cjs +134 -0
- package/dist/{email-verification-DI_0H4JC.cjs → email-verification-DOPnSgbI.cjs} +65 -71
- package/dist/{email-verification-C_lBu_JY.mjs → email-verification-YSR5n5lb.mjs} +23 -29
- package/dist/{hono-CO-zsqI-.mjs → hono-BAV2wQkK.mjs} +16 -33
- package/dist/hono-SVQuc5Ru.mjs +4 -0
- package/dist/hono-pgK4H_U1.cjs +9 -0
- package/dist/{hono-DnW5crl1.cjs → hono-tyFFJFdS.cjs} +42 -60
- package/dist/index-B86Cy0dE.d.cts +2 -0
- package/dist/index-B86Cy0dE.d.mts +2 -0
- package/dist/index.cjs +115 -150
- package/dist/index.d.cts +4 -5
- package/dist/index.d.mts +4 -5
- package/dist/index.mjs +45 -80
- package/dist/integrations/next-js.cjs +5 -9
- package/dist/integrations/next-js.d.cts +6 -14
- package/dist/integrations/next-js.d.mts +6 -14
- package/dist/integrations/next-js.mjs +4 -9
- package/dist/integrations/node.cjs +16 -14
- package/dist/integrations/node.d.cts +6 -14
- package/dist/integrations/node.d.mts +6 -14
- package/dist/integrations/node.mjs +15 -13
- package/dist/integrations/react-start.cjs +7 -11
- package/dist/integrations/react-start.d.cts +5 -13
- package/dist/integrations/react-start.d.mts +5 -13
- package/dist/integrations/react-start.mjs +6 -11
- package/dist/integrations/solid-start.cjs +3 -5
- package/dist/integrations/solid-start.d.cts +2 -5
- package/dist/integrations/solid-start.d.mts +2 -5
- package/dist/integrations/solid-start.mjs +2 -4
- package/dist/integrations/svelte-kit.cjs +6 -10
- package/dist/integrations/svelte-kit.d.cts +11 -23
- package/dist/integrations/svelte-kit.d.mts +11 -23
- package/dist/integrations/svelte-kit.mjs +5 -10
- package/dist/{ip-BjNYspCH.mjs → ip-6Lv2o42m.mjs} +4 -9
- package/dist/{ip-C17Qdq-G.cjs → ip-DPydExzV.cjs} +21 -27
- package/dist/{json--tl7Grvs.cjs → json-D3aq-nH2.cjs} +9 -13
- package/dist/{json-B1v2qRTQ.mjs → json-DooGMtnJ.mjs} +2 -5
- package/dist/{logged-CyGfp8_H.mjs → logged-B83SzMnJ.mjs} +6 -10
- package/dist/{logged-Dv3st5qc.cjs → logged-BIpCpnVY.cjs} +13 -18
- package/dist/{middleware-CE6OhDkq.mjs → middleware-Cakg4e1D.mjs} +2 -4
- package/dist/{middleware-CWvRH4EW.cjs → middleware-Cd-VkNxB.cjs} +17 -20
- package/dist/{node-sqlite-dialect-w4DAg0PH.mjs → node-sqlite-dialect-BMVOjEMh.mjs} +6 -9
- package/dist/{test-utils/node-sqlite-dialect-BgJqjBOu.cjs → node-sqlite-dialect-D3QPFROH.cjs} +5 -9
- package/dist/oauth2/index.cjs +166 -22
- package/dist/oauth2/index.d.cts +5 -17
- package/dist/oauth2/index.d.mts +5 -17
- package/dist/oauth2/index.mjs +156 -16
- package/dist/{origin-check-DjLTuZQ8.cjs → origin-check-BflGhEEN.cjs} +34 -38
- package/dist/{origin-check-8Gajklvh.mjs → origin-check-CRgs1M7k.mjs} +13 -16
- package/dist/{parser-B25ylT5u.mjs → parser-CqwvpF6l.cjs} +12 -10
- package/dist/{parser-B_wxvaAr.cjs → parser-DcKDjjHO.mjs} +7 -22
- package/dist/plugins/access/index.cjs +38 -4
- package/dist/plugins/access/index.d.cts +36 -2
- package/dist/plugins/access/index.d.mts +36 -2
- package/dist/plugins/access/index.mjs +36 -3
- package/dist/plugins/bearer/index.cjs +52 -7
- package/dist/plugins/bearer/index.d.cts +27 -4
- package/dist/plugins/bearer/index.d.mts +27 -4
- package/dist/plugins/bearer/index.mjs +51 -7
- package/dist/plugins/index.cjs +1385 -842
- package/dist/plugins/index.d.cts +489 -7566
- package/dist/plugins/index.d.mts +489 -7566
- package/dist/plugins/index.mjs +1118 -576
- package/dist/plugins/passkey/index.cjs +551 -15
- package/dist/plugins/passkey/index.d.cts +123 -4
- package/dist/plugins/passkey/index.d.mts +123 -4
- package/dist/plugins/passkey/index.mjs +547 -15
- package/dist/{chunk-BFnQceUY.mjs → rolldown-runtime-BKpuH2hG.mjs} +6 -7
- package/dist/{chunk-fPmz2rbM.cjs → rolldown-runtime-C_Pgydhf.cjs} +22 -24
- package/dist/{schema-DTIwLLmf.mjs → schema-CFCpv0tK.mjs} +3 -6
- package/dist/{schema-CirKflVs.cjs → schema-b-lKhMkG.cjs} +51 -55
- package/dist/{session-CM3rmOYF.mjs → session-BGjJgihS.mjs} +51 -74
- package/dist/{session-Cwrj4GfV.cjs → session-CzZSMmQC.cjs} +197 -219
- package/dist/shared.d.cts +1581 -0
- package/dist/shared.d.mts +1581 -0
- package/dist/social-providers/index.cjs +9 -9
- package/dist/social-providers/index.d.cts +1 -1
- package/dist/social-providers/index.d.mts +1 -1
- package/dist/social-providers/index.mjs +3 -5
- package/dist/social-providers-CjPww-qf.mjs +6 -0
- package/dist/social-providers-D7w_7Ym8.cjs +10 -0
- package/dist/{state-CvSihlVT.cjs → state-2OrNjOO-.cjs} +24 -24
- package/dist/{state-CQghgH9I.mjs → state-Dooeisfq.mjs} +17 -17
- package/dist/{bun-sqlite-dialect-DPgTzc0w.cjs → test-utils/bun-sqlite-dialect-BHkarnxN.cjs} +5 -9
- package/dist/{bun-sqlite-dialect-6NqeV3px.mjs → test-utils/bun-sqlite-dialect-BiZBuEF6.mjs} +6 -9
- package/dist/test-utils/index.cjs +8831 -7941
- package/dist/test-utils/index.d.cts +310 -12440
- package/dist/test-utils/index.d.mts +313 -12440
- package/dist/test-utils/index.mjs +8591 -7701
- package/dist/test-utils/{node-sqlite-dialect-DAQXiobH.mjs → node-sqlite-dialect-BMVOjEMh.mjs} +6 -9
- package/dist/{node-sqlite-dialect-DP11CB0y.cjs → test-utils/node-sqlite-dialect-D3QPFROH.cjs} +5 -9
- package/dist/types/index.d.cts +2 -3
- package/dist/types/index.d.mts +2 -3
- package/dist/types/index.mjs +1 -1
- package/dist/{url-BoUuoIwZ.mjs → url-CJtdrrUu.mjs} +12 -13
- package/dist/{url-Ce7CVaQD.cjs → url-DjCmCUHS.cjs} +42 -44
- package/dist/utils/cookies.cjs +29 -30
- package/dist/utils/cookies.d.cts +21 -25
- package/dist/utils/cookies.d.mts +20 -24
- package/dist/utils/cookies.mjs +2 -7
- package/dist/utils-C7OHyfHa.mjs +4 -0
- package/dist/utils-iX0Vy_UL.cjs +3 -0
- package/package.json +40 -30
- package/dist/access-BZ7-AbTM.cjs +0 -51
- package/dist/access-D0DRqUKC.mjs +0 -39
- package/dist/bearer-DDzrp5M7.cjs +0 -60
- package/dist/bearer-WZcs7gxL.mjs +0 -54
- package/dist/db-4tUsQJXd.mjs +0 -1119
- package/dist/db-ChMbb_U-.cjs +0 -1180
- package/dist/defu-BmOYq4PU.cjs +0 -34
- package/dist/defu-D9ZTXqlo.mjs +0 -28
- package/dist/hono-C14rpOEa.cjs +0 -13
- package/dist/hono-CoKYWnXA.mjs +0 -7
- package/dist/hono-D0VqxVy1.d.mts +0 -18
- package/dist/hono-DOM31WQz.d.cts +0 -18
- package/dist/index--DLiUhEn.d.mts +0 -33
- package/dist/index-B4bqEDYG.d.mts +0 -992
- package/dist/index-BDhhaE6Y.d.cts +0 -3
- package/dist/index-Boa0SV4h.d.cts +0 -13350
- package/dist/index-Bykgiq3o.d.cts +0 -13350
- package/dist/index-CF9iq55a.d.mts +0 -3
- package/dist/index-CRt_fppq.d.mts +0 -41
- package/dist/index-CdLyn7qP.d.cts +0 -41
- package/dist/index-ClFGA8tb.d.mts +0 -33
- package/dist/index-ClOM0wFf.d.cts +0 -992
- package/dist/index-CsxNfGAV.d.mts +0 -13350
- package/dist/index-DKnO_Zfm.d.cts +0 -992
- package/dist/index-DRYO4mGd.d.cts +0 -33
- package/dist/index-Dsua4U8w.d.cts +0 -33
- package/dist/index-DxXFCG2_.d.mts +0 -13350
- package/dist/index-gtCVvDvC.d.mts +0 -992
- package/dist/kysely-adapter-CtIdoHa8.mjs +0 -270
- package/dist/kysely-adapter-QZTx077T.cjs +0 -288
- package/dist/memory-adapter-17RZd5df.cjs +0 -154
- package/dist/memory-adapter-Dp4XdCZK.mjs +0 -148
- package/dist/oauth2-5RL4cVNS.cjs +0 -177
- package/dist/oauth2-C56wz-n9.mjs +0 -159
- package/dist/passkey-BTT-v5c-.cjs +0 -512
- package/dist/passkey-CzY_W2us.mjs +0 -505
- package/dist/request-1NL_1lyJ.mjs +0 -58
- package/dist/request-CPNlp-DK.cjs +0 -100
- package/dist/social-providers-B8RK5yqI.mjs +0 -9
- package/dist/social-providers-BmFOIIPk.cjs +0 -13
- package/dist/utils-44aDDP8f.cjs +0 -2
- package/dist/utils-D4vZd1-9.mjs +0 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/client/parser.ts
|
|
2
2
|
const PROTO_POLLUTION_PATTERNS = {
|
|
3
3
|
proto: /"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,
|
|
4
4
|
constructor: /"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,
|
|
@@ -47,16 +47,16 @@ const betterJSONParse = (value, options = {}) => {
|
|
|
47
47
|
return matches;
|
|
48
48
|
}) && strict) throw new Error("[better-json] Potential prototype pollution attempt detected");
|
|
49
49
|
try {
|
|
50
|
-
const secureReviver = (key, value
|
|
51
|
-
if (key === "__proto__" || key === "constructor" && value
|
|
50
|
+
const secureReviver = (key, value) => {
|
|
51
|
+
if (key === "__proto__" || key === "constructor" && value != null && typeof value === "object" && "prototype" in value) {
|
|
52
52
|
if (warnings) console.warn(`[better-json] Dropping "${key}" key to prevent prototype pollution`);
|
|
53
53
|
return;
|
|
54
54
|
}
|
|
55
|
-
if (parseDates && typeof value
|
|
56
|
-
const date = parseISODate(value
|
|
55
|
+
if (parseDates && typeof value === "string") {
|
|
56
|
+
const date = parseISODate(value);
|
|
57
57
|
if (date) return date;
|
|
58
58
|
}
|
|
59
|
-
return reviver ? reviver(key, value
|
|
59
|
+
return reviver ? reviver(key, value) : value;
|
|
60
60
|
};
|
|
61
61
|
return JSON.parse(trimmed, secureReviver);
|
|
62
62
|
} catch (error) {
|
|
@@ -65,7 +65,9 @@ const betterJSONParse = (value, options = {}) => {
|
|
|
65
65
|
}
|
|
66
66
|
};
|
|
67
67
|
const parseJSON = (value, options = { strict: true }) => betterJSONParse(value, options);
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
68
|
+
Object.defineProperty(exports, "parseJSON", {
|
|
69
|
+
enumerable: true,
|
|
70
|
+
get: function() {
|
|
71
|
+
return parseJSON;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
//#region src/client/parser.ts
|
|
1
|
+
// src/client/parser.ts
|
|
3
2
|
const PROTO_POLLUTION_PATTERNS = {
|
|
4
3
|
proto: /"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,
|
|
5
4
|
constructor: /"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,
|
|
@@ -48,16 +47,16 @@ const betterJSONParse = (value, options = {}) => {
|
|
|
48
47
|
return matches;
|
|
49
48
|
}) && strict) throw new Error("[better-json] Potential prototype pollution attempt detected");
|
|
50
49
|
try {
|
|
51
|
-
const secureReviver = (key, value
|
|
52
|
-
if (key === "__proto__" || key === "constructor" && value
|
|
50
|
+
const secureReviver = (key, value) => {
|
|
51
|
+
if (key === "__proto__" || key === "constructor" && value != null && typeof value === "object" && "prototype" in value) {
|
|
53
52
|
if (warnings) console.warn(`[better-json] Dropping "${key}" key to prevent prototype pollution`);
|
|
54
53
|
return;
|
|
55
54
|
}
|
|
56
|
-
if (parseDates && typeof value
|
|
57
|
-
const date = parseISODate(value
|
|
55
|
+
if (parseDates && typeof value === "string") {
|
|
56
|
+
const date = parseISODate(value);
|
|
58
57
|
if (date) return date;
|
|
59
58
|
}
|
|
60
|
-
return reviver ? reviver(key, value
|
|
59
|
+
return reviver ? reviver(key, value) : value;
|
|
61
60
|
};
|
|
62
61
|
return JSON.parse(trimmed, secureReviver);
|
|
63
62
|
} catch (error) {
|
|
@@ -66,18 +65,4 @@ const betterJSONParse = (value, options = {}) => {
|
|
|
66
65
|
}
|
|
67
66
|
};
|
|
68
67
|
const parseJSON = (value, options = { strict: true }) => betterJSONParse(value, options);
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
//#endregion
|
|
72
|
-
Object.defineProperty(exports, 'parseJSON', {
|
|
73
|
-
enumerable: true,
|
|
74
|
-
get: function () {
|
|
75
|
-
return parseJSON;
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
Object.defineProperty(exports, 'parser_default', {
|
|
79
|
-
enumerable: true,
|
|
80
|
-
get: function () {
|
|
81
|
-
return parser_default;
|
|
82
|
-
}
|
|
83
|
-
});
|
|
68
|
+
export { parseJSON as t };
|
|
@@ -1,4 +1,38 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
let _faire_auth_core_error = require("@faire-auth/core/error");
|
|
3
|
+
// src/plugins/access/access.ts
|
|
4
|
+
const role = (statements) => ({
|
|
5
|
+
authorize: (request, connector = "AND") => {
|
|
6
|
+
let success = false;
|
|
7
|
+
for (const [requestedResource, requestedActions] of Object.entries(request)) {
|
|
8
|
+
const allowedActions = statements[requestedResource];
|
|
9
|
+
if (!allowedActions) return {
|
|
10
|
+
success: false,
|
|
11
|
+
error: `You are not allowed to access resource: ${requestedResource}`
|
|
12
|
+
};
|
|
13
|
+
if (Array.isArray(requestedActions)) success = requestedActions.every((requestedAction) => allowedActions.includes(requestedAction));
|
|
14
|
+
else if (typeof requestedActions === "object") {
|
|
15
|
+
const actions = requestedActions;
|
|
16
|
+
if (actions.connector === "OR") success = actions.actions.some((requestedAction) => allowedActions.includes(requestedAction));
|
|
17
|
+
else success = actions.actions.every((requestedAction) => allowedActions.includes(requestedAction));
|
|
18
|
+
} else throw new _faire_auth_core_error.FaireAuthError("Invalid access control request");
|
|
19
|
+
if (success && connector === "OR") return { success };
|
|
20
|
+
if (!success && connector === "AND") return {
|
|
21
|
+
success: false,
|
|
22
|
+
error: `unauthorized to access resource "${requestedResource}"`
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (success) return { success };
|
|
26
|
+
return {
|
|
27
|
+
success: false,
|
|
28
|
+
error: "Not authorized"
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
statements
|
|
32
|
+
});
|
|
33
|
+
const createAccessControl = (s) => ({
|
|
34
|
+
newRole: (statements) => role(statements),
|
|
35
|
+
statements: s
|
|
36
|
+
});
|
|
37
|
+
exports.createAccessControl = createAccessControl;
|
|
38
|
+
exports.role = role;
|
|
@@ -1,2 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { LiteralString } from "@faire-auth/core/types";
|
|
2
|
+
type SubArray<T extends unknown[] | readonly unknown[] | any[]> = T[number][];
|
|
3
|
+
type Subset<K extends keyof R, R extends Record<string | LiteralString, readonly string[] | readonly LiteralString[]>> = { [P in K]: SubArray<R[P]>; };
|
|
4
|
+
type Statements = {
|
|
5
|
+
readonly [resource: string]: readonly LiteralString[];
|
|
6
|
+
};
|
|
7
|
+
type AccessControl<TStatements extends Statements = Statements> = ReturnType<typeof createAccessControl<TStatements>>;
|
|
8
|
+
type Role<TStatements extends Statements = Record<string, any>> = {
|
|
9
|
+
authorize: (request: any, connector?: ("OR" | "AND") | undefined) => AuthorizeResponse;
|
|
10
|
+
statements: TStatements;
|
|
11
|
+
};
|
|
12
|
+
export type AuthorizeResponse = {
|
|
13
|
+
success: false;
|
|
14
|
+
error: string;
|
|
15
|
+
} | {
|
|
16
|
+
success: true;
|
|
17
|
+
error?: never;
|
|
18
|
+
};
|
|
19
|
+
export declare const role: <TStatements extends Statements>(statements: TStatements) => {
|
|
20
|
+
authorize: <K extends keyof TStatements>(request: { [key in K]?: TStatements[key] | {
|
|
21
|
+
actions: TStatements[key];
|
|
22
|
+
connector: "OR" | "AND";
|
|
23
|
+
}; }, connector?: "OR" | "AND") => AuthorizeResponse;
|
|
24
|
+
statements: TStatements;
|
|
25
|
+
};
|
|
26
|
+
export declare const createAccessControl: <const TStatements extends Statements>(s: TStatements) => {
|
|
27
|
+
newRole: <K extends keyof TStatements>(statements: Subset<K, TStatements>) => {
|
|
28
|
+
authorize: <K_1 extends K>(request: K_1 extends (infer T extends keyof Subset<K, TStatements>) ? { [key in T]?: {
|
|
29
|
+
actions: Subset<K, TStatements>[key];
|
|
30
|
+
connector: "OR" | "AND";
|
|
31
|
+
} | Subset<K, TStatements>[key]; } : never, connector?: "OR" | "AND") => AuthorizeResponse;
|
|
32
|
+
statements: Subset<K, TStatements>;
|
|
33
|
+
};
|
|
34
|
+
statements: TStatements;
|
|
35
|
+
};
|
|
36
|
+
export type { AccessControl, Role, Statements, SubArray, Subset };
|
|
@@ -1,2 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { LiteralString } from "@faire-auth/core/types";
|
|
2
|
+
type SubArray<T extends unknown[] | readonly unknown[] | any[]> = T[number][];
|
|
3
|
+
type Subset<K extends keyof R, R extends Record<string | LiteralString, readonly string[] | readonly LiteralString[]>> = { [P in K]: SubArray<R[P]>; };
|
|
4
|
+
type Statements = {
|
|
5
|
+
readonly [resource: string]: readonly LiteralString[];
|
|
6
|
+
};
|
|
7
|
+
type AccessControl<TStatements extends Statements = Statements> = ReturnType<typeof createAccessControl<TStatements>>;
|
|
8
|
+
type Role<TStatements extends Statements = Record<string, any>> = {
|
|
9
|
+
authorize: (request: any, connector?: ("OR" | "AND") | undefined) => AuthorizeResponse;
|
|
10
|
+
statements: TStatements;
|
|
11
|
+
};
|
|
12
|
+
export type AuthorizeResponse = {
|
|
13
|
+
success: false;
|
|
14
|
+
error: string;
|
|
15
|
+
} | {
|
|
16
|
+
success: true;
|
|
17
|
+
error?: never;
|
|
18
|
+
};
|
|
19
|
+
export declare const role: <TStatements extends Statements>(statements: TStatements) => {
|
|
20
|
+
authorize: <K extends keyof TStatements>(request: { [key in K]?: TStatements[key] | {
|
|
21
|
+
actions: TStatements[key];
|
|
22
|
+
connector: "OR" | "AND";
|
|
23
|
+
}; }, connector?: "OR" | "AND") => AuthorizeResponse;
|
|
24
|
+
statements: TStatements;
|
|
25
|
+
};
|
|
26
|
+
export declare const createAccessControl: <const TStatements extends Statements>(s: TStatements) => {
|
|
27
|
+
newRole: <K extends keyof TStatements>(statements: Subset<K, TStatements>) => {
|
|
28
|
+
authorize: <K_1 extends K>(request: K_1 extends (infer T extends keyof Subset<K, TStatements>) ? { [key in T]?: {
|
|
29
|
+
actions: Subset<K, TStatements>[key];
|
|
30
|
+
connector: "OR" | "AND";
|
|
31
|
+
} | Subset<K, TStatements>[key]; } : never, connector?: "OR" | "AND") => AuthorizeResponse;
|
|
32
|
+
statements: Subset<K, TStatements>;
|
|
33
|
+
};
|
|
34
|
+
statements: TStatements;
|
|
35
|
+
};
|
|
36
|
+
export type { AccessControl, Role, Statements, SubArray, Subset };
|
|
@@ -1,3 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { FaireAuthError } from "@faire-auth/core/error";
|
|
2
|
+
// src/plugins/access/access.ts
|
|
3
|
+
const role = (statements) => ({
|
|
4
|
+
authorize: (request, connector = "AND") => {
|
|
5
|
+
let success = false;
|
|
6
|
+
for (const [requestedResource, requestedActions] of Object.entries(request)) {
|
|
7
|
+
const allowedActions = statements[requestedResource];
|
|
8
|
+
if (!allowedActions) return {
|
|
9
|
+
success: false,
|
|
10
|
+
error: `You are not allowed to access resource: ${requestedResource}`
|
|
11
|
+
};
|
|
12
|
+
if (Array.isArray(requestedActions)) success = requestedActions.every((requestedAction) => allowedActions.includes(requestedAction));
|
|
13
|
+
else if (typeof requestedActions === "object") {
|
|
14
|
+
const actions = requestedActions;
|
|
15
|
+
if (actions.connector === "OR") success = actions.actions.some((requestedAction) => allowedActions.includes(requestedAction));
|
|
16
|
+
else success = actions.actions.every((requestedAction) => allowedActions.includes(requestedAction));
|
|
17
|
+
} else throw new FaireAuthError("Invalid access control request");
|
|
18
|
+
if (success && connector === "OR") return { success };
|
|
19
|
+
if (!success && connector === "AND") return {
|
|
20
|
+
success: false,
|
|
21
|
+
error: `unauthorized to access resource "${requestedResource}"`
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (success) return { success };
|
|
25
|
+
return {
|
|
26
|
+
success: false,
|
|
27
|
+
error: "Not authorized"
|
|
28
|
+
};
|
|
29
|
+
},
|
|
30
|
+
statements
|
|
31
|
+
});
|
|
32
|
+
const createAccessControl = (s) => ({
|
|
33
|
+
newRole: (statements) => role(statements),
|
|
34
|
+
statements: s
|
|
35
|
+
});
|
|
36
|
+
export { createAccessControl, role };
|
|
@@ -1,7 +1,52 @@
|
|
|
1
|
-
|
|
2
|
-
require(
|
|
3
|
-
require(
|
|
4
|
-
require(
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_middleware = require("../../middleware-Cd-VkNxB.cjs");
|
|
3
|
+
const require_cookies = require("../../cookies-DQ52rcOy.cjs");
|
|
4
|
+
let _faire_auth_core_datatypes = require("@faire-auth/core/datatypes");
|
|
5
|
+
// src/plugins/bearer/index.ts
|
|
6
|
+
/**
|
|
7
|
+
* Converts bearer token to session cookie
|
|
8
|
+
*/
|
|
9
|
+
const bearer = (options) => ({
|
|
10
|
+
id: "bearer",
|
|
11
|
+
hooks: {
|
|
12
|
+
before: [{
|
|
13
|
+
matcher: (ctx) => Boolean(ctx.req.header("Authorization")),
|
|
14
|
+
handler: (_opts) => require_middleware.createHook()(async (ctx) => {
|
|
15
|
+
const token = ctx.req.header("Authorization")?.replace("Bearer ", "");
|
|
16
|
+
if (token == null) return;
|
|
17
|
+
let signedToken = "";
|
|
18
|
+
if (token.includes(".")) signedToken = token.replace("=", "");
|
|
19
|
+
else {
|
|
20
|
+
if (options?.requireSignature === true) return;
|
|
21
|
+
signedToken = (await require_cookies.serializeSignedCookie("", token, ctx.get("context").secret)).replace("=", "");
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const [first, second] = decodeURIComponent(signedToken).split(".");
|
|
25
|
+
if (first == null || second == null) return;
|
|
26
|
+
if (!await (0, _faire_auth_core_datatypes.createHMAC)("SHA-256", "base64urlnopad").verify(ctx.get("context").secret, first, second)) return;
|
|
27
|
+
} catch {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
ctx.req.raw.headers.append("cookie", `${ctx.get("context").authCookies.sessionToken.name}=${signedToken}`);
|
|
31
|
+
})
|
|
32
|
+
}],
|
|
33
|
+
after: [{
|
|
34
|
+
matcher: (_ctx) => true,
|
|
35
|
+
handler: (_opts) => require_middleware.createHook()(async (ctx) => {
|
|
36
|
+
const setCookie = ctx.res.headers.getSetCookie();
|
|
37
|
+
if (!setCookie.length) return;
|
|
38
|
+
const parsedCookies = require_cookies.parseSetCookieHeader(setCookie);
|
|
39
|
+
const cookieName = ctx.get("context").authCookies.sessionToken.name;
|
|
40
|
+
const sessionCookie = parsedCookies.get(cookieName);
|
|
41
|
+
if (sessionCookie?.value == null || sessionCookie["max-age"] === 0) return;
|
|
42
|
+
const token = sessionCookie.value;
|
|
43
|
+
const exposedHeaders = ctx.res.headers.get("access-control-expose-headers") ?? "";
|
|
44
|
+
const headersSet = new Set(exposedHeaders.split(",").map((header) => header.trim()).filter(Boolean));
|
|
45
|
+
headersSet.add("set-auth-token");
|
|
46
|
+
ctx.res.headers.set("set-auth-token", token);
|
|
47
|
+
ctx.res.headers.set("Access-Control-Expose-Headers", Array.from(headersSet).join(", "));
|
|
48
|
+
})
|
|
49
|
+
}]
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
exports.bearer = bearer;
|
|
@@ -1,4 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
interface BearerOptions {
|
|
2
|
+
/**
|
|
3
|
+
* If true, only signed tokens
|
|
4
|
+
* will be converted to session
|
|
5
|
+
* cookies
|
|
6
|
+
*
|
|
7
|
+
* @default false
|
|
8
|
+
*/
|
|
9
|
+
requireSignature?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Converts bearer token to session cookie
|
|
13
|
+
*/
|
|
14
|
+
export declare const bearer: (options?: BearerOptions) => {
|
|
15
|
+
id: string;
|
|
16
|
+
hooks: {
|
|
17
|
+
before: {
|
|
18
|
+
matcher: (ctx: any) => boolean;
|
|
19
|
+
handler: (_opts: any) => (ctx: any) => Promise<void>;
|
|
20
|
+
}[];
|
|
21
|
+
after: {
|
|
22
|
+
matcher: (_ctx: any) => boolean;
|
|
23
|
+
handler: (_opts: any) => (ctx: any) => Promise<void>;
|
|
24
|
+
}[];
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
export {};
|
|
@@ -1,4 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
interface BearerOptions {
|
|
2
|
+
/**
|
|
3
|
+
* If true, only signed tokens
|
|
4
|
+
* will be converted to session
|
|
5
|
+
* cookies
|
|
6
|
+
*
|
|
7
|
+
* @default false
|
|
8
|
+
*/
|
|
9
|
+
requireSignature?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Converts bearer token to session cookie
|
|
13
|
+
*/
|
|
14
|
+
export declare const bearer: (options?: BearerOptions) => {
|
|
15
|
+
id: string;
|
|
16
|
+
hooks: {
|
|
17
|
+
before: {
|
|
18
|
+
matcher: (ctx: any) => boolean;
|
|
19
|
+
handler: (_opts: any) => (ctx: any) => Promise<void>;
|
|
20
|
+
}[];
|
|
21
|
+
after: {
|
|
22
|
+
matcher: (_ctx: any) => boolean;
|
|
23
|
+
handler: (_opts: any) => (ctx: any) => Promise<void>;
|
|
24
|
+
}[];
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
export {};
|
|
@@ -1,7 +1,51 @@
|
|
|
1
|
-
import "../../
|
|
2
|
-
import "../../
|
|
3
|
-
import "
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { n as createHook } from "../../middleware-Cakg4e1D.mjs";
|
|
2
|
+
import { _ as serializeSignedCookie, p as parseSetCookieHeader } from "../../cookies-D9aY_gJh.mjs";
|
|
3
|
+
import { createHMAC } from "@faire-auth/core/datatypes";
|
|
4
|
+
// src/plugins/bearer/index.ts
|
|
5
|
+
/**
|
|
6
|
+
* Converts bearer token to session cookie
|
|
7
|
+
*/
|
|
8
|
+
const bearer = (options) => ({
|
|
9
|
+
id: "bearer",
|
|
10
|
+
hooks: {
|
|
11
|
+
before: [{
|
|
12
|
+
matcher: (ctx) => Boolean(ctx.req.header("Authorization")),
|
|
13
|
+
handler: (_opts) => createHook()(async (ctx) => {
|
|
14
|
+
const token = ctx.req.header("Authorization")?.replace("Bearer ", "");
|
|
15
|
+
if (token == null) return;
|
|
16
|
+
let signedToken = "";
|
|
17
|
+
if (token.includes(".")) signedToken = token.replace("=", "");
|
|
18
|
+
else {
|
|
19
|
+
if (options?.requireSignature === true) return;
|
|
20
|
+
signedToken = (await serializeSignedCookie("", token, ctx.get("context").secret)).replace("=", "");
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const [first, second] = decodeURIComponent(signedToken).split(".");
|
|
24
|
+
if (first == null || second == null) return;
|
|
25
|
+
if (!await createHMAC("SHA-256", "base64urlnopad").verify(ctx.get("context").secret, first, second)) return;
|
|
26
|
+
} catch {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
ctx.req.raw.headers.append("cookie", `${ctx.get("context").authCookies.sessionToken.name}=${signedToken}`);
|
|
30
|
+
})
|
|
31
|
+
}],
|
|
32
|
+
after: [{
|
|
33
|
+
matcher: (_ctx) => true,
|
|
34
|
+
handler: (_opts) => createHook()(async (ctx) => {
|
|
35
|
+
const setCookie = ctx.res.headers.getSetCookie();
|
|
36
|
+
if (!setCookie.length) return;
|
|
37
|
+
const parsedCookies = parseSetCookieHeader(setCookie);
|
|
38
|
+
const cookieName = ctx.get("context").authCookies.sessionToken.name;
|
|
39
|
+
const sessionCookie = parsedCookies.get(cookieName);
|
|
40
|
+
if (sessionCookie?.value == null || sessionCookie["max-age"] === 0) return;
|
|
41
|
+
const token = sessionCookie.value;
|
|
42
|
+
const exposedHeaders = ctx.res.headers.get("access-control-expose-headers") ?? "";
|
|
43
|
+
const headersSet = new Set(exposedHeaders.split(",").map((header) => header.trim()).filter(Boolean));
|
|
44
|
+
headersSet.add("set-auth-token");
|
|
45
|
+
ctx.res.headers.set("set-auth-token", token);
|
|
46
|
+
ctx.res.headers.set("Access-Control-Expose-Headers", Array.from(headersSet).join(", "));
|
|
47
|
+
})
|
|
48
|
+
}]
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
export { bearer };
|