@openclaw/fs-safe 0.16.0 → 0.18.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/CHANGELOG.md +91 -0
- package/README.md +8 -1
- package/dist/absolute-path.d.ts +0 -1
- package/dist/absolute-path.js +2 -8
- package/dist/advanced.d.ts +2 -1
- package/dist/advanced.js +2 -0
- package/dist/archive-crc32.d.ts +0 -1
- package/dist/archive-deadline.d.ts +0 -1
- package/dist/archive-deadline.js +22 -23
- package/dist/archive-durability.d.ts +0 -1
- package/dist/archive-entry.d.ts +0 -1
- package/dist/archive-errors.d.ts +0 -1
- package/dist/archive-gzip-tail.d.ts +0 -1
- package/dist/archive-input.d.ts +0 -1
- package/dist/archive-kind.d.ts +0 -1
- package/dist/archive-limits.d.ts +0 -1
- package/dist/archive-merge.d.ts +3 -4
- package/dist/archive-merge.js +17 -7
- package/dist/archive-native.d.ts +3 -14
- package/dist/archive-native.js +46 -70
- package/dist/archive-options.d.ts +9 -2
- package/dist/archive-parser-errors.d.ts +0 -1
- package/dist/archive-parser.wasm +0 -0
- package/dist/archive-plan.d.ts +10 -1
- package/dist/archive-plan.js +31 -21
- package/dist/archive-policy.d.ts +0 -1
- package/dist/archive-read.d.ts +0 -1
- package/dist/archive-staging.d.ts +0 -1
- package/dist/archive-tar-inspect.d.ts +0 -1
- package/dist/archive-tar-stream.d.ts +0 -1
- package/dist/archive-tar-wasm.d.ts +0 -1
- package/dist/archive-tar.d.ts +0 -1
- package/dist/archive-zip-admission.d.ts +0 -1
- package/dist/archive-zip-count.d.ts +0 -1
- package/dist/archive-zip-count.js +21 -1
- package/dist/archive-zip-directory.d.ts +0 -1
- package/dist/archive-zip-directory.js +23 -1
- package/dist/archive-zip-entry.d.ts +0 -1
- package/dist/archive-zip-integrity.d.ts +0 -1
- package/dist/archive-zip-loader.d.ts +2 -1
- package/dist/archive-zip-loader.js +7 -0
- package/dist/archive-zip-manifest.d.ts +0 -1
- package/dist/archive-zip-names.d.ts +0 -1
- package/dist/archive-zip-names.js +7 -2
- package/dist/archive-zip-preflight.d.ts +0 -1
- package/dist/archive.d.ts +0 -1
- package/dist/archive.js +93 -164
- package/dist/async-lock.d.ts +0 -1
- package/dist/atomic.d.ts +0 -1
- package/dist/bounded-read-stream.d.ts +0 -1
- package/dist/bounded-read.d.ts +0 -1
- package/dist/byte-budget.d.ts +0 -1
- package/dist/byte-view.d.ts +2 -0
- package/dist/byte-view.js +13 -0
- package/dist/clone-metadata.d.ts +0 -1
- package/dist/config.d.ts +0 -1
- package/dist/containment.d.ts +0 -1
- package/dist/copy-file-input.d.ts +0 -1
- package/dist/copy-policy.d.ts +0 -1
- package/dist/copy-publication.d.ts +0 -1
- package/dist/copy-tree-portable.d.ts +0 -1
- package/dist/copy-tree-portable.js +9 -6
- package/dist/copy.d.ts +0 -1
- package/dist/copy.js +5 -5
- package/dist/create-directory.d.ts +0 -2
- package/dist/create-directory.js +3 -22
- package/dist/create-file-async.d.ts +0 -1
- package/dist/create-file.d.ts +0 -1
- package/dist/create-file.js +3 -14
- package/dist/create-owned-file.d.ts +0 -1
- package/dist/create.d.ts +1 -2
- package/dist/create.js +1 -1
- package/dist/creation-darwin.d.ts +0 -2
- package/dist/creation-darwin.js +0 -9
- package/dist/creation-file-state.d.ts +0 -1
- package/dist/creation-path.d.ts +2 -1
- package/dist/creation-path.js +12 -0
- package/dist/creation-permissions.d.ts +0 -1
- package/dist/creation-permissions.js +28 -38
- package/dist/deny-mutations.d.ts +2 -3
- package/dist/deny-mutations.js +55 -35
- package/dist/device-path.d.ts +0 -1
- package/dist/directory-durability.d.ts +6 -7
- package/dist/directory-entry-path.d.ts +0 -1
- package/dist/directory-guard.d.ts +2 -7
- package/dist/directory-guard.js +25 -56
- package/dist/directory-mode-node.d.ts +0 -1
- package/dist/directory-mode-owner.d.ts +0 -1
- package/dist/directory-receipt.d.ts +2 -3
- package/dist/directory-receipt.js +15 -19
- package/dist/durability.d.ts +0 -1
- package/dist/effective-uid.d.ts +0 -1
- package/dist/error-detail.d.ts +0 -1
- package/dist/errors.d.ts +0 -1
- package/dist/file-cleanup.d.ts +1 -1
- package/dist/file-cleanup.js +7 -4
- package/dist/file-contents.d.ts +5 -0
- package/dist/file-contents.js +40 -0
- package/dist/file-handle-transfer.d.ts +0 -1
- package/dist/file-hash.d.ts +0 -1
- package/dist/file-hash.js +186 -70
- package/dist/file-identity.d.ts +0 -1
- package/dist/file-lock-sync-acquisition.d.ts +22 -0
- package/dist/file-lock-sync-acquisition.js +98 -0
- package/dist/file-lock-sync-admission.d.ts +0 -2
- package/dist/file-lock-sync-admission.js +9 -48
- package/dist/file-lock-sync-root-acquire.d.ts +0 -1
- package/dist/file-lock-sync-root-acquire.js +35 -98
- package/dist/file-lock-sync-root-arbitration.d.ts +0 -1
- package/dist/file-lock-sync-root-held.d.ts +1 -3
- package/dist/file-lock-sync-root-held.js +7 -5
- package/dist/file-lock-sync-root-io.d.ts +0 -1
- package/dist/file-lock-sync-root-mutation.d.ts +4 -5
- package/dist/file-lock-sync-root-mutation.js +7 -9
- package/dist/file-lock-sync-root-options.d.ts +0 -1
- package/dist/file-lock-sync-root-registration.d.ts +0 -1
- package/dist/file-lock-sync-root.d.ts +1 -2
- package/dist/file-lock-sync-root.js +14 -87
- package/dist/file-lock-sync-stale-admission.d.ts +2 -7
- package/dist/file-lock-sync-stale-admission.js +24 -23
- package/dist/file-lock-sync.d.ts +0 -1
- package/dist/file-lock-sync.js +46 -128
- package/dist/file-lock.d.ts +0 -1
- package/dist/file-observation.d.ts +0 -1
- package/dist/file-store-boundary.d.ts +0 -2
- package/dist/file-store-boundary.js +6 -26
- package/dist/file-store-copy-source.d.ts +1 -2
- package/dist/file-store-copy-source.js +1 -1
- package/dist/file-store-limit.d.ts +1 -2
- package/dist/file-store-limit.js +2 -3
- package/dist/file-store-path.d.ts +0 -1
- package/dist/file-store-prune.d.ts +0 -1
- package/dist/file-store-sync-directory.d.ts +0 -1
- package/dist/file-store-sync-directory.js +194 -231
- package/dist/file-store-sync-write.d.ts +0 -1
- package/dist/file-store-sync-write.js +16 -26
- package/dist/file-store.d.ts +0 -1
- package/dist/file-store.js +6 -7
- package/dist/file-sync.d.ts +0 -1
- package/dist/filename.d.ts +0 -1
- package/dist/filename.js +1 -7
- package/dist/fs.d.ts +0 -1
- package/dist/guarded-mkdir.d.ts +0 -1
- package/dist/guarded-mkdir.js +6 -27
- package/dist/guarded-mutation.d.ts +0 -7
- package/dist/guarded-mutation.js +6 -11
- package/dist/guest-dispatch-python.d.ts +0 -1
- package/dist/guest-dispatch-python.js +41 -90
- package/dist/guest-native-python.d.ts +0 -1
- package/dist/guest.d.ts +0 -1
- package/dist/home-dir.d.ts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/install-path.d.ts +0 -1
- package/dist/install-path.js +2 -5
- package/dist/json-document-store.d.ts +0 -1
- package/dist/json-durable-queue-directory.d.ts +13 -1
- package/dist/json-durable-queue-directory.js +134 -0
- package/dist/json-durable-queue-ownership.d.ts +0 -1
- package/dist/json-durable-queue-ownership.js +43 -66
- package/dist/json-durable-queue-read.d.ts +0 -1
- package/dist/json-durable-queue-read.js +6 -6
- package/dist/json-durable-queue.d.ts +0 -1
- package/dist/json-durable-queue.js +17 -139
- package/dist/json-store.d.ts +0 -1
- package/dist/json-stringify.d.ts +0 -1
- package/dist/json.d.ts +0 -1
- package/dist/json.js +38 -90
- package/dist/local-file-access.d.ts +0 -1
- package/dist/local-file-access.js +3 -10
- package/dist/local-file-descriptor.d.ts +0 -1
- package/dist/local-roots.d.ts +0 -1
- package/dist/local-roots.js +19 -21
- package/dist/lock-config.d.ts +0 -1
- package/dist/move-path-cleanup.d.ts +5 -20
- package/dist/move-path-cleanup.js +57 -21
- package/dist/move-path-stage.d.ts +0 -1
- package/dist/move-path.d.ts +0 -1
- package/dist/move-path.js +62 -39
- package/dist/mutation-authority.d.ts +0 -1
- package/dist/native-binding.d.ts +0 -1
- package/dist/native-config.d.ts +0 -1
- package/dist/native-directory-observation.d.ts +0 -1
- package/dist/native-fallback-warning.d.ts +0 -1
- package/dist/native-operations.d.ts +1 -5
- package/dist/native-operations.js +2 -6
- package/dist/native-parent-admission.d.ts +0 -1
- package/dist/native-pinned-write-windows.d.ts +0 -1
- package/dist/native-pinned-write.d.ts +0 -1
- package/dist/native-pinned-write.js +4 -10
- package/dist/native-policy-directory-observation.d.ts +0 -1
- package/dist/native-policy-parent-windows.d.ts +0 -1
- package/dist/native-rename-outcome.d.ts +0 -1
- package/dist/native-staged-file.d.ts +17 -4
- package/dist/native-staged-file.js +63 -68
- package/dist/native.d.ts +0 -1
- package/dist/native.js +2 -2
- package/dist/opened-file-failure.d.ts +0 -1
- package/dist/opened-realpath.d.ts +0 -1
- package/dist/opened-realpath.js +11 -2
- package/dist/output.d.ts +0 -1
- package/dist/overwrite-file-handle.d.ts +0 -1
- package/dist/owner-dacl.d.ts +0 -1
- package/dist/path-case.d.ts +0 -1
- package/dist/path-policy.d.ts +0 -1
- package/dist/path-prefix.d.ts +0 -1
- package/dist/path-scope-lexical.d.ts +0 -1
- package/dist/path-segment-route.d.ts +0 -1
- package/dist/path-suffix-aliases.d.ts +0 -1
- package/dist/path.d.ts +0 -1
- package/dist/path.js +2 -1
- package/dist/permission-exec.d.ts +0 -1
- package/dist/permission-exec.js +19 -25
- package/dist/permissions-public.d.ts +0 -1
- package/dist/permissions-windows.d.ts +2 -10
- package/dist/permissions-windows.js +10 -30
- package/dist/permissions.d.ts +0 -1
- package/dist/permissions.js +11 -33
- package/dist/pinned-mutation-admission.d.ts +0 -1
- package/dist/pinned-mutation-observation.d.ts +0 -1
- package/dist/pinned-mutation-shared-route.d.ts +0 -1
- package/dist/pinned-open.d.ts +1 -1
- package/dist/pinned-open.js +1 -1
- package/dist/pinned-operation.d.ts +0 -1
- package/dist/pinned-write-input.d.ts +0 -1
- package/dist/pinned-write-input.js +11 -1
- package/dist/pinned-write-mode.d.ts +3 -4
- package/dist/pinned-write-mode.js +15 -8
- package/dist/pinned-write-staged.d.ts +0 -1
- package/dist/pinned-write-staged.js +10 -11
- package/dist/pinned-write-types.d.ts +9 -21
- package/dist/pinned-write.d.ts +0 -1
- package/dist/pinned-write.js +17 -13
- package/dist/positional-read.d.ts +0 -1
- package/dist/private-directory.d.ts +0 -1
- package/dist/private-producer-handoff-sync.d.ts +0 -1
- package/dist/private-producer-handoff-sync.js +9 -51
- package/dist/private-producer-handoff.d.ts +20 -1
- package/dist/private-producer-handoff.js +69 -46
- package/dist/private-temp-workspace.d.ts +0 -1
- package/dist/private-temp-workspace.js +11 -36
- package/dist/publish-copy-stage.d.ts +0 -1
- package/dist/publish-file-failure.d.ts +0 -1
- package/dist/publish-file.d.ts +2 -3
- package/dist/publish-file.js +56 -96
- package/dist/read-open-flags.d.ts +0 -1
- package/dist/read-opened-file.d.ts +0 -1
- package/dist/realpath.d.ts +0 -1
- package/dist/recursive-mkdir-path.d.ts +0 -1
- package/dist/regular-file.d.ts +0 -1
- package/dist/regular-file.js +107 -178
- package/dist/replace-directory.d.ts +0 -1
- package/dist/replace-file-copy-fallback.d.ts +0 -1
- package/dist/replace-file-copy-fallback.js +42 -29
- package/dist/replace-file-copy-source.d.ts +0 -1
- package/dist/replace-file-copy-source.js +19 -23
- package/dist/replace-file-descriptor.d.ts +0 -1
- package/dist/replace-file-descriptor.js +16 -17
- package/dist/replace-file-mode.d.ts +0 -1
- package/dist/replace-file-rename-policy.d.ts +0 -1
- package/dist/replace-file-temp-owner.d.ts +12 -13
- package/dist/replace-file-temp-owner.js +72 -91
- package/dist/replace-file.d.ts +0 -1
- package/dist/replace-file.js +9 -13
- package/dist/retained-directory-replacement.d.ts +0 -1
- package/dist/root-boundary.d.ts +0 -1
- package/dist/root-context.d.ts +0 -1
- package/dist/root-create-input.d.ts +0 -1
- package/dist/root-directory-creation.d.ts +0 -1
- package/dist/root-directory-list.d.ts +0 -1
- package/dist/root-directory-list.js +20 -3
- package/dist/root-directory.d.ts +0 -1
- package/dist/root-entries.d.ts +0 -1
- package/dist/root-errors.d.ts +0 -1
- package/dist/root-file-final-admission.d.ts +1 -2
- package/dist/root-file-final-admission.js +5 -2
- package/dist/root-file.d.ts +0 -1
- package/dist/root-file.js +3 -2
- package/dist/root-impl.d.ts +2 -10
- package/dist/root-impl.js +164 -111
- package/dist/root-move-noreplace.d.ts +2 -1
- package/dist/root-move-noreplace.js +2 -2
- package/dist/root-move-preflight.d.ts +0 -1
- package/dist/root-observed-path.d.ts +0 -1
- package/dist/root-options.d.ts +0 -1
- package/dist/root-path-errors.d.ts +0 -1
- package/dist/root-path-existing.d.ts +3 -1
- package/dist/root-path-existing.js +39 -18
- package/dist/root-path-observation.d.ts +0 -1
- package/dist/root-path-stat.d.ts +0 -1
- package/dist/root-path.d.ts +0 -1
- package/dist/root-path.js +60 -188
- package/dist/root-paths-lexical.d.ts +0 -1
- package/dist/root-paths.d.ts +0 -1
- package/dist/root-read-admission.d.ts +0 -1
- package/dist/root-read-admission.js +31 -39
- package/dist/root-remove-identity.d.ts +0 -1
- package/dist/root-remove-receipt.d.ts +0 -1
- package/dist/root-remove.d.ts +0 -1
- package/dist/root-remove.js +15 -1
- package/dist/root-symlink-policy.d.ts +0 -1
- package/dist/root-walk.d.ts +0 -1
- package/dist/root-write-admission.d.ts +0 -1
- package/dist/root-write-compatibility.d.ts +0 -1
- package/dist/root-write-complete-parent.d.ts +0 -1
- package/dist/root-write-lock-binding.d.ts +0 -1
- package/dist/root-write-mode.d.ts +0 -1
- package/dist/root-write-publication.d.ts +0 -1
- package/dist/root-write-verification.d.ts +0 -1
- package/dist/root.d.ts +0 -1
- package/dist/safe-path-segment.d.ts +1 -2
- package/dist/safe-path-segment.js +2 -5
- package/dist/secret-file.d.ts +0 -1
- package/dist/secret-file.js +7 -17
- package/dist/secret-read-async.d.ts +0 -1
- package/dist/secret-read-async.js +5 -5
- package/dist/secret-read-policy.d.ts +0 -1
- package/dist/secret.d.ts +0 -1
- package/dist/secure-file-windows.d.ts +0 -6
- package/dist/secure-file-windows.js +13 -28
- package/dist/secure-file.d.ts +0 -1
- package/dist/secure-file.js +9 -9
- package/dist/secure-temp-dir.d.ts +0 -1
- package/dist/secure-temp-repair.d.ts +0 -1
- package/dist/sibling-staged-file.d.ts +0 -1
- package/dist/sibling-staged-file.js +32 -39
- package/dist/sibling-temp.d.ts +0 -1
- package/dist/sidecar-lock-acquire.d.ts +1 -2
- package/dist/sidecar-lock-acquire.js +35 -58
- package/dist/sidecar-lock-admission-context.d.ts +0 -1
- package/dist/sidecar-lock-admission-parser.d.ts +0 -1
- package/dist/sidecar-lock-admission.d.ts +1 -5
- package/dist/sidecar-lock-admission.js +1 -7
- package/dist/sidecar-lock-handle.d.ts +3 -1
- package/dist/sidecar-lock-handle.js +6 -0
- package/dist/sidecar-lock-policy.d.ts +3 -1
- package/dist/sidecar-lock-policy.js +16 -0
- package/dist/sidecar-lock-reclaim.d.ts +1 -2
- package/dist/sidecar-lock-reclaim.js +11 -8
- package/dist/sidecar-lock-registration.d.ts +13 -0
- package/dist/sidecar-lock-registration.js +47 -0
- package/dist/sidecar-lock-root.d.ts +0 -1
- package/dist/sidecar-lock-stale-admission.d.ts +0 -1
- package/dist/sidecar-lock-target.d.ts +0 -1
- package/dist/sidecar-lock-types.d.ts +0 -1
- package/dist/sidecar-lock.d.ts +0 -1
- package/dist/sidecar-lock.js +19 -88
- package/dist/staged-directory.d.ts +2 -3
- package/dist/staged-file-settlement.d.ts +0 -1
- package/dist/staged-file-types.d.ts +0 -1
- package/dist/standalone-publication-path.d.ts +0 -1
- package/dist/stat-observation.d.ts +0 -1
- package/dist/store.d.ts +0 -1
- package/dist/strict-file-identity.d.ts +1 -2
- package/dist/strict-file-identity.js +9 -9
- package/dist/string-coerce.d.ts +0 -1
- package/dist/suppressed-error.d.ts +0 -1
- package/dist/symlink-parents.d.ts +0 -1
- package/dist/symlink-parents.js +2 -27
- package/dist/temp-cleanup.d.ts +0 -1
- package/dist/temp-target.d.ts +0 -1
- package/dist/temp-target.js +7 -46
- package/dist/temp-workspace-admission.d.ts +0 -8
- package/dist/temp-workspace-admission.js +0 -4
- package/dist/temp-workspace-child-admission.d.ts +0 -4
- package/dist/temp-workspace-child-admission.js +0 -12
- package/dist/temp-workspace-descriptor.d.ts +0 -6
- package/dist/temp-workspace-descriptor.js +0 -2
- package/dist/temp-workspace-identity.d.ts +0 -1
- package/dist/temp-workspace-owner.d.ts +1 -1
- package/dist/temp-workspace-owner.js +49 -26
- package/dist/temp-workspace-permissions.d.ts +0 -1
- package/dist/temp-workspace-types.d.ts +0 -1
- package/dist/temp.d.ts +0 -1
- package/dist/test-hooks.d.ts +0 -1
- package/dist/text-atomic.d.ts +0 -1
- package/dist/timing.d.ts +0 -1
- package/dist/trash.d.ts +0 -1
- package/dist/types.d.ts +0 -1
- package/dist/unicode-path.d.ts +0 -1
- package/dist/unicode-path.js +3 -0
- package/dist/walk.d.ts +0 -1
- package/dist/walk.js +4 -2
- package/dist/windows-command.d.ts +0 -1
- package/dist/windows-owner.d.ts +0 -1
- package/dist/windows-owner.js +4 -1
- package/dist/windows-path-alias.d.ts +0 -1
- package/dist/windows-path-alias.js +7 -43
- package/dist/windows-path-syntax.d.ts +5 -0
- package/dist/windows-path-syntax.js +21 -0
- package/dist/windows-security-command.d.ts +0 -1
- package/dist/windows-security-facts.d.ts +0 -1
- package/dist/write-file-handle.d.ts +7 -1
- package/dist/write-file-handle.js +23 -0
- package/dist/write-open-flags.d.ts +0 -1
- package/dist/write-open-flags.js +1 -8
- package/dist/write-queue.d.ts +0 -1
- package/dist/write-queue.js +1 -4
- package/docs/advanced.md +68 -1
- package/docs/archive.md +41 -2
- package/docs/atomic.md +43 -5
- package/docs/contributing.md +4 -0
- package/docs/copy.md +2 -0
- package/docs/creation.md +8 -4
- package/docs/durability.md +35 -0
- package/docs/file-contents.md +68 -0
- package/docs/json.md +5 -4
- package/docs/local-roots.md +2 -0
- package/docs/mutation-policy-proof.md +11 -7
- package/docs/native.md +9 -8
- package/docs/path.md +4 -4
- package/docs/permissions.md +6 -0
- package/docs/public-api.md +5 -0
- package/docs/quickstart.md +1 -1
- package/docs/reading.md +2 -2
- package/docs/regular-file.md +3 -0
- package/docs/root.md +19 -0
- package/docs/secret-file.md +4 -0
- package/docs/sidecar-lock.md +9 -1
- package/docs/staged-file.md +4 -3
- package/docs/store.md +3 -1
- package/docs/temp.md +4 -1
- package/docs/types.md +18 -2
- package/docs/walk.md +7 -0
- package/docs/writing.md +18 -5
- package/package.json +8 -9
- package/dist/absolute-path.d.ts.map +0 -1
- package/dist/advanced.d.ts.map +0 -1
- package/dist/archive-crc32.d.ts.map +0 -1
- package/dist/archive-deadline.d.ts.map +0 -1
- package/dist/archive-durability.d.ts.map +0 -1
- package/dist/archive-entry.d.ts.map +0 -1
- package/dist/archive-errors.d.ts.map +0 -1
- package/dist/archive-gzip-tail.d.ts.map +0 -1
- package/dist/archive-input.d.ts.map +0 -1
- package/dist/archive-kind.d.ts.map +0 -1
- package/dist/archive-limits.d.ts.map +0 -1
- package/dist/archive-merge.d.ts.map +0 -1
- package/dist/archive-native.d.ts.map +0 -1
- package/dist/archive-options.d.ts.map +0 -1
- package/dist/archive-parser-errors.d.ts.map +0 -1
- package/dist/archive-plan.d.ts.map +0 -1
- package/dist/archive-policy.d.ts.map +0 -1
- package/dist/archive-read.d.ts.map +0 -1
- package/dist/archive-staging.d.ts.map +0 -1
- package/dist/archive-tar-inspect.d.ts.map +0 -1
- package/dist/archive-tar-stream.d.ts.map +0 -1
- package/dist/archive-tar-wasm.d.ts.map +0 -1
- package/dist/archive-tar.d.ts.map +0 -1
- package/dist/archive-zip-admission.d.ts.map +0 -1
- package/dist/archive-zip-count.d.ts.map +0 -1
- package/dist/archive-zip-directory.d.ts.map +0 -1
- package/dist/archive-zip-entry.d.ts.map +0 -1
- package/dist/archive-zip-integrity.d.ts.map +0 -1
- package/dist/archive-zip-loader.d.ts.map +0 -1
- package/dist/archive-zip-manifest.d.ts.map +0 -1
- package/dist/archive-zip-names.d.ts.map +0 -1
- package/dist/archive-zip-preflight.d.ts.map +0 -1
- package/dist/archive.d.ts.map +0 -1
- package/dist/async-lock.d.ts.map +0 -1
- package/dist/atomic.d.ts.map +0 -1
- package/dist/bounded-read-stream.d.ts.map +0 -1
- package/dist/bounded-read.d.ts.map +0 -1
- package/dist/byte-budget.d.ts.map +0 -1
- package/dist/clone-metadata.d.ts.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/containment.d.ts.map +0 -1
- package/dist/copy-file-input.d.ts.map +0 -1
- package/dist/copy-policy.d.ts.map +0 -1
- package/dist/copy-publication.d.ts.map +0 -1
- package/dist/copy-tree-portable.d.ts.map +0 -1
- package/dist/copy.d.ts.map +0 -1
- package/dist/create-directory.d.ts.map +0 -1
- package/dist/create-file-async.d.ts.map +0 -1
- package/dist/create-file.d.ts.map +0 -1
- package/dist/create-owned-file.d.ts.map +0 -1
- package/dist/create.d.ts.map +0 -1
- package/dist/creation-darwin.d.ts.map +0 -1
- package/dist/creation-file-state.d.ts.map +0 -1
- package/dist/creation-path.d.ts.map +0 -1
- package/dist/creation-permissions.d.ts.map +0 -1
- package/dist/deny-mutations.d.ts.map +0 -1
- package/dist/device-path.d.ts.map +0 -1
- package/dist/directory-durability.d.ts.map +0 -1
- package/dist/directory-entry-path.d.ts.map +0 -1
- package/dist/directory-guard.d.ts.map +0 -1
- package/dist/directory-mode-node.d.ts.map +0 -1
- package/dist/directory-mode-owner.d.ts.map +0 -1
- package/dist/directory-receipt.d.ts.map +0 -1
- package/dist/durability.d.ts.map +0 -1
- package/dist/effective-uid.d.ts.map +0 -1
- package/dist/error-detail.d.ts.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/file-cleanup.d.ts.map +0 -1
- package/dist/file-handle-transfer.d.ts.map +0 -1
- package/dist/file-hash.d.ts.map +0 -1
- package/dist/file-identity.d.ts.map +0 -1
- package/dist/file-lock-sync-admission.d.ts.map +0 -1
- package/dist/file-lock-sync-root-acquire.d.ts.map +0 -1
- package/dist/file-lock-sync-root-arbitration.d.ts.map +0 -1
- package/dist/file-lock-sync-root-held.d.ts.map +0 -1
- package/dist/file-lock-sync-root-io.d.ts.map +0 -1
- package/dist/file-lock-sync-root-mutation.d.ts.map +0 -1
- package/dist/file-lock-sync-root-options.d.ts.map +0 -1
- package/dist/file-lock-sync-root-registration.d.ts.map +0 -1
- package/dist/file-lock-sync-root.d.ts.map +0 -1
- package/dist/file-lock-sync-stale-admission.d.ts.map +0 -1
- package/dist/file-lock-sync.d.ts.map +0 -1
- package/dist/file-lock.d.ts.map +0 -1
- package/dist/file-observation.d.ts.map +0 -1
- package/dist/file-store-boundary.d.ts.map +0 -1
- package/dist/file-store-copy-source.d.ts.map +0 -1
- package/dist/file-store-limit.d.ts.map +0 -1
- package/dist/file-store-path.d.ts.map +0 -1
- package/dist/file-store-prune.d.ts.map +0 -1
- package/dist/file-store-sync-directory.d.ts.map +0 -1
- package/dist/file-store-sync-write.d.ts.map +0 -1
- package/dist/file-store.d.ts.map +0 -1
- package/dist/file-sync.d.ts.map +0 -1
- package/dist/filename.d.ts.map +0 -1
- package/dist/fs.d.ts.map +0 -1
- package/dist/guarded-mkdir.d.ts.map +0 -1
- package/dist/guarded-mutation.d.ts.map +0 -1
- package/dist/guest-dispatch-python.d.ts.map +0 -1
- package/dist/guest-native-python.d.ts.map +0 -1
- package/dist/guest.d.ts.map +0 -1
- package/dist/home-dir.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/install-path.d.ts.map +0 -1
- package/dist/json-document-store.d.ts.map +0 -1
- package/dist/json-durable-queue-directory.d.ts.map +0 -1
- package/dist/json-durable-queue-ownership.d.ts.map +0 -1
- package/dist/json-durable-queue-paths.d.ts +0 -11
- package/dist/json-durable-queue-paths.d.ts.map +0 -1
- package/dist/json-durable-queue-paths.js +0 -42
- package/dist/json-durable-queue-read.d.ts.map +0 -1
- package/dist/json-durable-queue.d.ts.map +0 -1
- package/dist/json-store.d.ts.map +0 -1
- package/dist/json-stringify.d.ts.map +0 -1
- package/dist/json.d.ts.map +0 -1
- package/dist/local-file-access.d.ts.map +0 -1
- package/dist/local-file-descriptor.d.ts.map +0 -1
- package/dist/local-roots.d.ts.map +0 -1
- package/dist/lock-config.d.ts.map +0 -1
- package/dist/move-path-cleanup.d.ts.map +0 -1
- package/dist/move-path-stage.d.ts.map +0 -1
- package/dist/move-path.d.ts.map +0 -1
- package/dist/mutation-authority.d.ts.map +0 -1
- package/dist/native-binding.d.ts.map +0 -1
- package/dist/native-config.d.ts.map +0 -1
- package/dist/native-directory-observation.d.ts.map +0 -1
- package/dist/native-fallback-warning.d.ts.map +0 -1
- package/dist/native-operations.d.ts.map +0 -1
- package/dist/native-parent-admission.d.ts.map +0 -1
- package/dist/native-pinned-write-windows.d.ts.map +0 -1
- package/dist/native-pinned-write.d.ts.map +0 -1
- package/dist/native-policy-directory-observation.d.ts.map +0 -1
- package/dist/native-policy-parent-windows.d.ts.map +0 -1
- package/dist/native-rename-outcome.d.ts.map +0 -1
- package/dist/native-staged-file.d.ts.map +0 -1
- package/dist/native.d.ts.map +0 -1
- package/dist/opened-file-failure.d.ts.map +0 -1
- package/dist/opened-realpath.d.ts.map +0 -1
- package/dist/output.d.ts.map +0 -1
- package/dist/overwrite-file-handle.d.ts.map +0 -1
- package/dist/owner-dacl.d.ts.map +0 -1
- package/dist/path-case.d.ts.map +0 -1
- package/dist/path-policy.d.ts.map +0 -1
- package/dist/path-prefix.d.ts.map +0 -1
- package/dist/path-scope-lexical.d.ts.map +0 -1
- package/dist/path-segment-route.d.ts.map +0 -1
- package/dist/path-suffix-aliases.d.ts.map +0 -1
- package/dist/path.d.ts.map +0 -1
- package/dist/permission-exec.d.ts.map +0 -1
- package/dist/permissions-public.d.ts.map +0 -1
- package/dist/permissions-windows.d.ts.map +0 -1
- package/dist/permissions.d.ts.map +0 -1
- package/dist/pinned-mutation-admission.d.ts.map +0 -1
- package/dist/pinned-mutation-observation.d.ts.map +0 -1
- package/dist/pinned-mutation-shared-route.d.ts.map +0 -1
- package/dist/pinned-open.d.ts.map +0 -1
- package/dist/pinned-operation.d.ts.map +0 -1
- package/dist/pinned-write-input.d.ts.map +0 -1
- package/dist/pinned-write-mode.d.ts.map +0 -1
- package/dist/pinned-write-staged.d.ts.map +0 -1
- package/dist/pinned-write-types.d.ts.map +0 -1
- package/dist/pinned-write.d.ts.map +0 -1
- package/dist/positional-read.d.ts.map +0 -1
- package/dist/private-directory.d.ts.map +0 -1
- package/dist/private-producer-handoff-sync.d.ts.map +0 -1
- package/dist/private-producer-handoff.d.ts.map +0 -1
- package/dist/private-temp-workspace.d.ts.map +0 -1
- package/dist/publish-copy-stage.d.ts.map +0 -1
- package/dist/publish-file-failure.d.ts.map +0 -1
- package/dist/publish-file.d.ts.map +0 -1
- package/dist/read-open-flags.d.ts.map +0 -1
- package/dist/read-opened-file.d.ts.map +0 -1
- package/dist/realpath.d.ts.map +0 -1
- package/dist/recursive-mkdir-path.d.ts.map +0 -1
- package/dist/regular-file.d.ts.map +0 -1
- package/dist/replace-directory.d.ts.map +0 -1
- package/dist/replace-file-copy-fallback.d.ts.map +0 -1
- package/dist/replace-file-copy-source.d.ts.map +0 -1
- package/dist/replace-file-descriptor.d.ts.map +0 -1
- package/dist/replace-file-mode.d.ts.map +0 -1
- package/dist/replace-file-rename-policy.d.ts.map +0 -1
- package/dist/replace-file-temp-owner.d.ts.map +0 -1
- package/dist/replace-file.d.ts.map +0 -1
- package/dist/retained-directory-replacement.d.ts.map +0 -1
- package/dist/root-boundary.d.ts.map +0 -1
- package/dist/root-context.d.ts.map +0 -1
- package/dist/root-create-input.d.ts.map +0 -1
- package/dist/root-directory-creation.d.ts.map +0 -1
- package/dist/root-directory-list.d.ts.map +0 -1
- package/dist/root-directory.d.ts.map +0 -1
- package/dist/root-entries.d.ts.map +0 -1
- package/dist/root-errors.d.ts.map +0 -1
- package/dist/root-file-final-admission.d.ts.map +0 -1
- package/dist/root-file.d.ts.map +0 -1
- package/dist/root-impl.d.ts.map +0 -1
- package/dist/root-move-noreplace.d.ts.map +0 -1
- package/dist/root-move-preflight.d.ts.map +0 -1
- package/dist/root-observed-path.d.ts.map +0 -1
- package/dist/root-options.d.ts.map +0 -1
- package/dist/root-path-errors.d.ts.map +0 -1
- package/dist/root-path-existing.d.ts.map +0 -1
- package/dist/root-path-observation.d.ts.map +0 -1
- package/dist/root-path-stat.d.ts.map +0 -1
- package/dist/root-path-symlink.d.ts +0 -7
- package/dist/root-path-symlink.d.ts.map +0 -1
- package/dist/root-path-symlink.js +0 -55
- package/dist/root-path.d.ts.map +0 -1
- package/dist/root-paths-lexical.d.ts.map +0 -1
- package/dist/root-paths.d.ts.map +0 -1
- package/dist/root-read-admission.d.ts.map +0 -1
- package/dist/root-remove-identity.d.ts.map +0 -1
- package/dist/root-remove-receipt.d.ts.map +0 -1
- package/dist/root-remove.d.ts.map +0 -1
- package/dist/root-symlink-policy.d.ts.map +0 -1
- package/dist/root-walk.d.ts.map +0 -1
- package/dist/root-write-admission.d.ts.map +0 -1
- package/dist/root-write-compatibility.d.ts.map +0 -1
- package/dist/root-write-complete-parent.d.ts.map +0 -1
- package/dist/root-write-lock-binding.d.ts.map +0 -1
- package/dist/root-write-mode.d.ts.map +0 -1
- package/dist/root-write-publication.d.ts.map +0 -1
- package/dist/root-write-verification.d.ts.map +0 -1
- package/dist/root.d.ts.map +0 -1
- package/dist/safe-path-segment.d.ts.map +0 -1
- package/dist/secret-file.d.ts.map +0 -1
- package/dist/secret-read-async.d.ts.map +0 -1
- package/dist/secret-read-policy.d.ts.map +0 -1
- package/dist/secret.d.ts.map +0 -1
- package/dist/secure-file-windows.d.ts.map +0 -1
- package/dist/secure-file.d.ts.map +0 -1
- package/dist/secure-temp-dir.d.ts.map +0 -1
- package/dist/secure-temp-repair.d.ts.map +0 -1
- package/dist/sibling-staged-file.d.ts.map +0 -1
- package/dist/sibling-temp.d.ts.map +0 -1
- package/dist/sidecar-lock-acquire.d.ts.map +0 -1
- package/dist/sidecar-lock-admission-context.d.ts.map +0 -1
- package/dist/sidecar-lock-admission-parser.d.ts.map +0 -1
- package/dist/sidecar-lock-admission.d.ts.map +0 -1
- package/dist/sidecar-lock-handle.d.ts.map +0 -1
- package/dist/sidecar-lock-policy.d.ts.map +0 -1
- package/dist/sidecar-lock-reclaim.d.ts.map +0 -1
- package/dist/sidecar-lock-root.d.ts.map +0 -1
- package/dist/sidecar-lock-stale-admission.d.ts.map +0 -1
- package/dist/sidecar-lock-target.d.ts.map +0 -1
- package/dist/sidecar-lock-types.d.ts.map +0 -1
- package/dist/sidecar-lock.d.ts.map +0 -1
- package/dist/staged-directory.d.ts.map +0 -1
- package/dist/staged-file-settlement.d.ts.map +0 -1
- package/dist/staged-file-types.d.ts.map +0 -1
- package/dist/standalone-publication-path.d.ts.map +0 -1
- package/dist/stat-observation.d.ts.map +0 -1
- package/dist/store.d.ts.map +0 -1
- package/dist/strict-file-identity.d.ts.map +0 -1
- package/dist/string-coerce.d.ts.map +0 -1
- package/dist/suppressed-error.d.ts.map +0 -1
- package/dist/symlink-parents.d.ts.map +0 -1
- package/dist/temp-cleanup.d.ts.map +0 -1
- package/dist/temp-target.d.ts.map +0 -1
- package/dist/temp-workspace-admission.d.ts.map +0 -1
- package/dist/temp-workspace-child-admission.d.ts.map +0 -1
- package/dist/temp-workspace-descriptor.d.ts.map +0 -1
- package/dist/temp-workspace-identity.d.ts.map +0 -1
- package/dist/temp-workspace-owner.d.ts.map +0 -1
- package/dist/temp-workspace-permissions.d.ts.map +0 -1
- package/dist/temp-workspace-types.d.ts.map +0 -1
- package/dist/temp.d.ts.map +0 -1
- package/dist/test-hooks.d.ts.map +0 -1
- package/dist/text-atomic.d.ts.map +0 -1
- package/dist/timing.d.ts.map +0 -1
- package/dist/trash.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/unicode-path.d.ts.map +0 -1
- package/dist/walk.d.ts.map +0 -1
- package/dist/windows-command.d.ts.map +0 -1
- package/dist/windows-owner.d.ts.map +0 -1
- package/dist/windows-path-alias.d.ts.map +0 -1
- package/dist/windows-security-command.d.ts.map +0 -1
- package/dist/windows-security-facts.d.ts.map +0 -1
- package/dist/write-file-handle.d.ts.map +0 -1
- package/dist/write-open-flags.d.ts.map +0 -1
- package/dist/write-queue.d.ts.map +0 -1
|
@@ -50,12 +50,12 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
|
|
|
50
50
|
var e = new Error(message);
|
|
51
51
|
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
52
|
});
|
|
53
|
-
import { assertDarwinCreationAcl
|
|
53
|
+
import { assertDarwinCreationAcl } from "./creation-darwin.js";
|
|
54
54
|
import { assertPrivateCreationFile } from "./creation-file-state.js";
|
|
55
55
|
import { requireNativeBinding } from "./native.js";
|
|
56
56
|
import { syncFileBestEffortSync } from "./file-sync.js";
|
|
57
57
|
import { randomUUID } from "node:crypto";
|
|
58
|
-
import fs from "node:fs";
|
|
58
|
+
import fs, {} from "node:fs";
|
|
59
59
|
import path from "node:path";
|
|
60
60
|
import { FsSafeError } from "./errors.js";
|
|
61
61
|
import { assertSynchronousCallbackResult, MutationAuthorityError } from "./mutation-authority.js";
|
|
@@ -86,50 +86,33 @@ function assertBasename(name, portable) {
|
|
|
86
86
|
}
|
|
87
87
|
const NOT_PUBLISHED = Object.freeze({ status: "not-published" });
|
|
88
88
|
class NativeStagedFile {
|
|
89
|
-
#
|
|
89
|
+
#owner;
|
|
90
90
|
#closeFd;
|
|
91
|
-
#
|
|
92
|
-
#closeParentFd;
|
|
93
|
-
#directory;
|
|
94
|
-
#portableNames;
|
|
95
|
-
#publishedMode;
|
|
96
|
-
#sync;
|
|
97
|
-
#strictFileSync;
|
|
91
|
+
#assertBeforeMutation;
|
|
98
92
|
#private;
|
|
99
93
|
#verifyMode;
|
|
100
|
-
#assertBeforeMutation;
|
|
101
|
-
#name;
|
|
102
94
|
#state = { status: "open", publication: NOT_PUBLISHED };
|
|
103
95
|
#receipt;
|
|
104
96
|
#rejectFinalSymlink = false;
|
|
105
|
-
constructor(
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
this.#closeFd = captureNativeFdClose(binding);
|
|
109
|
-
this.#
|
|
110
|
-
this.#
|
|
111
|
-
this.#
|
|
112
|
-
this.#
|
|
113
|
-
this.#portableNames = portableNames;
|
|
114
|
-
this.#publishedMode = publishedMode;
|
|
115
|
-
this.#sync = sync;
|
|
116
|
-
this.#strictFileSync = strictFileSync;
|
|
117
|
-
this.#private = permissionPolicy === "private-creation";
|
|
118
|
-
this.#verifyMode = permissionPolicy !== undefined;
|
|
119
|
-
this.#assertBeforeMutation = assertBeforeMutation;
|
|
97
|
+
constructor(owner) {
|
|
98
|
+
const name = owner.name ?? `.fs-safe-${randomUUID()}.tmp`;
|
|
99
|
+
assertBasename(name, owner.portableNames !== false);
|
|
100
|
+
this.#closeFd = captureNativeFdClose(owner.binding);
|
|
101
|
+
this.#owner = { ...owner, name };
|
|
102
|
+
this.#assertBeforeMutation = owner.assertBeforeMutation;
|
|
103
|
+
this.#private = owner.permissionPolicy === "private-creation";
|
|
104
|
+
this.#verifyMode = owner.permissionPolicy !== undefined;
|
|
120
105
|
}
|
|
121
106
|
// Public staging supplies a Node parent; pinned writes supply a native parent.
|
|
122
107
|
// The supplied closer owns parentFd even on construction or preparation failure.
|
|
123
|
-
static async create(
|
|
124
|
-
// Public staging uses portable names; existing POSIX writes accept literal names.
|
|
125
|
-
portableNames = true, sync = true, assertBeforeMutation, exclusiveBasename, strictFileSync = false, permissionPolicy) {
|
|
108
|
+
static async create(owner, input, maxBytes) {
|
|
126
109
|
let staged;
|
|
127
110
|
try {
|
|
128
|
-
staged = new NativeStagedFile(
|
|
111
|
+
staged = new NativeStagedFile(owner);
|
|
129
112
|
}
|
|
130
113
|
catch (error) {
|
|
131
114
|
try {
|
|
132
|
-
closeParentFd(parentFd);
|
|
115
|
+
owner.closeParentFd(owner.parentFd);
|
|
133
116
|
}
|
|
134
117
|
catch (closeError) {
|
|
135
118
|
throw new AggregateError([error, closeError], "staged owner construction and close failed");
|
|
@@ -145,7 +128,13 @@ class NativeStagedFile {
|
|
|
145
128
|
const exclusive = params.overwrite === false && params.input.kind === "buffer" && params.input.stageBeforePublish === false;
|
|
146
129
|
// This owner never escapes. Only the internal verifier borrows its fd;
|
|
147
130
|
// public descriptor methods remain await-free and cannot race disposal.
|
|
148
|
-
const staged = __addDisposableResource(env_1, await NativeStagedFile.create(
|
|
131
|
+
const staged = __addDisposableResource(env_1, await NativeStagedFile.create({
|
|
132
|
+
binding, parentFd, closeParentFd, directory, mode: params.mode, sync: params.sync,
|
|
133
|
+
// Public staging uses portable names; existing POSIX writes accept literal names.
|
|
134
|
+
portableNames: false, assertBeforeMutation: params.assertBeforeMutation,
|
|
135
|
+
name: exclusive ? params.basename : undefined, strictFileSync: params.strictFileSync,
|
|
136
|
+
permissionPolicy: params.private ? "private-creation" : params.verifyPosixMode === true ? "mode-only" : undefined,
|
|
137
|
+
}, params.input, params.maxBytes), true);
|
|
149
138
|
staged.#rejectFinalSymlink = params.rejectFinalSymlink === true;
|
|
150
139
|
if (params.input.kind === "file")
|
|
151
140
|
await params.input.verifySource();
|
|
@@ -201,7 +190,7 @@ class NativeStagedFile {
|
|
|
201
190
|
}
|
|
202
191
|
#assertNamed(name, expectedMode) {
|
|
203
192
|
const fd = this.#file();
|
|
204
|
-
const stat = this.#binding.stagedFileMatches(this.#parentFd, name, fd)
|
|
193
|
+
const stat = this.#owner.binding.stagedFileMatches(this.#owner.parentFd, name, fd)
|
|
205
194
|
? fs.fstatSync(fd, { bigint: true }) : undefined;
|
|
206
195
|
if (!stat || stat.nlink !== 1n) {
|
|
207
196
|
throw new FsSafeError("path-mismatch", "staged entry no longer names the exclusive created file");
|
|
@@ -213,8 +202,8 @@ class NativeStagedFile {
|
|
|
213
202
|
if (this.#open().publication.status !== "not-published") {
|
|
214
203
|
throw new FsSafeError("helper-failed", "staged file publication has already been attempted");
|
|
215
204
|
}
|
|
216
|
-
assertStagedDirectoryCurrent(this.#directory);
|
|
217
|
-
this.#assertNamed(this.#name, 0o600);
|
|
205
|
+
assertStagedDirectoryCurrent(this.#owner.directory);
|
|
206
|
+
this.#assertNamed(this.#owner.name, 0o600);
|
|
218
207
|
}
|
|
219
208
|
#assertPermissions(fd, stat, expectedMode) {
|
|
220
209
|
if (this.#private)
|
|
@@ -228,7 +217,7 @@ class NativeStagedFile {
|
|
|
228
217
|
}
|
|
229
218
|
async #prepare(input, maxBytes) {
|
|
230
219
|
try {
|
|
231
|
-
const mode = this.#
|
|
220
|
+
const mode = this.#owner.mode;
|
|
232
221
|
if (!Number.isInteger(mode) || mode < 0 || mode > 0o7777) {
|
|
233
222
|
throw new FsSafeError("invalid-path", "invalid staged file mode");
|
|
234
223
|
}
|
|
@@ -239,32 +228,35 @@ class NativeStagedFile {
|
|
|
239
228
|
throw new FsSafeError("helper-unavailable", "required cloning cannot verify staged permissions before copying");
|
|
240
229
|
}
|
|
241
230
|
}
|
|
242
|
-
assertStagedDirectoryCurrent(this.#directory);
|
|
231
|
+
assertStagedDirectoryCurrent(this.#owner.directory);
|
|
243
232
|
// The exclusive open performs no fallible post-open checks. Store its fd
|
|
244
233
|
// before every subsequent operation, including the first metadata read.
|
|
245
234
|
const state = this.#open();
|
|
246
235
|
if (this.#private)
|
|
247
|
-
assertDarwinCreationAcl(this.#parentFd, "file");
|
|
236
|
+
assertDarwinCreationAcl(this.#owner.parentFd, "file");
|
|
248
237
|
this.#assertBeforeMutation?.();
|
|
249
238
|
if (this.#private)
|
|
250
|
-
assertDarwinCreationAcl(this.#parentFd, "file");
|
|
239
|
+
assertDarwinCreationAcl(this.#owner.parentFd, "file");
|
|
251
240
|
// Native copying populates its new file before returning its descriptor.
|
|
252
241
|
const copied = input.kind === "file" && !this.#verifyMode
|
|
253
|
-
? await createNativeCopyFile(this.#binding, input, this.#parentFd, this.#name, maxBytes, false)
|
|
242
|
+
? await createNativeCopyFile(this.#owner.binding, input, this.#owner.parentFd, this.#owner.name, maxBytes, false)
|
|
254
243
|
: undefined;
|
|
255
244
|
state.fileFd = copied?.fd;
|
|
256
245
|
if (state.fileFd === undefined) {
|
|
257
246
|
this.#assertBeforeMutation?.();
|
|
258
247
|
if (this.#private)
|
|
259
|
-
assertDarwinCreationAcl(this.#parentFd, "file");
|
|
260
|
-
state.fileFd = this.#binding.createStagedFile(this.#parentFd, this.#name);
|
|
248
|
+
assertDarwinCreationAcl(this.#owner.parentFd, "file");
|
|
249
|
+
state.fileFd = this.#owner.binding.createStagedFile(this.#owner.parentFd, this.#owner.name);
|
|
261
250
|
}
|
|
262
251
|
const fd = state.fileFd;
|
|
263
252
|
if (input.kind === "file")
|
|
264
253
|
assertNativeCopyCompleted(input, copied);
|
|
265
|
-
const assertBeforeChmod = this.#
|
|
266
|
-
|
|
267
|
-
|
|
254
|
+
const assertBeforeChmod = this.#assertBeforeMutation;
|
|
255
|
+
const beforeChmodResult = assertBeforeChmod?.();
|
|
256
|
+
if (this.#private) {
|
|
257
|
+
assertSynchronousCallbackResult(beforeChmodResult, "assertBeforeMutation");
|
|
258
|
+
assertPrivateCreationFile(fs.fstatSync(fd, { bigint: true }), fd);
|
|
259
|
+
}
|
|
268
260
|
fs.fchmodSync(fd, 0o600);
|
|
269
261
|
// Some filesystems report successful chmod without enforcing its mode.
|
|
270
262
|
if (this.#verifyMode)
|
|
@@ -278,14 +270,14 @@ class NativeStagedFile {
|
|
|
278
270
|
await writePinnedInput(fd, input, maxBytes, assertBeforeMutation);
|
|
279
271
|
if (this.#verifyMode)
|
|
280
272
|
this.#assertStagePermissions(fd);
|
|
281
|
-
if (this.#sync) {
|
|
282
|
-
if (this.#strictFileSync)
|
|
273
|
+
if (this.#owner.sync !== false) {
|
|
274
|
+
if (this.#owner.strictFileSync)
|
|
283
275
|
fs.fsyncSync(fd);
|
|
284
276
|
else
|
|
285
277
|
syncFileBestEffortSync(fd);
|
|
286
278
|
}
|
|
287
279
|
const stat = fs.fstatSync(fd, { bigint: true });
|
|
288
|
-
this.#receipt = createStagedFileReceipt(this.#directory, this.#name, stat);
|
|
280
|
+
this.#receipt = createStagedFileReceipt(this.#owner.directory, this.#owner.name, stat);
|
|
289
281
|
this.#assertCurrent();
|
|
290
282
|
}
|
|
291
283
|
catch (error) {
|
|
@@ -308,23 +300,23 @@ class NativeStagedFile {
|
|
|
308
300
|
const overwrite = options?.overwrite;
|
|
309
301
|
try {
|
|
310
302
|
const state = this.#open();
|
|
311
|
-
assertBasename(basename, this.#portableNames);
|
|
312
|
-
if (basename === this.#name || typeof overwrite !== "boolean") {
|
|
303
|
+
assertBasename(basename, this.#owner.portableNames !== false);
|
|
304
|
+
if (basename === this.#owner.name || typeof overwrite !== "boolean") {
|
|
313
305
|
throw new FsSafeError("invalid-path", "publication needs a distinct basename and explicit overwrite policy");
|
|
314
306
|
}
|
|
315
307
|
this.#assertCurrent();
|
|
316
|
-
assertFinalSymlinkRejected(path.join(this.#directory.realPath, basename), this.#rejectFinalSymlink);
|
|
308
|
+
assertFinalSymlinkRejected(path.join(this.#owner.directory.realPath, basename), this.#rejectFinalSymlink);
|
|
317
309
|
this.#assertBeforeMutation?.();
|
|
318
310
|
if (this.#assertBeforeMutation) {
|
|
319
311
|
this.#assertCurrent();
|
|
320
|
-
assertFinalSymlinkRejected(path.join(this.#directory.realPath, basename), this.#rejectFinalSymlink);
|
|
312
|
+
assertFinalSymlinkRejected(path.join(this.#owner.directory.realPath, basename), this.#rejectFinalSymlink);
|
|
321
313
|
}
|
|
322
314
|
try {
|
|
323
315
|
if (overwrite) {
|
|
324
|
-
this.#binding.renameReplace(this.#parentFd, this.#name, this.#parentFd, basename);
|
|
316
|
+
this.#owner.binding.renameReplace(this.#owner.parentFd, this.#owner.name, this.#owner.parentFd, basename);
|
|
325
317
|
}
|
|
326
318
|
else {
|
|
327
|
-
this.#binding.renameNoReplace(this.#parentFd, this.#name, this.#parentFd, basename);
|
|
319
|
+
this.#owner.binding.renameNoReplace(this.#owner.parentFd, this.#owner.name, this.#owner.parentFd, basename);
|
|
328
320
|
}
|
|
329
321
|
}
|
|
330
322
|
catch (error) {
|
|
@@ -352,24 +344,24 @@ class NativeStagedFile {
|
|
|
352
344
|
this.#open().publication = receipt;
|
|
353
345
|
onPublished?.(receipt.staged.identity);
|
|
354
346
|
const stagedMode = this.#assertNamed(basename, 0o600);
|
|
355
|
-
assertStagedDirectoryCurrent(this.#directory);
|
|
347
|
+
assertStagedDirectoryCurrent(this.#owner.directory);
|
|
356
348
|
// Keep contents private until the name passes its identity fence. Mode
|
|
357
349
|
// changes use the owned fd, including for final mode 000.
|
|
358
350
|
const fd = this.#file();
|
|
359
|
-
if (this.#
|
|
360
|
-
fs.fchmodSync(fd, this.#
|
|
351
|
+
if (this.#owner.mode !== 0o600 || stagedMode !== 0o600)
|
|
352
|
+
fs.fchmodSync(fd, this.#owner.mode);
|
|
361
353
|
// Content was synced during preparation. A lost chmod leaves 0600, no wider
|
|
362
354
|
// than modes retaining owner rw; restrictive modes still need a durable correction.
|
|
363
|
-
if (this.#sync && ((this.#
|
|
364
|
-
if (this.#strictFileSync)
|
|
355
|
+
if (this.#owner.sync !== false && ((this.#owner.mode & 0o600) !== 0o600 || (stagedMode & ~this.#owner.mode) !== 0)) {
|
|
356
|
+
if (this.#owner.strictFileSync)
|
|
365
357
|
fs.fsyncSync(fd);
|
|
366
358
|
else
|
|
367
359
|
syncFileBestEffortSync(fd);
|
|
368
360
|
}
|
|
369
|
-
if (this.#sync)
|
|
370
|
-
syncFileBestEffortSync(this.#parentFd);
|
|
371
|
-
this.#assertNamed(basename, this.#
|
|
372
|
-
assertStagedDirectoryCurrent(this.#directory);
|
|
361
|
+
if (this.#owner.sync !== false)
|
|
362
|
+
syncFileBestEffortSync(this.#owner.parentFd);
|
|
363
|
+
this.#assertNamed(basename, this.#owner.mode);
|
|
364
|
+
assertStagedDirectoryCurrent(this.#owner.directory);
|
|
373
365
|
return receipt;
|
|
374
366
|
}
|
|
375
367
|
#finalize() {
|
|
@@ -384,7 +376,7 @@ class NativeStagedFile {
|
|
|
384
376
|
}
|
|
385
377
|
else if (state.publication.status === "not-published" && state.fileFd !== undefined) {
|
|
386
378
|
try {
|
|
387
|
-
outcome = this.#binding.removeStagedFile(this.#parentFd, this.#name, state.fileFd);
|
|
379
|
+
outcome = this.#owner.binding.removeStagedFile(this.#owner.parentFd, this.#owner.name, state.fileFd);
|
|
388
380
|
}
|
|
389
381
|
catch (error) {
|
|
390
382
|
outcome = "failed";
|
|
@@ -394,7 +386,7 @@ class NativeStagedFile {
|
|
|
394
386
|
let resources = "closed";
|
|
395
387
|
for (const [fd, closeFd] of [
|
|
396
388
|
[state.fileFd, this.#closeFd],
|
|
397
|
-
[this.#parentFd, this.#closeParentFd],
|
|
389
|
+
[this.#owner.parentFd, this.#owner.closeParentFd],
|
|
398
390
|
]) {
|
|
399
391
|
if (fd === undefined) {
|
|
400
392
|
continue;
|
|
@@ -408,7 +400,7 @@ class NativeStagedFile {
|
|
|
408
400
|
}
|
|
409
401
|
}
|
|
410
402
|
const receipt = Object.freeze({
|
|
411
|
-
temporaryBasename: this.#name,
|
|
403
|
+
temporaryBasename: this.#owner.name,
|
|
412
404
|
publication: state.publication,
|
|
413
405
|
status: outcome,
|
|
414
406
|
resources,
|
|
@@ -444,5 +436,8 @@ export async function stageFileInDirectory(options) {
|
|
|
444
436
|
const input = { kind: "buffer", data: Buffer.from(options.content) };
|
|
445
437
|
const mode = options.mode ?? 0o600;
|
|
446
438
|
const parent = openStagedDirectory(options.directory);
|
|
447
|
-
return await createNativeStage(
|
|
439
|
+
return await createNativeStage({
|
|
440
|
+
binding, parentFd: parent.fd, closeParentFd: fs.closeSync,
|
|
441
|
+
directory: parent.receipt, mode, permissionPolicy: "mode-only",
|
|
442
|
+
}, input);
|
|
448
443
|
}
|
package/dist/native.d.ts
CHANGED
|
@@ -11,4 +11,3 @@ export declare function getNativeBinding(): NativeBinding | undefined;
|
|
|
11
11
|
export declare function requireNativeBinding(): NativeBinding;
|
|
12
12
|
export declare function __setNativeLoaderForTest(loader: () => NativeBinding): void;
|
|
13
13
|
export declare function __resetNativeLoaderForTest(): void;
|
|
14
|
-
//# sourceMappingURL=native.d.ts.map
|
package/dist/native.js
CHANGED
|
@@ -22,7 +22,7 @@ function isMuslFromReport() {
|
|
|
22
22
|
return true;
|
|
23
23
|
}
|
|
24
24
|
catch {
|
|
25
|
-
// Continue with
|
|
25
|
+
// Continue with ELF and filesystem inspection.
|
|
26
26
|
}
|
|
27
27
|
return undefined;
|
|
28
28
|
}
|
|
@@ -114,7 +114,7 @@ function isMuslFromElfInterpreter() {
|
|
|
114
114
|
function isMusl() {
|
|
115
115
|
if (process.platform !== "linux")
|
|
116
116
|
return false;
|
|
117
|
-
for (const detector of [isMuslFromReport,
|
|
117
|
+
for (const detector of [isMuslFromReport, isMuslFromElfInterpreter, isMuslFromFilesystem]) {
|
|
118
118
|
const result = detector();
|
|
119
119
|
if (result !== undefined)
|
|
120
120
|
return result;
|
|
@@ -5,4 +5,3 @@ export declare function recordExclusiveCreateFailure(error: unknown, filePath: s
|
|
|
5
5
|
export declare function openedPathResolutionError(error?: Error): Error;
|
|
6
6
|
export declare function recordPreOpenFileChange(error: unknown, handle: FileHandle, filePath: string, before: BigIntStats | undefined, opened: BigIntStats | undefined): Promise<void>;
|
|
7
7
|
export declare function recordOpenedFileFailure(error: unknown, handle: FileHandle, filePath: string, identity: BigIntStats): Promise<void>;
|
|
8
|
-
//# sourceMappingURL=opened-file-failure.d.ts.map
|
package/dist/opened-realpath.js
CHANGED
|
@@ -5,9 +5,18 @@ import { openedPathResolutionError } from "./opened-file-failure.js";
|
|
|
5
5
|
import { sameFileIdentity } from "./file-identity.js";
|
|
6
6
|
import { isNotFoundPathError } from "./path.js";
|
|
7
7
|
import { realpathSync } from "./realpath.js";
|
|
8
|
+
import { inspectFileIdentitySync } from "./strict-file-identity.js";
|
|
8
9
|
export async function resolveOpenedFileRealPathForHandle(handle, ioPath) {
|
|
9
|
-
const
|
|
10
|
-
|
|
10
|
+
const fd = handle.fd;
|
|
11
|
+
const identity = inspectFileIdentitySync(() => fsSync.fstatSync(fd, { bigint: true }));
|
|
12
|
+
const resolved = await resolveOpenedFileRealPathForFd(fd, identity, ioPath);
|
|
13
|
+
let first = resolved.stat;
|
|
14
|
+
inspectFileIdentitySync(() => {
|
|
15
|
+
const current = first ?? fsSync.statSync(resolved.realPath, { bigint: true });
|
|
16
|
+
first = undefined;
|
|
17
|
+
return current;
|
|
18
|
+
}, identity);
|
|
19
|
+
return resolved.realPath;
|
|
11
20
|
}
|
|
12
21
|
export async function resolveOpenedFileRealPathForFd(fd, handleStat, ioPath) {
|
|
13
22
|
const statOptions = typeof handleStat.dev === "bigint" || typeof handleStat.ino === "bigint"
|
package/dist/output.d.ts
CHANGED
|
@@ -5,4 +5,3 @@ export type OverwriteFileHandleOptions = {
|
|
|
5
5
|
};
|
|
6
6
|
/** Overwrite a borrowed, non-append read/write handle with best-effort failure rollback. */
|
|
7
7
|
export declare function overwriteFileHandle(handle: FileHandle, data: Uint8Array, options?: OverwriteFileHandleOptions): Promise<void>;
|
|
8
|
-
//# sourceMappingURL=overwrite-file-handle.d.ts.map
|
package/dist/owner-dacl.d.ts
CHANGED
package/dist/path-case.d.ts
CHANGED
|
@@ -4,4 +4,3 @@ export type ProbePathCaseOptions = {
|
|
|
4
4
|
};
|
|
5
5
|
/** Observe local ASCII case behavior; unknown observations never imply an operating-system default. */
|
|
6
6
|
export declare function probePathCaseInsensitiveSync(targetPath: string, options?: ProbePathCaseOptions): boolean | undefined;
|
|
7
|
-
//# sourceMappingURL=path-case.d.ts.map
|
package/dist/path-policy.d.ts
CHANGED
package/dist/path-prefix.d.ts
CHANGED
|
@@ -4,4 +4,3 @@ export type PathSegmentRoute = Readonly<{
|
|
|
4
4
|
}>;
|
|
5
5
|
export declare function createPathSegmentRoute(segments: readonly string[]): PathSegmentRoute;
|
|
6
6
|
export declare function joinPathSegmentRoute(base: string, route: PathSegmentRoute, offset: number, tail?: string): string;
|
|
7
|
-
//# sourceMappingURL=path-segment-route.d.ts.map
|
|
@@ -9,4 +9,3 @@ export type ProbePathSuffixAliasesOptions = {
|
|
|
9
9
|
};
|
|
10
10
|
/** Observe bounded missing suffix aliases; the caller owns caching and ambiguity policy. */
|
|
11
11
|
export declare function probePathSuffixAliasesSync(options: ProbePathSuffixAliasesOptions): boolean | undefined;
|
|
12
|
-
//# sourceMappingURL=path-suffix-aliases.d.ts.map
|
package/dist/path.d.ts
CHANGED
|
@@ -18,4 +18,3 @@ export declare function isPathInsideWithRealpath(basePath: string, candidatePath
|
|
|
18
18
|
export declare function safeStatSync(targetPath: string): fs.Stats | null;
|
|
19
19
|
export declare function splitSafeRelativePath(relativePath: string): string[];
|
|
20
20
|
export declare function resolveSafeRelativePath(rootDir: string, relativePath: string): string;
|
|
21
|
-
//# sourceMappingURL=path.d.ts.map
|
package/dist/path.js
CHANGED
|
@@ -160,7 +160,8 @@ export function splitSafeRelativePath(relativePath) {
|
|
|
160
160
|
export function resolveSafeRelativePath(rootDir, relativePath) {
|
|
161
161
|
assertNoWindowsPathAlias(rootDir, "filesystem", "root dir uses a Windows filesystem namespace alias");
|
|
162
162
|
const root = resolvePathPreservingWindowsRoot(rootDir);
|
|
163
|
-
|
|
163
|
+
splitSafeRelativePath(relativePath);
|
|
164
|
+
const target = resolvePathFromBasePreservingWindowsRoot(root, relativePath);
|
|
164
165
|
if (!isPathInside(root, target)) {
|
|
165
166
|
throw new FsSafeError("outside-workspace", "relative path escapes root");
|
|
166
167
|
}
|
package/dist/permission-exec.js
CHANGED
|
@@ -8,7 +8,6 @@ export function formatPermissionErrorDetail(value) {
|
|
|
8
8
|
const formatted = formatErrorDetail(value);
|
|
9
9
|
return formatted.length > 400 ? `${formatted.slice(0, 399)}…` : formatted;
|
|
10
10
|
}
|
|
11
|
-
const MISSING_DATA_PROPERTY = Object.freeze({ found: false });
|
|
12
11
|
const MAX_CAUGHT_FAILURE_PROTOTYPES = 4;
|
|
13
12
|
const primitiveString = String;
|
|
14
13
|
const isUint8Array = utilTypes.isUint8Array;
|
|
@@ -36,32 +35,28 @@ function isInspectableCaughtObject(value) {
|
|
|
36
35
|
}
|
|
37
36
|
}
|
|
38
37
|
function dataProperty(value, name) {
|
|
39
|
-
if (!isInspectableCaughtObject(value))
|
|
40
|
-
return MISSING_DATA_PROPERTY;
|
|
41
38
|
let current = value;
|
|
42
39
|
for (let depth = 0; current !== null && depth < MAX_CAUGHT_FAILURE_PROTOTYPES; depth += 1) {
|
|
43
40
|
if (!isInspectableCaughtObject(current))
|
|
44
|
-
return
|
|
41
|
+
return undefined;
|
|
45
42
|
let descriptor;
|
|
46
43
|
try {
|
|
47
44
|
descriptor = Object.getOwnPropertyDescriptor(current, name);
|
|
48
45
|
}
|
|
49
46
|
catch {
|
|
50
|
-
return
|
|
47
|
+
return undefined;
|
|
51
48
|
}
|
|
52
49
|
if (descriptor) {
|
|
53
|
-
return Object.hasOwn(descriptor, "value")
|
|
54
|
-
? { found: true, value: descriptor.value }
|
|
55
|
-
: MISSING_DATA_PROPERTY;
|
|
50
|
+
return Object.hasOwn(descriptor, "value") ? descriptor : undefined;
|
|
56
51
|
}
|
|
57
52
|
try {
|
|
58
53
|
current = Object.getPrototypeOf(current);
|
|
59
54
|
}
|
|
60
55
|
catch {
|
|
61
|
-
return
|
|
56
|
+
return undefined;
|
|
62
57
|
}
|
|
63
58
|
}
|
|
64
|
-
return
|
|
59
|
+
return undefined;
|
|
65
60
|
}
|
|
66
61
|
function caughtPrimitiveDisplay(value) {
|
|
67
62
|
if (value !== null && (typeof value === "object" || typeof value === "function"))
|
|
@@ -78,9 +73,9 @@ export function formatCaughtPermissionFailure(error) {
|
|
|
78
73
|
}
|
|
79
74
|
const message = dataProperty(error, "message");
|
|
80
75
|
const name = dataProperty(error, "name");
|
|
81
|
-
const rawMessage =
|
|
76
|
+
const rawMessage = typeof message?.value === "string"
|
|
82
77
|
? message.value : "";
|
|
83
|
-
const rawName =
|
|
78
|
+
const rawName = typeof name?.value === "string"
|
|
84
79
|
? name.value : "";
|
|
85
80
|
const messageText = rawMessage.slice(0, 400);
|
|
86
81
|
const nameText = rawName.slice(0, 400);
|
|
@@ -123,12 +118,11 @@ function commandFailureFields(error) {
|
|
|
123
118
|
const signal = dataProperty(error, "signal");
|
|
124
119
|
const stderr = dataProperty(error, "stderr");
|
|
125
120
|
return {
|
|
126
|
-
found: killed
|
|
127
|
-
timedOut: killed
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
stderr: stderr.found ? safeStderr(stderr.value) : "",
|
|
121
|
+
found: !!(killed || code || signal || stderr),
|
|
122
|
+
timedOut: killed?.value === true && signal?.value === "SIGKILL",
|
|
123
|
+
exitCode: typeof code?.value === "number" ? code.value : null,
|
|
124
|
+
signal: typeof signal?.value === "string" ? signal.value : null,
|
|
125
|
+
stderr: stderr ? safeStderr(stderr.value) : "",
|
|
132
126
|
};
|
|
133
127
|
}
|
|
134
128
|
export class PermissionCommandError extends Error {
|
|
@@ -155,20 +149,20 @@ export class PermissionCommandError extends Error {
|
|
|
155
149
|
export function getPermissionCommandFailure(error, command, durationMs) {
|
|
156
150
|
if (isInspectableCaughtObject(error) && utilTypes.isNativeError(error)) {
|
|
157
151
|
const name = dataProperty(error, "name");
|
|
158
|
-
if (name
|
|
152
|
+
if (name?.value === "PermissionCommandError") {
|
|
159
153
|
const wrappedCommand = dataProperty(error, "command");
|
|
160
154
|
const wrappedDuration = dataProperty(error, "durationMs");
|
|
161
155
|
const wrappedTimedOut = dataProperty(error, "timedOut");
|
|
162
156
|
const wrappedExitCode = dataProperty(error, "exitCode");
|
|
163
157
|
const wrappedSignal = dataProperty(error, "signal");
|
|
164
158
|
const wrappedStderr = dataProperty(error, "stderr");
|
|
165
|
-
if (
|
|
166
|
-
|
|
159
|
+
if (typeof wrappedCommand?.value === "string" &&
|
|
160
|
+
typeof wrappedDuration?.value === "number" &&
|
|
167
161
|
Number.isSafeInteger(wrappedDuration.value) && wrappedDuration.value >= 0 &&
|
|
168
|
-
|
|
169
|
-
wrappedExitCode
|
|
170
|
-
wrappedSignal
|
|
171
|
-
wrappedStderr
|
|
162
|
+
typeof wrappedTimedOut?.value === "boolean" &&
|
|
163
|
+
wrappedExitCode && (wrappedExitCode.value === null || typeof wrappedExitCode.value === "number") &&
|
|
164
|
+
wrappedSignal && (wrappedSignal.value === null || typeof wrappedSignal.value === "string") &&
|
|
165
|
+
wrappedStderr) {
|
|
172
166
|
return {
|
|
173
167
|
command: wrappedCommand.value,
|
|
174
168
|
durationMs: wrappedDuration.value,
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
export { formatOctal, formatPermissionDetail, formatPermissionRemediation, inspectPathPermissions, isGroupReadable, isGroupWritable, isWorldReadable, isWorldWritable, modeBits, safeStat, type PermissionCheck, type PermissionCheckOptions, type PermissionCommandFailure, type SafeStatResult, } from "./permissions.js";
|
|
2
2
|
export { createPrivateDirectory, type CreatePrivateDirectoryOptions, } from "./private-directory.js";
|
|
3
3
|
export { readOwnerAndDacl, type OwnerAndDaclResult, type WindowsAccessControlEntry, type WindowsAceFlags, } from "./owner-dacl.js";
|
|
4
|
-
//# sourceMappingURL=permissions-public.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type PermissionCommandFailure } from "./permission-exec.js";
|
|
2
|
-
import { type PermissionCheck, type PermissionCheckOptions
|
|
2
|
+
import { type PermissionCheck, type PermissionCheckOptions } from "./permissions.js";
|
|
3
3
|
export type PermissionExec = (command: string, args: string[]) => Promise<{
|
|
4
4
|
stdout: string;
|
|
5
5
|
stderr: string;
|
|
@@ -31,14 +31,7 @@ export type IcaclsResetCommandOptions = {
|
|
|
31
31
|
env?: NodeJS.ProcessEnv;
|
|
32
32
|
userInfo?: WindowsUserInfoProvider;
|
|
33
33
|
};
|
|
34
|
-
export declare function inspectWindowsPermissions(
|
|
35
|
-
targetPath: string;
|
|
36
|
-
stat: SafeStatResult;
|
|
37
|
-
effectiveIsDir: boolean;
|
|
38
|
-
effectiveMode: number | null;
|
|
39
|
-
bits: number | null;
|
|
40
|
-
opts?: PermissionCheckOptions;
|
|
41
|
-
}): Promise<PermissionCheck>;
|
|
34
|
+
export declare function inspectWindowsPermissions(targetPath: string, unverified: Readonly<PermissionCheck>, opts?: PermissionCheckOptions): Promise<PermissionCheck>;
|
|
42
35
|
export declare function resolveWindowsUserPrincipal(env?: NodeJS.ProcessEnv, userInfo?: WindowsUserInfoProvider): string | null;
|
|
43
36
|
export declare function parseIcaclsOutput(output: string, targetPath: string): WindowsAclEntry[];
|
|
44
37
|
export declare function summarizeWindowsAcl(entries: WindowsAclEntry[], env?: NodeJS.ProcessEnv): Pick<WindowsAclSummary, "trusted" | "untrustedWorld" | "untrustedGroup">;
|
|
@@ -56,4 +49,3 @@ export declare function createIcaclsResetCommand(targetPath: string, opts: Icacl
|
|
|
56
49
|
args: string[];
|
|
57
50
|
display: string;
|
|
58
51
|
} | null;
|
|
59
|
-
//# sourceMappingURL=permissions-windows.d.ts.map
|
|
@@ -39,20 +39,16 @@ const TRUSTED_BASE_ASCII = new Set([...TRUSTED_BASE].map(stripDiacritics));
|
|
|
39
39
|
const normalize = (value) => normalizeLowercaseStringOrEmpty(value);
|
|
40
40
|
const defaultWindowsUserInfo = () => os.userInfo();
|
|
41
41
|
const defaultPermissionExec = executePermissionCommand;
|
|
42
|
-
function inspectWindowsPermissionsNative(
|
|
42
|
+
function inspectWindowsPermissionsNative(targetPath, unverified) {
|
|
43
43
|
const native = getNativeBinding();
|
|
44
44
|
if (!native)
|
|
45
45
|
return undefined;
|
|
46
46
|
try {
|
|
47
|
-
const facts = native.readOwnerAndDacl(
|
|
47
|
+
const facts = native.readOwnerAndDacl(targetPath);
|
|
48
48
|
if (facts.fallbackRequired)
|
|
49
49
|
return undefined;
|
|
50
50
|
return {
|
|
51
|
-
|
|
52
|
-
isSymlink: params.stat.isSymlink,
|
|
53
|
-
isDir: params.effectiveIsDir,
|
|
54
|
-
mode: params.effectiveMode,
|
|
55
|
-
bits: params.bits,
|
|
51
|
+
...unverified,
|
|
56
52
|
source: "windows-acl",
|
|
57
53
|
worldWritable: facts.worldWritable,
|
|
58
54
|
groupWritable: facts.groupWritable,
|
|
@@ -69,32 +65,20 @@ function inspectWindowsPermissionsNative(params) {
|
|
|
69
65
|
return undefined;
|
|
70
66
|
}
|
|
71
67
|
}
|
|
72
|
-
export async function inspectWindowsPermissions(
|
|
73
|
-
|
|
74
|
-
ok: true,
|
|
75
|
-
isSymlink: params.stat.isSymlink,
|
|
76
|
-
isDir: params.effectiveIsDir,
|
|
77
|
-
mode: params.effectiveMode,
|
|
78
|
-
bits: params.bits,
|
|
79
|
-
source: "unknown",
|
|
80
|
-
worldWritable: false,
|
|
81
|
-
groupWritable: false,
|
|
82
|
-
worldReadable: false,
|
|
83
|
-
groupReadable: false,
|
|
84
|
-
};
|
|
85
|
-
if (hasWindowsPathAlias(params.targetPath, "filesystem", "win32")) {
|
|
68
|
+
export async function inspectWindowsPermissions(targetPath, unverified, opts) {
|
|
69
|
+
if (hasWindowsPathAlias(targetPath, "filesystem", "win32")) {
|
|
86
70
|
return {
|
|
87
71
|
...unverified,
|
|
88
72
|
error: "Path uses a Windows filesystem namespace alias",
|
|
89
73
|
};
|
|
90
74
|
}
|
|
91
|
-
const native = inspectWindowsPermissionsNative(
|
|
75
|
+
const native = inspectWindowsPermissionsNative(targetPath, unverified);
|
|
92
76
|
if (native)
|
|
93
77
|
return native;
|
|
94
78
|
const owner = await inspectWindowsOwner({
|
|
95
|
-
targetPath
|
|
96
|
-
env:
|
|
97
|
-
exec:
|
|
79
|
+
targetPath,
|
|
80
|
+
env: opts?.env,
|
|
81
|
+
exec: opts?.exec ?? defaultPermissionExec,
|
|
98
82
|
});
|
|
99
83
|
if (owner.error !== undefined) {
|
|
100
84
|
const error = `Windows owner inspection failed: ${owner.error}`;
|
|
@@ -109,11 +93,7 @@ export async function inspectWindowsPermissions(params) {
|
|
|
109
93
|
if (!acl.ok)
|
|
110
94
|
return { ...unverified, ...ownerFields, error: acl.error, errorDetail: acl.errorDetail, errorCause: acl.errorCause };
|
|
111
95
|
return {
|
|
112
|
-
|
|
113
|
-
isSymlink: params.stat.isSymlink,
|
|
114
|
-
isDir: params.effectiveIsDir,
|
|
115
|
-
mode: params.effectiveMode,
|
|
116
|
-
bits: params.bits,
|
|
96
|
+
...unverified,
|
|
117
97
|
source: "windows-acl",
|
|
118
98
|
worldWritable: acl.untrustedWorld.some((entry) => entry.canWrite),
|
|
119
99
|
groupWritable: acl.untrustedGroup.some((entry) => entry.canWrite),
|