@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,390 @@
|
|
|
1
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
2
|
+
import { and, desc, eq, inArray, isNull, sql } from 'drizzle-orm';
|
|
3
|
+
import { getSessionCookie } from 'better-auth/cookies';
|
|
4
|
+
import {
|
|
5
|
+
demoPasses,
|
|
6
|
+
demoPassSessions,
|
|
7
|
+
oauthAccessToken,
|
|
8
|
+
oauthRefreshToken,
|
|
9
|
+
session as sessionTable,
|
|
10
|
+
user as userTable,
|
|
11
|
+
workspaceMembers,
|
|
12
|
+
type Db,
|
|
13
|
+
type DbConn
|
|
14
|
+
} from '@antasphere/chassis-db';
|
|
15
|
+
import type { DemoPass } from '@antasphere/chassis-contract';
|
|
16
|
+
import { mintRefusal } from '../accounts/mint-refusal.js';
|
|
17
|
+
import { holdLiveMembership } from '../members/removal.js';
|
|
18
|
+
import { isDemoAddress } from './demo-pass-rules.js';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The demo pass service (the demo pass spec, section 3): mint, list, revoke,
|
|
22
|
+
* look a secret up, and record a use. The secret is 32 random bytes in
|
|
23
|
+
* base64url (43 characters); only its sha256 hex is stored, looked up through
|
|
24
|
+
* the unique index. Nothing here logs, and nothing here returns the secret
|
|
25
|
+
* but `mint`, once, to the route that shows it once.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/** The sha256 hex of a pass secret: the only form the database ever holds. */
|
|
29
|
+
export function demoPassSecretHash(secret: string): string {
|
|
30
|
+
return createHash('sha256').update(secret, 'utf8').digest('hex');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** A pass as the owner's routes speak it: the row plus its person's address and name. */
|
|
34
|
+
interface PassWithPerson {
|
|
35
|
+
id: string;
|
|
36
|
+
userId: string;
|
|
37
|
+
email: string;
|
|
38
|
+
name: string;
|
|
39
|
+
targetPath: string;
|
|
40
|
+
createdBy: string | null;
|
|
41
|
+
createdAt: Date;
|
|
42
|
+
expiresAt: Date;
|
|
43
|
+
revokedAt: Date | null;
|
|
44
|
+
lastUsedAt: Date | null;
|
|
45
|
+
useCount: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function demoPassToWire(p: PassWithPerson): DemoPass {
|
|
49
|
+
return {
|
|
50
|
+
id: p.id,
|
|
51
|
+
userId: p.userId,
|
|
52
|
+
email: p.email,
|
|
53
|
+
name: p.name,
|
|
54
|
+
targetPath: p.targetPath,
|
|
55
|
+
createdBy: p.createdBy,
|
|
56
|
+
createdAt: p.createdAt.toISOString(),
|
|
57
|
+
expiresAt: p.expiresAt.toISOString(),
|
|
58
|
+
revokedAt: p.revokedAt?.toISOString() ?? null,
|
|
59
|
+
lastUsedAt: p.lastUsedAt?.toISOString() ?? null,
|
|
60
|
+
useCount: p.useCount
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* The judge's answer on a request's session cookie (`judgeSession`): null for
|
|
66
|
+
* an ordinary session (or none), the pass and the session for a live pass's
|
|
67
|
+
* session, `ended` when the pass is dead and its sessions were just ended.
|
|
68
|
+
*/
|
|
69
|
+
export type DemoSessionVerdict = { passId: string; sessionId: string } | 'ended' | null;
|
|
70
|
+
|
|
71
|
+
/** What a redeem signs in: the pass and its person, every condition re-checked. */
|
|
72
|
+
export interface RedeemablePass {
|
|
73
|
+
passId: string;
|
|
74
|
+
workspaceId: string;
|
|
75
|
+
targetPath: string;
|
|
76
|
+
expiresAt: Date;
|
|
77
|
+
user: { id: string; email: string; name: string };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const passColumns = {
|
|
81
|
+
id: demoPasses.id,
|
|
82
|
+
userId: demoPasses.userId,
|
|
83
|
+
email: userTable.email,
|
|
84
|
+
name: userTable.name,
|
|
85
|
+
targetPath: demoPasses.targetPath,
|
|
86
|
+
createdBy: demoPasses.createdBy,
|
|
87
|
+
createdAt: demoPasses.createdAt,
|
|
88
|
+
expiresAt: demoPasses.expiresAt,
|
|
89
|
+
revokedAt: demoPasses.revokedAt,
|
|
90
|
+
lastUsedAt: demoPasses.lastUsedAt,
|
|
91
|
+
useCount: demoPasses.useCount
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
/** The mint found the person's membership gone or off inside its transaction: answered as `no_such_member`. */
|
|
95
|
+
export class DemoPassMemberGoneError extends Error {
|
|
96
|
+
readonly code = 'no_such_member';
|
|
97
|
+
constructor() {
|
|
98
|
+
super('No member of this workspace holds that address');
|
|
99
|
+
this.name = 'DemoPassMemberGoneError';
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export class DemoPassService {
|
|
104
|
+
constructor(private readonly db: Db) {}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Mint a pass. The caller (the owner's route) has already judged every
|
|
108
|
+
* refusal; this writes the row and hands the secret back, once.
|
|
109
|
+
*
|
|
110
|
+
* The person's membership is re-read inside the insert's transaction and
|
|
111
|
+
* held FOR SHARE (`holdLiveMembership`, the end-to-end verification,
|
|
112
|
+
* finding 5): the route's read ran before, outside any lock, and a pass
|
|
113
|
+
* minted after a removal committed would sit on the inactive row and open
|
|
114
|
+
* the account again the day the person is re-invited. A removal still
|
|
115
|
+
* running waits for this insert and revokes the pass in its second pass.
|
|
116
|
+
* Throws `DemoPassMemberGoneError` when the membership is gone or off: the
|
|
117
|
+
* route answers it as the `no_such_member` 404.
|
|
118
|
+
*/
|
|
119
|
+
async mint(input: {
|
|
120
|
+
workspaceId: string;
|
|
121
|
+
userId: string;
|
|
122
|
+
createdBy: string;
|
|
123
|
+
targetPath: string;
|
|
124
|
+
expiresInMinutes: number;
|
|
125
|
+
}): Promise<{ pass: PassWithPerson; secret: string }> {
|
|
126
|
+
const secret = randomBytes(32).toString('base64url');
|
|
127
|
+
const expiresAt = new Date(Date.now() + input.expiresInMinutes * 60 * 1000);
|
|
128
|
+
const row = await this.db.transaction(async (tx) => {
|
|
129
|
+
if (!(await holdLiveMembership(tx, input.workspaceId, { userId: input.userId }))) return null;
|
|
130
|
+
const [inserted] = await tx
|
|
131
|
+
.insert(demoPasses)
|
|
132
|
+
.values({
|
|
133
|
+
workspaceId: input.workspaceId,
|
|
134
|
+
userId: input.userId,
|
|
135
|
+
targetPath: input.targetPath,
|
|
136
|
+
secretHash: demoPassSecretHash(secret),
|
|
137
|
+
createdBy: input.createdBy,
|
|
138
|
+
expiresAt
|
|
139
|
+
})
|
|
140
|
+
.returning({ id: demoPasses.id });
|
|
141
|
+
return inserted!;
|
|
142
|
+
});
|
|
143
|
+
if (!row) throw new DemoPassMemberGoneError();
|
|
144
|
+
const pass = await this.get(input.workspaceId, row.id);
|
|
145
|
+
return { pass: pass!, secret };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** One pass of one workspace, or null (another workspace's pass is null too). */
|
|
149
|
+
async get(workspaceId: string, id: string): Promise<PassWithPerson | null> {
|
|
150
|
+
const [row] = await this.db
|
|
151
|
+
.select(passColumns)
|
|
152
|
+
.from(demoPasses)
|
|
153
|
+
.innerJoin(userTable, eq(userTable.id, demoPasses.userId))
|
|
154
|
+
.where(and(eq(demoPasses.id, id), eq(demoPasses.workspaceId, workspaceId)))
|
|
155
|
+
.limit(1);
|
|
156
|
+
return row ?? null;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** The workspace's passes, newest first. */
|
|
160
|
+
async list(workspaceId: string): Promise<PassWithPerson[]> {
|
|
161
|
+
return this.db
|
|
162
|
+
.select(passColumns)
|
|
163
|
+
.from(demoPasses)
|
|
164
|
+
.innerJoin(userTable, eq(userTable.id, demoPasses.userId))
|
|
165
|
+
.where(eq(demoPasses.workspaceId, workspaceId))
|
|
166
|
+
.orderBy(desc(demoPasses.createdAt), desc(demoPasses.id));
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Revoke a pass of this workspace. Idempotent: a revoked pass keeps its
|
|
171
|
+
* first revocation time and is answered again. Null when the workspace
|
|
172
|
+
* holds no such pass. The sessions the pass opened END with it, in the same
|
|
173
|
+
* transaction (`endSessions`, their session links included): a revoke that
|
|
174
|
+
* left them alive would stop the next click and nothing else, and the owner
|
|
175
|
+
* revokes to take the access back.
|
|
176
|
+
*/
|
|
177
|
+
async revoke(workspaceId: string, id: string): Promise<PassWithPerson | null> {
|
|
178
|
+
const found = await this.db.transaction(async (tx) => {
|
|
179
|
+
const updated = await tx
|
|
180
|
+
.update(demoPasses)
|
|
181
|
+
.set({ revokedAt: sql`coalesce(${demoPasses.revokedAt}, now())` })
|
|
182
|
+
.where(and(eq(demoPasses.id, id), eq(demoPasses.workspaceId, workspaceId)))
|
|
183
|
+
.returning({ id: demoPasses.id });
|
|
184
|
+
if (updated.length === 0) return false;
|
|
185
|
+
await this.endSessions(await this.sessionIdsOf(id, tx), tx);
|
|
186
|
+
return true;
|
|
187
|
+
});
|
|
188
|
+
if (!found) return null;
|
|
189
|
+
return this.get(workspaceId, id);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* The redeem's lookup (spec section 4, step 2): the pass whose secret hashes
|
|
194
|
+
* to this, and only while EVERY condition still holds: not expired, not
|
|
195
|
+
* revoked, its person still there, still an ACTIVE member of the pass's
|
|
196
|
+
* workspace, the address still a demonstration address, no second factor
|
|
197
|
+
* enrolled since the mint, and the mint's own refusals judged again: not
|
|
198
|
+
* an owner now unless the pass is their own, not a guest, and no
|
|
199
|
+
* membership in any other workspace (`mintRefusal`). One statement for the
|
|
200
|
+
* pass, its person and the membership; null whatever the reason, so the
|
|
201
|
+
* caller has one answer to give.
|
|
202
|
+
*/
|
|
203
|
+
async redeemable(secret: string, extraDomains: ReadonlySet<string>): Promise<RedeemablePass | null> {
|
|
204
|
+
const [row] = await this.db
|
|
205
|
+
.select({
|
|
206
|
+
passId: demoPasses.id,
|
|
207
|
+
workspaceId: demoPasses.workspaceId,
|
|
208
|
+
targetPath: demoPasses.targetPath,
|
|
209
|
+
expiresAt: demoPasses.expiresAt,
|
|
210
|
+
createdBy: demoPasses.createdBy,
|
|
211
|
+
role: workspaceMembers.role,
|
|
212
|
+
origin: workspaceMembers.origin,
|
|
213
|
+
userId: userTable.id,
|
|
214
|
+
email: userTable.email,
|
|
215
|
+
name: userTable.name,
|
|
216
|
+
twoFactorEnabled: userTable.twoFactorEnabled
|
|
217
|
+
})
|
|
218
|
+
.from(demoPasses)
|
|
219
|
+
.innerJoin(userTable, eq(userTable.id, demoPasses.userId))
|
|
220
|
+
.innerJoin(
|
|
221
|
+
workspaceMembers,
|
|
222
|
+
and(
|
|
223
|
+
eq(workspaceMembers.userId, demoPasses.userId),
|
|
224
|
+
eq(workspaceMembers.workspaceId, demoPasses.workspaceId),
|
|
225
|
+
eq(workspaceMembers.isActive, true)
|
|
226
|
+
)
|
|
227
|
+
)
|
|
228
|
+
.where(
|
|
229
|
+
and(
|
|
230
|
+
eq(demoPasses.secretHash, demoPassSecretHash(secret)),
|
|
231
|
+
isNull(demoPasses.revokedAt),
|
|
232
|
+
sql`${demoPasses.expiresAt} > now()`
|
|
233
|
+
)
|
|
234
|
+
)
|
|
235
|
+
.limit(1);
|
|
236
|
+
if (!row) return null;
|
|
237
|
+
if (row.twoFactorEnabled) return null;
|
|
238
|
+
if (!isDemoAddress(row.email, extraDomains)) return null;
|
|
239
|
+
if (row.role === 'owner' && row.userId !== row.createdBy) return null;
|
|
240
|
+
// The message is the mint's; here only whether there is a refusal counts.
|
|
241
|
+
if (
|
|
242
|
+
await mintRefusal(
|
|
243
|
+
this.db,
|
|
244
|
+
'',
|
|
245
|
+
{ workspaceId: row.workspaceId },
|
|
246
|
+
{ userId: row.userId, origin: row.origin }
|
|
247
|
+
)
|
|
248
|
+
) {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
return {
|
|
252
|
+
passId: row.passId,
|
|
253
|
+
workspaceId: row.workspaceId,
|
|
254
|
+
targetPath: row.targetPath,
|
|
255
|
+
expiresAt: row.expiresAt,
|
|
256
|
+
user: { id: row.userId, email: row.email, name: row.name }
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/** Record one use: the session it opened (the audit mark) and the counters, together. */
|
|
261
|
+
async recordUse(passId: string, sessionId: string): Promise<void> {
|
|
262
|
+
await this.db.transaction(async (tx) => {
|
|
263
|
+
await tx.insert(demoPassSessions).values({ sessionId, passId });
|
|
264
|
+
await tx
|
|
265
|
+
.update(demoPasses)
|
|
266
|
+
.set({ useCount: sql`${demoPasses.useCount} + 1`, lastUsedAt: sql`now()` })
|
|
267
|
+
.where(eq(demoPasses.id, passId));
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* The rule that makes a pass's lifetime the lifetime of what it opened: a
|
|
273
|
+
* session a pass opened lives only while its pass does. Judged once per
|
|
274
|
+
* request by the credential resolver, for session principals, while the
|
|
275
|
+
* switch is on. Three answers: null (an ordinary session, the person signed
|
|
276
|
+
* in themselves), the pass's id (the audit mark) with the session's id, or
|
|
277
|
+
* `ended`: the pass has expired or was revoked, every session it opened is
|
|
278
|
+
* ended here (`endSessions`) and the request goes on signed out. Without
|
|
279
|
+
* it a link valid one day would open a session the library keeps a year
|
|
280
|
+
* and renews on use.
|
|
281
|
+
*
|
|
282
|
+
* The session cookie is `<token>.<signature>` and only the token part is
|
|
283
|
+
* read, the signature unchecked: at the resolver it was already checked, and
|
|
284
|
+
* at the sign-in library's door it does not need to be, because the only
|
|
285
|
+
* thing this can do with a token is end the sessions of a pass that is
|
|
286
|
+
* already dead, or refuse that session a path, and the token is that
|
|
287
|
+
* session's own secret.
|
|
288
|
+
*/
|
|
289
|
+
async judgeSession(headers: Headers): Promise<DemoSessionVerdict> {
|
|
290
|
+
const cookie = getSessionCookie(headers);
|
|
291
|
+
if (!cookie) return null;
|
|
292
|
+
const token = cookie.split('.')[0];
|
|
293
|
+
if (!token) return null;
|
|
294
|
+
const [row] = await this.db
|
|
295
|
+
.select({
|
|
296
|
+
sessionId: sessionTable.id,
|
|
297
|
+
passId: demoPassSessions.passId,
|
|
298
|
+
live: sql<boolean>`${demoPasses.revokedAt} is null and ${demoPasses.expiresAt} > now()`
|
|
299
|
+
})
|
|
300
|
+
.from(demoPassSessions)
|
|
301
|
+
.innerJoin(sessionTable, eq(sessionTable.id, demoPassSessions.sessionId))
|
|
302
|
+
.innerJoin(demoPasses, eq(demoPasses.id, demoPassSessions.passId))
|
|
303
|
+
.where(eq(sessionTable.token, token))
|
|
304
|
+
.limit(1);
|
|
305
|
+
if (!row) return null;
|
|
306
|
+
if (row.live) return { passId: row.passId, sessionId: row.sessionId };
|
|
307
|
+
// The pass is dead: every session it opened ends now, not only the one
|
|
308
|
+
// presented, so a second tab's session does not wait for its own request.
|
|
309
|
+
await this.db.transaction(async (tx) => this.endSessions(await this.sessionIdsOf(row.passId, tx), tx));
|
|
310
|
+
return 'ended';
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Pass sessions a revoke by this verified caller's session is about to delete (the library's revoke-session(s) paths).
|
|
315
|
+
*
|
|
316
|
+
* The library's own `/revoke-session`, `/revoke-sessions` and
|
|
317
|
+
* `/revoke-other-sessions` delete session rows and nothing else: a pass
|
|
318
|
+
* session a person's own session revokes would leave its OAuth tokens
|
|
319
|
+
* (their link to it set null, out of `endSessions`' reach) and its
|
|
320
|
+
* `demo_pass_sessions` row behind. The `/auth/*` middleware asks this first
|
|
321
|
+
* and ends those sessions the pass's way before the library runs. The
|
|
322
|
+
* caller is the library's verified session (the middleware resolves it
|
|
323
|
+
* through `auth.api.getSession`, the signature checked), so a forged or
|
|
324
|
+
* dead cookie ends nothing; a pass session never gets here (the middleware
|
|
325
|
+
* refuses it these paths). `/revoke-session`: the session whose token is
|
|
326
|
+
* the body's, the caller's own person's, and a pass's; `/revoke-sessions`:
|
|
327
|
+
* every pass session of that person; `/revoke-other-sessions`: the same,
|
|
328
|
+
* the caller's own session excepted. Any other path, or no session: none.
|
|
329
|
+
*/
|
|
330
|
+
async passSessionsRevokedBy(
|
|
331
|
+
authPath: string,
|
|
332
|
+
caller: { sessionId: string; userId: string },
|
|
333
|
+
bodyToken: string | null
|
|
334
|
+
): Promise<string[]> {
|
|
335
|
+
if (
|
|
336
|
+
authPath !== '/revoke-session' &&
|
|
337
|
+
authPath !== '/revoke-sessions' &&
|
|
338
|
+
authPath !== '/revoke-other-sessions'
|
|
339
|
+
) {
|
|
340
|
+
return [];
|
|
341
|
+
}
|
|
342
|
+
if (authPath === '/revoke-session') {
|
|
343
|
+
if (!bodyToken) return [];
|
|
344
|
+
const rows = await this.db
|
|
345
|
+
.select({ id: sessionTable.id })
|
|
346
|
+
.from(sessionTable)
|
|
347
|
+
.innerJoin(demoPassSessions, eq(demoPassSessions.sessionId, sessionTable.id))
|
|
348
|
+
.where(and(eq(sessionTable.token, bodyToken), eq(sessionTable.userId, caller.userId)))
|
|
349
|
+
.limit(1);
|
|
350
|
+
return rows.map((r) => r.id);
|
|
351
|
+
}
|
|
352
|
+
const rows = await this.db
|
|
353
|
+
.select({ id: sessionTable.id })
|
|
354
|
+
.from(sessionTable)
|
|
355
|
+
.innerJoin(demoPassSessions, eq(demoPassSessions.sessionId, sessionTable.id))
|
|
356
|
+
.where(eq(sessionTable.userId, caller.userId));
|
|
357
|
+
const ids = rows.map((r) => r.id);
|
|
358
|
+
return authPath === '/revoke-other-sessions' ? ids.filter((id) => id !== caller.sessionId) : ids;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/** The ids of the sessions a pass opened (its `demo_pass_sessions` rows). */
|
|
362
|
+
private async sessionIdsOf(passId: string, conn: DbConn): Promise<string[]> {
|
|
363
|
+
const rows = await conn
|
|
364
|
+
.select({ id: demoPassSessions.sessionId })
|
|
365
|
+
.from(demoPassSessions)
|
|
366
|
+
.where(eq(demoPassSessions.passId, passId));
|
|
367
|
+
return rows.map((row) => row.id);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* End sessions a pass opened, and what they opened with them: the OAuth
|
|
372
|
+
* access and refresh tokens issued under them (deleted FIRST: their
|
|
373
|
+
* `session_id` is `on delete set null`, so deleting the session alone would
|
|
374
|
+
* leave them alive and unattached), the `demo_pass_sessions` links, then
|
|
375
|
+
* the `session` rows. In the caller's transaction when one is given, in
|
|
376
|
+
* its own otherwise.
|
|
377
|
+
*/
|
|
378
|
+
async endSessions(sessionIds: readonly string[], tx?: DbConn): Promise<void> {
|
|
379
|
+
if (sessionIds.length === 0) return;
|
|
380
|
+
const ids = [...sessionIds];
|
|
381
|
+
const run = async (conn: DbConn) => {
|
|
382
|
+
await conn.delete(oauthAccessToken).where(inArray(oauthAccessToken.sessionId, ids));
|
|
383
|
+
await conn.delete(oauthRefreshToken).where(inArray(oauthRefreshToken.sessionId, ids));
|
|
384
|
+
await conn.delete(demoPassSessions).where(inArray(demoPassSessions.sessionId, ids));
|
|
385
|
+
await conn.delete(sessionTable).where(inArray(sessionTable.id, ids));
|
|
386
|
+
};
|
|
387
|
+
if (tx) return run(tx);
|
|
388
|
+
return this.db.transaction(async (own) => run(own));
|
|
389
|
+
}
|
|
390
|
+
}
|