@aphexcms/cms-core 9.8.0 → 9.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/organizations.d.ts +2 -1
- package/dist/api/organizations.d.ts.map +1 -1
- package/dist/api/organizations.js +2 -1
- package/dist/api/schemas/jobs.d.ts +15 -0
- package/dist/api/schemas/jobs.d.ts.map +1 -0
- package/dist/api/schemas/jobs.js +17 -0
- package/dist/api/schemas/user.d.ts.map +1 -1
- package/dist/api/schemas/user.js +6 -2
- package/dist/auth/account-deletion.d.ts +35 -0
- package/dist/auth/account-deletion.d.ts.map +1 -0
- package/dist/auth/account-deletion.js +65 -0
- package/dist/auth/bootstrap.d.ts +104 -0
- package/dist/auth/bootstrap.d.ts.map +1 -0
- package/dist/auth/bootstrap.js +164 -0
- package/dist/auth/instance-state.d.ts +13 -0
- package/dist/auth/instance-state.d.ts.map +1 -0
- package/dist/auth/instance-state.js +30 -0
- package/dist/auth/invitation-status.d.ts +25 -0
- package/dist/auth/invitation-status.d.ts.map +1 -0
- package/dist/auth/invitation-status.js +41 -0
- package/dist/auth/sign-up-policy.d.ts +62 -0
- package/dist/auth/sign-up-policy.d.ts.map +1 -0
- package/dist/auth/sign-up-policy.js +120 -0
- package/dist/components/admin/ActivityView.svelte +263 -13
- package/dist/components/admin/ActivityView.svelte.d.ts +10 -1
- package/dist/components/admin/ActivityView.svelte.d.ts.map +1 -1
- package/dist/db/interfaces/events.d.ts +29 -2
- package/dist/db/interfaces/events.d.ts.map +1 -1
- package/dist/db/interfaces/index.d.ts +1 -0
- package/dist/db/interfaces/index.d.ts.map +1 -1
- package/dist/db/interfaces/index.js +1 -0
- package/dist/db/interfaces/instance.d.ts +29 -0
- package/dist/db/interfaces/instance.d.ts.map +1 -1
- package/dist/db/interfaces/instance.js +8 -1
- package/dist/events/built-in-consumers.d.ts +20 -0
- package/dist/events/built-in-consumers.d.ts.map +1 -0
- package/dist/events/built-in-consumers.js +49 -0
- package/dist/events/catalog.d.ts +16 -0
- package/dist/events/catalog.d.ts.map +1 -1
- package/dist/events/catalog.js +17 -0
- package/dist/events/consumer.d.ts +14 -0
- package/dist/events/consumer.d.ts.map +1 -1
- package/dist/events/consumer.js +1 -0
- package/dist/events/emit.d.ts +23 -0
- package/dist/events/emit.d.ts.map +1 -1
- package/dist/events/emit.js +32 -1
- package/dist/events/index.d.ts +2 -0
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +2 -0
- package/dist/field-validation/utils.d.ts +27 -4
- package/dist/field-validation/utils.d.ts.map +1 -1
- package/dist/field-validation/utils.js +78 -10
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/jobs/run-batch.d.ts +7 -1
- package/dist/jobs/run-batch.d.ts.map +1 -1
- package/dist/jobs/run-batch.js +3 -1
- package/dist/lib/api/organizations.d.ts +2 -1
- package/dist/lib/api/organizations.d.ts.map +1 -1
- package/dist/lib/api/organizations.js +2 -1
- package/dist/lib/api/organizations.js.map +1 -1
- package/dist/lib/api/schemas/api-keys.d.ts +4 -4
- package/dist/lib/api/schemas/jobs.d.ts +15 -0
- package/dist/lib/api/schemas/jobs.d.ts.map +1 -0
- package/dist/lib/api/schemas/jobs.js +18 -0
- package/dist/lib/api/schemas/jobs.js.map +1 -0
- package/dist/lib/api/schemas/user.d.ts.map +1 -1
- package/dist/lib/api/schemas/user.js +6 -2
- package/dist/lib/api/schemas/user.js.map +1 -1
- package/dist/lib/auth/account-deletion.d.ts +35 -0
- package/dist/lib/auth/account-deletion.d.ts.map +1 -0
- package/dist/lib/auth/account-deletion.js +66 -0
- package/dist/lib/auth/account-deletion.js.map +1 -0
- package/dist/lib/auth/bootstrap.d.ts +104 -0
- package/dist/lib/auth/bootstrap.d.ts.map +1 -0
- package/dist/lib/auth/bootstrap.js +165 -0
- package/dist/lib/auth/bootstrap.js.map +1 -0
- package/dist/lib/auth/instance-state.d.ts +13 -0
- package/dist/lib/auth/instance-state.d.ts.map +1 -0
- package/dist/lib/auth/instance-state.js +31 -0
- package/dist/lib/auth/instance-state.js.map +1 -0
- package/dist/lib/auth/invitation-status.d.ts +25 -0
- package/dist/lib/auth/invitation-status.d.ts.map +1 -0
- package/dist/lib/auth/invitation-status.js +42 -0
- package/dist/lib/auth/invitation-status.js.map +1 -0
- package/dist/lib/auth/sign-up-policy.d.ts +62 -0
- package/dist/lib/auth/sign-up-policy.d.ts.map +1 -0
- package/dist/lib/auth/sign-up-policy.js +121 -0
- package/dist/lib/auth/sign-up-policy.js.map +1 -0
- package/dist/lib/db/interfaces/events.d.ts +29 -2
- package/dist/lib/db/interfaces/events.d.ts.map +1 -1
- package/dist/lib/db/interfaces/index.d.ts +1 -0
- package/dist/lib/db/interfaces/index.d.ts.map +1 -1
- package/dist/lib/db/interfaces/index.js +1 -0
- package/dist/lib/db/interfaces/index.js.map +1 -1
- package/dist/lib/db/interfaces/instance.d.ts +29 -0
- package/dist/lib/db/interfaces/instance.d.ts.map +1 -1
- package/dist/lib/db/interfaces/instance.js +8 -1
- package/dist/lib/db/interfaces/instance.js.map +1 -1
- package/dist/lib/events/built-in-consumers.d.ts +20 -0
- package/dist/lib/events/built-in-consumers.d.ts.map +1 -0
- package/dist/lib/events/built-in-consumers.js +50 -0
- package/dist/lib/events/built-in-consumers.js.map +1 -0
- package/dist/lib/events/catalog.d.ts +16 -0
- package/dist/lib/events/catalog.d.ts.map +1 -1
- package/dist/lib/events/catalog.js +17 -0
- package/dist/lib/events/catalog.js.map +1 -1
- package/dist/lib/events/consumer.d.ts +14 -0
- package/dist/lib/events/consumer.d.ts.map +1 -1
- package/dist/lib/events/consumer.js +1 -0
- package/dist/lib/events/consumer.js.map +1 -1
- package/dist/lib/events/emit.d.ts +23 -0
- package/dist/lib/events/emit.d.ts.map +1 -1
- package/dist/lib/events/emit.js +32 -1
- package/dist/lib/events/emit.js.map +1 -1
- package/dist/lib/events/index.d.ts +2 -0
- package/dist/lib/events/index.d.ts.map +1 -1
- package/dist/lib/events/index.js +2 -0
- package/dist/lib/events/index.js.map +1 -1
- package/dist/lib/field-validation/utils.d.ts +27 -4
- package/dist/lib/field-validation/utils.d.ts.map +1 -1
- package/dist/lib/field-validation/utils.js +78 -10
- package/dist/lib/field-validation/utils.js.map +1 -1
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +3 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/jobs/run-batch.d.ts +7 -1
- package/dist/lib/jobs/run-batch.d.ts.map +1 -1
- package/dist/lib/jobs/run-batch.js +3 -1
- package/dist/lib/jobs/run-batch.js.map +1 -1
- package/dist/lib/local-api/collection-api.d.ts +42 -1
- package/dist/lib/local-api/collection-api.d.ts.map +1 -1
- package/dist/lib/local-api/collection-api.js +68 -8
- package/dist/lib/local-api/collection-api.js.map +1 -1
- package/dist/lib/local-api/index.d.ts +1 -1
- package/dist/lib/local-api/index.d.ts.map +1 -1
- package/dist/lib/local-api/index.js +1 -1
- package/dist/lib/local-api/index.js.map +1 -1
- package/dist/lib/plugins/resolver.d.ts.map +1 -1
- package/dist/lib/plugins/resolver.js +7 -1
- package/dist/lib/plugins/resolver.js.map +1 -1
- package/dist/lib/server/api/rate-limit.d.ts +38 -0
- package/dist/lib/server/api/rate-limit.d.ts.map +1 -0
- package/dist/lib/server/api/rate-limit.js +71 -0
- package/dist/lib/server/api/rate-limit.js.map +1 -0
- package/dist/lib/server/api/routes/agent-change-sets.js +1 -1
- package/dist/lib/server/api/routes/agent-change-sets.js.map +1 -1
- package/dist/lib/server/api/routes/document-versions.js +1 -1
- package/dist/lib/server/api/routes/document-versions.js.map +1 -1
- package/dist/lib/server/api/routes/documents-by-id.d.ts.map +1 -1
- package/dist/lib/server/api/routes/documents-by-id.js +11 -2
- package/dist/lib/server/api/routes/documents-by-id.js.map +1 -1
- package/dist/lib/server/api/routes/documents-publish.d.ts.map +1 -1
- package/dist/lib/server/api/routes/documents-publish.js +11 -1
- package/dist/lib/server/api/routes/documents-publish.js.map +1 -1
- package/dist/lib/server/api/routes/documents.d.ts.map +1 -1
- package/dist/lib/server/api/routes/documents.js +10 -0
- package/dist/lib/server/api/routes/documents.js.map +1 -1
- package/dist/lib/server/api/routes/jobs.d.ts.map +1 -1
- package/dist/lib/server/api/routes/jobs.js +174 -20
- package/dist/lib/server/api/routes/jobs.js.map +1 -1
- package/dist/lib/server/api/routes/organizations-by-id.d.ts.map +1 -1
- package/dist/lib/server/api/routes/organizations-by-id.js +61 -3
- package/dist/lib/server/api/routes/organizations-by-id.js.map +1 -1
- package/dist/lib/server/api/routes/organizations-invitations.d.ts.map +1 -1
- package/dist/lib/server/api/routes/organizations-invitations.js +31 -2
- package/dist/lib/server/api/routes/organizations-invitations.js.map +1 -1
- package/dist/lib/server/api/routes/resolve-organization-names.d.ts +17 -0
- package/dist/lib/server/api/routes/resolve-organization-names.d.ts.map +1 -0
- package/dist/lib/server/api/routes/resolve-organization-names.js +26 -0
- package/dist/lib/server/api/routes/resolve-organization-names.js.map +1 -0
- package/dist/lib/server/api/routes/user.d.ts +0 -8
- package/dist/lib/server/api/routes/user.d.ts.map +1 -1
- package/dist/lib/server/api/routes/user.js +144 -0
- package/dist/lib/server/api/routes/user.js.map +1 -1
- package/dist/lib/server/index.d.ts +6 -1
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +9 -1
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/services/references-service.d.ts +1 -1
- package/dist/lib/services/references-service.d.ts.map +1 -1
- package/dist/lib/types/capabilities.d.ts +14 -0
- package/dist/lib/types/capabilities.d.ts.map +1 -1
- package/dist/lib/types/capabilities.js +37 -18
- package/dist/lib/types/capabilities.js.map +1 -1
- package/dist/lib/types/events.d.ts +27 -4
- package/dist/lib/types/events.d.ts.map +1 -1
- package/dist/lib/utils/fetch-remote-file.d.ts.map +1 -1
- package/dist/lib/utils/fetch-remote-file.js +32 -3
- package/dist/lib/utils/fetch-remote-file.js.map +1 -1
- package/dist/local-api/collection-api.d.ts +42 -1
- package/dist/local-api/collection-api.d.ts.map +1 -1
- package/dist/local-api/collection-api.js +68 -8
- package/dist/local-api/index.d.ts +1 -1
- package/dist/local-api/index.d.ts.map +1 -1
- package/dist/local-api/index.js +1 -1
- package/dist/plugins/resolver.d.ts.map +1 -1
- package/dist/plugins/resolver.js +7 -1
- package/dist/server/api/rate-limit.d.ts +38 -0
- package/dist/server/api/rate-limit.d.ts.map +1 -0
- package/dist/server/api/rate-limit.js +70 -0
- package/dist/server/api/routes/agent-change-sets.js +1 -1
- package/dist/server/api/routes/document-versions.js +1 -1
- package/dist/server/api/routes/documents-by-id.d.ts.map +1 -1
- package/dist/server/api/routes/documents-by-id.js +11 -2
- package/dist/server/api/routes/documents-publish.d.ts.map +1 -1
- package/dist/server/api/routes/documents-publish.js +11 -1
- package/dist/server/api/routes/documents.d.ts.map +1 -1
- package/dist/server/api/routes/documents.js +10 -0
- package/dist/server/api/routes/jobs.d.ts.map +1 -1
- package/dist/server/api/routes/jobs.js +174 -20
- package/dist/server/api/routes/organizations-by-id.d.ts.map +1 -1
- package/dist/server/api/routes/organizations-by-id.js +61 -3
- package/dist/server/api/routes/organizations-invitations.d.ts.map +1 -1
- package/dist/server/api/routes/organizations-invitations.js +31 -2
- package/dist/server/api/routes/resolve-organization-names.d.ts +17 -0
- package/dist/server/api/routes/resolve-organization-names.d.ts.map +1 -0
- package/dist/server/api/routes/resolve-organization-names.js +25 -0
- package/dist/server/api/routes/user.d.ts +0 -8
- package/dist/server/api/routes/user.d.ts.map +1 -1
- package/dist/server/api/routes/user.js +144 -0
- package/dist/server/index.d.ts +6 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +9 -1
- package/dist/services/references-service.d.ts +1 -1
- package/dist/services/references-service.d.ts.map +1 -1
- package/dist/types/capabilities.d.ts +14 -0
- package/dist/types/capabilities.d.ts.map +1 -1
- package/dist/types/capabilities.js +37 -18
- package/dist/types/events.d.ts +27 -4
- package/dist/types/events.d.ts.map +1 -1
- package/dist/utils/fetch-remote-file.d.ts.map +1 -1
- package/dist/utils/fetch-remote-file.js +32 -3
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organizations-by-id.js","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations-by-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"organizations-by-id.js","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations-by-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG7D,8EAA8E;AAC9E,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAElC;;;;;;;GAOG;AACH,KAAK,UAAU,uBAAuB,CACrC,YAMC,EACD,cAAsB;IAEtB,SAAS,CAAC;QACT,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,cAAc,EAAE;YAC1D,KAAK,EAAE,qBAAqB;YAC5B,MAAM,EAAE,CAAC;SACT,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE9B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACJ,MAAM,YAAY,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;gBACzD,MAAM,EAAE,CAAC;YACV,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,SAAS,CAAC,IAAI,CAAC,yBAAyB,KAAK,CAAC,EAAE,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAChF,CAAC;QACF,CAAC;QAED,8EAA8E;QAC9E,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YAClB,SAAS,CAAC,KAAK,CACd,kCAAkC,cAAc,KAAK,IAAI,CAAC,MAAM,oCAAoC,CACpG,CAAC;YACF,OAAO;QACR,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAmB,IAAI,IAAI,EAAY;KACzE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACxB,IAAI,CAAC;QACJ,MAAM,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3C,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,CAAC,CAAC,IAAI,CACZ;gBACC,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,iCAAiC;aAC1C,EACD,GAAG,CACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,EAAE,EAAE,CAAC;YACT,OAAO,CAAC,CAAC,IAAI,CACZ;gBACC,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,wBAAwB;gBAC/B,OAAO,EAAE,6BAA6B;aACtC,EACD,GAAG,CACH,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,OAAO,CAAC,CAAC,IAAI,CACZ;gBACC,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,2CAA2C;aACpD,EACD,GAAG,CACH,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,GAAG,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,SAAS,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC,IAAI,CACZ;YACC,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,8BAA8B;YACrC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SACjE,EACD,GAAG,CACH,CAAC;IACH,CAAC;AACF,CAAC,CAAC;KACD,KAAK,CACL,MAAM,EACN,UAAU,CAAC,MAAM,EAAE,yBAAyB,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC3D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,CAAC,IAAI,CACZ;YACC,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,sBAAsB;YAC7B,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;SAC3B,EACD,GAAG,CACH,CAAC;IACH,CAAC;AACF,CAAC,CAAC,EACF,KAAK,EAAE,CAAC,EAAE,EAAE;IACX,IAAI,CAAC;QACJ,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzD,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,CAAC,CAAC,IAAI,CACZ;gBACC,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,iCAAiC;aAC1C,EACD,GAAG,CACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,EAAE,EAAE,CAAC;YACT,OAAO,CAAC,CAAC,IAAI,CACZ;gBACC,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,wBAAwB;gBAC/B,OAAO,EAAE,6BAA6B;aACtC,EACD,GAAG,CACH,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAE9E,uEAAuE;QACvE,oEAAoE;QACpE,0EAA0E;QAC1E,gEAAgE;QAChE,yEAAyE;QACzE,IAAI,eAAe,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,UAAU,IAAI,CAAC,eAAe,EAAE,CAAC;YACpC,MAAM,kBAAkB,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;YACnF,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC,UAAU,IAAI,CAAC,eAAe,EAAE,CAAC;YACrC,OAAO,CAAC,CAAC,IAAI,CACZ;gBACC,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,4DAA4D;aACrE,EACD,GAAG,CACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEjC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5E,IAAI,WAAW,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC1C,OAAO,CAAC,CAAC,IAAI,CACZ;oBACC,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,qBAAqB;oBAC5B,OAAO,EAAE,2BAA2B,IAAI,CAAC,IAAI,kBAAkB;iBAC/D,EACD,GAAG,CACH,CAAC;YACH,CAAC;QACF,CAAC;QAED,MAAM,UAAU,GAIZ,EAAE,CAAC;QACP,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACzD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACzD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAErE,MAAM,mBAAmB,GAAG,MAAM,eAAe,CAAC,kBAAkB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACrF,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC1B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,GAAG,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,SAAS,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QACzD,OAAO,CAAC,CAAC,IAAI,CACZ;YACC,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,+BAA+B;YACtC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SACjE,EACD,GAAG,CACH,CAAC;IACH,CAAC;AACF,CAAC,CACD;KACA,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC3B,IAAI,CAAC;QACJ,MAAM,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3C,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,CAAC,CAAC,IAAI,CACZ;gBACC,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,iCAAiC;aAC1C,EACD,GAAG,CACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,EAAE,EAAE,CAAC;YACT,OAAO,CAAC,CAAC,IAAI,CACZ;gBACC,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,wBAAwB;gBAC/B,OAAO,EAAE,6BAA6B;aACtC,EACD,GAAG,CACH,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAChD,OAAO,CAAC,CAAC,IAAI,CACZ;gBACC,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,wCAAwC;aACjD,EACD,GAAG,CACH,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;QAClE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzE,IAAI,WAAW,EAAE,oBAAoB,KAAK,EAAE,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC7E,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBAE5E,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClD,MAAM,eAAe,CAAC,iBAAiB,CACtC,MAAM,CAAC,MAAM,EACb,aAAa,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAChC,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,MAAM,eAAe,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACxD,CAAC;YACF,CAAC;QACF,CAAC;QAED,2EAA2E;QAC3E,4EAA4E;QAC5E,0EAA0E;QAC1E,2EAA2E;QAC3E,2EAA2E;QAC3E,wCAAwC;QACxC,EAAE;QACF,4EAA4E;QAC5E,8EAA8E;QAC9E,4EAA4E;QAC5E,4EAA4E;QAC5E,2EAA2E;QAC3E,MAAM,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAE/D,MAAM,eAAe,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,eAAe,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,eAAe,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAE7C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,SAAS,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QACzD,OAAO,CAAC,CAAC,IAAI,CACZ;YACC,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,+BAA+B;YACtC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SACjE,EACD,GAAG,CACH,CAAC;IACH,CAAC;AACF,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organizations-invitations.d.ts","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations-invitations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"organizations-invitations.d.ts","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations-invitations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAU5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,EAAE,IAAI,CAAC,QAAQ,CA4OxD,CAAC"}
|
|
@@ -3,6 +3,7 @@ import { zValidator } from '@hono/zod-validator';
|
|
|
3
3
|
import { cmsLogger } from '../../../utils/logger.js';
|
|
4
4
|
import { inviteMemberRequest, cancelInvitationRequest } from '../../../api/schemas/organizations.js';
|
|
5
5
|
import { hasCapability } from '../../../types/capabilities.js';
|
|
6
|
+
import { isPendingInvitation, isStaleInvitation, invitationExpiryFrom } from '../../../auth/invitation-status.js';
|
|
6
7
|
/**
|
|
7
8
|
* Note: in studio, invitations are wrapped by a SvelteKit `+server.ts`
|
|
8
9
|
* that adds email sending after the invite row is created. While that
|
|
@@ -38,6 +39,18 @@ export const organizationsInvitationsRouter = new Hono()
|
|
|
38
39
|
}, 403);
|
|
39
40
|
}
|
|
40
41
|
const body = c.req.valid('json');
|
|
42
|
+
// The same restriction the member role-change route enforces, and for
|
|
43
|
+
// the same reason: `member.changeRole` refuses to promote anyone to
|
|
44
|
+
// owner, so admins must not be able to reach the same place by inviting
|
|
45
|
+
// a brand-new one instead — that detour would let an admin seat an
|
|
46
|
+
// accomplice above the actual owner.
|
|
47
|
+
if (body.role === 'owner' && auth.organizationRole !== 'owner') {
|
|
48
|
+
return c.json({
|
|
49
|
+
success: false,
|
|
50
|
+
error: 'Forbidden',
|
|
51
|
+
message: 'Only owners can invite members as owner'
|
|
52
|
+
}, 403);
|
|
53
|
+
}
|
|
41
54
|
const roleRow = await databaseAdapter.findRoleByName(auth.organizationId, body.role);
|
|
42
55
|
if (!roleRow) {
|
|
43
56
|
return c.json({
|
|
@@ -67,7 +80,10 @@ export const organizationsInvitationsRouter = new Hono()
|
|
|
67
80
|
}
|
|
68
81
|
}
|
|
69
82
|
const existingInvitations = await databaseAdapter.findOrganizationInvitations(auth.organizationId);
|
|
70
|
-
const
|
|
83
|
+
const sameEmail = existingInvitations.filter((inv) => inv.email.toLowerCase() === body.email.toLowerCase());
|
|
84
|
+
// Arrow, not point-free: `.find(isPendingInvitation)` would pass the array
|
|
85
|
+
// index as the `now` argument.
|
|
86
|
+
const pendingInvitation = sameEmail.find((inv) => isPendingInvitation(inv));
|
|
71
87
|
if (pendingInvitation) {
|
|
72
88
|
return c.json({
|
|
73
89
|
success: false,
|
|
@@ -75,6 +91,19 @@ export const organizationsInvitationsRouter = new Hono()
|
|
|
75
91
|
message: 'This email has already been invited to the organization'
|
|
76
92
|
}, 400);
|
|
77
93
|
}
|
|
94
|
+
// Clear lapsed invitations for this address so re-inviting replaces rather
|
|
95
|
+
// than accumulates. `isStaleInvitation` deliberately spares accepted ones —
|
|
96
|
+
// those are the record that somebody joined by invitation. Best-effort: a
|
|
97
|
+
// stale row is inert to every other path, so failing to tidy up shouldn't
|
|
98
|
+
// block the invitation actually being asked for.
|
|
99
|
+
for (const stale of sameEmail.filter((inv) => isStaleInvitation(inv))) {
|
|
100
|
+
try {
|
|
101
|
+
await databaseAdapter.deleteInvitation(stale.id, auth.organizationId);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
cmsLogger.warn('Failed to clear expired invitation:', error);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
78
107
|
const token = crypto.randomUUID();
|
|
79
108
|
const invitation = await databaseAdapter.createInvitation({
|
|
80
109
|
organizationId: auth.organizationId,
|
|
@@ -82,7 +111,7 @@ export const organizationsInvitationsRouter = new Hono()
|
|
|
82
111
|
role: body.role,
|
|
83
112
|
invitedBy: auth.user.id,
|
|
84
113
|
token,
|
|
85
|
-
expiresAt:
|
|
114
|
+
expiresAt: invitationExpiryFrom()
|
|
86
115
|
});
|
|
87
116
|
return c.json({
|
|
88
117
|
success: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organizations-invitations.js","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations-invitations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAClG,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"organizations-invitations.js","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/organizations-invitations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DatabaseAdapter } from '../../../db/interfaces/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve `organizationId` on a list of rows to the organization's name.
|
|
4
|
+
*
|
|
5
|
+
* Only needed by the instance-wide history views, where rows from several tenants sit in one
|
|
6
|
+
* table and a bare uuid tells a super admin nothing about which customer is affected. The
|
|
7
|
+
* org-scoped views skip this entirely — every row belongs to the org you're already in.
|
|
8
|
+
*
|
|
9
|
+
* Lookups are deduped and run in parallel; an org that can't be read resolves to `null`
|
|
10
|
+
* rather than failing the page, since a missing name is cosmetic and a 500 is not.
|
|
11
|
+
*/
|
|
12
|
+
export declare function withOrganizationNames<T extends {
|
|
13
|
+
organizationId: string;
|
|
14
|
+
}>(rows: T[], db: DatabaseAdapter): Promise<Array<T & {
|
|
15
|
+
organizationName: string | null;
|
|
16
|
+
}>>;
|
|
17
|
+
//# sourceMappingURL=resolve-organization-names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-organization-names.d.ts","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/resolve-organization-names.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,SAAS;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,EAC/E,IAAI,EAAE,CAAC,EAAE,EACT,EAAE,EAAE,eAAe,GACjB,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG;IAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC,CAgBzD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve `organizationId` on a list of rows to the organization's name.
|
|
3
|
+
*
|
|
4
|
+
* Only needed by the instance-wide history views, where rows from several tenants sit in one
|
|
5
|
+
* table and a bare uuid tells a super admin nothing about which customer is affected. The
|
|
6
|
+
* org-scoped views skip this entirely — every row belongs to the org you're already in.
|
|
7
|
+
*
|
|
8
|
+
* Lookups are deduped and run in parallel; an org that can't be read resolves to `null`
|
|
9
|
+
* rather than failing the page, since a missing name is cosmetic and a 500 is not.
|
|
10
|
+
*/
|
|
11
|
+
export async function withOrganizationNames(rows, db) {
|
|
12
|
+
const ids = [...new Set(rows.map((r) => r.organizationId))];
|
|
13
|
+
const names = new Map();
|
|
14
|
+
await Promise.all(ids.map(async (id) => {
|
|
15
|
+
try {
|
|
16
|
+
const org = await db.findOrganizationById(id);
|
|
17
|
+
if (org)
|
|
18
|
+
names.set(id, org.name);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// Unreadable org — leave the name null and show the id.
|
|
22
|
+
}
|
|
23
|
+
}));
|
|
24
|
+
return rows.map((r) => ({ ...r, organizationName: names.get(r.organizationId) ?? null }));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=resolve-organization-names.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-organization-names.js","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/resolve-organization-names.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAC1C,IAAS,EACT,EAAmB;IAEnB,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAExC,MAAM,OAAO,CAAC,GAAG,CAChB,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QACpB,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;YAC9C,IAAI,GAAG;gBAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACR,wDAAwD;QACzD,CAAC;IACF,CAAC,CAAC,CACF,CAAC;IAEF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3F,CAAC"}
|
|
@@ -1,12 +1,4 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
2
|
import type { AphexEnv } from '../index.js';
|
|
3
|
-
/**
|
|
4
|
-
* User account routes that delegate to the configured AuthProvider.
|
|
5
|
-
*
|
|
6
|
-
* cms-core ships these as Hono routers so studio doesn't need to maintain
|
|
7
|
-
* SvelteKit `+server.ts` files for them. The wire format and side effects
|
|
8
|
-
* (e.g. the password-reset email) are owned by the AuthProvider impl —
|
|
9
|
-
* cms-core's role is just to expose them over HTTP.
|
|
10
|
-
*/
|
|
11
3
|
export declare const userRouter: Hono<AphexEnv>;
|
|
12
4
|
//# sourceMappingURL=user.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAS5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAoJzC,eAAO,MAAM,UAAU,EAAE,IAAI,CAAC,QAAQ,CAmNpC,CAAC"}
|
|
@@ -2,6 +2,47 @@ import { Hono } from 'hono';
|
|
|
2
2
|
import { zValidator } from '@hono/zod-validator';
|
|
3
3
|
import { cmsLogger } from '../../../utils/logger.js';
|
|
4
4
|
import { updateUserRequest, requestPasswordResetRequest, resetPasswordRequest } from '../../../api/schemas/user.js';
|
|
5
|
+
import { RateLimiter, clientAddress } from '../rate-limit.js';
|
|
6
|
+
// Throttles for the two unauthenticated facades below. Both call the auth provider
|
|
7
|
+
// *server-side*, which bypasses the provider's own HTTP rate limiter entirely (it only
|
|
8
|
+
// engages for calls carrying a real request) — so without these they are unlimited.
|
|
9
|
+
//
|
|
10
|
+
// Two buckets per endpoint, because either one alone is porous: the address bucket stops
|
|
11
|
+
// one host hammering many mailboxes, and the email/token bucket still holds when the
|
|
12
|
+
// address is forged, which `x-forwarded-for` always permits.
|
|
13
|
+
const RESET_REQUEST_WINDOW_MS = 60_000;
|
|
14
|
+
const resetRequestByAddress = new RateLimiter({ windowMs: RESET_REQUEST_WINDOW_MS, max: 5 });
|
|
15
|
+
// Tighter than the address bucket: nobody legitimately asks for the same mailbox's reset
|
|
16
|
+
// link three times a minute, and this is the half an attacker can't sidestep.
|
|
17
|
+
const resetRequestByEmail = new RateLimiter({ windowMs: RESET_REQUEST_WINDOW_MS, max: 2 });
|
|
18
|
+
// The redemption side is a token-guessing surface rather than an email one, so it's keyed
|
|
19
|
+
// on the address and on the token itself — a single token being retried is the signature of
|
|
20
|
+
// a brute-force attempt, not of a user clicking their link again.
|
|
21
|
+
const RESET_SUBMIT_WINDOW_MS = 60_000;
|
|
22
|
+
const resetSubmitByAddress = new RateLimiter({ windowMs: RESET_SUBMIT_WINDOW_MS, max: 10 });
|
|
23
|
+
const resetSubmitByToken = new RateLimiter({ windowMs: RESET_SUBMIT_WINDOW_MS, max: 5 });
|
|
24
|
+
/**
|
|
25
|
+
* Apply every bucket and return a 429 response if any of them is exhausted.
|
|
26
|
+
*
|
|
27
|
+
* All buckets are consumed, not short-circuited: a request that trips the first limit must
|
|
28
|
+
* still count against the others, or an attacker could keep a secondary bucket permanently
|
|
29
|
+
* fresh by deliberately tripping the primary one.
|
|
30
|
+
*/
|
|
31
|
+
function enforceRateLimits(c, checks) {
|
|
32
|
+
let retryAfter = 0;
|
|
33
|
+
for (const { limiter, key } of checks) {
|
|
34
|
+
const result = limiter.check(key);
|
|
35
|
+
if (!result.allowed)
|
|
36
|
+
retryAfter = Math.max(retryAfter, result.retryAfterSeconds);
|
|
37
|
+
}
|
|
38
|
+
if (retryAfter === 0)
|
|
39
|
+
return null;
|
|
40
|
+
return c.json({
|
|
41
|
+
success: false,
|
|
42
|
+
error: 'Too many requests',
|
|
43
|
+
message: `Too many attempts. Try again in ${retryAfter} second${retryAfter === 1 ? '' : 's'}.`
|
|
44
|
+
}, 429, { 'Retry-After': String(retryAfter) });
|
|
45
|
+
}
|
|
5
46
|
/**
|
|
6
47
|
* User account routes that delegate to the configured AuthProvider.
|
|
7
48
|
*
|
|
@@ -10,6 +51,72 @@ import { updateUserRequest, requestPasswordResetRequest, resetPasswordRequest }
|
|
|
10
51
|
* (e.g. the password-reset email) are owned by the AuthProvider impl —
|
|
11
52
|
* cms-core's role is just to expose them over HTTP.
|
|
12
53
|
*/
|
|
54
|
+
/**
|
|
55
|
+
* Avatars are stored as the CDN path `/media/<assetId>/<filename>`, which is what
|
|
56
|
+
* makes the underlying asset recoverable from the profile field. Anything else —
|
|
57
|
+
* an absolute storage URL from before this format, or an external provider's
|
|
58
|
+
* avatar — has no asset of ours behind it and is left alone.
|
|
59
|
+
*/
|
|
60
|
+
function avatarAssetId(image) {
|
|
61
|
+
return /^\/media\/([^/]+)\//.exec(image)?.[1] ?? null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Is `assetId` an asset this user uploaded as their own avatar?
|
|
65
|
+
*
|
|
66
|
+
* The gate on both pointing the profile field at an asset and deleting the one
|
|
67
|
+
* it used to point at. Both checks read *server-written* facts only:
|
|
68
|
+
*
|
|
69
|
+
* - `createdBy` is stamped from the session by the upload route, so it can't be
|
|
70
|
+
* forged onto somebody else's asset.
|
|
71
|
+
* - `metadata.system` marks the asset as hidden infrastructure rather than
|
|
72
|
+
* content, which is what an avatar is.
|
|
73
|
+
*
|
|
74
|
+
* Without this, `image` was simply a string the client chose: an attacker could
|
|
75
|
+
* point their avatar at any asset in the organization and then change it again,
|
|
76
|
+
* and the replace-cleanup below would delete that asset for them — a delete with
|
|
77
|
+
* none of the `asset.delete` capability checks the assets API enforces, usable
|
|
78
|
+
* by any authenticated user including a viewer.
|
|
79
|
+
*/
|
|
80
|
+
async function isOwnAvatarAsset(assetService, organizationId, userId, assetId) {
|
|
81
|
+
const asset = await assetService.findAssetById(organizationId, assetId);
|
|
82
|
+
if (!asset || asset.createdBy !== userId)
|
|
83
|
+
return false;
|
|
84
|
+
const metadata = asset.metadata;
|
|
85
|
+
return (typeof metadata === 'object' &&
|
|
86
|
+
metadata !== null &&
|
|
87
|
+
metadata.system === true);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Delete the asset behind a superseded avatar.
|
|
91
|
+
*
|
|
92
|
+
* Server-side rather than in the client for two reasons. The `asset.delete`
|
|
93
|
+
* capability gates the assets API, so a viewer replacing their own avatar could
|
|
94
|
+
* never clean up after themselves — their old pictures would accumulate forever.
|
|
95
|
+
* And doing it here means every caller of this route inherits the behaviour
|
|
96
|
+
* instead of each one remembering to orchestrate it.
|
|
97
|
+
*
|
|
98
|
+
* Re-checks ownership rather than trusting that the stored value passed the
|
|
99
|
+
* inbound check: rows written before that check existed are still out there.
|
|
100
|
+
*
|
|
101
|
+
* Best-effort by design: the profile field has already moved, so a failure here
|
|
102
|
+
* leaks a file but never leaves a broken avatar. Failing the request would
|
|
103
|
+
* report the leak by making the user's save look broken, which is worse.
|
|
104
|
+
*/
|
|
105
|
+
async function discardAvatarAsset(assetService, organizationId, userId, image) {
|
|
106
|
+
const id = avatarAssetId(image);
|
|
107
|
+
if (!id)
|
|
108
|
+
return;
|
|
109
|
+
try {
|
|
110
|
+
if (!(await isOwnAvatarAsset(assetService, organizationId, userId, id))) {
|
|
111
|
+
cmsLogger.warn('[User API] Refusing to delete superseded avatar asset that is not the user’s own:', id);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
await assetService.deleteAsset(organizationId, id);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
cmsLogger.warn('[User API] Could not delete superseded avatar asset:', error);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
13
120
|
export const userRouter = new Hono()
|
|
14
121
|
.patch('/', zValidator('json', updateUserRequest, (result, c) => {
|
|
15
122
|
if (!result.success) {
|
|
@@ -48,7 +155,31 @@ export const userRouter = new Hono()
|
|
|
48
155
|
error: 'Auth provider does not support profile image updates'
|
|
49
156
|
}, 500);
|
|
50
157
|
}
|
|
158
|
+
// An avatar may only point at an asset this user uploaded as an avatar.
|
|
159
|
+
// `image` is a free-form string from the client, and the replace
|
|
160
|
+
// cleanup below deletes whatever the *previous* value pointed at — so
|
|
161
|
+
// without this, setting the field to another asset's path and then
|
|
162
|
+
// changing it again is an unauthenticated-by-capability delete of any
|
|
163
|
+
// asset in the organization. Non-asset values (an external provider's
|
|
164
|
+
// URL, or the absolute storage URLs avatars used to use) have no asset
|
|
165
|
+
// of ours behind them and pass through.
|
|
166
|
+
const incomingAssetId = image === null ? null : avatarAssetId(image);
|
|
167
|
+
if (incomingAssetId &&
|
|
168
|
+
!(await isOwnAvatarAsset(c.var.aphexCMS.assetService, auth.organizationId, auth.user.id, incomingAssetId))) {
|
|
169
|
+
return c.json({
|
|
170
|
+
success: false,
|
|
171
|
+
error: 'Forbidden',
|
|
172
|
+
message: 'That image is not one of your uploaded avatars'
|
|
173
|
+
}, 403);
|
|
174
|
+
}
|
|
175
|
+
// Read the outgoing avatar before overwriting the field — once it's
|
|
176
|
+
// gone the asset is unreachable, and an avatar nothing points at is
|
|
177
|
+
// personal data with no way left to find or erase it.
|
|
178
|
+
const current = await provider.getUserById(auth.user.id);
|
|
51
179
|
await provider.changeUserImage(auth.user.id, image);
|
|
180
|
+
if (current?.image && current.image !== image) {
|
|
181
|
+
await discardAvatarAsset(c.var.aphexCMS.assetService, auth.organizationId, auth.user.id, current.image);
|
|
182
|
+
}
|
|
52
183
|
}
|
|
53
184
|
return c.json({ success: true, message: 'User updated successfully' });
|
|
54
185
|
}
|
|
@@ -77,6 +208,13 @@ export const userRouter = new Hono()
|
|
|
77
208
|
return c.json({ success: false, error: 'Auth provider not configured' }, 500);
|
|
78
209
|
}
|
|
79
210
|
const { email, redirectTo } = c.req.valid('json');
|
|
211
|
+
// Keyed on the normalized address so casing/whitespace can't mint a fresh bucket.
|
|
212
|
+
const limited = enforceRateLimits(c, [
|
|
213
|
+
{ limiter: resetRequestByAddress, key: clientAddress(c.req.raw.headers) },
|
|
214
|
+
{ limiter: resetRequestByEmail, key: email.trim().toLowerCase() }
|
|
215
|
+
]);
|
|
216
|
+
if (limited)
|
|
217
|
+
return limited;
|
|
80
218
|
await provider.requestPasswordReset(email, redirectTo);
|
|
81
219
|
// Constant response shape regardless of whether the email exists,
|
|
82
220
|
// to avoid account enumeration via the API.
|
|
@@ -110,6 +248,12 @@ export const userRouter = new Hono()
|
|
|
110
248
|
return c.json({ success: false, error: 'Auth provider not configured' }, 500);
|
|
111
249
|
}
|
|
112
250
|
const { token, newPassword } = c.req.valid('json');
|
|
251
|
+
const limited = enforceRateLimits(c, [
|
|
252
|
+
{ limiter: resetSubmitByAddress, key: clientAddress(c.req.raw.headers) },
|
|
253
|
+
{ limiter: resetSubmitByToken, key: token }
|
|
254
|
+
]);
|
|
255
|
+
if (limited)
|
|
256
|
+
return limited;
|
|
113
257
|
await provider.resetPassword(token, newPassword);
|
|
114
258
|
return c.json({ success: true, message: 'Password reset successfully' });
|
|
115
259
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EACN,iBAAiB,EACjB,2BAA2B,EAC3B,oBAAoB,EACpB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../../../src/lib/server/api/routes/user.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,10 @@ export * from '../cache/index.js';
|
|
|
4
4
|
export * from '../email/index.js';
|
|
5
5
|
export * from '../ai/index.js';
|
|
6
6
|
export { AuthError, type AuthErrorCode } from '../auth/auth-errors.js';
|
|
7
|
+
export { isInstanceEmpty, canDetermineInstanceEmptiness } from '../auth/instance-state.js';
|
|
8
|
+
export * from '../auth/bootstrap.js';
|
|
9
|
+
export * from '../auth/sign-up-policy.js';
|
|
10
|
+
export * from '../auth/account-deletion.js';
|
|
7
11
|
export { createCMSConfig } from '../config.js';
|
|
8
12
|
export { cmsLogger, setLogger, type Logger } from '../utils/logger.js';
|
|
9
13
|
export { CMSEngine } from '../engine.js';
|
|
@@ -17,11 +21,12 @@ export { AssetService } from '../services/asset-service.js';
|
|
|
17
21
|
export { RolesService } from '../services/roles-service.js';
|
|
18
22
|
export { GET as serveAssetCDN } from '../routes/assets-cdn.js';
|
|
19
23
|
export { createAphexApi, mountAphexBuiltins, toHonoHandler, type AphexEnv } from './api/index.js';
|
|
24
|
+
export { RateLimiter, clientAddress, type RateLimitRule, type RateLimitResult } from './api/rate-limit.js';
|
|
20
25
|
export * from '../jobs/index.js';
|
|
21
26
|
export * from '../schema-utils/index.js';
|
|
22
27
|
export { createHashForPublishing } from '../utils/content-hash.js';
|
|
23
28
|
export { getPreviewPerspective, type PreviewPerspective } from '../preview/perspective.js';
|
|
24
29
|
export { createGraphQLHandler, type GraphQLConfig, type GraphQLSettings, type GraphQLHandlerResult } from '../graphql/index.js';
|
|
25
|
-
export { LocalAPI, createLocalAPI, getLocalAPI, CollectionAPI, SingletonOperationError, PermissionChecker, PermissionError, authToContext, requireAuth, systemContext, type Collections, type SingletonCollection, type LocalAPIContext, type CreateOptions, type UpdateOptions } from '../local-api/index.js';
|
|
30
|
+
export { LocalAPI, createLocalAPI, getLocalAPI, CollectionAPI, SingletonOperationError, DocumentValidationError, PermissionChecker, PermissionError, authToContext, requireAuth, systemContext, type Collections, type SingletonCollection, type LocalAPIContext, type CreateOptions, type UpdateOptions } from '../local-api/index.js';
|
|
26
31
|
export { buildContentTools, type McpTool, type McpToolResult, type McpToolDeps } from '../mcp/tools.js';
|
|
27
32
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/server/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,gBAAgB,CAAC;AAE/B,cAAc,aAAa,CAAC;AAG5B,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/server/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,gBAAgB,CAAC;AAE/B,cAAc,aAAa,CAAC;AAG5B,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACxF,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AAGzC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxF,cAAc,wBAAwB,CAAC;AAGvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAKzD,OAAO,EAAE,GAAG,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI5D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAK/F,OAAO,EACN,WAAW,EACX,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,MAAM,kBAAkB,CAAC;AAG1B,cAAc,eAAe,CAAC;AAG9B,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,OAAO,EAAE,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGxF,OAAO,EACN,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACN,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,WAAW,EACX,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EACN,iBAAiB,EACjB,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,MAAM,cAAc,CAAC"}
|
package/dist/lib/server/index.js
CHANGED
|
@@ -8,6 +8,10 @@ export * from '../email/index.js';
|
|
|
8
8
|
export * from '../ai/index.js';
|
|
9
9
|
// Authentication errors
|
|
10
10
|
export { AuthError } from '../auth/auth-errors.js';
|
|
11
|
+
export { isInstanceEmpty, canDetermineInstanceEmptiness } from '../auth/instance-state.js';
|
|
12
|
+
export * from '../auth/bootstrap.js';
|
|
13
|
+
export * from '../auth/sign-up-policy.js';
|
|
14
|
+
export * from '../auth/account-deletion.js';
|
|
11
15
|
// Configuration system
|
|
12
16
|
export { createCMSConfig } from '../config.js';
|
|
13
17
|
// Logger
|
|
@@ -33,6 +37,10 @@ export { GET as serveAssetCDN } from '../routes/assets-cdn.js';
|
|
|
33
37
|
// Hono API app — exposed so user apps (and tests) can construct or extend
|
|
34
38
|
// the same router the SK catch-all forwards to.
|
|
35
39
|
export { createAphexApi, mountAphexBuiltins, toHonoHandler } from './api/index.js';
|
|
40
|
+
// Fixed-window throttle for unauthenticated endpoints. Exposed because an app adding its own
|
|
41
|
+
// public route needs the same guard the password-reset facades use — and because the caveat
|
|
42
|
+
// travels with it: this is per-process memory, so N instances give N× the configured limit.
|
|
43
|
+
export { RateLimiter, clientAddress } from './api/rate-limit.js';
|
|
36
44
|
// Job execution — the DB-backed job runner (claim → run handler → complete/retry/fail).
|
|
37
45
|
export * from '../jobs/index.js';
|
|
38
46
|
// Schema utilities
|
|
@@ -44,7 +52,7 @@ export { getPreviewPerspective } from '../preview/perspective.js';
|
|
|
44
52
|
// GraphQL (built-in, enabled by default)
|
|
45
53
|
export { createGraphQLHandler } from '../graphql/index.js';
|
|
46
54
|
// Local API (unified operations layer)
|
|
47
|
-
export { LocalAPI, createLocalAPI, getLocalAPI, CollectionAPI, SingletonOperationError, PermissionChecker, PermissionError, authToContext, requireAuth, systemContext } from '../local-api/index.js';
|
|
55
|
+
export { LocalAPI, createLocalAPI, getLocalAPI, CollectionAPI, SingletonOperationError, DocumentValidationError, PermissionChecker, PermissionError, authToContext, requireAuth, systemContext } from '../local-api/index.js';
|
|
48
56
|
// MCP — transport-agnostic tool registry (the MCP route + a future AI panel
|
|
49
57
|
// both consume these). The SvelteKit route handler is at ./routes/mcp.
|
|
50
58
|
export { buildContentTools } from '../mcp/tools.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/server/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,+DAA+D;AAE/D,sDAAsD;AACtD,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,gBAAgB,CAAC;AAE/B,cAAc,aAAa,CAAC;AAE5B,wBAAwB;AACxB,OAAO,EAAE,SAAS,EAAsB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/server/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,+DAA+D;AAE/D,sDAAsD;AACtD,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,gBAAgB,CAAC;AAE/B,cAAc,aAAa,CAAC;AAE5B,wBAAwB;AACxB,OAAO,EAAE,SAAS,EAAsB,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACxF,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AAEzC,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,SAAS;AACT,OAAO,EAAE,SAAS,EAAE,SAAS,EAAe,MAAM,iBAAiB,CAAC;AAEpE,aAAa;AACb,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,6CAA6C;AAC7C,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAqB,MAAM,UAAU,CAAC;AAExF,qFAAqF;AACrF,cAAc,wBAAwB,CAAC;AAEvC,kCAAkC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAE7C,iDAAiD;AACjD,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,4EAA4E;AAC5E,wEAAwE;AACxE,oEAAoE;AACpE,OAAO,EAAE,GAAG,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE5D,0EAA0E;AAC1E,gDAAgD;AAChD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAiB,MAAM,aAAa,CAAC;AAE/F,6FAA6F;AAC7F,4FAA4F;AAC5F,4FAA4F;AAC5F,OAAO,EACN,WAAW,EACX,aAAa,EAGb,MAAM,kBAAkB,CAAC;AAE1B,wFAAwF;AACxF,cAAc,eAAe,CAAC;AAE9B,mBAAmB;AACnB,cAAc,uBAAuB,CAAC;AAEtC,uCAAuC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,oBAAoB;AACpB,OAAO,EAAE,qBAAqB,EAA2B,MAAM,wBAAwB,CAAC;AAExF,yCAAyC;AACzC,OAAO,EACN,oBAAoB,EAIpB,MAAM,kBAAkB,CAAC;AAE1B,uCAAuC;AACvC,OAAO,EACN,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,WAAW,EACX,aAAa,EAMb,MAAM,oBAAoB,CAAC;AAE5B,4EAA4E;AAC5E,uEAAuE;AACvE,OAAO,EACN,iBAAiB,EAIjB,MAAM,cAAc,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"references-service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/references-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"references-service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/references-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD;;;;;;;;;GASG;AACH,qBAAa,iBAAiB;IACjB,OAAO,CAAC,eAAe;gBAAf,eAAe,EAAE,eAAe;IAEpD;;;OAGG;IACG,iBAAiB,CACtB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,UAAU,GAAG,IAAI,EACzB,QAAQ,EAAE,UAAU,EAAE,GACpB,OAAO,CAAC,IAAI,CAAC;IAShB;;;;;;;OAOG;IACG,eAAe,CACpB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,UAAU,EAAE,EACrB,gBAAgB,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,GACjF,OAAO,CAAC,IAAI,CAAC;CAwBhB"}
|
|
@@ -111,6 +111,20 @@ export declare function isInstanceRole(auth: Auth): boolean;
|
|
|
111
111
|
* seed for the org role so behavior remains safe.
|
|
112
112
|
*/
|
|
113
113
|
export declare function hasCapability(auth: Auth, capability: Capability | (string & {})): boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Expand an API key's coarse `read`/`write` scopes into capabilities.
|
|
116
|
+
*
|
|
117
|
+
* The compatibility path for keys issued before the capability model existed,
|
|
118
|
+
* and the default for keys created without an explicit allowlist.
|
|
119
|
+
*
|
|
120
|
+
* **This expansion is not itself a permission check.** It says what the scopes
|
|
121
|
+
* mean, not what the key's owner may actually do — the caller is responsible for
|
|
122
|
+
* intersecting the result with the owner's grantable set before trusting it, or
|
|
123
|
+
* a `write` key would confer `document.delete` to an owner whose role never had
|
|
124
|
+
* it. `AuthService.validateApiKey` does that clamp; anything else deriving
|
|
125
|
+
* capabilities from scopes must too.
|
|
126
|
+
*/
|
|
127
|
+
export declare function coarseApiKeyCapabilities(permissions: readonly string[]): string[];
|
|
114
128
|
/**
|
|
115
129
|
* Resolve the effective capability set for an Auth.
|
|
116
130
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/lib/types/capabilities.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/lib/types/capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -298,6 +298,37 @@ export function isInstanceRole(auth) {
|
|
|
298
298
|
export function hasCapability(auth, capability) {
|
|
299
299
|
return resolveCapabilities(auth).has(capability);
|
|
300
300
|
}
|
|
301
|
+
/** What the coarse `read` scope buys a key. */
|
|
302
|
+
const API_KEY_READ_CAPABILITIES = ['document.read', 'asset.read'];
|
|
303
|
+
/** What the coarse `write` scope adds on top. */
|
|
304
|
+
const API_KEY_WRITE_CAPABILITIES = [
|
|
305
|
+
'document.create',
|
|
306
|
+
'document.update',
|
|
307
|
+
'document.delete',
|
|
308
|
+
'document.publish',
|
|
309
|
+
'document.unpublish',
|
|
310
|
+
'asset.upload',
|
|
311
|
+
'asset.delete'
|
|
312
|
+
];
|
|
313
|
+
/**
|
|
314
|
+
* Expand an API key's coarse `read`/`write` scopes into capabilities.
|
|
315
|
+
*
|
|
316
|
+
* The compatibility path for keys issued before the capability model existed,
|
|
317
|
+
* and the default for keys created without an explicit allowlist.
|
|
318
|
+
*
|
|
319
|
+
* **This expansion is not itself a permission check.** It says what the scopes
|
|
320
|
+
* mean, not what the key's owner may actually do — the caller is responsible for
|
|
321
|
+
* intersecting the result with the owner's grantable set before trusting it, or
|
|
322
|
+
* a `write` key would confer `document.delete` to an owner whose role never had
|
|
323
|
+
* it. `AuthService.validateApiKey` does that clamp; anything else deriving
|
|
324
|
+
* capabilities from scopes must too.
|
|
325
|
+
*/
|
|
326
|
+
export function coarseApiKeyCapabilities(permissions) {
|
|
327
|
+
const caps = [...API_KEY_READ_CAPABILITIES];
|
|
328
|
+
if (permissions.includes('write'))
|
|
329
|
+
caps.push(...API_KEY_WRITE_CAPABILITIES);
|
|
330
|
+
return caps;
|
|
331
|
+
}
|
|
301
332
|
/**
|
|
302
333
|
* Resolve the effective capability set for an Auth.
|
|
303
334
|
*
|
|
@@ -318,25 +349,13 @@ export function resolveCapabilities(auth) {
|
|
|
318
349
|
if (auth.type === 'session' && INSTANCE_ROLE_OVERRIDES.has(auth.user.role)) {
|
|
319
350
|
return new Set(ALL_CAPABILITIES);
|
|
320
351
|
}
|
|
352
|
+
// Reached only when the key carries no capability list at all — an explicit
|
|
353
|
+
// one, including an empty one, is authoritative and was returned above.
|
|
354
|
+
// "Empty" must mean *nothing*, never "fall back to the coarse set": an
|
|
355
|
+
// allowlist that a clamp stripped to nothing would otherwise resolve to more
|
|
356
|
+
// than it asked for.
|
|
321
357
|
if (auth.type === 'api_key') {
|
|
322
|
-
|
|
323
|
-
// to exactly what they need (e.g. a key that can only publish one
|
|
324
|
-
// collection). Falls back to the coarse read/write mapping otherwise
|
|
325
|
-
// for keys issued before the capability model existed.
|
|
326
|
-
if (Array.isArray(auth.capabilities) && auth.capabilities.length > 0) {
|
|
327
|
-
return new Set(auth.capabilities);
|
|
328
|
-
}
|
|
329
|
-
const caps = new Set(['document.read', 'asset.read']);
|
|
330
|
-
if (auth.permissions.includes('write')) {
|
|
331
|
-
caps.add('document.create');
|
|
332
|
-
caps.add('document.update');
|
|
333
|
-
caps.add('document.delete');
|
|
334
|
-
caps.add('document.publish');
|
|
335
|
-
caps.add('document.unpublish');
|
|
336
|
-
caps.add('asset.upload');
|
|
337
|
-
caps.add('asset.delete');
|
|
338
|
-
}
|
|
339
|
-
return caps;
|
|
358
|
+
return new Set(coarseApiKeyCapabilities(auth.permissions));
|
|
340
359
|
}
|
|
341
360
|
// Session without pre-resolved capabilities → seed fallback.
|
|
342
361
|
const builtin = BUILTIN_ROLE_SEED[auth.organizationRole];
|