@c9up/warden 0.1.17 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AuthManager.d.ts +86 -1
- package/dist/AuthManager.d.ts.map +1 -1
- package/dist/AuthManager.js +113 -10
- package/dist/AuthManager.js.map +1 -1
- package/dist/Authenticator.d.ts +13 -1
- package/dist/Authenticator.d.ts.map +1 -1
- package/dist/Authenticator.js +37 -3
- package/dist/Authenticator.js.map +1 -1
- package/dist/RememberMeToken.d.ts +169 -0
- package/dist/RememberMeToken.d.ts.map +1 -0
- package/dist/RememberMeToken.js +269 -0
- package/dist/RememberMeToken.js.map +1 -0
- package/dist/ResilientBlacklistDriver.d.ts +15 -9
- package/dist/ResilientBlacklistDriver.d.ts.map +1 -1
- package/dist/ResilientBlacklistDriver.js +53 -15
- package/dist/ResilientBlacklistDriver.js.map +1 -1
- package/dist/Secret.d.ts +11 -0
- package/dist/Secret.d.ts.map +1 -0
- package/dist/Secret.js +36 -0
- package/dist/Secret.js.map +1 -0
- package/dist/WardenProvider.d.ts +1 -0
- package/dist/WardenProvider.d.ts.map +1 -1
- package/dist/WardenProvider.js +64 -0
- package/dist/WardenProvider.js.map +1 -1
- package/dist/bouncer/Bouncer.d.ts +46 -1
- package/dist/bouncer/Bouncer.d.ts.map +1 -1
- package/dist/bouncer/Bouncer.js +77 -4
- package/dist/bouncer/Bouncer.js.map +1 -1
- package/dist/bouncer/PolicyAuthorizer.d.ts +9 -1
- package/dist/bouncer/PolicyAuthorizer.d.ts.map +1 -1
- package/dist/bouncer/PolicyAuthorizer.js +17 -1
- package/dist/bouncer/PolicyAuthorizer.js.map +1 -1
- package/dist/bouncer/evaluate.d.ts +14 -2
- package/dist/bouncer/evaluate.d.ts.map +1 -1
- package/dist/bouncer/evaluate.js +16 -5
- package/dist/bouncer/evaluate.js.map +1 -1
- package/dist/bouncer/types.d.ts +4 -2
- package/dist/bouncer/types.d.ts.map +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -0
- package/dist/config.js.map +1 -1
- package/dist/firstcontact/drivers/GitHubDriver.d.ts.map +1 -1
- package/dist/firstcontact/drivers/GitHubDriver.js +2 -3
- package/dist/firstcontact/drivers/GitHubDriver.js.map +1 -1
- package/dist/firstcontact/drivers/GoogleDriver.d.ts.map +1 -1
- package/dist/firstcontact/drivers/GoogleDriver.js +2 -3
- package/dist/firstcontact/drivers/GoogleDriver.js.map +1 -1
- package/dist/firstcontact/types.d.ts +10 -0
- package/dist/firstcontact/types.d.ts.map +1 -1
- package/dist/firstcontact/types.js +18 -1
- package/dist/firstcontact/types.js.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/mfa/MfaManager.d.ts.map +1 -1
- package/dist/mfa/MfaManager.js +14 -5
- package/dist/mfa/MfaManager.js.map +1 -1
- package/dist/mfa/TotpProvider.d.ts +34 -1
- package/dist/mfa/TotpProvider.d.ts.map +1 -1
- package/dist/mfa/TotpProvider.js +60 -4
- package/dist/mfa/TotpProvider.js.map +1 -1
- package/dist/mfa/webauthn-codec.d.ts +6 -1
- package/dist/mfa/webauthn-codec.d.ts.map +1 -1
- package/dist/mfa/webauthn-codec.js +50 -6
- package/dist/mfa/webauthn-codec.js.map +1 -1
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +46 -1
- package/dist/middleware.js.map +1 -1
- package/dist/quasar.d.ts.map +1 -1
- package/dist/quasar.js +6 -14
- package/dist/quasar.js.map +1 -1
- package/dist/sanitize.d.ts +10 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +15 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/strategies/ApiKeyStrategy.d.ts +10 -1
- package/dist/strategies/ApiKeyStrategy.d.ts.map +1 -1
- package/dist/strategies/ApiKeyStrategy.js +16 -0
- package/dist/strategies/ApiKeyStrategy.js.map +1 -1
- package/dist/strategies/BasicAuthStrategy.d.ts +59 -0
- package/dist/strategies/BasicAuthStrategy.d.ts.map +1 -0
- package/dist/strategies/BasicAuthStrategy.js +97 -0
- package/dist/strategies/BasicAuthStrategy.js.map +1 -0
- package/dist/strategies/JwtStrategy.d.ts +10 -1
- package/dist/strategies/JwtStrategy.d.ts.map +1 -1
- package/dist/strategies/JwtStrategy.js +11 -0
- package/dist/strategies/JwtStrategy.js.map +1 -1
- package/dist/strategies/SessionStrategy.d.ts +84 -2
- package/dist/strategies/SessionStrategy.d.ts.map +1 -1
- package/dist/strategies/SessionStrategy.js +124 -1
- package/dist/strategies/SessionStrategy.js.map +1 -1
- package/index.darwin-arm64.node +0 -0
- package/index.darwin-x64.node +0 -0
- package/index.linux-arm64-gnu.node +0 -0
- package/index.linux-x64-gnu.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +4 -2
- package/src/AuthManager.ts +163 -7
- package/src/Authenticator.ts +58 -10
- package/src/RememberMeToken.ts +357 -0
- package/src/ResilientBlacklistDriver.ts +58 -18
- package/src/Secret.ts +41 -0
- package/src/WardenProvider.ts +90 -0
- package/src/bouncer/Bouncer.ts +93 -4
- package/src/bouncer/PolicyAuthorizer.ts +20 -1
- package/src/bouncer/evaluate.ts +26 -6
- package/src/bouncer/types.ts +4 -2
- package/src/config.ts +9 -0
- package/src/firstcontact/drivers/GitHubDriver.ts +2 -3
- package/src/firstcontact/drivers/GoogleDriver.ts +2 -3
- package/src/firstcontact/types.ts +24 -0
- package/src/index.ts +30 -2
- package/src/mfa/MfaManager.ts +15 -8
- package/src/mfa/TotpProvider.ts +90 -6
- package/src/mfa/webauthn-codec.ts +48 -6
- package/src/middleware.ts +55 -2
- package/src/quasar.ts +6 -14
- package/src/sanitize.ts +17 -0
- package/src/strategies/ApiKeyStrategy.ts +23 -1
- package/src/strategies/BasicAuthStrategy.ts +127 -0
- package/src/strategies/JwtStrategy.ts +18 -1
- package/src/strategies/SessionStrategy.ts +167 -2
package/dist/Secret.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps a sensitive value so it never leaks through a log, `JSON.stringify`, or
|
|
3
|
+
* `util.inspect`. Read it back deliberately with {@link Secret.release}.
|
|
4
|
+
*
|
|
5
|
+
* AdonisJS takes this from `@adonisjs/core/helpers`, and its `RememberMeToken`
|
|
6
|
+
* hands secrets out wrapped in one. Warden carries its own copy rather than
|
|
7
|
+
* importing `@c9up/ream`: it has no runtime dependencies and ships a standalone
|
|
8
|
+
* entry point, so reaching for a peer here would break the framework-free mode.
|
|
9
|
+
* Same reason every native package carries its own platform map.
|
|
10
|
+
*/
|
|
11
|
+
const REDACTED = "[redacted]";
|
|
12
|
+
export class Secret {
|
|
13
|
+
#value;
|
|
14
|
+
#keyword;
|
|
15
|
+
constructor(value, redactedKeyword = REDACTED) {
|
|
16
|
+
this.#value = value;
|
|
17
|
+
this.#keyword = redactedKeyword;
|
|
18
|
+
}
|
|
19
|
+
/** Redacted placeholder, so `JSON.stringify` never emits the secret. */
|
|
20
|
+
toJSON() {
|
|
21
|
+
return this.#keyword;
|
|
22
|
+
}
|
|
23
|
+
/** Redacted placeholder for string coercion and template literals. */
|
|
24
|
+
toString() {
|
|
25
|
+
return this.#keyword;
|
|
26
|
+
}
|
|
27
|
+
/** Redacted placeholder for `console.log` / `util.inspect`. */
|
|
28
|
+
[Symbol.for("nodejs.util.inspect.custom")]() {
|
|
29
|
+
return this.#keyword;
|
|
30
|
+
}
|
|
31
|
+
/** Release the underlying value — the one deliberate way to read it. */
|
|
32
|
+
release() {
|
|
33
|
+
return this.#value;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=Secret.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Secret.js","sourceRoot":"","sources":["../src/Secret.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,QAAQ,GAAG,YAAY,CAAC;AAE9B,MAAM,OAAO,MAAM;IACT,MAAM,CAAI;IACV,QAAQ,CAAS;IAE1B,YAAY,KAAQ,EAAE,kBAA0B,QAAQ;QACvD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC;IACjC,CAAC;IAED,wEAAwE;IACxE,MAAM;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,sEAAsE;IACtE,QAAQ;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,+DAA+D;IAC/D,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,wEAAwE;IACxE,OAAO;QACN,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;CACD"}
|
package/dist/WardenProvider.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WardenProvider.d.ts","sourceRoot":"","sources":["../src/WardenProvider.ts"],"names":[],"mappings":"AAYA,UAAU,eAAe;IACxB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC;IACxD,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1C;AAED,UAAU,iBAAiB;IAC1B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,EAAE,iBAAiB,CAAC;CAC1B;AAED,MAAM,CAAC,OAAO,OAAO,cAAc
|
|
1
|
+
{"version":3,"file":"WardenProvider.d.ts","sourceRoot":"","sources":["../src/WardenProvider.ts"],"names":[],"mappings":"AAYA,UAAU,eAAe;IACxB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC;IACxD,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1C;AAED,UAAU,iBAAiB;IAC1B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,EAAE,iBAAiB,CAAC;CAC1B;AAED,MAAM,CAAC,OAAO,OAAO,cAAc;;IACtB,SAAS,CAAC,GAAG,EAAE,gBAAgB;gBAArB,GAAG,EAAE,gBAAgB;IAE3C,QAAQ;IA2HF,IAAI;CA4EV"}
|
package/dist/WardenProvider.js
CHANGED
|
@@ -127,6 +127,70 @@ export default class WardenProvider {
|
|
|
127
127
|
const manager = await this.app.container.resolve(AuthManager);
|
|
128
128
|
if (manager instanceof AuthManager)
|
|
129
129
|
setAuth(manager);
|
|
130
|
+
await this.#registerTemplateTags();
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Publish `@can` / `@cannot` to the template engine, as AdonisJS's bouncer
|
|
134
|
+
* does. A migrated template keeps `@can('PostPolicy.edit', post) … @endcan`
|
|
135
|
+
* unchanged.
|
|
136
|
+
*
|
|
137
|
+
* Both are BLOCK tags and both AWAIT — the check returns a promise — so they
|
|
138
|
+
* render on the async path and raise on a synchronous one, matching upstream
|
|
139
|
+
* (which emits `await bouncer.can(...)`). The checks themselves come from
|
|
140
|
+
* `ctx.bouncer.templateHelpers`, shared into the view per request.
|
|
141
|
+
*
|
|
142
|
+
* Resolved through the container: warden must not depend on the engine, and
|
|
143
|
+
* an app with no template layer simply skips this.
|
|
144
|
+
*/
|
|
145
|
+
async #registerTemplateTags() {
|
|
146
|
+
const engine = await this.#resolveTemplateEngine();
|
|
147
|
+
if (engine === undefined)
|
|
148
|
+
return;
|
|
149
|
+
for (const tagName of ["can", "cannot"]) {
|
|
150
|
+
engine.registerTag({
|
|
151
|
+
tagName,
|
|
152
|
+
block: true,
|
|
153
|
+
seekable: true,
|
|
154
|
+
async compile(_parser, buffer, token) {
|
|
155
|
+
// The shared bag lives in the render scope under `bouncer`.
|
|
156
|
+
const bouncer = token.evaluate("typeof bouncer === 'undefined' ? undefined : bouncer");
|
|
157
|
+
const check = Reflect.get(Object(bouncer), tagName);
|
|
158
|
+
if (typeof check !== "function") {
|
|
159
|
+
// No bouncer on this request: deny rather than render an
|
|
160
|
+
// unguarded body.
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const args = token.evaluate(`[${token.properties.jsArg}]`);
|
|
164
|
+
const allowed = await check.apply(bouncer, Array.isArray(args) ? args : []);
|
|
165
|
+
if (allowed === true)
|
|
166
|
+
buffer.writeRaw(await token.renderBody());
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/** The template engine, if the host installed one. */
|
|
172
|
+
async #resolveTemplateEngine() {
|
|
173
|
+
for (const token of ["inker", "view"]) {
|
|
174
|
+
try {
|
|
175
|
+
const binding = await this.app.container.resolve(token);
|
|
176
|
+
for (const candidate of [
|
|
177
|
+
binding,
|
|
178
|
+
Reflect.get(Object(binding), "_templates"),
|
|
179
|
+
]) {
|
|
180
|
+
if (typeof candidate === "object" &&
|
|
181
|
+
candidate !== null &&
|
|
182
|
+
typeof Reflect.get(candidate, "registerTag") === "function") {
|
|
183
|
+
return {
|
|
184
|
+
registerTag: Reflect.get(candidate, "registerTag").bind(candidate),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// A host without a template layer is not an error.
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return undefined;
|
|
130
194
|
}
|
|
131
195
|
}
|
|
132
196
|
//# sourceMappingURL=WardenProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WardenProvider.js","sourceRoot":"","sources":["../src/WardenProvider.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WardenProvider.js","sourceRoot":"","sources":["../src/WardenProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,11 +15,34 @@ import type { Scope } from "../rights/types.js";
|
|
|
15
15
|
import { AbilitiesBuilder } from "./AbilitiesBuilder.js";
|
|
16
16
|
import { AuthorizationResponse } from "./AuthorizationResponse.js";
|
|
17
17
|
import type { BasePolicy } from "./BasePolicy.js";
|
|
18
|
+
import { type ResponseBuilder } from "./evaluate.js";
|
|
18
19
|
import { PolicyAuthorizer } from "./PolicyAuthorizer.js";
|
|
19
|
-
import type { Ability, AbilityOptions, AuthorizerResponse, BouncerContext } from "./types.js";
|
|
20
|
+
import type { Ability, AbilityOptions, AuthorizerResponse, BouncerContext, PolicyContainerResolver } from "./types.js";
|
|
20
21
|
export declare class Bouncer {
|
|
21
22
|
#private;
|
|
23
|
+
/**
|
|
24
|
+
* How a bare boolean from an ability or a policy becomes an
|
|
25
|
+
* {@link AuthorizationResponse} (AdonisJS `Bouncer.responseBuilder`).
|
|
26
|
+
*
|
|
27
|
+
* Replace it once at boot to give every `return false` a house message and
|
|
28
|
+
* status instead of a naked 403:
|
|
29
|
+
*
|
|
30
|
+
* ```ts
|
|
31
|
+
* Bouncer.responseBuilder = (value) =>
|
|
32
|
+
* value === false ? AuthorizationResponse.deny('Nope', 404) : normalizeResponse(value)
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
static responseBuilder: ResponseBuilder;
|
|
22
36
|
constructor(user: UserPayload | (() => UserPayload | null) | null, abilities?: Record<string, Ability<never[]>>, policies?: Record<string, new () => BasePolicy>, context?: BouncerContext);
|
|
37
|
+
/**
|
|
38
|
+
* Point the bouncer at an IoC resolver, so a policy's constructor
|
|
39
|
+
* dependencies are injected (AdonisJS `setContainerResolver`).
|
|
40
|
+
*
|
|
41
|
+
* The constructor takes one too; this is the setter AdonisJS exposes so the
|
|
42
|
+
* HTTP layer can hand over the REQUEST's resolver after the bouncer exists.
|
|
43
|
+
* Passing `undefined` clears it, and policies fall back to `new Policy()`.
|
|
44
|
+
*/
|
|
45
|
+
setContainerResolver(containerResolver?: PolicyContainerResolver): this;
|
|
23
46
|
/**
|
|
24
47
|
* Define an ability and open a chainable {@link AbilitiesBuilder} (Adonis
|
|
25
48
|
* `Bouncer.define`). Read `.abilities` off the returned builder to pass into a
|
|
@@ -36,6 +59,28 @@ export declare class Bouncer {
|
|
|
36
59
|
static ability<Args extends unknown[]>(options: AbilityOptions, callback: (user: UserPayload | null, ...args: Args) => AuthorizerResponse): Ability<Args>;
|
|
37
60
|
/** Convenience — equivalent to `AuthorizationResponse.deny` (Adonis `bouncer.deny`). */
|
|
38
61
|
deny(message?: string, status?: number): AuthorizationResponse;
|
|
62
|
+
/**
|
|
63
|
+
* The checks a TEMPLATE performs, shared into the view per request so
|
|
64
|
+
* `@can('post.edit', post)` resolves them (AdonisJS shares the same pair
|
|
65
|
+
* under `bouncer`; it names the bag `edgeHelpers`, we do not borrow the
|
|
66
|
+
* engine's name).
|
|
67
|
+
*
|
|
68
|
+
* AdonisJS reads a dotted action as `policy.method` —
|
|
69
|
+
* `'PostPolicy.edit'` is `with('PostPolicy').allows('edit', …)`. Warden,
|
|
70
|
+
* however, keys its ABILITIES with dots (`'post.edit'`), so applying that
|
|
71
|
+
* split blindly would break every warden app.
|
|
72
|
+
*
|
|
73
|
+
* NAMED DEVIATION, strictly more permissive: a registered ability wins, and
|
|
74
|
+
* only an action with no matching ability falls through to the policy
|
|
75
|
+
* split. A migrated AdonisJS template resolves its policies exactly as
|
|
76
|
+
* before, and a warden app keeps its dotted abilities.
|
|
77
|
+
*/
|
|
78
|
+
readonly templateHelpers: {
|
|
79
|
+
bouncer: {
|
|
80
|
+
can(action: string, ...args: unknown[]): Promise<boolean>;
|
|
81
|
+
cannot(action: string, ...args: unknown[]): Promise<boolean>;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
39
84
|
/** Open a policy for checks (D8 — fresh policy instance per check). */
|
|
40
85
|
with(policy: (new () => BasePolicy) | string): PolicyAuthorizer;
|
|
41
86
|
/** Run an ability check and resolve to the full response. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bouncer.d.ts","sourceRoot":"","sources":["../../src/bouncer/Bouncer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,OAAO,KAAK,EAAwB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"Bouncer.d.ts","sourceRoot":"","sources":["../../src/bouncer/Bouncer.ts"],"names":[],"mappings":"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"}
|
package/dist/bouncer/Bouncer.js
CHANGED
|
@@ -10,13 +10,27 @@
|
|
|
10
10
|
* `RightsResolver` (D4); abilities/policy methods receive `(user, ...args)` and
|
|
11
11
|
* the developer writes the predicate, exactly as Adonis does.
|
|
12
12
|
*/
|
|
13
|
+
var _a;
|
|
13
14
|
import { WardenError } from "../errors.js";
|
|
14
15
|
import { AbilitiesBuilder } from "./AbilitiesBuilder.js";
|
|
15
16
|
import { AuthorizationResponse } from "./AuthorizationResponse.js";
|
|
16
|
-
import { evaluate, isAction, throwAuthorizationFailure } from "./evaluate.js";
|
|
17
|
+
import { defaultResponseBuilder, evaluate, isAction, throwAuthorizationFailure, } from "./evaluate.js";
|
|
17
18
|
import { PolicyAuthorizer } from "./PolicyAuthorizer.js";
|
|
18
19
|
import { emptyPermissions } from "./policyContext.js";
|
|
19
20
|
export class Bouncer {
|
|
21
|
+
/**
|
|
22
|
+
* How a bare boolean from an ability or a policy becomes an
|
|
23
|
+
* {@link AuthorizationResponse} (AdonisJS `Bouncer.responseBuilder`).
|
|
24
|
+
*
|
|
25
|
+
* Replace it once at boot to give every `return false` a house message and
|
|
26
|
+
* status instead of a naked 403:
|
|
27
|
+
*
|
|
28
|
+
* ```ts
|
|
29
|
+
* Bouncer.responseBuilder = (value) =>
|
|
30
|
+
* value === false ? AuthorizationResponse.deny('Nope', 404) : normalizeResponse(value)
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
static responseBuilder = defaultResponseBuilder;
|
|
20
34
|
#userOrResolver;
|
|
21
35
|
/** Lazily-resolved user cache (`undefined` until `#getUser` runs). */
|
|
22
36
|
#user;
|
|
@@ -37,6 +51,18 @@ export class Bouncer {
|
|
|
37
51
|
this.#containerResolver = context?.containerResolver;
|
|
38
52
|
this.#emitter = context?.emitter;
|
|
39
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Point the bouncer at an IoC resolver, so a policy's constructor
|
|
56
|
+
* dependencies are injected (AdonisJS `setContainerResolver`).
|
|
57
|
+
*
|
|
58
|
+
* The constructor takes one too; this is the setter AdonisJS exposes so the
|
|
59
|
+
* HTTP layer can hand over the REQUEST's resolver after the bouncer exists.
|
|
60
|
+
* Passing `undefined` clears it, and policies fall back to `new Policy()`.
|
|
61
|
+
*/
|
|
62
|
+
setContainerResolver(containerResolver) {
|
|
63
|
+
this.#containerResolver = containerResolver;
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
40
66
|
/**
|
|
41
67
|
* Resolve the user, lazily invoking a resolver callback once and memoizing
|
|
42
68
|
* the result (Adonis `#getUser`). A plain `UserPayload | null` passes through.
|
|
@@ -104,6 +130,48 @@ export class Bouncer {
|
|
|
104
130
|
deny(message, status) {
|
|
105
131
|
return AuthorizationResponse.deny(message, status);
|
|
106
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* The checks a TEMPLATE performs, shared into the view per request so
|
|
135
|
+
* `@can('post.edit', post)` resolves them (AdonisJS shares the same pair
|
|
136
|
+
* under `bouncer`; it names the bag `edgeHelpers`, we do not borrow the
|
|
137
|
+
* engine's name).
|
|
138
|
+
*
|
|
139
|
+
* AdonisJS reads a dotted action as `policy.method` —
|
|
140
|
+
* `'PostPolicy.edit'` is `with('PostPolicy').allows('edit', …)`. Warden,
|
|
141
|
+
* however, keys its ABILITIES with dots (`'post.edit'`), so applying that
|
|
142
|
+
* split blindly would break every warden app.
|
|
143
|
+
*
|
|
144
|
+
* NAMED DEVIATION, strictly more permissive: a registered ability wins, and
|
|
145
|
+
* only an action with no matching ability falls through to the policy
|
|
146
|
+
* split. A migrated AdonisJS template resolves its policies exactly as
|
|
147
|
+
* before, and a warden app keeps its dotted abilities.
|
|
148
|
+
*/
|
|
149
|
+
templateHelpers = {
|
|
150
|
+
bouncer: {
|
|
151
|
+
can: (action, ...args) => {
|
|
152
|
+
const split = this.#splitAction(action);
|
|
153
|
+
return split === undefined
|
|
154
|
+
? this.allows(action, ...args)
|
|
155
|
+
: this.with(split.policy).allows(split.method, ...args);
|
|
156
|
+
},
|
|
157
|
+
cannot: (action, ...args) => {
|
|
158
|
+
const split = this.#splitAction(action);
|
|
159
|
+
return split === undefined
|
|
160
|
+
? this.denies(action, ...args)
|
|
161
|
+
: this.with(split.policy).denies(split.method, ...args);
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
/** `policy.method` for a dotted action that names no registered ability;
|
|
166
|
+
* `undefined` when the action IS an ability (warden keys its own with dots). */
|
|
167
|
+
#splitAction(action) {
|
|
168
|
+
if (Object.hasOwn(this.#abilities, action))
|
|
169
|
+
return undefined;
|
|
170
|
+
const dot = action.indexOf(".");
|
|
171
|
+
if (dot <= 0 || dot === action.length - 1)
|
|
172
|
+
return undefined;
|
|
173
|
+
return { policy: action.slice(0, dot), method: action.slice(dot + 1) };
|
|
174
|
+
}
|
|
107
175
|
/** Open a policy for checks (D8 — fresh policy instance per check). */
|
|
108
176
|
with(policy) {
|
|
109
177
|
const factory = typeof policy === "string"
|
|
@@ -111,7 +179,7 @@ export class Bouncer {
|
|
|
111
179
|
: () => this.#construct(policy);
|
|
112
180
|
// The PolicyAuthorizer inherits the Bouncer's scope + the shared memoized
|
|
113
181
|
// resolve so every policy check sees the active `(user, scope)` (AC1/AC3).
|
|
114
|
-
return new PolicyAuthorizer(this.#getUser(), factory, this.#scope, () => this.#resolvePermissions(), this.#emitter);
|
|
182
|
+
return new PolicyAuthorizer(this.#getUser(), factory, this.#scope, () => this.#resolvePermissions(), this.#emitter, _a.responseBuilder);
|
|
115
183
|
}
|
|
116
184
|
/**
|
|
117
185
|
* Construct a policy instance via the container resolver when present (Adonis
|
|
@@ -123,10 +191,13 @@ export class Bouncer {
|
|
|
123
191
|
: Promise.resolve(new ctor());
|
|
124
192
|
}
|
|
125
193
|
/** Emit `authorization:finished` when an emitter is wired (no-op otherwise). */
|
|
126
|
-
#emit(action, response) {
|
|
194
|
+
#emit(action, response, parameters) {
|
|
127
195
|
this.#emitter?.emit("authorization:finished", {
|
|
128
196
|
user: this.#getUser(),
|
|
129
197
|
action,
|
|
198
|
+
// What the check was ABOUT. AdonisJS carries it, and without it an
|
|
199
|
+
// audit log can say "Ada was denied editPost" but never which post.
|
|
200
|
+
parameters,
|
|
130
201
|
response,
|
|
131
202
|
});
|
|
132
203
|
}
|
|
@@ -154,8 +225,9 @@ export class Bouncer {
|
|
|
154
225
|
allowGuest: resolved.allowGuest,
|
|
155
226
|
run: (user) => resolved.execute(user, ...args),
|
|
156
227
|
args,
|
|
228
|
+
responseBuilder: _a.responseBuilder,
|
|
157
229
|
});
|
|
158
|
-
this.#emit(action, response);
|
|
230
|
+
this.#emit(action, response, args);
|
|
159
231
|
return response;
|
|
160
232
|
}
|
|
161
233
|
#resolveAbility(name) {
|
|
@@ -180,4 +252,5 @@ export class Bouncer {
|
|
|
180
252
|
};
|
|
181
253
|
}
|
|
182
254
|
}
|
|
255
|
+
_a = Bouncer;
|
|
183
256
|
//# sourceMappingURL=Bouncer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bouncer.js","sourceRoot":"","sources":["../../src/bouncer/Bouncer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG
|
|
1
|
+
{"version":3,"file":"Bouncer.js","sourceRoot":"","sources":["../../src/bouncer/Bouncer.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,12 +9,20 @@ import type { UserPayload } from "../AuthManager.js";
|
|
|
9
9
|
import type { EffectivePermissions, Scope } from "../rights/types.js";
|
|
10
10
|
import type { AuthorizationResponse } from "./AuthorizationResponse.js";
|
|
11
11
|
import { BasePolicy } from "./BasePolicy.js";
|
|
12
|
+
import { type ResponseBuilder } from "./evaluate.js";
|
|
12
13
|
import type { BouncerEmitter } from "./types.js";
|
|
13
14
|
export declare class PolicyAuthorizer {
|
|
14
15
|
#private;
|
|
15
|
-
constructor(user: UserPayload | null, factory: () => Promise<BasePolicy>, scope?: Scope, resolvePermissions?: () => Promise<EffectivePermissions>, emitter?: BouncerEmitter);
|
|
16
|
+
constructor(user: UserPayload | null, factory: () => Promise<BasePolicy>, scope?: Scope, resolvePermissions?: () => Promise<EffectivePermissions>, emitter?: BouncerEmitter, responseBuilder?: ResponseBuilder);
|
|
16
17
|
/** Run a check and resolve to the full response (D8 — fresh policy per check). */
|
|
17
18
|
execute(action: string, ...args: unknown[]): Promise<AuthorizationResponse>;
|
|
19
|
+
/**
|
|
20
|
+
* Swap the event sink after construction (AdonisJS `setEmitter`).
|
|
21
|
+
*
|
|
22
|
+
* The Bouncer passes its own down, but an authorizer built directly — a
|
|
23
|
+
* test, a console command — had no way to be given one.
|
|
24
|
+
*/
|
|
25
|
+
setEmitter(emitter?: BouncerEmitter): this;
|
|
18
26
|
/** True iff the action is authorized. Never throws on denial. */
|
|
19
27
|
allows(action: string, ...args: unknown[]): Promise<boolean>;
|
|
20
28
|
/** Boolean negation of {@link allows}. Never throws on denial. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolicyAuthorizer.d.ts","sourceRoot":"","sources":["../../src/bouncer/PolicyAuthorizer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"PolicyAuthorizer.d.ts","sourceRoot":"","sources":["../../src/bouncer/PolicyAuthorizer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAIN,KAAK,eAAe,EAEpB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA6CjD,qBAAa,gBAAgB;;gBAS3B,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,EAClC,KAAK,GAAE,KAAgB,EACvB,kBAAkB,GAAE,MAAM,OAAO,CAAC,oBAAoB,CACb,EACzC,OAAO,CAAC,EAAE,cAAc,EACxB,eAAe,CAAC,EAAE,eAAe;IAUlC,kFAAkF;IAC5E,OAAO,CACZ,MAAM,EAAE,MAAM,EACd,GAAG,IAAI,EAAE,OAAO,EAAE,GAChB,OAAO,CAAC,qBAAqB,CAAC;IA6BjC;;;;;OAKG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI;IAK1C,iEAAiE;IAC3D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlE,kEAAkE;IAC5D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlE,6EAA6E;IACvE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAMlE"}
|
|
@@ -49,12 +49,14 @@ export class PolicyAuthorizer {
|
|
|
49
49
|
#scope;
|
|
50
50
|
#resolvePermissions;
|
|
51
51
|
#emitter;
|
|
52
|
-
|
|
52
|
+
#responseBuilder;
|
|
53
|
+
constructor(user, factory, scope = "global", resolvePermissions = () => Promise.resolve(emptyPermissions(scope)), emitter, responseBuilder) {
|
|
53
54
|
this.#user = user;
|
|
54
55
|
this.#factory = factory;
|
|
55
56
|
this.#scope = scope;
|
|
56
57
|
this.#resolvePermissions = resolvePermissions;
|
|
57
58
|
this.#emitter = emitter;
|
|
59
|
+
this.#responseBuilder = responseBuilder;
|
|
58
60
|
}
|
|
59
61
|
/** Run a check and resolve to the full response (D8 — fresh policy per check). */
|
|
60
62
|
async execute(action, ...args) {
|
|
@@ -73,14 +75,28 @@ export class PolicyAuthorizer {
|
|
|
73
75
|
args,
|
|
74
76
|
before: policy.before?.bind(policy),
|
|
75
77
|
after: policy.after?.bind(policy),
|
|
78
|
+
responseBuilder: this.#responseBuilder,
|
|
76
79
|
});
|
|
77
80
|
this.#emitter?.emit("authorization:finished", {
|
|
78
81
|
user: this.#user,
|
|
79
82
|
action,
|
|
83
|
+
// Same payload as an ability check: which resource the decision was
|
|
84
|
+
// about, not just that a decision happened.
|
|
85
|
+
parameters: args,
|
|
80
86
|
response,
|
|
81
87
|
});
|
|
82
88
|
return response;
|
|
83
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Swap the event sink after construction (AdonisJS `setEmitter`).
|
|
92
|
+
*
|
|
93
|
+
* The Bouncer passes its own down, but an authorizer built directly — a
|
|
94
|
+
* test, a console command — had no way to be given one.
|
|
95
|
+
*/
|
|
96
|
+
setEmitter(emitter) {
|
|
97
|
+
this.#emitter = emitter;
|
|
98
|
+
return this;
|
|
99
|
+
}
|
|
84
100
|
/** True iff the action is authorized. Never throws on denial. */
|
|
85
101
|
async allows(action, ...args) {
|
|
86
102
|
return (await this.execute(action, ...args)).authorized;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolicyAuthorizer.js","sourceRoot":"","sources":["../../src/bouncer/PolicyAuthorizer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAEN,QAAQ,EACR,QAAQ,
|
|
1
|
+
{"version":3,"file":"PolicyAuthorizer.js","sourceRoot":"","sources":["../../src/bouncer/PolicyAuthorizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,8 +12,18 @@ import { AuthorizationResponse } from "./AuthorizationResponse.js";
|
|
|
12
12
|
import type { AuthorizerResponse, HookResponse } from "./types.js";
|
|
13
13
|
/** A policy action method / ability callback, structurally. */
|
|
14
14
|
export type Action = (user: UserPayload | null, ...args: unknown[]) => AuthorizerResponse;
|
|
15
|
-
/**
|
|
16
|
-
export
|
|
15
|
+
/** Turns whatever an ability returned into an {@link AuthorizationResponse}. */
|
|
16
|
+
export type ResponseBuilder = (value: boolean | AuthorizationResponse) => AuthorizationResponse;
|
|
17
|
+
/** The default: boolean sugar → response; an explicit response passes through (D7). */
|
|
18
|
+
export declare const defaultResponseBuilder: ResponseBuilder;
|
|
19
|
+
/**
|
|
20
|
+
* Boolean sugar → response, through whatever builder is installed.
|
|
21
|
+
*
|
|
22
|
+
* `Bouncer.responseBuilder` replaces it app-wide, which is how you give every
|
|
23
|
+
* bare `return false` a house message and status instead of a naked 403
|
|
24
|
+
* (AdonisJS `Bouncer.responseBuilder`).
|
|
25
|
+
*/
|
|
26
|
+
export declare function normalizeResponse(value: boolean | AuthorizationResponse, builder?: ResponseBuilder): AuthorizationResponse;
|
|
17
27
|
/**
|
|
18
28
|
* Type guard for a callable action. A function's parameter/return types are not
|
|
19
29
|
* observable at runtime, so this asserts the structural `Action` shape from a
|
|
@@ -32,5 +42,7 @@ export declare function evaluate(params: {
|
|
|
32
42
|
args: unknown[];
|
|
33
43
|
before?: (user: UserPayload | null, action: string, ...args: unknown[]) => HookResponse;
|
|
34
44
|
after?: (user: UserPayload | null, action: string, result: AuthorizationResponse, ...args: unknown[]) => HookResponse;
|
|
45
|
+
/** Overrides how a bare boolean becomes a response. */
|
|
46
|
+
responseBuilder?: ResponseBuilder;
|
|
35
47
|
}): Promise<AuthorizationResponse>;
|
|
36
48
|
//# sourceMappingURL=evaluate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/bouncer/evaluate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnE,+DAA+D;AAC/D,MAAM,MAAM,MAAM,GAAG,CACpB,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,GAAG,IAAI,EAAE,OAAO,EAAE,KACd,kBAAkB,CAAC;AAExB,
|
|
1
|
+
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/bouncer/evaluate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnE,+DAA+D;AAC/D,MAAM,MAAM,MAAM,GAAG,CACpB,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,GAAG,IAAI,EAAE,OAAO,EAAE,KACd,kBAAkB,CAAC;AAExB,gFAAgF;AAChF,MAAM,MAAM,eAAe,GAAG,CAC7B,KAAK,EAAE,OAAO,GAAG,qBAAqB,KAClC,qBAAqB,CAAC;AAE3B,uFAAuF;AACvF,eAAO,MAAM,sBAAsB,EAAE,eAKpC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,OAAO,GAAG,qBAAqB,EACtC,OAAO,GAAE,eAAwC,GAC/C,qBAAqB,CAEvB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,4EAA4E;AAC5E,wBAAgB,yBAAyB,CACxC,QAAQ,EAAE,qBAAqB,GAC7B,KAAK,CASP;AAED,wEAAwE;AACxE,wBAAsB,QAAQ,CAAC,MAAM,EAAE;IACtC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,kBAAkB,CAAC;IACtD,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,CACR,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,EAAE,MAAM,EACd,GAAG,IAAI,EAAE,OAAO,EAAE,KACd,YAAY,CAAC;IAClB,KAAK,CAAC,EAAE,CACP,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,qBAAqB,EAC7B,GAAG,IAAI,EAAE,OAAO,EAAE,KACd,YAAY,CAAC;IAClB,uDAAuD;IACvD,eAAe,CAAC,EAAE,eAAe,CAAC;CAClC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAiCjC"}
|
package/dist/bouncer/evaluate.js
CHANGED
|
@@ -9,12 +9,22 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { WardenError } from "../errors.js";
|
|
11
11
|
import { AuthorizationResponse } from "./AuthorizationResponse.js";
|
|
12
|
-
/**
|
|
13
|
-
export
|
|
12
|
+
/** The default: boolean sugar → response; an explicit response passes through (D7). */
|
|
13
|
+
export const defaultResponseBuilder = (value) => {
|
|
14
14
|
if (value instanceof AuthorizationResponse) {
|
|
15
15
|
return value;
|
|
16
16
|
}
|
|
17
17
|
return value ? AuthorizationResponse.allow() : AuthorizationResponse.deny();
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Boolean sugar → response, through whatever builder is installed.
|
|
21
|
+
*
|
|
22
|
+
* `Bouncer.responseBuilder` replaces it app-wide, which is how you give every
|
|
23
|
+
* bare `return false` a house message and status instead of a naked 403
|
|
24
|
+
* (AdonisJS `Bouncer.responseBuilder`).
|
|
25
|
+
*/
|
|
26
|
+
export function normalizeResponse(value, builder = defaultResponseBuilder) {
|
|
27
|
+
return builder(value);
|
|
18
28
|
}
|
|
19
29
|
/**
|
|
20
30
|
* Type guard for a callable action. A function's parameter/return types are not
|
|
@@ -35,12 +45,13 @@ export function throwAuthorizationFailure(response) {
|
|
|
35
45
|
/** Run the D5 evaluation pipeline and resolve to the final response. */
|
|
36
46
|
export async function evaluate(params) {
|
|
37
47
|
const { user, action, allowGuest, run, args, before, after } = params;
|
|
48
|
+
const builder = params.responseBuilder ?? defaultResponseBuilder;
|
|
38
49
|
let response;
|
|
39
50
|
// (1) before — non-undefined short-circuits the action.
|
|
40
51
|
if (before) {
|
|
41
52
|
const early = await before(user, action, ...args);
|
|
42
53
|
if (early !== undefined) {
|
|
43
|
-
response = normalizeResponse(early);
|
|
54
|
+
response = normalizeResponse(early, builder);
|
|
44
55
|
}
|
|
45
56
|
}
|
|
46
57
|
// (2) guest-deny + (3) action — only if before did not short-circuit.
|
|
@@ -49,7 +60,7 @@ export async function evaluate(params) {
|
|
|
49
60
|
response = AuthorizationResponse.deny();
|
|
50
61
|
}
|
|
51
62
|
else {
|
|
52
|
-
response = normalizeResponse(await run(user));
|
|
63
|
+
response = normalizeResponse(await run(user), builder);
|
|
53
64
|
}
|
|
54
65
|
}
|
|
55
66
|
// (4) after — non-undefined overrides. Receives the resource args (Adonis
|
|
@@ -57,7 +68,7 @@ export async function evaluate(params) {
|
|
|
57
68
|
if (after) {
|
|
58
69
|
const override = await after(user, action, response, ...args);
|
|
59
70
|
if (override !== undefined) {
|
|
60
|
-
response = normalizeResponse(override);
|
|
71
|
+
response = normalizeResponse(override, builder);
|
|
61
72
|
}
|
|
62
73
|
}
|
|
63
74
|
return response;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/bouncer/evaluate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/bouncer/evaluate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAcnE,uFAAuF;AACvF,MAAM,CAAC,MAAM,sBAAsB,GAAoB,CAAC,KAAK,EAAE,EAAE;IAChE,IAAI,KAAK,YAAY,qBAAqB,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC;AAC7E,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAChC,KAAsC,EACtC,UAA2B,sBAAsB;IAEjD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC;AACpC,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,yBAAyB,CACxC,QAA+B;IAE/B,MAAM,IAAI,WAAW,CACpB,uBAAuB,EACvB,QAAQ,CAAC,OAAO,IAAI,sBAAsB,EAC1C;QACC,IAAI,EAAE,qDAAqD;QAC3D,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,GAAG;KAC9B,CACD,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAmB9B;IACA,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IACtE,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,IAAI,sBAAsB,CAAC;IAEjE,IAAI,QAA2C,CAAC;IAEhD,wDAAwD;IACxD,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,QAAQ,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;IACF,CAAC;IAED,sEAAsE;IACtE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClC,QAAQ,GAAG,qBAAqB,CAAC,IAAI,EAAE,CAAC;QACzC,CAAC;aAAM,CAAC;YACP,QAAQ,GAAG,iBAAiB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC;IACF,CAAC;IAED,0EAA0E;IAC1E,kDAAkD;IAClD,IAAI,KAAK,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC;QAC9D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC5B,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;IACF,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC"}
|
package/dist/bouncer/types.d.ts
CHANGED
|
@@ -20,8 +20,10 @@ export interface PolicyContainerResolver {
|
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
22
|
* Agnostic event sink (Adonis `Bouncer.emitter`). When present, an
|
|
23
|
-
* `authorization:finished` event fires after every ability/policy evaluation
|
|
24
|
-
* `{ user, action, response }
|
|
23
|
+
* `authorization:finished` event fires after every ability/policy evaluation
|
|
24
|
+
* with `{ user, action, parameters, response }` (AdonisJS `BouncerEvents`).
|
|
25
|
+
* `parameters` are the arguments the check ran against — an audit log needs
|
|
26
|
+
* them to say WHICH resource was refused. No-op when absent.
|
|
25
27
|
*/
|
|
26
28
|
export interface BouncerEmitter {
|
|
27
29
|
emit(event: string, payload: unknown): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bouncer/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACvC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACvD;AAED
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bouncer/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACvC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACvD;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC9B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CAC5C;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC9B,uDAAuD;IACvD,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;IACnC,4EAA4E;IAC5E,QAAQ,CAAC,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;IACrD,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;CAClC;AAED,qFAAqF;AACrF,MAAM,MAAM,kBAAkB,GAC3B,OAAO,GACP,qBAAqB,GACrB,OAAO,CAAC,OAAO,GAAG,qBAAqB,CAAC,CAAC;AAE5C,wGAAwG;AACxG,MAAM,MAAM,YAAY,GACrB,OAAO,GACP,qBAAqB,GACrB,SAAS,GACT,OAAO,CAAC,OAAO,GAAG,qBAAqB,GAAG,SAAS,CAAC,CAAC;AAExD,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,OAAO,CAAC,IAAI,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE;IAC1D,uEAAuE;IACvE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,CACjB,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,GAAG,IAAI,EAAE,OAAO,EAAE,KACd,kBAAkB,CAAC;IACxB,kFAAkF;IAClF,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CAC1C"}
|