@adonis-agora/durable 1.0.0-rc.1 → 1.0.0-rc.10
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 +116 -0
- package/dist/assets/spa/assets/index-B2kIfzsc.css +1 -0
- package/dist/assets/spa/assets/index-Bgf_8IJ0.js +16 -0
- package/dist/assets/spa/assets/index-Bgf_8IJ0.js.map +1 -0
- package/dist/assets/spa/index.html +2 -2
- package/dist/commands/runs.d.ts.map +1 -1
- package/dist/commands/runs.js +4 -2
- package/dist/commands/runs.js.map +1 -1
- package/dist/providers/dashboard_provider.d.ts +15 -49
- package/dist/providers/dashboard_provider.d.ts.map +1 -1
- package/dist/providers/dashboard_provider.js +69 -244
- package/dist/providers/dashboard_provider.js.map +1 -1
- package/dist/providers/durable_provider.d.ts.map +1 -1
- package/dist/providers/durable_provider.js +8 -3
- package/dist/providers/durable_provider.js.map +1 -1
- package/dist/src/commands/runs.js +1 -1
- package/dist/src/commands/runs.js.map +1 -1
- package/dist/src/concurrency.d.ts.map +1 -1
- package/dist/src/concurrency.js +1 -0
- package/dist/src/concurrency.js.map +1 -1
- package/dist/src/control-flow-signal.d.ts +5 -4
- package/dist/src/control-flow-signal.d.ts.map +1 -1
- package/dist/src/control-flow-signal.js +5 -4
- package/dist/src/control-flow-signal.js.map +1 -1
- package/dist/src/dashboard/access_denied_page.d.ts +5 -7
- package/dist/src/dashboard/access_denied_page.d.ts.map +1 -1
- package/dist/src/dashboard/access_denied_page.js +2 -6
- package/dist/src/dashboard/access_denied_page.js.map +1 -1
- package/dist/src/dashboard/console_authorize.d.ts +76 -0
- package/dist/src/dashboard/console_authorize.d.ts.map +1 -0
- package/dist/src/dashboard/console_authorize.js +101 -0
- package/dist/src/dashboard/console_authorize.js.map +1 -0
- package/dist/src/dashboard/define_config.d.ts +44 -81
- package/dist/src/dashboard/define_config.d.ts.map +1 -1
- package/dist/src/dashboard/define_config.js +16 -112
- package/dist/src/dashboard/define_config.js.map +1 -1
- package/dist/src/dashboard/handlers.d.ts.map +1 -1
- package/dist/src/dashboard/handlers.js +6 -3
- package/dist/src/dashboard/handlers.js.map +1 -1
- package/dist/src/dashboard/index.d.ts +5 -8
- package/dist/src/dashboard/index.d.ts.map +1 -1
- package/dist/src/dashboard/index.js +4 -6
- package/dist/src/dashboard/index.js.map +1 -1
- package/dist/src/dashboard/openapi.d.ts.map +1 -1
- package/dist/src/dashboard/openapi.js +11 -1
- package/dist/src/dashboard/openapi.js.map +1 -1
- package/dist/src/dashboard/run-filter.d.ts.map +1 -1
- package/dist/src/dashboard/run-filter.js +1 -0
- package/dist/src/dashboard/run-filter.js.map +1 -1
- package/dist/src/diagnostics/index.d.ts +11 -0
- package/dist/src/diagnostics/index.d.ts.map +1 -0
- package/dist/src/diagnostics/index.js +6 -0
- package/dist/src/diagnostics/index.js.map +1 -0
- package/dist/src/diagnostics/transport.d.ts +71 -0
- package/dist/src/diagnostics/transport.d.ts.map +1 -0
- package/dist/src/diagnostics/transport.js +188 -0
- package/dist/src/diagnostics/transport.js.map +1 -0
- package/dist/src/diagnostics-bridge.d.ts +2 -1
- package/dist/src/diagnostics-bridge.d.ts.map +1 -1
- package/dist/src/diagnostics-bridge.js +7 -1
- package/dist/src/diagnostics-bridge.js.map +1 -1
- package/dist/src/engine.d.ts +13 -8
- package/dist/src/engine.d.ts.map +1 -1
- package/dist/src/engine.js +136 -51
- package/dist/src/engine.js.map +1 -1
- package/dist/src/errors.d.ts +9 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +13 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/event-trigger-bridge.d.ts +5 -14
- package/dist/src/event-trigger-bridge.d.ts.map +1 -1
- package/dist/src/event-trigger-bridge.js +11 -99
- package/dist/src/event-trigger-bridge.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/interfaces.d.ts +22 -6
- package/dist/src/interfaces.d.ts.map +1 -1
- package/dist/src/interfaces.js +8 -0
- package/dist/src/interfaces.js.map +1 -1
- package/dist/src/origin.js +3 -3
- package/dist/src/scheduler.d.ts.map +1 -1
- package/dist/src/scheduler.js +2 -1
- package/dist/src/scheduler.js.map +1 -1
- package/dist/src/singleton-admission.d.ts.map +1 -1
- package/dist/src/singleton-admission.js +2 -0
- package/dist/src/singleton-admission.js.map +1 -1
- package/dist/src/singleton-gate.d.ts +1 -1
- package/dist/src/singleton-gate.d.ts.map +1 -1
- package/dist/src/singleton-gate.js +4 -3
- package/dist/src/singleton-gate.js.map +1 -1
- package/dist/src/stores/lucid-pg-hot-path.d.ts +6 -2
- package/dist/src/stores/lucid-pg-hot-path.d.ts.map +1 -1
- package/dist/src/stores/lucid-pg-hot-path.js +7 -3
- package/dist/src/stores/lucid-pg-hot-path.js.map +1 -1
- package/dist/src/stores/lucid.d.ts +15 -2
- package/dist/src/stores/lucid.d.ts.map +1 -1
- package/dist/src/stores/lucid.js +191 -49
- package/dist/src/stores/lucid.js.map +1 -1
- package/dist/src/testing/in-memory-state-store.js +3 -3
- package/dist/src/testing/in-memory-state-store.js.map +1 -1
- package/dist/src/testing-kit/state-store-conformance.d.ts.map +1 -1
- package/dist/src/testing-kit/state-store-conformance.js +13 -0
- package/dist/src/testing-kit/state-store-conformance.js.map +1 -1
- package/dist/src/testing-kit/transport-conformance.d.ts.map +1 -1
- package/dist/src/testing-kit/transport-conformance.js +5 -1
- package/dist/src/testing-kit/transport-conformance.js.map +1 -1
- package/dist/src/transports/bullmq/bullmq-transport.d.ts.map +1 -1
- package/dist/src/transports/bullmq/bullmq-transport.js +13 -2
- package/dist/src/transports/bullmq/bullmq-transport.js.map +1 -1
- package/dist/src/transports/db.d.ts.map +1 -1
- package/dist/src/transports/db.js +42 -3
- package/dist/src/transports/db.js.map +1 -1
- package/dist/src/transports/queue.d.ts.map +1 -1
- package/dist/src/transports/queue.js +44 -3
- package/dist/src/transports/queue.js.map +1 -1
- package/dist/src/workflow-discovery.d.ts +1 -1
- package/dist/src/workflow-discovery.d.ts.map +1 -1
- package/dist/src/workflow-discovery.js +4 -7
- package/dist/src/workflow-discovery.js.map +1 -1
- package/dist/src/workflow-events.d.ts +20 -51
- package/dist/src/workflow-events.d.ts.map +1 -1
- package/dist/src/workflow-events.js +12 -30
- package/dist/src/workflow-events.js.map +1 -1
- package/dist/src/workflow-ref.d.ts +1 -1
- package/dist/src/workflow-turn.d.ts.map +1 -1
- package/dist/src/workflow-turn.js +18 -1
- package/dist/src/workflow-turn.js.map +1 -1
- package/dist/stubs/config/durable_dashboard.stub +9 -29
- package/package.json +12 -2
- package/skills/durable-cluster/SKILL.md +8 -4
- package/skills/durable-reliability/SKILL.md +2 -2
- package/dist/assets/spa/assets/index-70hGzOnT.css +0 -1
- package/dist/assets/spa/assets/index-CJjMAUau.js +0 -16
- package/dist/assets/spa/assets/index-CJjMAUau.js.map +0 -1
- package/dist/src/dashboard/auth.d.ts +0 -134
- package/dist/src/dashboard/auth.d.ts.map +0 -1
- package/dist/src/dashboard/auth.js +0 -156
- package/dist/src/dashboard/auth.js.map +0 -1
- package/dist/src/dashboard/login_page.d.ts +0 -36
- package/dist/src/dashboard/login_page.d.ts.map +0 -1
- package/dist/src/dashboard/login_page.js +0 -158
- package/dist/src/dashboard/login_page.js.map +0 -1
- package/dist/src/dashboard/session_cookie.d.ts +0 -45
- package/dist/src/dashboard/session_cookie.d.ts.map +0 -1
- package/dist/src/dashboard/session_cookie.js +0 -97
- package/dist/src/dashboard/session_cookie.js.map +0 -1
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { createHash, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
function isAuthorizerClass(value) {
|
|
3
|
+
return (typeof value === 'function' &&
|
|
4
|
+
typeof value.prototype?.authorize === 'function');
|
|
5
|
+
}
|
|
6
|
+
function lazyModuleClass(value) {
|
|
7
|
+
if (typeof value !== 'object' || value === null)
|
|
8
|
+
return undefined;
|
|
9
|
+
const candidate = value.default;
|
|
10
|
+
return isAuthorizerClass(candidate) ? candidate : undefined;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Collapse an `authorize` result into a {@link ConsoleDecision}. Only `true` or an object with
|
|
14
|
+
* `allowed === true` allows; `{ redirectTo }` is an unauthenticated denial with a redirect target;
|
|
15
|
+
* anything else — `false`, `{ allowed: false }`, a truthy non-boolean, a missing value — is a `403`.
|
|
16
|
+
*/
|
|
17
|
+
export function normalizeConsoleDecision(result) {
|
|
18
|
+
if (result === true)
|
|
19
|
+
return { allowed: true };
|
|
20
|
+
if (typeof result !== 'object' || result === null)
|
|
21
|
+
return { allowed: false, reason: 'forbidden' };
|
|
22
|
+
const record = result;
|
|
23
|
+
if (record.allowed === true)
|
|
24
|
+
return { allowed: true };
|
|
25
|
+
if (typeof record.redirectTo === 'string' && record.redirectTo !== '') {
|
|
26
|
+
return { allowed: false, reason: 'unauthenticated', redirectTo: record.redirectTo };
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
allowed: false,
|
|
30
|
+
reason: record.reason === 'unauthenticated' ? 'unauthenticated' : 'forbidden',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
async function runAuthorizer(Authorizer, ctx) {
|
|
34
|
+
const instance = await ctx.containerResolver.make(Authorizer);
|
|
35
|
+
return instance.authorize(ctx);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Turn any {@link ConsoleAuthorize} form into a per-request gate:
|
|
39
|
+
*
|
|
40
|
+
* - a class is instantiated through the request's container resolver (so `@inject()` works) and its
|
|
41
|
+
* `authorize(ctx)` is called;
|
|
42
|
+
* - a function is called with `ctx`; when it resolves to a module whose `default` is an authorizer
|
|
43
|
+
* class it was a lazy import — the class is remembered (the import runs once) and used from then on;
|
|
44
|
+
* - a thrown error is a `403`, never an allow.
|
|
45
|
+
*/
|
|
46
|
+
export function resolveConsoleAuthorize(authorize) {
|
|
47
|
+
let Authorizer = isAuthorizerClass(authorize)
|
|
48
|
+
? authorize
|
|
49
|
+
: undefined;
|
|
50
|
+
if (Authorizer === undefined && typeof authorize !== 'function') {
|
|
51
|
+
throw new TypeError('[console] `authorize` must be a function, an authorizer class, or a lazy import of one.');
|
|
52
|
+
}
|
|
53
|
+
const fn = authorize;
|
|
54
|
+
return async (ctx) => {
|
|
55
|
+
try {
|
|
56
|
+
if (Authorizer !== undefined) {
|
|
57
|
+
return normalizeConsoleDecision(await runAuthorizer(Authorizer, ctx));
|
|
58
|
+
}
|
|
59
|
+
const result = await fn(ctx);
|
|
60
|
+
const lazy = lazyModuleClass(result);
|
|
61
|
+
if (lazy !== undefined) {
|
|
62
|
+
Authorizer = lazy;
|
|
63
|
+
return normalizeConsoleDecision(await runAuthorizer(lazy, ctx));
|
|
64
|
+
}
|
|
65
|
+
return normalizeConsoleDecision(result);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return { allowed: false, reason: 'forbidden', error };
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function digest(value) {
|
|
73
|
+
return createHash('sha256').update(value).digest();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* An `authorize` for machine access (scripts, a Prometheus scrape): allows a request whose
|
|
77
|
+
* `Authorization` header is `Bearer <token>`, and answers `{ allowed: false, reason: 'unauthenticated' }`
|
|
78
|
+
* (`401`) otherwise. Only the header is read.
|
|
79
|
+
*
|
|
80
|
+
* ```ts
|
|
81
|
+
* authorize: authorizeByToken({ token: env.get('CONSOLE_TOKEN') }),
|
|
82
|
+
* ```
|
|
83
|
+
*
|
|
84
|
+
* Throws at config time when `token` is empty or undefined.
|
|
85
|
+
*/
|
|
86
|
+
export function authorizeByToken(options) {
|
|
87
|
+
const token = options?.token;
|
|
88
|
+
if (typeof token !== 'string' || token === '') {
|
|
89
|
+
throw new Error('authorizeByToken: `token` must be a non-empty string');
|
|
90
|
+
}
|
|
91
|
+
// Compare digests: equal length always, so the check leaks neither a match nor the token length.
|
|
92
|
+
const expected = digest(token);
|
|
93
|
+
return (ctx) => {
|
|
94
|
+
const header = ctx.request.header('authorization');
|
|
95
|
+
const match = typeof header === 'string' ? /^Bearer\s+(.+)$/i.exec(header.trim()) : null;
|
|
96
|
+
if (match?.[1] && timingSafeEqual(digest(match[1]), expected))
|
|
97
|
+
return { allowed: true };
|
|
98
|
+
return { allowed: false, reason: 'unauthenticated' };
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=console_authorize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console_authorize.js","sourceRoot":"","sources":["../../../src/dashboard/console_authorize.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { HttpContext } from '@adonisjs/core/http';
|
|
2
2
|
import type { AccessDeniedOption as GenericAccessDeniedOption, AccessDeniedRenderer as GenericAccessDeniedRenderer } from './access_denied_page.js';
|
|
3
|
-
import { type
|
|
3
|
+
import { type ConsoleAuthorize, type ConsoleAuthorizeGate, type ConsoleAuthorizeResult, type ConsoleDecision } from './console_authorize.js';
|
|
4
4
|
/**
|
|
5
5
|
* The function form of {@link DurableDashboardConfig.accessDenied}: render (or answer) a refused
|
|
6
6
|
* page navigation yourself. Receives the refusal ({@link AccessDeniedInfo}) and the AdonisJS
|
|
@@ -15,41 +15,28 @@ export type AccessDeniedOption = GenericAccessDeniedOption<HttpContext>;
|
|
|
15
15
|
* A structured answer from an {@link AuthorizeHook}: whether the request may proceed and, when it may
|
|
16
16
|
* not, why. The `reason` picks the status: `'unauthenticated'` (nobody is signed in) → `401`,
|
|
17
17
|
* `'forbidden'` (signed in, not allowed) → `403`. No reason → `403` (fail closed).
|
|
18
|
-
*
|
|
19
|
-
* This is the shared Agora dashboard-gate contract — the same shape every `@adonis-agora` console
|
|
20
|
-
* accepts, so one hook (e.g. `@adonis-agora/authz`'s `authorizeByRoles`) can gate them all.
|
|
21
18
|
*/
|
|
22
19
|
export interface AuthorizeDecision {
|
|
23
20
|
allowed: boolean;
|
|
24
21
|
reason?: 'unauthenticated' | 'forbidden';
|
|
25
22
|
}
|
|
26
|
-
/** What an {@link AuthorizeHook} may return: a bare boolean or an {@link AuthorizeDecision}. */
|
|
27
|
-
export type AuthorizeResult = boolean | AuthorizeDecision;
|
|
28
23
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* access-denied page, or `{ error: 'forbidden' }`).
|
|
37
|
-
*
|
|
38
|
-
* A hook that THROWS is a denial (`403`), never a pass. A hook that answers the request itself — a
|
|
39
|
-
* redirect to the host's login page, most commonly — keeps its answer: the provider writes nothing
|
|
40
|
-
* over it.
|
|
41
|
-
*
|
|
42
|
-
* It receives the AdonisJS {@link HttpContext}, so it can read the session,
|
|
43
|
-
* a bearer token, an IP allow-list, etc.
|
|
24
|
+
* What an {@link AuthorizeHook} may return: the shared {@link ConsoleAuthorizeResult} (a boolean,
|
|
25
|
+
* a decision, or `{ redirectTo }`) or an {@link AuthorizeDecision}.
|
|
26
|
+
*/
|
|
27
|
+
export type AuthorizeResult = ConsoleAuthorizeResult | AuthorizeDecision;
|
|
28
|
+
/**
|
|
29
|
+
* The function form of `authorize`. It receives the AdonisJS {@link HttpContext}, so it can read the
|
|
30
|
+
* session, a bearer token, an IP allow-list, etc. May be async.
|
|
44
31
|
*/
|
|
45
32
|
export type AuthorizeHook = (ctx: HttpContext) => AuthorizeResult | Promise<AuthorizeResult>;
|
|
46
33
|
/**
|
|
47
34
|
* Collapse an {@link AuthorizeResult} into a decision. Only `true` or an object with
|
|
48
|
-
* `allowed === true` allows
|
|
49
|
-
*
|
|
50
|
-
*
|
|
35
|
+
* `allowed === true` allows; `{ redirectTo }` is an unauthenticated denial carrying the redirect
|
|
36
|
+
* target; anything else — `false`, `{ allowed: false }`, a truthy non-boolean, a missing value —
|
|
37
|
+
* denies with `403`.
|
|
51
38
|
*/
|
|
52
|
-
export declare function normalizeAuthorizeResult(result: unknown):
|
|
39
|
+
export declare function normalizeAuthorizeResult(result: unknown): ConsoleDecision;
|
|
53
40
|
/** Shape of `config/durable_dashboard.ts`. */
|
|
54
41
|
export interface DurableDashboardConfig {
|
|
55
42
|
/**
|
|
@@ -64,39 +51,17 @@ export interface DurableDashboardConfig {
|
|
|
64
51
|
*/
|
|
65
52
|
path?: string;
|
|
66
53
|
/**
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* session guard is then the gate) or {@link allowUnauthenticated} explicitly opts out.
|
|
73
|
-
*
|
|
74
|
-
* (Before 0.37 the default was open outside `NODE_ENV=production` — which left every dev/staging
|
|
75
|
-
* deployment, and any box where NODE_ENV was unset or spelled differently, with an unauthenticated
|
|
76
|
-
* console whose destructive endpoints a malicious web page could drive via cross-site POSTs.)
|
|
77
|
-
*/
|
|
78
|
-
authorize?: AuthorizeHook;
|
|
79
|
-
/**
|
|
80
|
-
* Explicitly serve the dashboard WITHOUT any authentication. This is the loaded footgun the old
|
|
81
|
-
* "open outside production" default was — now it at least has to be spelled out in config, so a
|
|
82
|
-
* deploy can grep for it. Only for local development / networks you fully trust. Ignored when
|
|
83
|
-
* `authorize` or `dashboardAuth` is configured.
|
|
84
|
-
*/
|
|
85
|
-
allowUnauthenticated?: boolean;
|
|
86
|
-
/**
|
|
87
|
-
* Optional built-in login screen. When set, the provider mounts a
|
|
88
|
-
* server-rendered `GET <path>/login` page plus `POST <path>/login` /
|
|
89
|
-
* `GET <path>/logout`, and stamps a session guard on the dashboard: an
|
|
90
|
-
* unauthenticated page navigation is redirected (`302`) to the login page and
|
|
91
|
-
* an unauthenticated API request gets `401`. The signed session cookie is
|
|
92
|
-
* minted only by the host's {@link DashboardAuthOptions.login} hook.
|
|
54
|
+
* Who may reach the console. Runs before every dashboard route (API + HTML). Takes the shared
|
|
55
|
+
* {@link ConsoleAuthorize} contract — an inline function, an authorizer class (resolved through the
|
|
56
|
+
* container, so `@inject()` works), or a lazy import of one (`() => import('#policies/console_access')`).
|
|
57
|
+
* It returns a boolean, `{ allowed, reason? }` (`reason: 'unauthenticated'` → `401`, any other
|
|
58
|
+
* denial `403`) or `{ redirectTo }` (`302` for a page, `401` for an API call). A throw is a `403`.
|
|
93
59
|
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
* (
|
|
97
|
-
* closed at boot.
|
|
60
|
+
* Omitted, the console is open when the app is not in production and answers `403` to every
|
|
61
|
+
* request in production (a warning is logged once at boot). For machine access use
|
|
62
|
+
* `authorizeByToken({ token })`.
|
|
98
63
|
*/
|
|
99
|
-
|
|
64
|
+
authorize?: ConsoleAuthorize | AuthorizeHook;
|
|
100
65
|
/**
|
|
101
66
|
* Audit sink for MUTATING console actions (retry, cancel, bulk, fix-and-replay, signal, update,
|
|
102
67
|
* task completion, schedule control): called once per attempt with who did what, before the
|
|
@@ -117,13 +82,12 @@ export interface DurableDashboardConfig {
|
|
|
117
82
|
};
|
|
118
83
|
/**
|
|
119
84
|
* What a BROWSER sees when the guard refuses a page navigation (the SPA shell, its assets, or —
|
|
120
|
-
*
|
|
85
|
+
* nothing else). API requests are unaffected:
|
|
121
86
|
* they keep getting the JSON the SPA relies on (`403 { error: 'forbidden' }` /
|
|
122
|
-
* `401 { error: '
|
|
87
|
+
* `401 { error: 'unauthenticated' }`).
|
|
123
88
|
*
|
|
124
89
|
* Omit it for the built-in page — a dark card in the console's own visual language, with the
|
|
125
|
-
* status, a sentence explaining the refusal
|
|
126
|
-
* exists, a "Sign in" button. Pass an object to tweak that page (`brand`, `title`, `message`,
|
|
90
|
+
* status, a sentence explaining the refusal and a "Back to app" link. Pass an object to tweak that page (`brand`, `title`, `message`,
|
|
127
91
|
* `homeHref`, `loginHref`, `accent`, …), or a function to render/answer it yourself — see
|
|
128
92
|
* {@link AccessDeniedRenderer}. Either way, an `authorize` hook that already wrote a redirect
|
|
129
93
|
* still wins: the provider never overwrites a `location` header.
|
|
@@ -134,9 +98,10 @@ export interface DurableDashboardConfig {
|
|
|
134
98
|
export interface ResolvedDurableDashboardConfig {
|
|
135
99
|
enabled: boolean;
|
|
136
100
|
path: string;
|
|
137
|
-
authorize:
|
|
138
|
-
|
|
139
|
-
|
|
101
|
+
/** The resolved `authorize` gate (or the default): one call per request, never throws. */
|
|
102
|
+
authorize: ConsoleAuthorizeGate;
|
|
103
|
+
/** Whether the host set `authorize` (`false` means the dev-open / production-deny default). */
|
|
104
|
+
authorizeConfigured: boolean;
|
|
140
105
|
/** The host's `accessDenied` option as given, or `null` for the built-in page with defaults. */
|
|
141
106
|
accessDenied: AccessDeniedOption | null;
|
|
142
107
|
/** The host's audit sink, or `null` for the default logger line. */
|
|
@@ -150,29 +115,27 @@ export interface ResolvedDurableDashboardConfig {
|
|
|
150
115
|
/** One audited mutating console action — who (actor), what (method + path), when. */
|
|
151
116
|
export interface DashboardAuditEntry {
|
|
152
117
|
at: Date;
|
|
153
|
-
/**
|
|
118
|
+
/**
|
|
119
|
+
* The signed-in user (`ctx.auth.user`'s `email`, `name` or `id`), `'bearer'` for a caller with an
|
|
120
|
+
* `Authorization` header and no user, else `'anonymous'`.
|
|
121
|
+
*/
|
|
154
122
|
actor: string;
|
|
155
123
|
method: string;
|
|
156
|
-
/** The request path (no query string
|
|
124
|
+
/** The request path (no query string). */
|
|
157
125
|
path: string;
|
|
158
126
|
}
|
|
159
|
-
/**
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
* NODE_ENV branch anymore: "not production" is exactly the set of deployments (dev boxes,
|
|
170
|
-
* staging, misspelled envs) that used to ship an open console. Opt out explicitly with
|
|
171
|
-
* `allowUnauthenticated: true`, or configure `dashboardAuth`/your own `authorize`.
|
|
172
|
-
*/
|
|
173
|
-
export declare function defaultAuthorize(ctx: HttpContext): boolean;
|
|
127
|
+
/** The warning logged once at boot when `authorize` is omitted. */
|
|
128
|
+
export declare const NO_AUTHORIZE_WARNING = "[@adonis-agora/durable] console has no `authorize` configured: it is open outside production and denies every request in production. Set `authorize` in config/durable_dashboard.ts.";
|
|
129
|
+
/** Options for {@link resolveConfig}. */
|
|
130
|
+
export interface ResolveConfigOptions {
|
|
131
|
+
/**
|
|
132
|
+
* Whether the app runs in production (`app.inProduction`). Only `false` opens a console without
|
|
133
|
+
* `authorize`; anything else denies it.
|
|
134
|
+
*/
|
|
135
|
+
inProduction?: boolean;
|
|
136
|
+
}
|
|
174
137
|
/** Apply defaults to a partial config, producing a fully-resolved one. */
|
|
175
|
-
export declare function resolveConfig(config?: DurableDashboardConfig): ResolvedDurableDashboardConfig;
|
|
138
|
+
export declare function resolveConfig(config?: DurableDashboardConfig, options?: ResolveConfigOptions): ResolvedDurableDashboardConfig;
|
|
176
139
|
/** Identity helper giving `config/durable_dashboard.ts` full type-checking. */
|
|
177
140
|
export declare function defineConfig(config?: DurableDashboardConfig): DurableDashboardConfig;
|
|
178
141
|
//# sourceMappingURL=define_config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../../src/dashboard/define_config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../../src/dashboard/define_config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,129 +1,33 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { resolveDashboardAuth, } from './auth.js';
|
|
1
|
+
import { normalizeConsoleDecision, resolveConsoleAuthorize, } from './console_authorize.js';
|
|
3
2
|
/**
|
|
4
3
|
* Collapse an {@link AuthorizeResult} into a decision. Only `true` or an object with
|
|
5
|
-
* `allowed === true` allows
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* `allowed === true` allows; `{ redirectTo }` is an unauthenticated denial carrying the redirect
|
|
5
|
+
* target; anything else — `false`, `{ allowed: false }`, a truthy non-boolean, a missing value —
|
|
6
|
+
* denies with `403`.
|
|
8
7
|
*/
|
|
9
8
|
export function normalizeAuthorizeResult(result) {
|
|
10
|
-
|
|
11
|
-
return { allowed: true };
|
|
12
|
-
if (typeof result === 'object' &&
|
|
13
|
-
result !== null &&
|
|
14
|
-
result.allowed === true) {
|
|
15
|
-
return { allowed: true };
|
|
16
|
-
}
|
|
17
|
-
const reason = typeof result === 'object' && result !== null
|
|
18
|
-
? result.reason
|
|
19
|
-
: undefined;
|
|
20
|
-
return { allowed: false, reason: reason === 'unauthenticated' ? 'unauthenticated' : 'forbidden' };
|
|
9
|
+
return normalizeConsoleDecision(result);
|
|
21
10
|
}
|
|
22
|
-
/**
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
* cookie hardening defaults.
|
|
27
|
-
*/
|
|
28
|
-
export function isProduction() {
|
|
29
|
-
return (process.env.NODE_ENV ?? '').toLowerCase() === 'production';
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Extract a bearer token from an `Authorization: Bearer <token>` header, a
|
|
33
|
-
* `token` query-string param, or an `x-durable-token` header — whichever is
|
|
34
|
-
* present. Returns `undefined` when none is supplied.
|
|
35
|
-
*/
|
|
36
|
-
function readToken(ctx) {
|
|
37
|
-
const header = ctx.request.header('authorization');
|
|
38
|
-
if (header) {
|
|
39
|
-
const match = /^Bearer\s+(.+)$/i.exec(header);
|
|
40
|
-
if (match?.[1])
|
|
41
|
-
return match[1].trim();
|
|
42
|
-
}
|
|
43
|
-
const xHeader = ctx.request.header('x-durable-token');
|
|
44
|
-
if (xHeader)
|
|
45
|
-
return xHeader.trim();
|
|
46
|
-
// The query-string channel exists ONLY because EventSource (the SSE live-tail) cannot set
|
|
47
|
-
// headers. Restricted to read methods: a `?token=` that authorized POSTs turned any leaked/logged
|
|
48
|
-
// URL (access logs, Referer, browser history) into a destructive-capable magic link.
|
|
49
|
-
const method = ctx.request.method().toUpperCase();
|
|
50
|
-
if (method === 'GET' || method === 'HEAD') {
|
|
51
|
-
const qs = ctx.request.qs().token;
|
|
52
|
-
if (typeof qs === 'string' && qs.length > 0)
|
|
53
|
-
return qs;
|
|
54
|
-
}
|
|
55
|
-
return undefined;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Compare two secrets in constant time (guarding for equal byte-length first,
|
|
59
|
-
* since {@link timingSafeEqual} throws on a length mismatch). Returns `false`
|
|
60
|
-
* for any length difference, otherwise the timing-safe equality — so the token
|
|
61
|
-
* check leaks neither a match nor the token's length via response time.
|
|
62
|
-
*/
|
|
63
|
-
function secretsMatch(a, b) {
|
|
64
|
-
const bufA = Buffer.from(a);
|
|
65
|
-
const bufB = Buffer.from(b);
|
|
66
|
-
if (bufA.length !== bufB.length)
|
|
67
|
-
return false;
|
|
68
|
-
return timingSafeEqual(bufA, bufB);
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* The default guard: FAIL CLOSED in every environment — require a bearer token equal to
|
|
72
|
-
* `DURABLE_DASHBOARD_TOKEN`, denying everything when that env var is unset. There is no
|
|
73
|
-
* NODE_ENV branch anymore: "not production" is exactly the set of deployments (dev boxes,
|
|
74
|
-
* staging, misspelled envs) that used to ship an open console. Opt out explicitly with
|
|
75
|
-
* `allowUnauthenticated: true`, or configure `dashboardAuth`/your own `authorize`.
|
|
76
|
-
*/
|
|
77
|
-
export function defaultAuthorize(ctx) {
|
|
78
|
-
const expected = process.env.DURABLE_DASHBOARD_TOKEN;
|
|
79
|
-
if (!expected)
|
|
80
|
-
return false;
|
|
81
|
-
const provided = readToken(ctx);
|
|
82
|
-
if (provided === undefined)
|
|
83
|
-
return false;
|
|
84
|
-
// Constant-time compare to remove the timing side-channel from the token check.
|
|
85
|
-
return secretsMatch(provided, expected);
|
|
86
|
-
}
|
|
87
|
-
/** The explicit `allowUnauthenticated: true` guard — allow everything, by conscious opt-in only. */
|
|
88
|
-
const allowAll = () => true;
|
|
89
|
-
let warnedOpenDashboard = false;
|
|
11
|
+
/** The warning logged once at boot when `authorize` is omitted. */
|
|
12
|
+
export const NO_AUTHORIZE_WARNING = '[@adonis-agora/durable] console has no `authorize` configured: it is open outside production and denies every request in production. Set `authorize` in config/durable_dashboard.ts.';
|
|
13
|
+
const allowAll = async () => ({ allowed: true });
|
|
14
|
+
const denyAll = async () => ({ allowed: false, reason: 'forbidden' });
|
|
90
15
|
/** Apply defaults to a partial config, producing a fully-resolved one. */
|
|
91
|
-
export function resolveConfig(config = {}) {
|
|
16
|
+
export function resolveConfig(config = {}, options = {}) {
|
|
92
17
|
const rawPath = config.path ?? '/durable';
|
|
93
18
|
// Normalize: ensure a single leading slash and no trailing slash (root stays '/').
|
|
94
19
|
const trimmed = `/${rawPath.replace(/^\/+/, '').replace(/\/+$/, '')}`;
|
|
95
|
-
|
|
96
|
-
// 1. a host `authorize` hook wins;
|
|
97
|
-
// 2. `dashboardAuth` configured -> the session guard IS the gate (the default token guard would
|
|
98
|
-
// otherwise 403 every login flow that never set DURABLE_DASHBOARD_TOKEN);
|
|
99
|
-
// 3. `allowUnauthenticated: true` -> consciously open (warned once at resolve time);
|
|
100
|
-
// 4. else the fail-closed token guard.
|
|
101
|
-
const hasDashboardAuth = config.dashboardAuth !== undefined;
|
|
20
|
+
const authorizeConfigured = config.authorize !== undefined;
|
|
102
21
|
let authorize;
|
|
103
|
-
if (config.authorize)
|
|
104
|
-
authorize = config.authorize;
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
authorize = allowAll;
|
|
108
|
-
}
|
|
109
|
-
else if (config.allowUnauthenticated === true) {
|
|
110
|
-
if (!warnedOpenDashboard) {
|
|
111
|
-
warnedOpenDashboard = true;
|
|
112
|
-
console.warn('[durable_dashboard] allowUnauthenticated: true — the console (including destructive ' +
|
|
113
|
-
'endpoints) is served with NO authentication. Never ship this to a reachable network.');
|
|
114
|
-
}
|
|
115
|
-
authorize = allowAll;
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
authorize = defaultAuthorize;
|
|
119
|
-
}
|
|
22
|
+
if (config.authorize !== undefined)
|
|
23
|
+
authorize = resolveConsoleAuthorize(config.authorize);
|
|
24
|
+
else
|
|
25
|
+
authorize = options.inProduction === false ? allowAll : denyAll;
|
|
120
26
|
return {
|
|
121
27
|
enabled: config.enabled ?? true,
|
|
122
28
|
path: trimmed === '/' ? '' : trimmed,
|
|
123
29
|
authorize,
|
|
124
|
-
|
|
125
|
-
// not on the first login attempt. `null` when `dashboardAuth` is omitted.
|
|
126
|
-
dashboardAuth: resolveDashboardAuth(config.dashboardAuth),
|
|
30
|
+
authorizeConfigured,
|
|
127
31
|
accessDenied: config.accessDenied ?? null,
|
|
128
32
|
audit: config.audit ?? null,
|
|
129
33
|
redact: config.redact ?? null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../../src/dashboard/define_config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../../src/dashboard/define_config.ts"],"names":[],"mappings":"AAKA,OAAO,EAKL,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAoChC;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAe;IACtD,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC;AA4FD,mEAAmE;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAC/B,sLAAsL,CAAC;AAEzL,MAAM,QAAQ,GAAyB,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACvE,MAAM,OAAO,GAAyB,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;AAW5F,0EAA0E;AAC1E,MAAM,UAAU,aAAa,CAC3B,MAAM,GAA2B,EAAE,EACnC,OAAO,GAAyB,EAAE;IAElC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC;IAC1C,mFAAmF;IACnF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;IACtE,MAAM,mBAAmB,GAAG,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC;IAC3D,IAAI,SAA+B,CAAC;IACpC,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;QAAE,SAAS,GAAG,uBAAuB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;;QACrF,SAAS,GAAG,OAAO,CAAC,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IACrE,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI;QAC/B,IAAI,EAAE,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO;QACpC,SAAS;QACT,mBAAmB;QACnB,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI;QACzC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;KAC9B,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAAC,MAAM,GAA2B,EAAE;IAC9D,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/dashboard/handlers.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/dashboard/handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -250,9 +250,12 @@ export async function getRun(deps, req) {
|
|
|
250
250
|
if (detail.etag && detail.notModified)
|
|
251
251
|
return notModified(detail.etag);
|
|
252
252
|
const checkpoint = (cp) => redacted(deps.redact?.checkpoint, summarizeCheckpoint(cp));
|
|
253
|
+
// What a suspended run is parked on (a signal, an update, a task, a child), as the list rows carry
|
|
254
|
+
// it, so the console offers the matching action from the run itself.
|
|
255
|
+
const waitingOf = detail.run.status === 'suspended' ? await waitingResolver(engine, [detail.run]) : undefined;
|
|
253
256
|
return {
|
|
254
257
|
...ok({
|
|
255
|
-
run: redacted(deps.redact?.run, detailRun(detail.run)),
|
|
258
|
+
run: redacted(deps.redact?.run, detailRun(detail.run, waitingOf)),
|
|
256
259
|
timeline: detail.timeline.map(checkpoint),
|
|
257
260
|
children: detail.children,
|
|
258
261
|
...(detail.fans ? { fans: detail.fans.map((fan) => serializeFan(fan, checkpoint)) } : {}),
|
|
@@ -729,10 +732,10 @@ function summarizeRun(run, waitingOf) {
|
|
|
729
732
|
};
|
|
730
733
|
}
|
|
731
734
|
/** Fuller run shape for the detail view. */
|
|
732
|
-
function detailRun(run) {
|
|
735
|
+
function detailRun(run, waitingOf) {
|
|
733
736
|
return {
|
|
734
737
|
// recoveryAttempts already comes through from summarizeRun.
|
|
735
|
-
...summarizeRun(run),
|
|
738
|
+
...summarizeRun(run, waitingOf),
|
|
736
739
|
input: run.input,
|
|
737
740
|
output: run.output,
|
|
738
741
|
error: run.error,
|