canopycms 0.0.61-int.74 → 0.0.61
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/ai/handler.js +1 -1
- package/dist/ai/handler.js.map +1 -1
- package/dist/api/assets.d.ts.map +1 -1
- package/dist/api/assets.js +36 -4
- package/dist/api/assets.js.map +1 -1
- package/dist/api/branch-status.d.ts.map +1 -1
- package/dist/api/branch-status.js +56 -0
- package/dist/api/branch-status.js.map +1 -1
- package/dist/api/branch-withdraw.d.ts.map +1 -1
- package/dist/api/branch-withdraw.js +14 -3
- package/dist/api/branch-withdraw.js.map +1 -1
- package/dist/api/branch.d.ts +31 -2
- package/dist/api/branch.d.ts.map +1 -1
- package/dist/api/branch.js +252 -13
- package/dist/api/branch.js.map +1 -1
- package/dist/api/content.d.ts.map +1 -1
- package/dist/api/content.js +12 -4
- package/dist/api/content.js.map +1 -1
- package/dist/api/entries.d.ts.map +1 -1
- package/dist/api/entries.js +11 -9
- package/dist/api/entries.js.map +1 -1
- package/dist/api/guards.d.ts.map +1 -1
- package/dist/api/guards.js +12 -5
- package/dist/api/guards.js.map +1 -1
- package/dist/api/permissions.d.ts +2 -2
- package/dist/api/permissions.d.ts.map +1 -1
- package/dist/api/permissions.js +51 -3
- package/dist/api/permissions.js.map +1 -1
- package/dist/api/reference-options.d.ts.map +1 -1
- package/dist/api/reference-options.js +10 -17
- package/dist/api/reference-options.js.map +1 -1
- package/dist/api/resolve-references.d.ts.map +1 -1
- package/dist/api/resolve-references.js +3 -1
- package/dist/api/resolve-references.js.map +1 -1
- package/dist/api/schema.d.ts.map +1 -1
- package/dist/api/schema.js +3 -2
- package/dist/api/schema.js.map +1 -1
- package/dist/api/settings-helpers.d.ts.map +1 -1
- package/dist/api/settings-helpers.js +6 -5
- package/dist/api/settings-helpers.js.map +1 -1
- package/dist/assets/pipeline.d.ts +11 -2
- package/dist/assets/pipeline.d.ts.map +1 -1
- package/dist/assets/pipeline.js +114 -2
- package/dist/assets/pipeline.js.map +1 -1
- package/dist/assets/transform-directives.d.ts +18 -0
- package/dist/assets/transform-directives.d.ts.map +1 -1
- package/dist/assets/transform-directives.js +18 -0
- package/dist/assets/transform-directives.js.map +1 -1
- package/dist/assets/transform.d.ts.map +1 -1
- package/dist/assets/transform.js +1 -10
- package/dist/assets/transform.js.map +1 -1
- package/dist/auth/types.d.ts +29 -0
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/authorization/index.d.ts +1 -1
- package/dist/authorization/index.d.ts.map +1 -1
- package/dist/authorization/index.js +1 -1
- package/dist/authorization/index.js.map +1 -1
- package/dist/authorization/protected-branch.d.ts +75 -0
- package/dist/authorization/protected-branch.d.ts.map +1 -1
- package/dist/authorization/protected-branch.js +39 -0
- package/dist/authorization/protected-branch.js.map +1 -1
- package/dist/branch-registry.d.ts.map +1 -1
- package/dist/branch-registry.js +5 -1
- package/dist/branch-registry.js.map +1 -1
- package/dist/branch-schema-cache.d.ts.map +1 -1
- package/dist/branch-schema-cache.js +9 -0
- package/dist/branch-schema-cache.js.map +1 -1
- package/dist/build/generate-ai-content.js +1 -1
- package/dist/build/generate-ai-content.js.map +1 -1
- package/dist/cli/cli.js +1442 -828
- package/dist/cli/generate-ai-content.js +404 -136
- package/dist/cli/init.d.ts +8 -2
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +440 -151
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/project-detect.d.ts +89 -0
- package/dist/cli/project-detect.d.ts.map +1 -0
- package/dist/cli/project-detect.js +240 -0
- package/dist/cli/project-detect.js.map +1 -0
- package/dist/cli/template-files/Dockerfile.cms.template +11 -6
- package/dist/cli/template-files/cdk-app.ts.template +82 -0
- package/dist/cli/template-files/cdk.json.template +9 -0
- package/dist/cli/template-files/cms-stack.ts.template +124 -0
- package/dist/cli/template-files/deploy-cms.yml.template +125 -13
- package/dist/cli/template-files/dockerignore.template +2 -1
- package/dist/cli/templates.d.ts +26 -2
- package/dist/cli/templates.d.ts.map +1 -1
- package/dist/cli/templates.js +36 -4
- package/dist/cli/templates.js.map +1 -1
- package/dist/config/schemas/config.d.ts +2 -3
- package/dist/config/schemas/config.d.ts.map +1 -1
- package/dist/config/schemas/config.js +21 -1
- package/dist/config/schemas/config.js.map +1 -1
- package/dist/config/validation.d.ts +9 -0
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +22 -12
- package/dist/config/validation.js.map +1 -1
- package/dist/content-reader.js +1 -1
- package/dist/content-reader.js.map +1 -1
- package/dist/content-store.d.ts +11 -0
- package/dist/content-store.d.ts.map +1 -1
- package/dist/content-store.js +2 -1
- package/dist/content-store.js.map +1 -1
- package/dist/dev-content-watcher.d.ts.map +1 -1
- package/dist/dev-content-watcher.js +4 -1
- package/dist/dev-content-watcher.js.map +1 -1
- package/dist/editor/BranchManager.d.ts +15 -0
- package/dist/editor/BranchManager.d.ts.map +1 -1
- package/dist/editor/BranchManager.js +43 -9
- package/dist/editor/BranchManager.js.map +1 -1
- package/dist/editor/CanopyEditor.d.ts.map +1 -1
- package/dist/editor/CanopyEditor.js +2 -2
- package/dist/editor/CanopyEditor.js.map +1 -1
- package/dist/editor/Editor.d.ts.map +1 -1
- package/dist/editor/Editor.js +110 -48
- package/dist/editor/Editor.js.map +1 -1
- package/dist/editor/admin/SystemHealthPanel.d.ts.map +1 -1
- package/dist/editor/admin/SystemHealthPanel.js +9 -8
- package/dist/editor/admin/SystemHealthPanel.js.map +1 -1
- package/dist/editor/components/EditorHeader.d.ts +6 -0
- package/dist/editor/components/EditorHeader.d.ts.map +1 -1
- package/dist/editor/components/EditorHeader.js +76 -23
- package/dist/editor/components/EditorHeader.js.map +1 -1
- package/dist/editor/components/EntryCreateModal.d.ts.map +1 -1
- package/dist/editor/components/EntryCreateModal.js +21 -6
- package/dist/editor/components/EntryCreateModal.js.map +1 -1
- package/dist/editor/context/SWRProvider.d.ts +31 -0
- package/dist/editor/context/SWRProvider.d.ts.map +1 -0
- package/dist/editor/context/SWRProvider.js +12 -0
- package/dist/editor/context/SWRProvider.js.map +1 -0
- package/dist/editor/context/index.d.ts +3 -0
- package/dist/editor/context/index.d.ts.map +1 -1
- package/dist/editor/context/index.js +3 -0
- package/dist/editor/context/index.js.map +1 -1
- package/dist/editor/editor-utils.d.ts.map +1 -1
- package/dist/editor/editor-utils.js +8 -2
- package/dist/editor/editor-utils.js.map +1 -1
- package/dist/editor/fields/ImageField.d.ts.map +1 -1
- package/dist/editor/fields/ImageField.js +27 -3
- package/dist/editor/fields/ImageField.js.map +1 -1
- package/dist/editor/fields/ReferenceField.d.ts.map +1 -1
- package/dist/editor/fields/ReferenceField.js +52 -31
- package/dist/editor/fields/ReferenceField.js.map +1 -1
- package/dist/editor/hooks/__test__/test-utils.d.ts +38 -3
- package/dist/editor/hooks/__test__/test-utils.d.ts.map +1 -1
- package/dist/editor/hooks/__test__/test-utils.js +50 -4
- package/dist/editor/hooks/__test__/test-utils.js.map +1 -1
- package/dist/editor/hooks/index.d.ts +4 -1
- package/dist/editor/hooks/index.d.ts.map +1 -1
- package/dist/editor/hooks/index.js +4 -1
- package/dist/editor/hooks/index.js.map +1 -1
- package/dist/editor/hooks/useBranchManager.d.ts +21 -1
- package/dist/editor/hooks/useBranchManager.d.ts.map +1 -1
- package/dist/editor/hooks/useBranchManager.js +68 -32
- package/dist/editor/hooks/useBranchManager.js.map +1 -1
- package/dist/editor/hooks/useBranchesData.d.ts +57 -0
- package/dist/editor/hooks/useBranchesData.d.ts.map +1 -0
- package/dist/editor/hooks/useBranchesData.js +69 -0
- package/dist/editor/hooks/useBranchesData.js.map +1 -0
- package/dist/editor/hooks/useCommentSystem.d.ts.map +1 -1
- package/dist/editor/hooks/useCommentSystem.js +24 -22
- package/dist/editor/hooks/useCommentSystem.js.map +1 -1
- package/dist/editor/hooks/useCommentsData.d.ts +29 -0
- package/dist/editor/hooks/useCommentsData.d.ts.map +1 -0
- package/dist/editor/hooks/useCommentsData.js +40 -0
- package/dist/editor/hooks/useCommentsData.js.map +1 -0
- package/dist/editor/hooks/useDraftManager.d.ts.map +1 -1
- package/dist/editor/hooks/useDraftManager.js +32 -18
- package/dist/editor/hooks/useDraftManager.js.map +1 -1
- package/dist/editor/hooks/useEntriesData.d.ts +35 -0
- package/dist/editor/hooks/useEntriesData.d.ts.map +1 -0
- package/dist/editor/hooks/useEntriesData.js +96 -0
- package/dist/editor/hooks/useEntriesData.js.map +1 -0
- package/dist/editor/hooks/useEntryManager.d.ts +8 -15
- package/dist/editor/hooks/useEntryManager.d.ts.map +1 -1
- package/dist/editor/hooks/useEntryManager.js +259 -117
- package/dist/editor/hooks/useEntryManager.js.map +1 -1
- package/dist/editor/hooks/usePermissionManager.d.ts +2 -2
- package/dist/editor/hooks/usePermissionManager.d.ts.map +1 -1
- package/dist/editor/hooks/usePermissionManager.js +11 -9
- package/dist/editor/hooks/usePermissionManager.js.map +1 -1
- package/dist/editor/hooks/useReferenceResolution.d.ts.map +1 -1
- package/dist/editor/hooks/useReferenceResolution.js +24 -1
- package/dist/editor/hooks/useReferenceResolution.js.map +1 -1
- package/dist/editor/media/MediaLibraryBody.d.ts.map +1 -1
- package/dist/editor/media/MediaLibraryBody.js +12 -2
- package/dist/editor/media/MediaLibraryBody.js.map +1 -1
- package/dist/editor/permission-manager/GroupSelector.d.ts.map +1 -1
- package/dist/editor/permission-manager/GroupSelector.js +7 -2
- package/dist/editor/permission-manager/GroupSelector.js.map +1 -1
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.d.ts +3 -3
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.d.ts.map +1 -1
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.js +1 -0
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.js.map +1 -1
- package/dist/editor/permission-manager/types.d.ts +6 -4
- package/dist/editor/permission-manager/types.d.ts.map +1 -1
- package/dist/editor/test-setup.js +8 -0
- package/dist/editor/test-setup.js.map +1 -1
- package/dist/git-manager.d.ts +126 -9
- package/dist/git-manager.d.ts.map +1 -1
- package/dist/git-manager.js +251 -27
- package/dist/git-manager.js.map +1 -1
- package/dist/github-service.d.ts.map +1 -1
- package/dist/github-service.js +13 -7
- package/dist/github-service.js.map +1 -1
- package/dist/http/handler.d.ts.map +1 -1
- package/dist/http/handler.js +8 -2
- package/dist/http/handler.js.map +1 -1
- package/dist/operating-mode/client-unsafe-strategy.d.ts.map +1 -1
- package/dist/operating-mode/client-unsafe-strategy.js +7 -8
- package/dist/operating-mode/client-unsafe-strategy.js.map +1 -1
- package/dist/operating-mode/deployment-name.d.ts +28 -0
- package/dist/operating-mode/deployment-name.d.ts.map +1 -0
- package/dist/operating-mode/deployment-name.js +78 -0
- package/dist/operating-mode/deployment-name.js.map +1 -0
- package/dist/operating-mode/index.d.ts +5 -1
- package/dist/operating-mode/index.d.ts.map +1 -1
- package/dist/operating-mode/index.js +7 -1
- package/dist/operating-mode/index.js.map +1 -1
- package/dist/operating-mode/types.d.ts +13 -3
- package/dist/operating-mode/types.d.ts.map +1 -1
- package/dist/paths/branch-name.d.ts +38 -0
- package/dist/paths/branch-name.d.ts.map +1 -1
- package/dist/paths/branch-name.js +46 -0
- package/dist/paths/branch-name.js.map +1 -1
- package/dist/paths/index.d.ts +1 -1
- package/dist/paths/index.d.ts.map +1 -1
- package/dist/paths/index.js +1 -1
- package/dist/paths/index.js.map +1 -1
- package/dist/reference-resolver.d.ts +6 -2
- package/dist/reference-resolver.d.ts.map +1 -1
- package/dist/reference-resolver.js +8 -1
- package/dist/reference-resolver.js.map +1 -1
- package/dist/schema/meta-loader.d.ts.map +1 -1
- package/dist/schema/meta-loader.js +10 -2
- package/dist/schema/meta-loader.js.map +1 -1
- package/dist/schema/schema-store.d.ts +11 -2
- package/dist/schema/schema-store.d.ts.map +1 -1
- package/dist/schema/schema-store.js +23 -11
- package/dist/schema/schema-store.js.map +1 -1
- package/dist/settings-workspace.d.ts +0 -15
- package/dist/settings-workspace.d.ts.map +1 -1
- package/dist/settings-workspace.js +97 -1
- package/dist/settings-workspace.js.map +1 -1
- package/dist/types.d.ts +63 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/debug.d.ts +11 -0
- package/dist/utils/debug.d.ts.map +1 -1
- package/dist/utils/debug.js +12 -1
- package/dist/utils/debug.js.map +1 -1
- package/dist/utils/git.d.ts +38 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +69 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/logger.d.ts +71 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +85 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/validation/entry-type-reference-validator.d.ts +33 -0
- package/dist/validation/entry-type-reference-validator.d.ts.map +1 -0
- package/dist/validation/entry-type-reference-validator.js +110 -0
- package/dist/validation/entry-type-reference-validator.js.map +1 -0
- package/dist/worker/cms-worker.d.ts +232 -3
- package/dist/worker/cms-worker.d.ts.map +1 -1
- package/dist/worker/cms-worker.js +856 -87
- package/dist/worker/cms-worker.js.map +1 -1
- package/dist/worker/log.d.ts +61 -0
- package/dist/worker/log.d.ts.map +1 -0
- package/dist/worker/log.js +74 -0
- package/dist/worker/log.js.map +1 -0
- package/package.json +3 -1
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Server-only - never import this module from client/editor code. It pulls
|
|
8
8
|
* in `file-type`, `image-size`, and the SVG sanitizer, none of which belong
|
|
9
|
-
* in a browser bundle.
|
|
9
|
+
* in a browser bundle. `sharp` is loaded dynamically (see
|
|
10
|
+
* `rasterIsDecodable` below) rather than statically imported, but is just as
|
|
11
|
+
* server-only - it is never reachable from a browser bundle either way.
|
|
10
12
|
*/
|
|
11
13
|
import type { AssetMeta } from './types';
|
|
12
14
|
/** Client-declared content types accepted at presign time (UX only - never trusted at finalize). */
|
|
@@ -32,7 +34,14 @@ export interface FinalizeSuccess {
|
|
|
32
34
|
}
|
|
33
35
|
export interface FinalizeRejection {
|
|
34
36
|
ok: false;
|
|
35
|
-
|
|
37
|
+
/**
|
|
38
|
+
* 413: over a size/pixel cap. 415: unrecognized/unsupported file type.
|
|
39
|
+
* 422: recognized, in-limits raster whose bytes do not actually decode -
|
|
40
|
+
* the same status `applyTransform` (transform.ts) uses for a decode
|
|
41
|
+
* failure, so a client sees one consistent status for "this file's bytes
|
|
42
|
+
* don't decode" regardless of which half of the pipeline caught it.
|
|
43
|
+
*/
|
|
44
|
+
status: 413 | 415 | 422;
|
|
36
45
|
error: string;
|
|
37
46
|
}
|
|
38
47
|
export type FinalizeResult = FinalizeSuccess | FinalizeRejection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/assets/pipeline.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/assets/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAMxC,oGAAoG;AACpG,eAAO,MAAM,4BAA4B,aAIvC,CAAA;AAkBF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,UAAU,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,IAAI,CAAA;IACR,IAAI,EAAE,SAAS,CAAA;IACf,iGAAiG;IACjG,IAAI,EAAE,UAAU,CAAA;IAChB,YAAY,CAAC,EAAE,oBAAoB,CAAA;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,KAAK,CAAA;IACT;;;;;;OAMG;IACH,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,iBAAiB,CAAA;AAkLhE;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAsGvF"}
|
package/dist/assets/pipeline.js
CHANGED
|
@@ -6,14 +6,17 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Server-only - never import this module from client/editor code. It pulls
|
|
8
8
|
* in `file-type`, `image-size`, and the SVG sanitizer, none of which belong
|
|
9
|
-
* in a browser bundle.
|
|
9
|
+
* in a browser bundle. `sharp` is loaded dynamically (see
|
|
10
|
+
* `rasterIsDecodable` below) rather than statically imported, but is just as
|
|
11
|
+
* server-only - it is never reachable from a browser bundle either way.
|
|
10
12
|
*/
|
|
11
13
|
import { fileTypeFromBuffer } from 'file-type';
|
|
12
14
|
import { imageSize } from 'image-size';
|
|
13
15
|
import { create as createContentDisposition } from 'content-disposition';
|
|
16
|
+
import { getErrorMessage } from '../utils/error.js';
|
|
14
17
|
import { hashBytes, publicKey, slugifyFilename } from './keys.js';
|
|
15
18
|
import { sanitizeSvg } from './svg-sanitizer.js';
|
|
16
|
-
import { MAX_INPUT_PIXELS } from './transform-directives.js';
|
|
19
|
+
import { MAX_ANIMATED_FRAMES, MAX_INPUT_PIXELS } from './transform-directives.js';
|
|
17
20
|
const RASTER_MIME_TYPES = new Set(['image/png', 'image/jpeg', 'image/webp', 'image/gif']);
|
|
18
21
|
const PDF_MIME_TYPE = 'application/pdf';
|
|
19
22
|
const SVG_MIME_TYPE = 'image/svg+xml';
|
|
@@ -99,6 +102,108 @@ function computeDimensions(data) {
|
|
|
99
102
|
return {};
|
|
100
103
|
}
|
|
101
104
|
}
|
|
105
|
+
/** Output dims for the throwaway decode-validation resize below - tiny enough that the encode side costs nothing; what has to be bounded is the mandatory decode, not this. */
|
|
106
|
+
const DECODE_CHECK_SIZE = 8;
|
|
107
|
+
/**
|
|
108
|
+
* User-facing rejection message for an undecodable raster - deliberately
|
|
109
|
+
* generic (never the raw libvips string, e.g. "vipspng: libpng read error"),
|
|
110
|
+
* matching how the sniff/size rejections above also speak in terms an editor
|
|
111
|
+
* can act on rather than surfacing library internals.
|
|
112
|
+
*/
|
|
113
|
+
const UNDECODABLE_RASTER_ERROR = 'This image could not be decoded - it may be corrupt or truncated. Try re-exporting it and uploading again.';
|
|
114
|
+
/**
|
|
115
|
+
* Force a REAL pixel decode of a raster upload, catching the defect
|
|
116
|
+
* `computeDimensions` above (header-only, explicitly non-fatal) cannot: a
|
|
117
|
+
* corrupt PNG IDAT / truncated JPEG scan / etc. still carries a perfectly
|
|
118
|
+
* valid IHDR/SOF, so `file-type`/`image-size` both accept bytes that the
|
|
119
|
+
* transform engine's real sharp/libvips decoder (transform.ts's
|
|
120
|
+
* `applyTransform`) later refuses - with a raw "vipspng: libpng read error"
|
|
121
|
+
* - by which point the asset has already "uploaded successfully" and renders
|
|
122
|
+
* broken everywhere it's shown. This makes finalize use the same decoder
|
|
123
|
+
* transform.ts does, before the bytes are ever persisted, instead of only
|
|
124
|
+
* discovering the mismatch at render time.
|
|
125
|
+
*
|
|
126
|
+
* `.resize()` to a tiny output - NOT `.metadata()` - is what makes this a
|
|
127
|
+
* real test: `metadata()` only reads header fields, exactly what
|
|
128
|
+
* `computeDimensions` above already does and exactly what fails to catch
|
|
129
|
+
* this class of bug. libvips cannot compute a resized pixel buffer without
|
|
130
|
+
* fully decoding the source, so a corrupt IDAT/scan still throws here even
|
|
131
|
+
* though it would not throw from a header-only read. The output itself is
|
|
132
|
+
* immediately discarded - decode is the expensive, unavoidable part of this
|
|
133
|
+
* check; encoding an 8x8 buffer is not.
|
|
134
|
+
*
|
|
135
|
+
* ANIMATION: sharp defaults to `pages: 1`, i.e. frame 0 only. That is not
|
|
136
|
+
* enough to mirror `applyTransform`, which reads
|
|
137
|
+
* `min(totalPages, MAX_ANIMATED_FRAMES)` frames - a GIF/WebP whose frame 0 is
|
|
138
|
+
* clean but whose frame 3 is corrupt passed this check and then threw
|
|
139
|
+
* `gifload_buffer: Invalid frame data` at transform time, which is the very
|
|
140
|
+
* "accepted at upload, unrenderable at render" state this function exists to
|
|
141
|
+
* prevent, just moved from single-frame to animated sources. So the page
|
|
142
|
+
* count is probed and passed through, with the SAME cap constant transform.ts
|
|
143
|
+
* uses (both import it from transform-directives.ts) - which also means the
|
|
144
|
+
* two sides ignore the same frames past the cap, so a many-hundred-frame
|
|
145
|
+
* source cannot produce a disagreement either.
|
|
146
|
+
*
|
|
147
|
+
* The probe is a separate, deliberate step rather than a guess: sharp's
|
|
148
|
+
* `pages` is a fixed request, not an upper bound, so a value EXCEEDING the
|
|
149
|
+
* source's real page count makes it throw "bad page number" (transform.ts
|
|
150
|
+
* documents the same constraint at its own call site). A metadata-only probe
|
|
151
|
+
* costs effectively nothing - it is a header read, not a decode.
|
|
152
|
+
*
|
|
153
|
+
* `limitInputPixels: MAX_INPUT_PIXELS` reuses transform.ts's own
|
|
154
|
+
* decompression-bomb cap (imported above, not redefined) so this validation
|
|
155
|
+
* step cannot itself become a bomb vector on a header that lied about its
|
|
156
|
+
* dimensions - in practice the pixel-count check in the caller below already
|
|
157
|
+
* rejects those before this function is ever reached, but the cap is cheap
|
|
158
|
+
* insurance against relying on that ordering. Note the caller's check reads
|
|
159
|
+
* single-frame dimensions from `image-size`, so for animated sources it is
|
|
160
|
+
* `limitInputPixels` here (which sees the full multi-page strip) that bounds
|
|
161
|
+
* total decoded pixels - exactly as it does in transform.ts.
|
|
162
|
+
*
|
|
163
|
+
* Fails OPEN vs. fails CLOSED, deliberately different failure modes:
|
|
164
|
+
* - sharp itself cannot be loaded (native binary missing for this
|
|
165
|
+
* platform/architecture, e.g. a cross-arch build) - there is no decoder
|
|
166
|
+
* available in this environment at all, which is an environment problem,
|
|
167
|
+
* not a fact about the uploaded file. Log it and let the upload through
|
|
168
|
+
* unvalidated (the pre-fix behavior) rather than failing every raster
|
|
169
|
+
* upload because of a deployment issue.
|
|
170
|
+
* - sharp loads fine but its decoder REJECTS the bytes - that IS a fact
|
|
171
|
+
* about this specific file, and an actionable one. Return false so the
|
|
172
|
+
* caller rejects the upload. A throw from the page-count probe counts as
|
|
173
|
+
* this case, not the one above: the module loaded, so an unreadable header
|
|
174
|
+
* is again a fact about the file, and `applyTransform` would reject the
|
|
175
|
+
* same bytes from its own probe with the same 422.
|
|
176
|
+
*/
|
|
177
|
+
async function rasterIsDecodable(data) {
|
|
178
|
+
// Typed as the whole module (not just its callable default export) and
|
|
179
|
+
// dereferenced via `.default` below - sharp's own types ship an
|
|
180
|
+
// `export const sharp: SharpConstructor; export default sharp;` pair for
|
|
181
|
+
// the ESM entry point resolved by `import()`, so `typeof import('sharp')`
|
|
182
|
+
// is the two-property namespace object, not the callable itself.
|
|
183
|
+
let sharpModule;
|
|
184
|
+
try {
|
|
185
|
+
sharpModule = await import('sharp');
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
console.warn(`[canopycms] sharp could not be loaded - skipping raster decode validation at finalize: ${getErrorMessage(err)}`);
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
try {
|
|
192
|
+
const probeMeta = await sharpModule
|
|
193
|
+
.default(data, { limitInputPixels: MAX_INPUT_PIXELS })
|
|
194
|
+
.metadata();
|
|
195
|
+
const pagesToRead = Math.min(probeMeta.pages ?? 1, MAX_ANIMATED_FRAMES);
|
|
196
|
+
await sharpModule
|
|
197
|
+
.default(data, { pages: pagesToRead, limitInputPixels: MAX_INPUT_PIXELS })
|
|
198
|
+
.resize({ width: DECODE_CHECK_SIZE, height: DECODE_CHECK_SIZE, fit: 'fill' })
|
|
199
|
+
.toBuffer();
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
console.warn(`[canopycms] raster upload failed real pixel decode at finalize: ${getErrorMessage(err)}`);
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
102
207
|
/**
|
|
103
208
|
* Run the finalize pipeline over freshly-uploaded bytes: sniff the real file
|
|
104
209
|
* type (never trust the client-declared contentType beyond presign-time UX),
|
|
@@ -166,6 +271,13 @@ export async function runFinalizePipeline(input) {
|
|
|
166
271
|
};
|
|
167
272
|
}
|
|
168
273
|
}
|
|
274
|
+
// Only rasters ever reach sharp downstream (svg/pdf are served statically,
|
|
275
|
+
// never transformed) - checked AFTER the cheap header-based pixel cap
|
|
276
|
+
// above, so an oversized/bomb-shaped input is rejected without ever
|
|
277
|
+
// spending a real decode on it.
|
|
278
|
+
if (kind === 'raster' && !(await rasterIsDecodable(canonicalData))) {
|
|
279
|
+
return { ok: false, status: 422, error: UNDECODABLE_RASTER_ERROR };
|
|
280
|
+
}
|
|
169
281
|
const meta = {
|
|
170
282
|
hash32,
|
|
171
283
|
filename: input.filename,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/assets/pipeline.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/assets/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -69,6 +69,24 @@ export type ParseTransformPathResult = ({
|
|
|
69
69
|
* source (e.g. a 30000x30000 solid-color PNG).
|
|
70
70
|
*/
|
|
71
71
|
export declare const MAX_INPUT_PIXELS: number;
|
|
72
|
+
/**
|
|
73
|
+
* Cap on decoded animated frames (GIF/WebP) - without this, `{ animated: true }`
|
|
74
|
+
* (sharp's `pages: -1`) decodes every frame of a maliciously-crafted
|
|
75
|
+
* many-thousand-frame animation into memory at once, a decompression-bomb
|
|
76
|
+
* vector distinct from (and not covered by) `limitInputPixels`, which only
|
|
77
|
+
* bounds a single frame's width x height. 60 frames covers any reasonable
|
|
78
|
+
* animated asset (2s at 30fps) with headroom.
|
|
79
|
+
*
|
|
80
|
+
* Shared here for the same reasons as `MAX_INPUT_PIXELS` above, plus one that
|
|
81
|
+
* is load-bearing rather than tidy: upload finalize (pipeline.ts's
|
|
82
|
+
* `rasterIsDecodable`) and the transform engine (transform.ts's
|
|
83
|
+
* `applyTransform`) must decode the SAME frames, or finalize accepts a file
|
|
84
|
+
* the transform engine will later refuse - the "uploads fine, renders broken"
|
|
85
|
+
* defect. Reading one number from one dependency-free module is what makes the
|
|
86
|
+
* two agree by construction (including on which frames past the cap they both
|
|
87
|
+
* ignore) rather than by two constants that happen to match today.
|
|
88
|
+
*/
|
|
89
|
+
export declare const MAX_ANIMATED_FRAMES = 60;
|
|
72
90
|
/** True if `width` is on the allowlist: a multiple of 160 in [160, 4096]. */
|
|
73
91
|
export declare function isAllowedTransformWidth(width: number): boolean;
|
|
74
92
|
/** True if `quality` is on the allowlist: a multiple of 5 in [30, 95]. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform-directives.d.ts","sourceRoot":"","sources":["../../src/assets/transform-directives.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,gFAAgF;AAChF,eAAO,MAAM,4BAA4B,SAAS,CAAA;AAElD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAA;AAElD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,2EAA2E;AAC3E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAA;CACxB;AAED,sFAAsF;AACtF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAA;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAA;CACzB;AAED,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,GAAG,gBAAgB,CAAA;AAEvE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAA;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,MAAM,wBAAwB,GAChC,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG,mBAAmB,CAAC,GAC7C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAMlD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,QAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"transform-directives.d.ts","sourceRoot":"","sources":["../../src/assets/transform-directives.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,gFAAgF;AAChF,eAAO,MAAM,4BAA4B,SAAS,CAAA;AAElD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAA;AAElD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,2EAA2E;AAC3E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAA;CACxB;AAED,sFAAsF;AACtF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAA;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAA;CACzB;AAED,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,GAAG,gBAAgB,CAAA;AAEvE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAA;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,MAAM,wBAAwB,GAChC,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG,mBAAmB,CAAC,GAC7C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAMlD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,QAAc,CAAA;AAE3C;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAiCrC,6EAA6E;AAC7E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAI9D;AAQD,0EAA0E;AAC1E,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOlE;AAcD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAOnF;AA0FD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,wBAAwB,CAkCxF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,mBAAmB,GAAG,MAAM,CA4BxE"}
|
|
@@ -40,6 +40,24 @@ const WIDTH_STEP = 160;
|
|
|
40
40
|
* source (e.g. a 30000x30000 solid-color PNG).
|
|
41
41
|
*/
|
|
42
42
|
export const MAX_INPUT_PIXELS = 4096 * 4096;
|
|
43
|
+
/**
|
|
44
|
+
* Cap on decoded animated frames (GIF/WebP) - without this, `{ animated: true }`
|
|
45
|
+
* (sharp's `pages: -1`) decodes every frame of a maliciously-crafted
|
|
46
|
+
* many-thousand-frame animation into memory at once, a decompression-bomb
|
|
47
|
+
* vector distinct from (and not covered by) `limitInputPixels`, which only
|
|
48
|
+
* bounds a single frame's width x height. 60 frames covers any reasonable
|
|
49
|
+
* animated asset (2s at 30fps) with headroom.
|
|
50
|
+
*
|
|
51
|
+
* Shared here for the same reasons as `MAX_INPUT_PIXELS` above, plus one that
|
|
52
|
+
* is load-bearing rather than tidy: upload finalize (pipeline.ts's
|
|
53
|
+
* `rasterIsDecodable`) and the transform engine (transform.ts's
|
|
54
|
+
* `applyTransform`) must decode the SAME frames, or finalize accepts a file
|
|
55
|
+
* the transform engine will later refuse - the "uploads fine, renders broken"
|
|
56
|
+
* defect. Reading one number from one dependency-free module is what makes the
|
|
57
|
+
* two agree by construction (including on which frames past the cap they both
|
|
58
|
+
* ignore) rather than by two constants that happen to match today.
|
|
59
|
+
*/
|
|
60
|
+
export const MAX_ANIMATED_FRAMES = 60;
|
|
43
61
|
// Quality is allowlisted (multiples of 5 in [30, 95] - 14 values) for the
|
|
44
62
|
// same cache-stuffing reason as width: every accepted directive combination
|
|
45
63
|
// becomes a stored cache object in prod, so unbounded q would multiply the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform-directives.js","sourceRoot":"","sources":["../../src/assets/transform-directives.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,gFAAgF;AAChF,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAA;AAsClD,MAAM,SAAS,GAAG,GAAG,CAAA;AACrB,MAAM,SAAS,GAAG,IAAI,CAAA;AACtB,MAAM,UAAU,GAAG,GAAG,CAAA;AAEtB;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"transform-directives.js","sourceRoot":"","sources":["../../src/assets/transform-directives.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,gFAAgF;AAChF,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAA;AAsClD,MAAM,SAAS,GAAG,GAAG,CAAA;AACrB,MAAM,SAAS,GAAG,IAAI,CAAA;AACtB,MAAM,UAAU,GAAG,GAAG,CAAA;AAEtB;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAAA;AAE3C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAA;AAErC,0EAA0E;AAC1E,4EAA4E;AAC5E,2EAA2E;AAC3E,6EAA6E;AAC7E,wEAAwE;AACxE,2EAA2E;AAC3E,MAAM,WAAW,GAAG,EAAE,CAAA;AACtB,MAAM,WAAW,GAAG,EAAE,CAAA;AACtB,MAAM,YAAY,GAAG,CAAC,CAAA;AACtB,MAAM,cAAc,GAAG,CAAC,CAAA;AAExB,MAAM,SAAS,GAAG,gBAAgB,CAAA;AAClC,MAAM,OAAO,GAAG,cAAc,CAAA;AAC9B,MAAM,MAAM,GAAG,kBAAkB,CAAA;AACjC,MAAM,eAAe,GAAG,eAAe,CAAA;AACvC,4EAA4E;AAC5E,4EAA4E;AAC5E,0EAA0E;AAC1E,4EAA4E;AAC5E,wEAAwE;AACxE,0EAA0E;AAC1E,8BAA8B;AAC9B,wDAAwD;AACxD,MAAM,aAAa,GAAG,iCAAiC,CAAA;AAEvD,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;AAE1D,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,CAAA;AAChE,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,OAAO,CACL,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,GAAG,UAAU,KAAK,CAAC,CAChG,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACvB,OAAO,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAC9C,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,yBAAyB,CAAC,OAAe;IACvD,OAAO,CACL,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;QACzB,OAAO,IAAI,WAAW;QACtB,OAAO,IAAI,WAAW;QACtB,OAAO,GAAG,YAAY,KAAK,CAAC,CAC7B,CAAA;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACvB,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAChD,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAC3C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACvB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACpC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;IACxE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAA;IACzD,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IAClC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAA;IACxC,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IACtC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAC7C,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAgB,CAAA;IACrC,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAC7C,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;AACvB,CAAC;AAED,SAAS,eAAe,CAAC,CAAS;IAChC,OAAO,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;AAClC,CAAC;AAED,SAAS,GAAG,CAAC,KAAa;IACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;AAC7B,CAAC;AAED;;;;GAIG;AACH,SAAS,qBAAqB,CAC5B,GAAW;IAEX,IAAI,GAAG,KAAK,4BAA4B,EAAE,CAAC;QACzC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAA;IACrD,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC,kBAAkB,CAAC,CAAA;IAChC,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,IAAI,KAAyB,CAAA;IAC7B,IAAI,MAAgC,CAAA;IACpC,IAAI,OAA2B,CAAA;IAC/B,IAAI,IAA0B,CAAA;IAE9B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC/B,0EAA0E;QAC1E,wEAAwE;QACxE,qEAAqE;QACrE,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,OAAO,GAAG,CAAC,yBAAyB,IAAI,GAAG,CAAC,CAAA;QAC9C,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;QAEnC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO,GAAG,CAAC,2BAA2B,GAAG,GAAG,CAAC,CAAA;QAC/C,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,GAAG,CAAC,6BAA6B,GAAG,GAAG,CAAC,CAAA;QACjD,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAEb,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,GAAG,CAAC,CAAC,CAAC;gBACT,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;gBAC3B,IAAI,CAAC,KAAK,IAAI;oBAAE,OAAO,GAAG,CAAC,mBAAmB,KAAK,GAAG,CAAC,CAAA;gBACvD,KAAK,GAAG,CAAC,CAAA;gBACT,MAAK;YACP,CAAC;YACD,KAAK,GAAG,CAAC,CAAC,CAAC;gBACT,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;oBAAE,OAAO,GAAG,CAAC,oBAAoB,KAAK,GAAG,CAAC,CAAA;gBACpE,MAAM,GAAG,KAAK,CAAA;gBACd,MAAK;YACP,CAAC;YACD,KAAK,GAAG,CAAC,CAAC,CAAC;gBACT,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;gBAC7B,IAAI,CAAC,KAAK,IAAI;oBAAE,OAAO,GAAG,CAAC,qBAAqB,KAAK,GAAG,CAAC,CAAA;gBACzD,OAAO,GAAG,CAAC,CAAA;gBACX,MAAK;YACP,CAAC;YACD,KAAK,GAAG,CAAC,CAAC,CAAC;gBACT,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;gBAC1B,IAAI,CAAC,CAAC;oBAAE,OAAO,GAAG,CAAC,kBAAkB,KAAK,GAAG,CAAC,CAAA;gBAC9C,IAAI,GAAG,CAAC,CAAA;gBACR,MAAK;YACP,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAA;AACpF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAA2B;IAC5D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAC,8DAA8D,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAC7F,CAAC;IACD,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAA;IAEjD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,oBAAoB,MAAM,GAAG,CAAC,CAAA;IAC3C,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACxC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,OAAO,GAAG,CAAC,8BAA8B,OAAO,GAAG,CAAC,CAAA;IACtD,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA;IACtC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,CAAC,kBAAkB,IAAI,GAAG,CAAC,CAAA;IACvC,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAC,CAAA;IACrC,CAAC;IAED,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAA;IAC7D,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC;QACzB,OAAO,gBAAgB,CAAA;IACzB,CAAC;IAED,MAAM,EAAE,UAAU,EAAE,GAAG,gBAAgB,CAAA;IACvC,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACzF,OAAO,GAAG,CAAC,cAAc,GAAG,4BAA4B,UAAU,CAAC,MAAM,GAAG,CAAC,CAAA;IAC/E,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAA+B;IAC9D,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxB,OAAO,4BAA4B,CAAA;IACrC,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,UAAU,CAAC,IAAI,CAAA;QACtC,KAAK,CAAC,IAAI,CACR,KAAK,eAAe,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,EAAE,CAC5F,CAAA;IACH,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;IACtC,CAAC;IACD,IAAI,UAAU,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC,CAAA;IACvC,CAAC;IACD,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC,CAAA;IACrC,CAAC;IAED,sEAAsE;IACtE,mEAAmE;IACnE,0EAA0E;IAC1E,yEAAyE;IACzE,4BAA4B;IAC5B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAA;AAC1E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/assets/transform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAKH,OAAO,
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/assets/transform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAKH,OAAO,EAKL,KAAK,mBAAmB,EACzB,MAAM,wBAAwB,CAAA;AA+B/B,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAA;IAChB,wFAAwF;IACxF,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,IAAI,CAAA;IACR,IAAI,EAAE,UAAU,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,KAAK,CAAA;IACT,6FAA6F;IAC7F,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG,kBAAkB,CAAA;AAgFnE,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,EAC1B,UAAU,EAAE,mBAAmB,GAC9B,OAAO,CAAC,eAAe,CAAC,CAwE1B"}
|
package/dist/assets/transform.js
CHANGED
|
@@ -30,20 +30,11 @@
|
|
|
30
30
|
*/
|
|
31
31
|
import sharp from 'sharp';
|
|
32
32
|
import { getErrorMessage } from '../utils/error.js';
|
|
33
|
-
import { MAX_INPUT_PIXELS, } from './transform-directives.js';
|
|
33
|
+
import { MAX_ANIMATED_FRAMES, MAX_INPUT_PIXELS, } from './transform-directives.js';
|
|
34
34
|
/** Raster formats the transform engine accepts as input. svg/pdf never reach here - they're served statically. */
|
|
35
35
|
const ALLOWED_INPUT_EXTS = new Set(['png', 'jpg', 'jpeg', 'webp', 'gif']);
|
|
36
36
|
/** Defensive cap on encoded output size - prevents cache-stuffing with giant re-encodes. */
|
|
37
37
|
const MAX_OUTPUT_BYTES = 10 * 1024 * 1024;
|
|
38
|
-
/**
|
|
39
|
-
* Cap on decoded animated frames (GIF/WebP) - without this, `{ animated: true }`
|
|
40
|
-
* (sharp's `pages: -1`) decodes every frame of a maliciously-crafted
|
|
41
|
-
* many-thousand-frame animation into memory at once, a decompression-bomb
|
|
42
|
-
* vector distinct from (and not covered by) `limitInputPixels`, which only
|
|
43
|
-
* bounds a single frame's width x height. 60 frames covers any reasonable
|
|
44
|
-
* animated asset (2s at 30fps) with headroom.
|
|
45
|
-
*/
|
|
46
|
-
const MAX_ANIMATED_FRAMES = 60;
|
|
47
38
|
const CONTENT_TYPE_BY_FORMAT = {
|
|
48
39
|
webp: 'image/webp',
|
|
49
40
|
jpeg: 'image/jpeg',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/assets/transform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EACL,gBAAgB,GAIjB,MAAM,wBAAwB,CAAA;AAW/B,kHAAkH;AAClH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAA;AAEzE,4FAA4F;AAC5F,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA;AAEzC
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/assets/transform.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/types.d.ts
CHANGED
|
@@ -17,6 +17,35 @@ export interface GroupMetadata {
|
|
|
17
17
|
description?: string;
|
|
18
18
|
memberCount?: number;
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Where a group offered as a permission target came from: the auth provider
|
|
22
|
+
* ('external'), Canopy's own groups.json ('internal'), or BOTH -- the same ID
|
|
23
|
+
* exists in each universe.
|
|
24
|
+
*
|
|
25
|
+
* 'both' matters for what a grant actually does. The two ID spaces are not
|
|
26
|
+
* namespaced against each other, and `checkPathPermission` matches one
|
|
27
|
+
* flattened `user.groups` list by ID, so granting a colliding ID reaches the
|
|
28
|
+
* internal group's members AND every provider user whose external groups
|
|
29
|
+
* include that ID. Labeling such an option merely 'internal' would understate
|
|
30
|
+
* its blast radius to the admin making the grant.
|
|
31
|
+
*/
|
|
32
|
+
export type GroupSource = 'internal' | 'external' | 'both';
|
|
33
|
+
/**
|
|
34
|
+
* A group offered as a permission target by `permissions.listGroups`.
|
|
35
|
+
*
|
|
36
|
+
* Both universes are valid `allowedGroups` values -- `authResultToCanopyUser`
|
|
37
|
+
* (user.ts) flattens external and internal groups into one `user.groups` list
|
|
38
|
+
* and `checkPathPermission` matches `allowedGroups` against it by ID -- so the
|
|
39
|
+
* picker has to offer both. The two ID spaces are not namespaced against each
|
|
40
|
+
* other, hence `source` to disambiguate them in the UI.
|
|
41
|
+
*
|
|
42
|
+
* Internal options deliberately carry no `memberCount`: member identities and
|
|
43
|
+
* counts stay behind the admin-only `groups.getInternal`, while this endpoint
|
|
44
|
+
* is `privileged` (admin or reviewer).
|
|
45
|
+
*/
|
|
46
|
+
export interface PermissionGroupOption extends GroupMetadata {
|
|
47
|
+
source: GroupSource;
|
|
48
|
+
}
|
|
20
49
|
/**
|
|
21
50
|
* Authentication result from auth plugins.
|
|
22
51
|
* Returns user identity (without final groups) on success.
|
package/dist/auth/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE3D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,YAAY,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,aAAa,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,YAAY,CAAA;QACpB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,qEAAqE;QACrE,cAAc,CAAC,EAAE,aAAa,EAAE,CAAA;KACjC,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE3D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,YAAY,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,aAAa,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAA;AAE1D;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,MAAM,EAAE,WAAW,CAAA;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,YAAY,CAAA;QACpB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,qEAAqE;QACrE,cAAc,CAAC,EAAE,aAAa,EAAE,CAAA;KACjC,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf"}
|
|
@@ -29,7 +29,7 @@ export type { BranchAccessResult, PathPermissionResult, ContentAccessResult, Con
|
|
|
29
29
|
export { parsePermissionPath } from './validation';
|
|
30
30
|
export { checkContentAccess, createCheckContentAccess, createContentAccessChecker, type ContentAccessChecker, } from './content';
|
|
31
31
|
export { checkBranchAccessWithDefault, createCheckBranchAccess, canPerformWorkflowAction, } from './branch';
|
|
32
|
-
export { getBranchProtection, type BranchProtection } from './protected-branch';
|
|
32
|
+
export { getBranchProtection, getBranchWriteProtection, type BranchProtection, type BranchWriteProtection, } from './protected-branch';
|
|
33
33
|
export { checkPathAccess, createCheckPathAccess, resolveDefaultPathAccess } from './path';
|
|
34
34
|
export { RESERVED_GROUPS, type ReservedGroupId, isReservedGroup, stripReservedGroups, isAdmin, isReviewer, isPrivileged, } from './helpers';
|
|
35
35
|
export { PermissionsFileSchema, createDefaultPermissionsFile, type PermissionsFile, loadPermissionsFile, loadPathPermissions, mutatePermissionsFile, ensurePermissionsFile, } from './permissions';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/authorization/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,GACf,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAGlD,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,0BAA0B,EAC1B,KAAK,oBAAoB,GAC1B,MAAM,WAAW,CAAA;AAGlB,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,UAAU,CAAA;AAGjB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/authorization/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,GACf,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAGlD,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,0BAA0B,EAC1B,KAAK,oBAAoB,GAC1B,MAAM,WAAW,CAAA;AAGlB,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,UAAU,CAAA;AAGjB,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,GAC3B,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,QAAQ,CAAA;AAGzF,OAAO,EACL,eAAe,EACf,KAAK,eAAe,EACpB,eAAe,EACf,mBAAmB,EACnB,OAAO,EACP,UAAU,EACV,YAAY,GACb,MAAM,WAAW,CAAA;AAGlB,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,KAAK,eAAe,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AAGtB,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,UAAU,CAAA;AAIjB,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,4BAA4B,EAC5B,KAAK,yBAAyB,GAC/B,MAAM,uBAAuB,CAAA"}
|
|
@@ -32,7 +32,7 @@ export { checkContentAccess, createCheckContentAccess, createContentAccessChecke
|
|
|
32
32
|
// Branch-level access
|
|
33
33
|
export { checkBranchAccessWithDefault, createCheckBranchAccess, canPerformWorkflowAction, } from './branch.js';
|
|
34
34
|
// Protected base branch (submit-block + read-only predicate)
|
|
35
|
-
export { getBranchProtection } from './protected-branch.js';
|
|
35
|
+
export { getBranchProtection, getBranchWriteProtection, } from './protected-branch.js';
|
|
36
36
|
// Path-level access
|
|
37
37
|
export { checkPathAccess, createCheckPathAccess, resolveDefaultPathAccess } from './path.js';
|
|
38
38
|
// Helper functions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/authorization/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAWH,aAAa;AACb,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,mDAAmD;AACnD,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,0BAA0B,GAE3B,MAAM,WAAW,CAAA;AAElB,sBAAsB;AACtB,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,UAAU,CAAA;AAEjB,6DAA6D;AAC7D,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/authorization/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAWH,aAAa;AACb,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,mDAAmD;AACnD,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,0BAA0B,GAE3B,MAAM,WAAW,CAAA;AAElB,sBAAsB;AACtB,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,UAAU,CAAA;AAEjB,6DAA6D;AAC7D,OAAO,EACL,mBAAmB,EACnB,wBAAwB,GAGzB,MAAM,oBAAoB,CAAA;AAE3B,oBAAoB;AACpB,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,QAAQ,CAAA;AAEzF,mBAAmB;AACnB,OAAO,EACL,eAAe,EAEf,eAAe,EACf,mBAAmB,EACnB,OAAO,EACP,UAAU,EACV,YAAY,GACb,MAAM,WAAW,CAAA;AAElB,4BAA4B;AAC5B,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAE5B,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AAEtB,uBAAuB;AACvB,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EAGvB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,UAAU,CAAA;AAEjB,6DAA6D;AAC7D,8EAA8E;AAC9E,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,4BAA4B,GAE7B,MAAM,uBAAuB,CAAA"}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* key off of; do not re-derive the comparison elsewhere.
|
|
10
10
|
*/
|
|
11
11
|
import type { CanopyConfig } from '../config';
|
|
12
|
+
import type { BranchStatus } from '../types';
|
|
12
13
|
export interface BranchProtection {
|
|
13
14
|
/** True when branchName resolves to the configured base branch. */
|
|
14
15
|
isProtected: boolean;
|
|
@@ -17,6 +18,55 @@ export interface BranchProtection {
|
|
|
17
18
|
/** True when the branch is read-only in the editor (prod only). */
|
|
18
19
|
readOnly: boolean;
|
|
19
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* {@link BranchProtection} plus the write decision, which additionally depends
|
|
23
|
+
* on the branch's workflow status. Produced only by
|
|
24
|
+
* {@link getBranchWriteProtection}, so a caller that never supplied a status
|
|
25
|
+
* cannot read a `writeBlocked` that would silently mean "not checked".
|
|
26
|
+
*/
|
|
27
|
+
export interface BranchWriteProtection extends BranchProtection {
|
|
28
|
+
/**
|
|
29
|
+
* True when content writes must be rejected, for ANY of three reasons: the
|
|
30
|
+
* branch is the read-only protected base branch, its workflow status has
|
|
31
|
+
* moved past `'editing'` (locked while a reviewer looks at its PR), or its
|
|
32
|
+
* status could not be read at all.
|
|
33
|
+
*/
|
|
34
|
+
writeBlocked: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* True when the branch can never be submitted for review, for EITHER
|
|
37
|
+
* reason: it is the protected base branch (`protection.submitBlocked`), or
|
|
38
|
+
* its workflow status has moved past `'editing'` (already submitted,
|
|
39
|
+
* approved, or archived -- or unreadable, which fails closed the same way
|
|
40
|
+
* `writeBlocked` does: `status !== 'editing'` is true when `status` is
|
|
41
|
+
* `undefined`).
|
|
42
|
+
*
|
|
43
|
+
* DELIBERATELY NOT named `submitBlocked` on this type, even though it
|
|
44
|
+
* replaces the naive re-derivation of the same conjunction client-side.
|
|
45
|
+
* `BranchProtection.submitBlocked` (the field this interface inherits) means
|
|
46
|
+
* ONLY "this is the base branch" -- `api/guards.ts`'s `submittableBranch`
|
|
47
|
+
* guard reads exactly that, narrow, meaning, and must keep reading it: the
|
|
48
|
+
* guard's whole point is to refuse the base branch regardless of status. If
|
|
49
|
+
* this wider, compound answer had reused the same field name on the
|
|
50
|
+
* subtype, the two meanings would be one property access apart and
|
|
51
|
+
* indistinguishable at every call site -- a future edit anywhere near the
|
|
52
|
+
* guard could silently start reading the wide answer where the narrow one
|
|
53
|
+
* is required (or vice versa) and no type error would catch it, because
|
|
54
|
+
* both are `boolean`. The verbose name is the guard against that: nobody
|
|
55
|
+
* writes `submitBlockedIncludingStatus` by accident.
|
|
56
|
+
*
|
|
57
|
+
* Also worth noting the asymmetry with `writeBlocked` above:
|
|
58
|
+
* `writeBlocked` is built from `readOnly` (protected base branch, PROD
|
|
59
|
+
* ONLY) plus the status clause, while this is built from `isProtected` /
|
|
60
|
+
* `submitBlocked` (protected base branch, BOTH MODES) plus the same status
|
|
61
|
+
* clause. They are not two spellings of one rule -- in dev, the base branch
|
|
62
|
+
* is writable (`readOnly` is false there, so `writeBlocked` can be false)
|
|
63
|
+
* but still never submittable (`isProtected` is true regardless of mode, so
|
|
64
|
+
* this stays true). A branch can be `writeBlocked: false,
|
|
65
|
+
* submitBlockedIncludingStatus: true` in dev's base branch specifically;
|
|
66
|
+
* collapsing the two fields into one would lose that state.
|
|
67
|
+
*/
|
|
68
|
+
submitBlockedIncludingStatus: boolean;
|
|
69
|
+
}
|
|
20
70
|
/**
|
|
21
71
|
* Determine whether `branchName` is the protected base branch for `config`.
|
|
22
72
|
*
|
|
@@ -34,6 +84,31 @@ export interface BranchProtection {
|
|
|
34
84
|
* base workspace was actually forked from. The clause is purely additive: it
|
|
35
85
|
* only ever adds protection the config clause didn't already grant, so a
|
|
36
86
|
* normal editing branch (`baseBranch !== name`) is never falsely protected.
|
|
87
|
+
*
|
|
88
|
+
* This answers base-branch questions only (submit/delete/ACL rails). To
|
|
89
|
+
* authorize a content write or render a lock, use
|
|
90
|
+
* {@link getBranchWriteProtection}, which also accounts for workflow status.
|
|
37
91
|
*/
|
|
38
92
|
export declare function getBranchProtection(config: Pick<CanopyConfig, 'mode' | 'defaultBaseBranch'>, branchName: string, recordedBaseBranch?: string): BranchProtection;
|
|
93
|
+
/**
|
|
94
|
+
* {@link getBranchProtection} plus the write decision: writes are blocked on the
|
|
95
|
+
* read-only base branch, and on any branch whose status has left `'editing'`.
|
|
96
|
+
* This is the single expression of the "which statuses lock editing" rule --
|
|
97
|
+
* the API guard, the branches-list wire flag, and the editor all read it here.
|
|
98
|
+
*
|
|
99
|
+
* `status` is REQUIRED, and deliberately typed to admit `undefined`, because a
|
|
100
|
+
* missing status must FAIL CLOSED. `branch.json` is read with a bare
|
|
101
|
+
* `JSON.parse(...) as BranchMetadataFile` (branch-metadata.ts) with no schema
|
|
102
|
+
* validation, so a hand-repaired or partially-written file can yield
|
|
103
|
+
* `status: undefined` at runtime even though the type says otherwise -- and
|
|
104
|
+
* malformed branch metadata is a real, handled condition here (see the
|
|
105
|
+
* corrupt-metadata quarantine in branch-registry/branch-health). A branch whose
|
|
106
|
+
* review state cannot be determined must not be writable.
|
|
107
|
+
*
|
|
108
|
+
* Requiring the parameter is the point: an optional one would make "caller
|
|
109
|
+
* omitted it" and "the file had no status" indistinguishable, and the safe
|
|
110
|
+
* answer differs between them. Callers that genuinely don't care about status
|
|
111
|
+
* call {@link getBranchProtection} instead and get no `writeBlocked` at all.
|
|
112
|
+
*/
|
|
113
|
+
export declare function getBranchWriteProtection(config: Pick<CanopyConfig, 'mode' | 'defaultBaseBranch'>, branchName: string, recordedBaseBranch: string | undefined, status: BranchStatus | undefined): BranchWriteProtection;
|
|
39
114
|
//# sourceMappingURL=protected-branch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protected-branch.d.ts","sourceRoot":"","sources":["../../src/authorization/protected-branch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"protected-branch.d.ts","sourceRoot":"","sources":["../../src/authorization/protected-branch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAM5C,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,WAAW,EAAE,OAAO,CAAA;IACpB,4EAA4E;IAC5E,aAAa,EAAE,OAAO,CAAA;IACtB,mEAAmE;IACnE,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,qBAAsB,SAAQ,gBAAgB;IAC7D;;;;;OAKG;IACH,YAAY,EAAE,OAAO,CAAA;IACrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACH,4BAA4B,EAAE,OAAO,CAAA;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,mBAAmB,CAAC,EACxD,UAAU,EAAE,MAAM,EAClB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,gBAAgB,CAWlB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,mBAAmB,CAAC,EACxD,UAAU,EAAE,MAAM,EAClB,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,MAAM,EAAE,YAAY,GAAG,SAAS,GAC/B,qBAAqB,CAevB"}
|
|
@@ -29,6 +29,10 @@ import { sanitizeBranchName } from '../paths/branch-name.js';
|
|
|
29
29
|
* base workspace was actually forked from. The clause is purely additive: it
|
|
30
30
|
* only ever adds protection the config clause didn't already grant, so a
|
|
31
31
|
* normal editing branch (`baseBranch !== name`) is never falsely protected.
|
|
32
|
+
*
|
|
33
|
+
* This answers base-branch questions only (submit/delete/ACL rails). To
|
|
34
|
+
* authorize a content write or render a lock, use
|
|
35
|
+
* {@link getBranchWriteProtection}, which also accounts for workflow status.
|
|
32
36
|
*/
|
|
33
37
|
export function getBranchProtection(config, branchName, recordedBaseBranch) {
|
|
34
38
|
const sanitizedName = sanitizeBranchName(branchName);
|
|
@@ -40,4 +44,39 @@ export function getBranchProtection(config, branchName, recordedBaseBranch) {
|
|
|
40
44
|
readOnly: isProtected && config.mode === 'prod',
|
|
41
45
|
};
|
|
42
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* {@link getBranchProtection} plus the write decision: writes are blocked on the
|
|
49
|
+
* read-only base branch, and on any branch whose status has left `'editing'`.
|
|
50
|
+
* This is the single expression of the "which statuses lock editing" rule --
|
|
51
|
+
* the API guard, the branches-list wire flag, and the editor all read it here.
|
|
52
|
+
*
|
|
53
|
+
* `status` is REQUIRED, and deliberately typed to admit `undefined`, because a
|
|
54
|
+
* missing status must FAIL CLOSED. `branch.json` is read with a bare
|
|
55
|
+
* `JSON.parse(...) as BranchMetadataFile` (branch-metadata.ts) with no schema
|
|
56
|
+
* validation, so a hand-repaired or partially-written file can yield
|
|
57
|
+
* `status: undefined` at runtime even though the type says otherwise -- and
|
|
58
|
+
* malformed branch metadata is a real, handled condition here (see the
|
|
59
|
+
* corrupt-metadata quarantine in branch-registry/branch-health). A branch whose
|
|
60
|
+
* review state cannot be determined must not be writable.
|
|
61
|
+
*
|
|
62
|
+
* Requiring the parameter is the point: an optional one would make "caller
|
|
63
|
+
* omitted it" and "the file had no status" indistinguishable, and the safe
|
|
64
|
+
* answer differs between them. Callers that genuinely don't care about status
|
|
65
|
+
* call {@link getBranchProtection} instead and get no `writeBlocked` at all.
|
|
66
|
+
*/
|
|
67
|
+
export function getBranchWriteProtection(config, branchName, recordedBaseBranch, status) {
|
|
68
|
+
const protection = getBranchProtection(config, branchName, recordedBaseBranch);
|
|
69
|
+
return {
|
|
70
|
+
...protection,
|
|
71
|
+
// `undefined !== 'editing'` is true, so an unreadable status blocks writes.
|
|
72
|
+
writeBlocked: protection.readOnly || status !== 'editing',
|
|
73
|
+
// Base-branch half is `protection.submitBlocked` (isProtected, BOTH
|
|
74
|
+
// modes) -- not `protection.readOnly` (PROD only) -- because submit is
|
|
75
|
+
// never valid on the base branch even in dev, where it stays writable.
|
|
76
|
+
// See the field's own doc comment on BranchWriteProtection for the
|
|
77
|
+
// asymmetry this produces against `writeBlocked` and why the name is
|
|
78
|
+
// deliberately verbose.
|
|
79
|
+
submitBlockedIncludingStatus: protection.submitBlocked || status !== 'editing',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
43
82
|
//# sourceMappingURL=protected-branch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protected-branch.js","sourceRoot":"","sources":["../../src/authorization/protected-branch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"protected-branch.js","sourceRoot":"","sources":["../../src/authorization/protected-branch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,4EAA4E;AAC5E,2EAA2E;AAC3E,kDAAkD;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AA6DzD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAwD,EACxD,UAAkB,EAClB,kBAA2B;IAE3B,MAAM,aAAa,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAA;IACpD,MAAM,WAAW,GACf,aAAa,KAAK,kBAAkB,CAAC,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC;QACxE,CAAC,kBAAkB,KAAK,SAAS,IAAI,aAAa,KAAK,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAEhG,OAAO;QACL,WAAW;QACX,aAAa,EAAE,WAAW;QAC1B,QAAQ,EAAE,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;KAChD,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAwD,EACxD,UAAkB,EAClB,kBAAsC,EACtC,MAAgC;IAEhC,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAA;IAE9E,OAAO;QACL,GAAG,UAAU;QACb,4EAA4E;QAC5E,YAAY,EAAE,UAAU,CAAC,QAAQ,IAAI,MAAM,KAAK,SAAS;QACzD,oEAAoE;QACpE,uEAAuE;QACvE,uEAAuE;QACvE,mEAAmE;QACnE,qEAAqE;QACrE,wBAAwB;QACxB,4BAA4B,EAAE,UAAU,CAAC,aAAa,IAAI,MAAM,KAAK,SAAS;KAC/E,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch-registry.d.ts","sourceRoot":"","sources":["../src/branch-registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"branch-registry.d.ts","sourceRoot":"","sources":["../src/branch-registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAgC5C,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB;;;;OAIG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IAEjC,4GAA4G;IAC5G,OAAO,CAAC,aAAa,CAAwC;IAE7D,6DAA6D;IAC7D,OAAO,CAAC,mBAAmB,CAAI;gBAEnB,IAAI,EAAE,MAAM;IAOxB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IA2BtC;;;;;;;;;;OAUG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAW3D,OAAO,CAAC,kBAAkB;IAO1B;;;;;;;;;OASG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBjC;;;;;;OAMG;YACW,UAAU;YAYV,iBAAiB;IA4C/B;;;;OAIG;cACa,qBAAqB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;CA+ClE"}
|