@antasphere/chassis-server 1.0.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/LICENSE +82 -0
- package/dist/accounts/deletion.d.ts +163 -0
- package/dist/accounts/deletion.d.ts.map +1 -0
- package/dist/accounts/deletion.js +360 -0
- package/dist/accounts/deletion.js.map +1 -0
- package/dist/accounts/erasure-log.d.ts +66 -0
- package/dist/accounts/erasure-log.d.ts.map +1 -0
- package/dist/accounts/erasure-log.js +117 -0
- package/dist/accounts/erasure-log.js.map +1 -0
- package/dist/accounts/index.d.ts +6 -0
- package/dist/accounts/index.d.ts.map +1 -0
- package/dist/accounts/index.js +6 -0
- package/dist/accounts/index.js.map +1 -0
- package/dist/accounts/mint-refusal.d.ts +47 -0
- package/dist/accounts/mint-refusal.d.ts.map +1 -0
- package/dist/accounts/mint-refusal.js +59 -0
- package/dist/accounts/mint-refusal.js.map +1 -0
- package/dist/accounts/signup-duplicate.d.ts +14 -0
- package/dist/accounts/signup-duplicate.d.ts.map +1 -0
- package/dist/accounts/signup-duplicate.js +25 -0
- package/dist/accounts/signup-duplicate.js.map +1 -0
- package/dist/accounts/superadmin.d.ts +27 -0
- package/dist/accounts/superadmin.d.ts.map +1 -0
- package/dist/accounts/superadmin.js +46 -0
- package/dist/accounts/superadmin.js.map +1 -0
- package/dist/api/apikeys.d.ts +14 -0
- package/dist/api/apikeys.d.ts.map +1 -0
- package/dist/api/apikeys.js +124 -0
- package/dist/api/apikeys.js.map +1 -0
- package/dist/api/audit.d.ts +4 -0
- package/dist/api/audit.d.ts.map +1 -0
- package/dist/api/audit.js +75 -0
- package/dist/api/audit.js.map +1 -0
- package/dist/api/break-glass.d.ts +48 -0
- package/dist/api/break-glass.d.ts.map +1 -0
- package/dist/api/break-glass.js +217 -0
- package/dist/api/break-glass.js.map +1 -0
- package/dist/api/cli-auth.d.ts +84 -0
- package/dist/api/cli-auth.d.ts.map +1 -0
- package/dist/api/cli-auth.js +177 -0
- package/dist/api/cli-auth.js.map +1 -0
- package/dist/api/create-api.d.ts +123 -0
- package/dist/api/create-api.d.ts.map +1 -0
- package/dist/api/create-api.js +1165 -0
- package/dist/api/create-api.js.map +1 -0
- package/dist/api/demo-passes.d.ts +45 -0
- package/dist/api/demo-passes.d.ts.map +1 -0
- package/dist/api/demo-passes.js +143 -0
- package/dist/api/demo-passes.js.map +1 -0
- package/dist/api/errors.d.ts +5 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +5 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/export.d.ts +63 -0
- package/dist/api/export.d.ts.map +1 -0
- package/dist/api/export.js +393 -0
- package/dist/api/export.js.map +1 -0
- package/dist/api/files.d.ts +40 -0
- package/dist/api/files.d.ts.map +1 -0
- package/dist/api/files.js +150 -0
- package/dist/api/files.js.map +1 -0
- package/dist/api/index.d.ts +17 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +17 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/invitations.d.ts +50 -0
- package/dist/api/invitations.d.ts.map +1 -0
- package/dist/api/invitations.js +313 -0
- package/dist/api/invitations.js.map +1 -0
- package/dist/api/members.d.ts +25 -0
- package/dist/api/members.d.ts.map +1 -0
- package/dist/api/members.js +522 -0
- package/dist/api/members.js.map +1 -0
- package/dist/api/onboarding.d.ts +26 -0
- package/dist/api/onboarding.d.ts.map +1 -0
- package/dist/api/onboarding.js +23 -0
- package/dist/api/onboarding.js.map +1 -0
- package/dist/api/openapi-doc.d.ts +21 -0
- package/dist/api/openapi-doc.d.ts.map +1 -0
- package/dist/api/openapi-doc.js +25 -0
- package/dist/api/openapi-doc.js.map +1 -0
- package/dist/api/projects.d.ts +24 -0
- package/dist/api/projects.d.ts.map +1 -0
- package/dist/api/projects.js +624 -0
- package/dist/api/projects.js.map +1 -0
- package/dist/api/scope-routes.d.ts +12 -0
- package/dist/api/scope-routes.d.ts.map +1 -0
- package/dist/api/scope-routes.js +2 -0
- package/dist/api/scope-routes.js.map +1 -0
- package/dist/api/sso-connect.d.ts +70 -0
- package/dist/api/sso-connect.d.ts.map +1 -0
- package/dist/api/sso-connect.js +164 -0
- package/dist/api/sso-connect.js.map +1 -0
- package/dist/api/sso-logout.d.ts +41 -0
- package/dist/api/sso-logout.d.ts.map +1 -0
- package/dist/api/sso-logout.js +34 -0
- package/dist/api/sso-logout.js.map +1 -0
- package/dist/api/teams.d.ts +43 -0
- package/dist/api/teams.d.ts.map +1 -0
- package/dist/api/teams.js +447 -0
- package/dist/api/teams.js.map +1 -0
- package/dist/api/workspaces.d.ts +114 -0
- package/dist/api/workspaces.d.ts.map +1 -0
- package/dist/api/workspaces.js +462 -0
- package/dist/api/workspaces.js.map +1 -0
- package/dist/apikeys/index.d.ts +3 -0
- package/dist/apikeys/index.d.ts.map +1 -0
- package/dist/apikeys/index.js +3 -0
- package/dist/apikeys/index.js.map +1 -0
- package/dist/apikeys/peppers.d.ts +53 -0
- package/dist/apikeys/peppers.d.ts.map +1 -0
- package/dist/apikeys/peppers.js +97 -0
- package/dist/apikeys/peppers.js.map +1 -0
- package/dist/apikeys/service.d.ts +56 -0
- package/dist/apikeys/service.d.ts.map +1 -0
- package/dist/apikeys/service.js +196 -0
- package/dist/apikeys/service.js.map +1 -0
- package/dist/app.d.ts +65 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +142 -0
- package/dist/app.js.map +1 -0
- package/dist/audit/filters.d.ts +38 -0
- package/dist/audit/filters.d.ts.map +1 -0
- package/dist/audit/filters.js +97 -0
- package/dist/audit/filters.js.map +1 -0
- package/dist/audit/index.d.ts +3 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +3 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/service.d.ts +65 -0
- package/dist/audit/service.d.ts.map +1 -0
- package/dist/audit/service.js +103 -0
- package/dist/audit/service.js.map +1 -0
- package/dist/boot.d.ts +8 -0
- package/dist/boot.d.ts.map +1 -0
- package/dist/boot.js +822 -0
- package/dist/boot.js.map +1 -0
- package/dist/constant-time.d.ts +3 -0
- package/dist/constant-time.d.ts.map +1 -0
- package/dist/constant-time.js +10 -0
- package/dist/constant-time.js.map +1 -0
- package/dist/email/driver.d.ts +16 -0
- package/dist/email/driver.d.ts.map +1 -0
- package/dist/email/driver.js +136 -0
- package/dist/email/driver.js.map +1 -0
- package/dist/email/index.d.ts +4 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +4 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/shell.d.ts +72 -0
- package/dist/email/shell.d.ts.map +1 -0
- package/dist/email/shell.js +146 -0
- package/dist/email/shell.js.map +1 -0
- package/dist/email/templates.d.ts +83 -0
- package/dist/email/templates.d.ts.map +1 -0
- package/dist/email/templates.js +96 -0
- package/dist/email/templates.js.map +1 -0
- package/dist/entitlements/check.d.ts +140 -0
- package/dist/entitlements/check.d.ts.map +1 -0
- package/dist/entitlements/check.js +276 -0
- package/dist/entitlements/check.js.map +1 -0
- package/dist/entitlements/clock-skew.d.ts +27 -0
- package/dist/entitlements/clock-skew.d.ts.map +1 -0
- package/dist/entitlements/clock-skew.js +58 -0
- package/dist/entitlements/clock-skew.js.map +1 -0
- package/dist/entitlements/gate.d.ts +113 -0
- package/dist/entitlements/gate.d.ts.map +1 -0
- package/dist/entitlements/gate.js +430 -0
- package/dist/entitlements/gate.js.map +1 -0
- package/dist/entitlements/hub-machine-token.d.ts +83 -0
- package/dist/entitlements/hub-machine-token.d.ts.map +1 -0
- package/dist/entitlements/hub-machine-token.js +175 -0
- package/dist/entitlements/hub-machine-token.js.map +1 -0
- package/dist/entitlements/hub-subject.d.ts +32 -0
- package/dist/entitlements/hub-subject.d.ts.map +1 -0
- package/dist/entitlements/hub-subject.js +68 -0
- package/dist/entitlements/hub-subject.js.map +1 -0
- package/dist/entitlements/index.d.ts +9 -0
- package/dist/entitlements/index.d.ts.map +1 -0
- package/dist/entitlements/index.js +9 -0
- package/dist/entitlements/index.js.map +1 -0
- package/dist/entitlements/poster.d.ts +81 -0
- package/dist/entitlements/poster.d.ts.map +1 -0
- package/dist/entitlements/poster.js +169 -0
- package/dist/entitlements/poster.js.map +1 -0
- package/dist/entitlements/profiles.d.ts +121 -0
- package/dist/entitlements/profiles.d.ts.map +1 -0
- package/dist/entitlements/profiles.js +212 -0
- package/dist/entitlements/profiles.js.map +1 -0
- package/dist/entitlements/slot.d.ts +33 -0
- package/dist/entitlements/slot.d.ts.map +1 -0
- package/dist/entitlements/slot.js +75 -0
- package/dist/entitlements/slot.js.map +1 -0
- package/dist/env.d.ts +293 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +383 -0
- package/dist/env.js.map +1 -0
- package/dist/files/http.d.ts +23 -0
- package/dist/files/http.d.ts.map +1 -0
- package/dist/files/http.js +66 -0
- package/dist/files/http.js.map +1 -0
- package/dist/files/index.d.ts +5 -0
- package/dist/files/index.d.ts.map +1 -0
- package/dist/files/index.js +5 -0
- package/dist/files/index.js.map +1 -0
- package/dist/files/serve.d.ts +43 -0
- package/dist/files/serve.d.ts.map +1 -0
- package/dist/files/serve.js +71 -0
- package/dist/files/serve.js.map +1 -0
- package/dist/files/service.d.ts +69 -0
- package/dist/files/service.d.ts.map +1 -0
- package/dist/files/service.js +188 -0
- package/dist/files/service.js.map +1 -0
- package/dist/files/spool.d.ts +21 -0
- package/dist/files/spool.d.ts.map +1 -0
- package/dist/files/spool.js +47 -0
- package/dist/files/spool.js.map +1 -0
- package/dist/identity/better-auth.d.ts +3927 -0
- package/dist/identity/better-auth.d.ts.map +1 -0
- package/dist/identity/better-auth.js +896 -0
- package/dist/identity/better-auth.js.map +1 -0
- package/dist/identity/demo-pass-plugin.d.ts +29 -0
- package/dist/identity/demo-pass-plugin.d.ts.map +1 -0
- package/dist/identity/demo-pass-plugin.js +88 -0
- package/dist/identity/demo-pass-plugin.js.map +1 -0
- package/dist/identity/demo-pass-rules.d.ts +84 -0
- package/dist/identity/demo-pass-rules.d.ts.map +1 -0
- package/dist/identity/demo-pass-rules.js +223 -0
- package/dist/identity/demo-pass-rules.js.map +1 -0
- package/dist/identity/demo-pass.d.ts +159 -0
- package/dist/identity/demo-pass.d.ts.map +1 -0
- package/dist/identity/demo-pass.js +319 -0
- package/dist/identity/demo-pass.js.map +1 -0
- package/dist/identity/hub-grant.d.ts +182 -0
- package/dist/identity/hub-grant.d.ts.map +1 -0
- package/dist/identity/hub-grant.js +594 -0
- package/dist/identity/hub-grant.js.map +1 -0
- package/dist/identity/hub-jwt.d.ts +22 -0
- package/dist/identity/hub-jwt.d.ts.map +1 -0
- package/dist/identity/hub-jwt.js +77 -0
- package/dist/identity/hub-jwt.js.map +1 -0
- package/dist/identity/hub-live-gate.d.ts +17 -0
- package/dist/identity/hub-live-gate.d.ts.map +1 -0
- package/dist/identity/hub-live-gate.js +146 -0
- package/dist/identity/hub-live-gate.js.map +1 -0
- package/dist/identity/hub-logout.d.ts +88 -0
- package/dist/identity/hub-logout.d.ts.map +1 -0
- package/dist/identity/hub-logout.js +158 -0
- package/dist/identity/hub-logout.js.map +1 -0
- package/dist/identity/hub-projection.d.ts +103 -0
- package/dist/identity/hub-projection.d.ts.map +1 -0
- package/dist/identity/hub-projection.js +130 -0
- package/dist/identity/hub-projection.js.map +1 -0
- package/dist/identity/hub-reconcile.d.ts +151 -0
- package/dist/identity/hub-reconcile.d.ts.map +1 -0
- package/dist/identity/hub-reconcile.js +400 -0
- package/dist/identity/hub-reconcile.js.map +1 -0
- package/dist/identity/hub-sso.d.ts +363 -0
- package/dist/identity/hub-sso.d.ts.map +1 -0
- package/dist/identity/hub-sso.js +536 -0
- package/dist/identity/hub-sso.js.map +1 -0
- package/dist/identity/hub-user-client.d.ts +222 -0
- package/dist/identity/hub-user-client.d.ts.map +1 -0
- package/dist/identity/hub-user-client.js +406 -0
- package/dist/identity/hub-user-client.js.map +1 -0
- package/dist/identity/index.d.ts +13 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +13 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/oauth-jwt.d.ts +32 -0
- package/dist/identity/oauth-jwt.d.ts.map +1 -0
- package/dist/identity/oauth-jwt.js +122 -0
- package/dist/identity/oauth-jwt.js.map +1 -0
- package/dist/identity/resolve-membership.d.ts +28 -0
- package/dist/identity/resolve-membership.d.ts.map +1 -0
- package/dist/identity/resolve-membership.js +69 -0
- package/dist/identity/resolve-membership.js.map +1 -0
- package/dist/identity/signing-key.d.ts +49 -0
- package/dist/identity/signing-key.d.ts.map +1 -0
- package/dist/identity/signing-key.js +144 -0
- package/dist/identity/signing-key.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/invitations/index.d.ts +2 -0
- package/dist/invitations/index.d.ts.map +1 -0
- package/dist/invitations/index.js +2 -0
- package/dist/invitations/index.js.map +1 -0
- package/dist/invitations/service.d.ts +36 -0
- package/dist/invitations/service.d.ts.map +1 -0
- package/dist/invitations/service.js +122 -0
- package/dist/invitations/service.js.map +1 -0
- package/dist/jobs/index.d.ts +3 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +3 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/pgboss.d.ts +119 -0
- package/dist/jobs/pgboss.d.ts.map +1 -0
- package/dist/jobs/pgboss.js +521 -0
- package/dist/jobs/pgboss.js.map +1 -0
- package/dist/jobs/timers.d.ts +127 -0
- package/dist/jobs/timers.d.ts.map +1 -0
- package/dist/jobs/timers.js +228 -0
- package/dist/jobs/timers.js.map +1 -0
- package/dist/logger.d.ts +17 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +64 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp/errors.d.ts +37 -0
- package/dist/mcp/errors.d.ts.map +1 -0
- package/dist/mcp/errors.js +77 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/http.d.ts +35 -0
- package/dist/mcp/http.d.ts.map +1 -0
- package/dist/mcp/http.js +80 -0
- package/dist/mcp/http.js.map +1 -0
- package/dist/mcp/index.d.ts +8 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +8 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/inputs.d.ts +19 -0
- package/dist/mcp/inputs.d.ts.map +1 -0
- package/dist/mcp/inputs.js +28 -0
- package/dist/mcp/inputs.js.map +1 -0
- package/dist/mcp/projects.d.ts +31 -0
- package/dist/mcp/projects.d.ts.map +1 -0
- package/dist/mcp/projects.js +315 -0
- package/dist/mcp/projects.js.map +1 -0
- package/dist/mcp/server.d.ts +52 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +93 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/teams.d.ts +7 -0
- package/dist/mcp/teams.d.ts.map +1 -0
- package/dist/mcp/teams.js +62 -0
- package/dist/mcp/teams.js.map +1 -0
- package/dist/mcp/tool-kit.d.ts +67 -0
- package/dist/mcp/tool-kit.d.ts.map +1 -0
- package/dist/mcp/tool-kit.js +74 -0
- package/dist/mcp/tool-kit.js.map +1 -0
- package/dist/members/removal.d.ts +95 -0
- package/dist/members/removal.d.ts.map +1 -0
- package/dist/members/removal.js +143 -0
- package/dist/members/removal.js.map +1 -0
- package/dist/middleware/auth-body.d.ts +25 -0
- package/dist/middleware/auth-body.d.ts.map +1 -0
- package/dist/middleware/auth-body.js +55 -0
- package/dist/middleware/auth-body.js.map +1 -0
- package/dist/middleware/auth-context.d.ts +170 -0
- package/dist/middleware/auth-context.d.ts.map +1 -0
- package/dist/middleware/auth-context.js +251 -0
- package/dist/middleware/auth-context.js.map +1 -0
- package/dist/middleware/body-cap.d.ts +17 -0
- package/dist/middleware/body-cap.d.ts.map +1 -0
- package/dist/middleware/body-cap.js +31 -0
- package/dist/middleware/body-cap.js.map +1 -0
- package/dist/middleware/body-refusal.d.ts +20 -0
- package/dist/middleware/body-refusal.d.ts.map +1 -0
- package/dist/middleware/body-refusal.js +5 -0
- package/dist/middleware/body-refusal.js.map +1 -0
- package/dist/middleware/cross-site.d.ts +61 -0
- package/dist/middleware/cross-site.d.ts.map +1 -0
- package/dist/middleware/cross-site.js +59 -0
- package/dist/middleware/cross-site.js.map +1 -0
- package/dist/middleware/hub-managed.d.ts +45 -0
- package/dist/middleware/hub-managed.d.ts.map +1 -0
- package/dist/middleware/hub-managed.js +56 -0
- package/dist/middleware/hub-managed.js.map +1 -0
- package/dist/middleware/idempotency.d.ts +14 -0
- package/dist/middleware/idempotency.d.ts.map +1 -0
- package/dist/middleware/idempotency.js +222 -0
- package/dist/middleware/idempotency.js.map +1 -0
- package/dist/middleware/index.d.ts +12 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +12 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/json-depth.d.ts +32 -0
- package/dist/middleware/json-depth.d.ts.map +1 -0
- package/dist/middleware/json-depth.js +80 -0
- package/dist/middleware/json-depth.js.map +1 -0
- package/dist/middleware/no-store.d.ts +21 -0
- package/dist/middleware/no-store.d.ts.map +1 -0
- package/dist/middleware/no-store.js +32 -0
- package/dist/middleware/no-store.js.map +1 -0
- package/dist/middleware/oauth-public.d.ts +16 -0
- package/dist/middleware/oauth-public.d.ts.map +1 -0
- package/dist/middleware/oauth-public.js +50 -0
- package/dist/middleware/oauth-public.js.map +1 -0
- package/dist/middleware/rate-limit.d.ts +182 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit.js +277 -0
- package/dist/middleware/rate-limit.js.map +1 -0
- package/dist/middleware/request-id.d.ts +10 -0
- package/dist/middleware/request-id.d.ts.map +1 -0
- package/dist/middleware/request-id.js +42 -0
- package/dist/middleware/request-id.js.map +1 -0
- package/dist/middleware/scopes.d.ts +33 -0
- package/dist/middleware/scopes.d.ts.map +1 -0
- package/dist/middleware/scopes.js +139 -0
- package/dist/middleware/scopes.js.map +1 -0
- package/dist/middleware/security-headers.d.ts +53 -0
- package/dist/middleware/security-headers.d.ts.map +1 -0
- package/dist/middleware/security-headers.js +96 -0
- package/dist/middleware/security-headers.js.map +1 -0
- package/dist/observability/index.d.ts +3 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +3 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/metrics.d.ts +17 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +82 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/otel.d.ts +20 -0
- package/dist/observability/otel.d.ts.map +1 -0
- package/dist/observability/otel.js +54 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/pagination.d.ts +57 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +90 -0
- package/dist/pagination.js.map +1 -0
- package/dist/platform/edition.d.ts +57 -0
- package/dist/platform/edition.d.ts.map +1 -0
- package/dist/platform/edition.js +90 -0
- package/dist/platform/edition.js.map +1 -0
- package/dist/platform/entitlements.d.ts +26 -0
- package/dist/platform/entitlements.d.ts.map +1 -0
- package/dist/platform/entitlements.js +28 -0
- package/dist/platform/entitlements.js.map +1 -0
- package/dist/platform/events.d.ts +87 -0
- package/dist/platform/events.d.ts.map +1 -0
- package/dist/platform/events.js +32 -0
- package/dist/platform/events.js.map +1 -0
- package/dist/platform/index.d.ts +8 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +8 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/local-identity.d.ts +39 -0
- package/dist/platform/local-identity.d.ts.map +1 -0
- package/dist/platform/local-identity.js +87 -0
- package/dist/platform/local-identity.js.map +1 -0
- package/dist/platform/registry.d.ts +23 -0
- package/dist/platform/registry.d.ts.map +1 -0
- package/dist/platform/registry.js +5 -0
- package/dist/platform/registry.js.map +1 -0
- package/dist/platform/usage.d.ts +11 -0
- package/dist/platform/usage.d.ts.map +1 -0
- package/dist/platform/usage.js +12 -0
- package/dist/platform/usage.js.map +1 -0
- package/dist/platform/workspaces.d.ts +25 -0
- package/dist/platform/workspaces.d.ts.map +1 -0
- package/dist/platform/workspaces.js +44 -0
- package/dist/platform/workspaces.js.map +1 -0
- package/dist/projects/access.d.ts +40 -0
- package/dist/projects/access.d.ts.map +1 -0
- package/dist/projects/access.js +133 -0
- package/dist/projects/access.js.map +1 -0
- package/dist/projects/index.d.ts +2 -0
- package/dist/projects/index.d.ts.map +1 -0
- package/dist/projects/index.js +2 -0
- package/dist/projects/index.js.map +1 -0
- package/dist/route-label.d.ts +23 -0
- package/dist/route-label.d.ts.map +1 -0
- package/dist/route-label.js +29 -0
- package/dist/route-label.js.map +1 -0
- package/dist/routes/health.d.ts +30 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +54 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/index.d.ts +3 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +3 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/wellknown.d.ts +11 -0
- package/dist/routes/wellknown.d.ts.map +1 -0
- package/dist/routes/wellknown.js +45 -0
- package/dist/routes/wellknown.js.map +1 -0
- package/dist/secret.d.ts +30 -0
- package/dist/secret.d.ts.map +1 -0
- package/dist/secret.js +97 -0
- package/dist/secret.js.map +1 -0
- package/dist/setup-transport.d.ts +23 -0
- package/dist/setup-transport.d.ts.map +1 -0
- package/dist/setup-transport.js +52 -0
- package/dist/setup-transport.js.map +1 -0
- package/dist/state.d.ts +21 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +4 -0
- package/dist/state.js.map +1 -0
- package/dist/storage/driver.d.ts +38 -0
- package/dist/storage/driver.d.ts.map +1 -0
- package/dist/storage/driver.js +14 -0
- package/dist/storage/driver.js.map +1 -0
- package/dist/storage/factory.d.ts +4 -0
- package/dist/storage/factory.d.ts.map +1 -0
- package/dist/storage/factory.js +20 -0
- package/dist/storage/factory.js.map +1 -0
- package/dist/storage/index.d.ts +4 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +4 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local.d.ts +21 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +88 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/s3.d.ts +29 -0
- package/dist/storage/s3.d.ts.map +1 -0
- package/dist/storage/s3.js +82 -0
- package/dist/storage/s3.js.map +1 -0
- package/dist/testing/fake-hub.d.ts +425 -0
- package/dist/testing/fake-hub.d.ts.map +1 -0
- package/dist/testing/fake-hub.js +1074 -0
- package/dist/testing/fake-hub.js.map +1 -0
- package/dist/testing/helpers.d.ts +124 -0
- package/dist/testing/helpers.d.ts.map +1 -0
- package/dist/testing/helpers.js +174 -0
- package/dist/testing/helpers.js.map +1 -0
- package/dist/testing/index.d.ts +12 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +12 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/setup-origins.d.ts +21 -0
- package/dist/testing/setup-origins.d.ts.map +1 -0
- package/dist/testing/setup-origins.js +57 -0
- package/dist/testing/setup-origins.js.map +1 -0
- package/dist/testing/sso-helpers.d.ts +43 -0
- package/dist/testing/sso-helpers.d.ts.map +1 -0
- package/dist/testing/sso-helpers.js +159 -0
- package/dist/testing/sso-helpers.js.map +1 -0
- package/dist/tool-definition.d.ts +382 -0
- package/dist/tool-definition.d.ts.map +1 -0
- package/dist/tool-definition.js +46 -0
- package/dist/tool-definition.js.map +1 -0
- package/dist/util/index.d.ts +8 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +8 -0
- package/dist/util/index.js.map +1 -0
- package/package.json +161 -0
- package/src/accounts/deletion.ts +389 -0
- package/src/accounts/erasure-log.ts +140 -0
- package/src/accounts/index.ts +5 -0
- package/src/accounts/mint-refusal.ts +67 -0
- package/src/accounts/signup-duplicate.ts +21 -0
- package/src/accounts/superadmin.ts +46 -0
- package/src/api/apikeys.ts +147 -0
- package/src/api/audit.ts +83 -0
- package/src/api/break-glass.ts +294 -0
- package/src/api/cli-auth.ts +308 -0
- package/src/api/create-api.ts +1403 -0
- package/src/api/demo-passes.ts +207 -0
- package/src/api/errors.ts +13 -0
- package/src/api/export.ts +482 -0
- package/src/api/files.ts +200 -0
- package/src/api/index.ts +29 -0
- package/src/api/invitations.ts +396 -0
- package/src/api/members.ts +617 -0
- package/src/api/onboarding.ts +50 -0
- package/src/api/openapi-doc.ts +34 -0
- package/src/api/projects.ts +788 -0
- package/src/api/scope-routes.ts +12 -0
- package/src/api/sso-connect.ts +246 -0
- package/src/api/sso-logout.ts +76 -0
- package/src/api/teams.ts +575 -0
- package/src/api/workspaces.ts +649 -0
- package/src/apikeys/index.ts +2 -0
- package/src/apikeys/peppers.ts +118 -0
- package/src/apikeys/service.ts +223 -0
- package/src/app.ts +228 -0
- package/src/audit/filters.ts +101 -0
- package/src/audit/index.ts +9 -0
- package/src/audit/service.ts +154 -0
- package/src/boot.ts +953 -0
- package/src/constant-time.ts +9 -0
- package/src/email/driver.ts +139 -0
- package/src/email/index.ts +26 -0
- package/src/email/shell.ts +201 -0
- package/src/email/templates.ts +184 -0
- package/src/entitlements/check.ts +435 -0
- package/src/entitlements/clock-skew.ts +58 -0
- package/src/entitlements/gate.ts +636 -0
- package/src/entitlements/hub-machine-token.ts +205 -0
- package/src/entitlements/hub-subject.ts +77 -0
- package/src/entitlements/index.ts +37 -0
- package/src/entitlements/poster.ts +265 -0
- package/src/entitlements/profiles.ts +303 -0
- package/src/entitlements/slot.ts +105 -0
- package/src/env.ts +456 -0
- package/src/files/http.ts +77 -0
- package/src/files/index.ts +4 -0
- package/src/files/serve.ts +115 -0
- package/src/files/service.ts +209 -0
- package/src/files/spool.ts +58 -0
- package/src/identity/better-auth.ts +1103 -0
- package/src/identity/demo-pass-plugin.ts +121 -0
- package/src/identity/demo-pass-rules.ts +229 -0
- package/src/identity/demo-pass.ts +390 -0
- package/src/identity/hub-grant.ts +704 -0
- package/src/identity/hub-jwt.ts +78 -0
- package/src/identity/hub-live-gate.ts +167 -0
- package/src/identity/hub-logout.ts +174 -0
- package/src/identity/hub-projection.ts +251 -0
- package/src/identity/hub-reconcile.ts +572 -0
- package/src/identity/hub-sso.ts +696 -0
- package/src/identity/hub-user-client.ts +554 -0
- package/src/identity/index.ts +56 -0
- package/src/identity/oauth-jwt.ts +128 -0
- package/src/identity/resolve-membership.ts +104 -0
- package/src/identity/signing-key.ts +164 -0
- package/src/index.ts +65 -0
- package/src/invitations/index.ts +1 -0
- package/src/invitations/service.ts +171 -0
- package/src/jobs/index.ts +25 -0
- package/src/jobs/pgboss.ts +594 -0
- package/src/jobs/timers.ts +287 -0
- package/src/logger.ts +67 -0
- package/src/mcp/errors.ts +111 -0
- package/src/mcp/http.ts +129 -0
- package/src/mcp/index.ts +28 -0
- package/src/mcp/inputs.ts +33 -0
- package/src/mcp/projects.ts +480 -0
- package/src/mcp/server.ts +174 -0
- package/src/mcp/teams.ts +97 -0
- package/src/mcp/tool-kit.ts +148 -0
- package/src/members/removal.ts +216 -0
- package/src/middleware/auth-body.ts +58 -0
- package/src/middleware/auth-context.ts +384 -0
- package/src/middleware/body-cap.ts +33 -0
- package/src/middleware/body-refusal.ts +23 -0
- package/src/middleware/cross-site.ts +122 -0
- package/src/middleware/hub-managed.ts +61 -0
- package/src/middleware/idempotency.ts +264 -0
- package/src/middleware/index.ts +33 -0
- package/src/middleware/json-depth.ts +74 -0
- package/src/middleware/no-store.ts +30 -0
- package/src/middleware/oauth-public.ts +54 -0
- package/src/middleware/rate-limit.ts +432 -0
- package/src/middleware/request-id.ts +54 -0
- package/src/middleware/scopes.ts +150 -0
- package/src/middleware/security-headers.ts +129 -0
- package/src/observability/index.ts +2 -0
- package/src/observability/metrics.ts +102 -0
- package/src/observability/otel.ts +79 -0
- package/src/pagination.ts +118 -0
- package/src/platform/edition.ts +140 -0
- package/src/platform/entitlements.ts +47 -0
- package/src/platform/events.ts +71 -0
- package/src/platform/index.ts +7 -0
- package/src/platform/local-identity.ts +90 -0
- package/src/platform/registry.ts +28 -0
- package/src/platform/usage.ts +13 -0
- package/src/platform/workspaces.ts +41 -0
- package/src/projects/access.ts +160 -0
- package/src/projects/index.ts +7 -0
- package/src/route-label.ts +29 -0
- package/src/routes/health.ts +79 -0
- package/src/routes/index.ts +2 -0
- package/src/routes/wellknown.ts +67 -0
- package/src/secret.ts +115 -0
- package/src/setup-transport.ts +46 -0
- package/src/state.ts +23 -0
- package/src/storage/driver.ts +48 -0
- package/src/storage/factory.ts +34 -0
- package/src/storage/index.ts +3 -0
- package/src/storage/local.ts +93 -0
- package/src/storage/s3.ts +109 -0
- package/src/testing/fake-hub.ts +1316 -0
- package/src/testing/helpers.ts +254 -0
- package/src/testing/index.ts +11 -0
- package/src/testing/setup-origins.ts +58 -0
- package/src/testing/sso-helpers.ts +178 -0
- package/src/tool-definition.ts +463 -0
- package/src/util/index.ts +17 -0
- package/test/fixtures/onboarding-backfill.sql +13 -0
- package/test/fixtures/operator-user-id-backfill.sql +18 -0
- package/test/host/dr-lib.sh +253 -0
- package/test/host/drizzle/0000_chassis_baseline.sql +438 -0
- package/test/host/drizzle/0001_last_owner_guard.sql +42 -0
- package/test/host/drizzle/meta/0000_snapshot.json +3566 -0
- package/test/host/drizzle/meta/_journal.json +20 -0
- package/test/host/drizzle.config.ts +17 -0
- package/test/host/identity.ts +41 -0
- package/test/host/minimal-host.ts +35 -0
- package/test/host/minimal-tool.ts +123 -0
- package/test/integration/account-oracle-uniformity.test.ts +284 -0
- package/test/integration/account-recovery.test.ts +236 -0
- package/test/integration/account.test.ts +120 -0
- package/test/integration/api-quota.test.ts +208 -0
- package/test/integration/apikey-expiry.test.ts +178 -0
- package/test/integration/apikey-pepper-rotation.test.ts +190 -0
- package/test/integration/boot-posture.test.ts +169 -0
- package/test/integration/break-glass.test.ts +484 -0
- package/test/integration/cloud-lifecycle.test.ts +233 -0
- package/test/integration/credential-boundaries.test.ts +195 -0
- package/test/integration/default-workspace.test.ts +414 -0
- package/test/integration/demo-pass-rules.test.ts +332 -0
- package/test/integration/demo-pass.test.ts +1222 -0
- package/test/integration/dr-verify-real-dump.test.ts +154 -0
- package/test/integration/edition.test.ts +868 -0
- package/test/integration/email-change.test.ts +394 -0
- package/test/integration/empty-tool.test.ts +267 -0
- package/test/integration/entitlements-null-hook.test.ts +187 -0
- package/test/integration/entitlements.test.ts +693 -0
- package/test/integration/export-entries.test.ts +321 -0
- package/test/integration/files.test.ts +320 -0
- package/test/integration/first-boot-claim.test.ts +131 -0
- package/test/integration/gdpr.test.ts +532 -0
- package/test/integration/helpers.ts +29 -0
- package/test/integration/hub-grant.test.ts +505 -0
- package/test/integration/hub-live-gate.test.ts +612 -0
- package/test/integration/hub-managed-membership.test.ts +559 -0
- package/test/integration/hub-org-selector.test.ts +281 -0
- package/test/integration/hub-reconcile.test.ts +646 -0
- package/test/integration/hub-sso.test.ts +704 -0
- package/test/integration/hub-teams.test.ts +771 -0
- package/test/integration/idempotency.test.ts +261 -0
- package/test/integration/invite-verification.test.ts +210 -0
- package/test/integration/last-owner-race.test.ts +263 -0
- package/test/integration/m9-fixes.test.ts +290 -0
- package/test/integration/mcp-projects.test.ts +463 -0
- package/test/integration/member-removal-race.test.ts +466 -0
- package/test/integration/member-removal.test.ts +794 -0
- package/test/integration/oauth-mcp.test.ts +477 -0
- package/test/integration/oauth-workspace.test.ts +371 -0
- package/test/integration/observability.test.ts +183 -0
- package/test/integration/onboarding.test.ts +268 -0
- package/test/integration/orphan-purge.test.ts +451 -0
- package/test/integration/pagination.test.ts +344 -0
- package/test/integration/platform-core.test.ts +305 -0
- package/test/integration/platform.test.ts +246 -0
- package/test/integration/pool-survives-restart.test.ts +80 -0
- package/test/integration/projects-cloud.test.ts +193 -0
- package/test/integration/projects.test.ts +1310 -0
- package/test/integration/security-fixes.test.ts +190 -0
- package/test/integration/setup-transport.test.ts +118 -0
- package/test/integration/signin-wall.test.ts +103 -0
- package/test/integration/signing-key-rotation.test.ts +349 -0
- package/test/integration/sso-helpers.ts +15 -0
- package/test/integration/sso-logout.test.ts +283 -0
- package/test/integration/teams-cloud.test.ts +194 -0
- package/test/integration/teams.test.ts +551 -0
- package/test/integration/timers.test.ts +377 -0
- package/test/integration/two-factor.test.ts +301 -0
- package/test/integration/usage-window.test.ts +161 -0
- package/test/integration/workspace-create-cloud.test.ts +523 -0
- package/test/integration/workspace-create.test.ts +510 -0
- package/test/integration/workspace-scoping.test.ts +530 -0
- package/test/integration/zz-adv-replay-owner.test.ts +205 -0
- package/test/unit/apikey-peppers.test.ts +110 -0
- package/test/unit/apikey-prefix.test.ts +34 -0
- package/test/unit/audit-filters.test.ts +135 -0
- package/test/unit/auth-origins.test.ts +92 -0
- package/test/unit/body-cap.test.ts +84 -0
- package/test/unit/clock-skew.test.ts +68 -0
- package/test/unit/cross-site.test.ts +166 -0
- package/test/unit/declared-credits.test.ts +13 -0
- package/test/unit/demo-pass-rules.test.ts +192 -0
- package/test/unit/email-driver.test.ts +127 -0
- package/test/unit/end-pool.test.ts +181 -0
- package/test/unit/entitlement-check.test.ts +492 -0
- package/test/unit/entitlement-gate.test.ts +1333 -0
- package/test/unit/entitlement-profiles.test.ts +289 -0
- package/test/unit/erasure-log.test.ts +72 -0
- package/test/unit/error-mapping.test.ts +89 -0
- package/test/unit/export-entries.test.ts +85 -0
- package/test/unit/export-sanitize.test.ts +27 -0
- package/test/unit/files-head-route.test.ts +155 -0
- package/test/unit/files-http.test.ts +97 -0
- package/test/unit/head-rewrite.test.ts +72 -0
- package/test/unit/hub-create-org.test.ts +181 -0
- package/test/unit/hub-jwt.test.ts +93 -0
- package/test/unit/hub-sso-params.test.ts +39 -0
- package/test/unit/hub-subject.test.ts +83 -0
- package/test/unit/idempotency-crypto.test.ts +45 -0
- package/test/unit/json-depth.test.ts +88 -0
- package/test/unit/logger-redaction.test.ts +66 -0
- package/test/unit/mcp-errors.test.ts +110 -0
- package/test/unit/mcp-inputs.test.ts +106 -0
- package/test/unit/mcp-project-hints.test.ts +26 -0
- package/test/unit/no-store.test.ts +49 -0
- package/test/unit/no-tool-migration-filename.test.ts +70 -0
- package/test/unit/observability.test.ts +64 -0
- package/test/unit/openapi-doc.test.ts +93 -0
- package/test/unit/rate-limit-consume-on.test.ts +76 -0
- package/test/unit/rate-limit.test.ts +39 -0
- package/test/unit/readyz-storage.test.ts +157 -0
- package/test/unit/request-quota.test.ts +146 -0
- package/test/unit/scopes.test.ts +66 -0
- package/test/unit/security-headers.test.ts +131 -0
- package/test/unit/serve-content-type.test.ts +74 -0
- package/test/unit/setup-transport.test.ts +29 -0
- package/test/unit/storage-local.test.ts +53 -0
- package/test/unit/superadmin.test.ts +32 -0
- package/test/unit/timers.test.ts +287 -0
- package/test/unit/tool-definition-guards.test.ts +166 -0
- package/test/unit/tool-entitlements-guard.test.ts +168 -0
- package/test/unit/usage-poster.test.ts +542 -0
- package/test/unit/usage-window.test.ts +48 -0
- package/test/unit/workspace-create-audit.test.ts +48 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { BetterAuthPlugin } from 'better-auth';
|
|
3
|
+
import { APIError, createAuthEndpoint, formCsrfMiddleware } from 'better-auth/api';
|
|
4
|
+
import { setSessionCookie } from 'better-auth/cookies';
|
|
5
|
+
import type { Db } from '@antasphere/chassis-db';
|
|
6
|
+
import type { AuditService } from '../audit/service.js';
|
|
7
|
+
import { DemoPassService } from './demo-pass.js';
|
|
8
|
+
import { parseDemoEmailDomains } from './demo-pass-rules.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The demo pass redeem (the demo pass spec, section 4): a local Better Auth
|
|
12
|
+
* plugin with ONE endpoint, `POST /demo/redeem` (mounted at
|
|
13
|
+
* `/api/v1/auth/demo/redeem`). It lives inside the sign-in library on
|
|
14
|
+
* purpose: the session is created through the library's own internal
|
|
15
|
+
* adapter and the cookie set by its own `setSessionCookie`, so the cookie's
|
|
16
|
+
* name, attributes and signature are exactly a password sign-in's, and every
|
|
17
|
+
* after-hook sees `newSession` as it would there. Registered in
|
|
18
|
+
* identity/better-auth.ts only while DEMO_SIGN_IN is on, on the self-hosted
|
|
19
|
+
* edition; otherwise the path is an unknown one.
|
|
20
|
+
*
|
|
21
|
+
* In front of it, outside the library: the cross-site guard refuses a
|
|
22
|
+
* foreign Origin before any work (api/create-api.ts), and the `demo-redeem`
|
|
23
|
+
* wall bounds one address to 20 refused tries in 15 minutes. The sign-in Origin lock
|
|
24
|
+
* of the before-hook is keyed on `/sign-in*` paths and does not cover this
|
|
25
|
+
* one, so the endpoint carries its own lock: no Origin, no redeem.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
export interface DemoPassPluginDeps {
|
|
29
|
+
db: Db;
|
|
30
|
+
/** `DEMO_SIGN_IN_EMAIL_DOMAINS`, raw (validated at boot). */
|
|
31
|
+
emailDomains: string | undefined;
|
|
32
|
+
/** Where the `demo_pass.use` row is written: the /auth mount runs before the audit middleware. */
|
|
33
|
+
audit: AuditService;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* ONE answer for every refusal of a pass (unknown, expired, revoked, the
|
|
38
|
+
* person gone or no longer a member, the address no longer a demonstration
|
|
39
|
+
* one, a second factor enrolled since): the answer must not tell which, or
|
|
40
|
+
* it becomes an oracle on the pass and on the person. The body is the API's
|
|
41
|
+
* error wire shape, so the SDK reads its code like any other.
|
|
42
|
+
*/
|
|
43
|
+
const INVALID_DEMO_PASS = {
|
|
44
|
+
error: { code: 'invalid_demo_pass', message: 'This demo link is not valid' }
|
|
45
|
+
} as const;
|
|
46
|
+
|
|
47
|
+
/** A secret is 43 characters; the bound keeps an oversized body from reaching the hash. */
|
|
48
|
+
const redeemBodySchema = z.object({ pass: z.string().min(1).max(128) });
|
|
49
|
+
|
|
50
|
+
export function demoPassPlugin(deps: DemoPassPluginDeps): BetterAuthPlugin {
|
|
51
|
+
const service = new DemoPassService(deps.db);
|
|
52
|
+
const extraDomains = parseDemoEmailDomains(deps.emailDomains);
|
|
53
|
+
return {
|
|
54
|
+
id: 'demo-pass',
|
|
55
|
+
endpoints: {
|
|
56
|
+
redeemDemoPass: createAuthEndpoint(
|
|
57
|
+
'/demo/redeem',
|
|
58
|
+
{
|
|
59
|
+
method: 'POST',
|
|
60
|
+
// The library's own sign-in CSRF check (what /sign-in/email uses):
|
|
61
|
+
// an Origin or Fetch Metadata present is validated against the
|
|
62
|
+
// trusted origins even when no cookie rides along.
|
|
63
|
+
use: [formCsrfMiddleware],
|
|
64
|
+
body: redeemBodySchema
|
|
65
|
+
},
|
|
66
|
+
async (ctx) => {
|
|
67
|
+
// A browser always sends Origin on this POST; a request without
|
|
68
|
+
// one is a script or a server-side call, and a pass is redeemed
|
|
69
|
+
// only by the page it was made for.
|
|
70
|
+
if (!ctx.request?.headers.get('origin')) {
|
|
71
|
+
throw new APIError('FORBIDDEN', {
|
|
72
|
+
error: {
|
|
73
|
+
code: 'cross_site_forbidden',
|
|
74
|
+
message: 'A demo link is redeemed from its page on this instance only'
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const pass = await service.redeemable(ctx.body.pass, extraDomains);
|
|
79
|
+
if (!pass) throw new APIError('UNAUTHORIZED', INVALID_DEMO_PASS);
|
|
80
|
+
const user = await ctx.context.internalAdapter.findUserById(pass.user.id);
|
|
81
|
+
if (!user) throw new APIError('UNAUTHORIZED', INVALID_DEMO_PASS);
|
|
82
|
+
|
|
83
|
+
// The library's own sign-in sequence (api/routes/sign-in.mjs,
|
|
84
|
+
// signInEmail on 1.6.22): createSession, then setSessionCookie, with
|
|
85
|
+
// `dontRememberMe` at its default (false: a remembered session).
|
|
86
|
+
// Re-verify both signatures on any Better Auth bump.
|
|
87
|
+
const session = await ctx.context.internalAdapter.createSession(user.id, false);
|
|
88
|
+
if (!session) {
|
|
89
|
+
throw APIError.fromStatus('UNAUTHORIZED', {
|
|
90
|
+
message: 'Failed to create session',
|
|
91
|
+
code: 'FAILED_TO_CREATE_SESSION'
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
// The use is recorded BEFORE the cookie leaves: the row is what ties
|
|
95
|
+
// the session to its pass (the resolver's judge, the audit mark), so
|
|
96
|
+
// a session that could not be tied is dropped, never handed out.
|
|
97
|
+
try {
|
|
98
|
+
await service.recordUse(pass.passId, session.id);
|
|
99
|
+
} catch (cause) {
|
|
100
|
+
await ctx.context.internalAdapter.deleteSession(session.token);
|
|
101
|
+
throw cause;
|
|
102
|
+
}
|
|
103
|
+
await setSessionCookie(ctx, { session, user }, false);
|
|
104
|
+
await deps.audit.write({
|
|
105
|
+
workspaceId: pass.workspaceId,
|
|
106
|
+
principal: { userId: user.id, via: 'session' },
|
|
107
|
+
action: 'demo_pass.use',
|
|
108
|
+
resourceType: 'demo_pass',
|
|
109
|
+
resourceId: pass.passId,
|
|
110
|
+
metadata: { passId: pass.passId }
|
|
111
|
+
});
|
|
112
|
+
return ctx.json({
|
|
113
|
+
user: pass.user,
|
|
114
|
+
path: pass.targetPath,
|
|
115
|
+
expiresAt: pass.expiresAt.toISOString()
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
)
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { isLoopbackHost } from '../setup-transport.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The demo pass's pure rules (the demo pass spec, sections 1 to 3): which
|
|
5
|
+
* hosts the switch may be on, which addresses a pass may open, and which
|
|
6
|
+
* paths a pass may land on. No I/O here, so the env schema, the mint route
|
|
7
|
+
* and the redeem endpoint all judge through the same functions.
|
|
8
|
+
*
|
|
9
|
+
* A demo pass is a sign-in-equivalent link an owner hands out for a
|
|
10
|
+
* demonstration. What keeps it from being a takeover tool is the narrowness
|
|
11
|
+
* of these rules: the switch refuses to boot on a public host nobody named,
|
|
12
|
+
* and a pass only ever opens an address on a domain reserved for examples
|
|
13
|
+
* and tests (RFC 2606 / RFC 6761) or one the operator named on purpose.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The lifetime bounds are the contract's (the mint body is validated with
|
|
18
|
+
* them, the dashboard's form reads them): one definition, re-exported here
|
|
19
|
+
* beside the other rules.
|
|
20
|
+
*/
|
|
21
|
+
export { DEMO_PASS_DEFAULT_MINUTES, DEMO_PASS_MAX_MINUTES } from '@antasphere/chassis-contract';
|
|
22
|
+
/** The longest target path a pass may carry. */
|
|
23
|
+
export const DEMO_PASS_MAX_PATH_LENGTH = 2048;
|
|
24
|
+
|
|
25
|
+
/** The second-level domains reserved for documentation (RFC 2606 §3); their subdomains too. */
|
|
26
|
+
const RESERVED_EXAMPLE_DOMAINS = ['example.com', 'example.net', 'example.org'] as const;
|
|
27
|
+
/** The top-level names reserved for testing and examples (RFC 2606 §2, RFC 6761). */
|
|
28
|
+
const RESERVED_TOP_LABELS = new Set(['test', 'example', 'invalid', 'localhost']);
|
|
29
|
+
|
|
30
|
+
/** One DNS label as the lists accept it: letters, digits and hyphens, lowercased. */
|
|
31
|
+
const LABEL_RE = /^[a-z0-9-]+$/;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Why one list entry is not a bare hostname, or null when it is. Checked in
|
|
35
|
+
* the order an operator's typo most likely takes: a pasted URL, a port, a
|
|
36
|
+
* wildcard. A refusal names the entry so the boot table says which one.
|
|
37
|
+
*/
|
|
38
|
+
function entryProblem(entry: string): string | null {
|
|
39
|
+
if (/\s/.test(entry)) return 'contains a space';
|
|
40
|
+
if (entry.includes('://')) return 'carries a scheme (list the bare hostname)';
|
|
41
|
+
if (entry.includes('/')) return 'carries a path (list the bare hostname)';
|
|
42
|
+
if (entry.includes(':')) return 'carries a port (list the bare hostname)';
|
|
43
|
+
if (entry.includes('*')) return 'is a wildcard (list each hostname exactly)';
|
|
44
|
+
const labels = entry.split('.');
|
|
45
|
+
if (labels.some((label) => label.length === 0)) return 'has an empty label';
|
|
46
|
+
if (labels.some((label) => !LABEL_RE.test(label))) return 'is not a hostname';
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Parse one comma-separated list of hostnames into a lowercased set. Unset
|
|
52
|
+
* or blank is the empty set; a list that is only separators, or any entry
|
|
53
|
+
* that is not a bare hostname, THROWS, so the env schema refuses the boot:
|
|
54
|
+
* a typo must never silently widen (or silently empty) the list.
|
|
55
|
+
*/
|
|
56
|
+
function parseHostList(variable: string, raw: string | undefined): ReadonlySet<string> {
|
|
57
|
+
const set = new Set<string>();
|
|
58
|
+
if (raw === undefined || raw.trim() === '') return set;
|
|
59
|
+
const entries = raw
|
|
60
|
+
.split(',')
|
|
61
|
+
.map((entry) => entry.trim())
|
|
62
|
+
.filter((entry) => entry.length > 0);
|
|
63
|
+
if (entries.length === 0) throw new Error(`${variable} must list at least one hostname`);
|
|
64
|
+
for (const entry of entries) {
|
|
65
|
+
const lowered = entry.toLowerCase();
|
|
66
|
+
const problem = entryProblem(lowered);
|
|
67
|
+
if (problem) throw new Error(`${variable} entry "${entry}" ${problem}`);
|
|
68
|
+
set.add(lowered);
|
|
69
|
+
}
|
|
70
|
+
return set;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** `DEMO_SIGN_IN_HOSTS`: the public hosts the switch may be on, beside loopback. Exact match. */
|
|
74
|
+
export function parseDemoHosts(raw: string | undefined): ReadonlySet<string> {
|
|
75
|
+
return parseHostList('DEMO_SIGN_IN_HOSTS', raw);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** `DEMO_SIGN_IN_EMAIL_DOMAINS`: the domains the operator adds to the reserved ones (subdomains included). */
|
|
79
|
+
export function parseDemoEmailDomains(raw: string | undefined): ReadonlySet<string> {
|
|
80
|
+
return parseHostList('DEMO_SIGN_IN_EMAIL_DOMAINS', raw);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* The boot rule: the switch may be on only where the host of PUBLIC_BASE_URL
|
|
85
|
+
* is loopback (the same test the setup wizard uses, never a second copy) or
|
|
86
|
+
* listed, exactly, in `DEMO_SIGN_IN_HOSTS`. An unparseable URL fails closed.
|
|
87
|
+
*/
|
|
88
|
+
export function isDemoSignInHost(publicBaseUrl: string, hosts: ReadonlySet<string>): boolean {
|
|
89
|
+
let hostname: string;
|
|
90
|
+
try {
|
|
91
|
+
hostname = new URL(publicBaseUrl).hostname.toLowerCase();
|
|
92
|
+
} catch {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return isLoopbackHost(hostname) || hosts.has(hostname);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** `domain` equals `parent` or sits under it, on a label boundary. */
|
|
99
|
+
function isDomainOrSubdomain(domain: string, parent: string): boolean {
|
|
100
|
+
return domain === parent || domain.endsWith(`.${parent}`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Who a pass may open (spec section 2): an address whose domain (the part
|
|
105
|
+
* after the LAST `@`, lowercased) is a reserved example domain or under one,
|
|
106
|
+
* ends in a reserved top-level name, or is an operator-listed domain or under
|
|
107
|
+
* one. Matching is on label boundaries, so `notexample.com` and
|
|
108
|
+
* `example.com.evil.io` are refused. A domain with an empty label is refused
|
|
109
|
+
* outright: it is no mailbox anybody holds.
|
|
110
|
+
*/
|
|
111
|
+
export function isDemoAddress(email: string, extraDomains: ReadonlySet<string>): boolean {
|
|
112
|
+
const at = email.lastIndexOf('@');
|
|
113
|
+
if (at <= 0) return false;
|
|
114
|
+
const domain = email.slice(at + 1).toLowerCase();
|
|
115
|
+
const labels = domain.split('.');
|
|
116
|
+
if (labels.some((label) => label.length === 0)) return false;
|
|
117
|
+
if (RESERVED_TOP_LABELS.has(labels[labels.length - 1]!)) return true;
|
|
118
|
+
if (RESERVED_EXAMPLE_DOMAINS.some((parent) => isDomainOrSubdomain(domain, parent))) return true;
|
|
119
|
+
for (const parent of extraDomains) {
|
|
120
|
+
if (isDomainOrSubdomain(domain, parent)) return true;
|
|
121
|
+
}
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* The page a pass lands on (spec section 3): one leading `/` and never `//`
|
|
127
|
+
* or `/\` (both resolve to another origin in a browser, LESSONS.md M8), no
|
|
128
|
+
* control character, space or DEL, no fragment, at most 2048 characters. The
|
|
129
|
+
* server checks it at mint; the dashboard still passes it through `safeNext`.
|
|
130
|
+
*/
|
|
131
|
+
export function isSafeDemoPath(path: string): boolean {
|
|
132
|
+
if (typeof path !== 'string') return false;
|
|
133
|
+
if (path.length < 1 || path.length > DEMO_PASS_MAX_PATH_LENGTH) return false;
|
|
134
|
+
if (!path.startsWith('/') || path.startsWith('//') || path.startsWith('/\\')) return false;
|
|
135
|
+
for (let i = 0; i < path.length; i++) {
|
|
136
|
+
const code = path.charCodeAt(i);
|
|
137
|
+
if (code < 0x21 || code === 0x7f) return false;
|
|
138
|
+
}
|
|
139
|
+
return !path.includes('#');
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Sign-in library paths (relative to /api/v1/auth) a demo pass's session is
|
|
144
|
+
* refused. A pass's session is a visit: what it opens or changes must not
|
|
145
|
+
* outlive the pass, so it changes no address, password, name or second
|
|
146
|
+
* factor, deletes no account, mints no token and ends no other session. On
|
|
147
|
+
* this edition a pass lands in no tool, so it authorizes no OAuth client at
|
|
148
|
+
* all: the whole authorize and consent flow is on the list, and client
|
|
149
|
+
* management with it. A new sign-in-library plugin's endpoints must be
|
|
150
|
+
* reviewed against this list when it is added.
|
|
151
|
+
*/
|
|
152
|
+
export const DEMO_SESSION_REFUSED_AUTH_PATHS: readonly string[] = [
|
|
153
|
+
'/change-email',
|
|
154
|
+
'/change-password',
|
|
155
|
+
'/delete-user',
|
|
156
|
+
'/update-user',
|
|
157
|
+
'/link-social',
|
|
158
|
+
'/unlink-account',
|
|
159
|
+
'/email-otp/change-email',
|
|
160
|
+
'/email-otp/request-email-change',
|
|
161
|
+
'/two-factor/enable',
|
|
162
|
+
'/two-factor/disable',
|
|
163
|
+
'/two-factor/generate-backup-codes',
|
|
164
|
+
'/two-factor/get-totp-uri',
|
|
165
|
+
'/oauth2/authorize',
|
|
166
|
+
'/oauth2/consent',
|
|
167
|
+
'/oauth2/update-consent',
|
|
168
|
+
'/oauth2/continue',
|
|
169
|
+
'/oauth2/create-client',
|
|
170
|
+
// A session's register stores the client under the person (user_id), a
|
|
171
|
+
// credential the pass would leave behind; anonymous registration is another
|
|
172
|
+
// matter, judged by OAUTH_DYNAMIC_CLIENT_REGISTRATION and its own wall.
|
|
173
|
+
'/oauth2/register',
|
|
174
|
+
'/oauth2/update-client',
|
|
175
|
+
'/oauth2/client/rotate-secret',
|
|
176
|
+
'/oauth2/delete-client',
|
|
177
|
+
'/revoke-sessions',
|
|
178
|
+
'/revoke-other-sessions',
|
|
179
|
+
'/revoke-session',
|
|
180
|
+
'/token',
|
|
181
|
+
'/get-access-token',
|
|
182
|
+
'/refresh-token'
|
|
183
|
+
];
|
|
184
|
+
|
|
185
|
+
const REFUSED_AUTH_PATHS: ReadonlySet<string> = new Set(DEMO_SESSION_REFUSED_AUTH_PATHS);
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Whether a demo pass's session is refused this sign-in library path
|
|
189
|
+
* (relative to /api/v1/auth). One trailing `/` is dropped and the comparison
|
|
190
|
+
* is lowercase, so neither spelling walks past the list.
|
|
191
|
+
*/
|
|
192
|
+
export function demoSessionAuthRefusal(authPath: string): boolean {
|
|
193
|
+
const trimmed = authPath.endsWith('/') ? authPath.slice(0, -1) : authPath;
|
|
194
|
+
return REFUSED_AUTH_PATHS.has(trimmed.toLowerCase());
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** One API route a demo pass's session is refused, and what the refusal says it cannot do. */
|
|
198
|
+
export interface DemoSessionRefusedApiRoute {
|
|
199
|
+
/** An HTTP method, or `ALL` for every method of the path. */
|
|
200
|
+
readonly method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'ALL';
|
|
201
|
+
/** A path relative to /api/v1, in the router's spelling (`:id`, a trailing `*` for a subtree). */
|
|
202
|
+
readonly path: string;
|
|
203
|
+
/** The act, completing "A session opened by a demo link cannot …". */
|
|
204
|
+
readonly does: string;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* API routes (relative to /api/v1) a demo pass's session is refused. A pass's
|
|
209
|
+
* session is a visit: it mints no credential for anyone (a reset link, a
|
|
210
|
+
* change-email link, an invitation, an API key, a demo link) and owns nothing
|
|
211
|
+
* that outlives the pass (a workspace, a default). Mounted once, right after
|
|
212
|
+
* the credential middleware (`api/create-api.ts`); a new route that mints a
|
|
213
|
+
* credential or creates something the person keeps joins this list.
|
|
214
|
+
*/
|
|
215
|
+
export const DEMO_SESSION_REFUSED_API_ROUTES: readonly DemoSessionRefusedApiRoute[] = [
|
|
216
|
+
{ method: 'POST', path: '/members/:id/reset-link', does: 'make a password reset link' },
|
|
217
|
+
{ method: 'POST', path: '/members/:id/change-email-link', does: 'make an email change link' },
|
|
218
|
+
{ method: 'POST', path: '/invitations', does: 'send an invitation' },
|
|
219
|
+
{ method: 'POST', path: '/api-keys', does: 'create an API key' },
|
|
220
|
+
{ method: 'ALL', path: '/demo/passes', does: 'manage demo links' },
|
|
221
|
+
{ method: 'ALL', path: '/demo/passes/*', does: 'manage demo links' },
|
|
222
|
+
{ method: 'POST', path: '/workspaces', does: 'create a workspace' },
|
|
223
|
+
{ method: 'PUT', path: '/me/default-workspace', does: 'change your default workspace' }
|
|
224
|
+
];
|
|
225
|
+
|
|
226
|
+
/** The refusal's sentence for one entry of `DEMO_SESSION_REFUSED_API_ROUTES`. */
|
|
227
|
+
export function demoSessionApiRefusalMessage(does: string): string {
|
|
228
|
+
return `A session opened by a demo link cannot ${does}: sign in with your password`;
|
|
229
|
+
}
|