@synopackageland/cli 0.3.10 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +57 -9
- package/dist/bin.js +1 -2
- package/dist/build-spk/generator.d.ts +0 -3
- package/dist/build-spk/generator.js +138 -287
- package/dist/build-spk/native-lifecycle.js +0 -3
- package/dist/build-spk/native-payload.js +0 -1
- package/dist/build-spk/notices.d.ts +5 -0
- package/dist/build-spk/notices.js +60 -0
- package/dist/cli.js +178 -151
- package/dist/compose/analyze.d.ts +1 -2
- package/dist/compose/analyze.js +5 -48
- package/dist/contract/unsupported-types.d.ts +10 -0
- package/dist/contract/unsupported-types.js +49 -0
- package/dist/contract/validate.js +25 -2
- package/dist/contract/web-launch.js +0 -2
- package/dist/deploy/deploy.d.ts +1 -4
- package/dist/deploy/deploy.js +45 -156
- package/dist/deploy/homes-values.js +1 -1
- package/dist/deploy/plan.d.ts +18 -0
- package/dist/deploy/plan.js +54 -0
- package/dist/deploy/spk-version.d.ts +2 -14
- package/dist/deploy/spk-version.js +25 -111
- package/dist/dev.d.ts +1 -3
- package/dist/dev.js +14 -28
- package/dist/error-registry.js +830 -862
- package/dist/host/dsm-client.js +12 -272
- package/dist/host/dsm-port-profile.d.ts +0 -1
- package/dist/host/dsm-port-profile.js +0 -2
- package/dist/host/types.d.ts +1 -83
- package/dist/index.d.ts +0 -9
- package/dist/index.js +0 -6
- package/dist/info.d.ts +0 -1
- package/dist/info.js +3 -10
- package/dist/init.d.ts +15 -1
- package/dist/init.js +128 -12
- package/dist/log.js +2 -3
- package/dist/native/validate.js +0 -1
- package/dist/standalone/binary.d.ts +9 -0
- package/dist/standalone/binary.js +67 -0
- package/dist/standalone/build.d.ts +25 -0
- package/dist/standalone/build.js +110 -0
- package/dist/standalone/daemon.d.ts +23 -0
- package/dist/standalone/daemon.js +114 -0
- package/dist/standalone/dsm-window.d.ts +26 -0
- package/dist/standalone/dsm-window.js +291 -0
- package/dist/standalone/helper-inventory.d.ts +16 -0
- package/dist/standalone/helper-inventory.js +2 -0
- package/dist/standalone/helper.d.ts +21 -0
- package/dist/standalone/helper.js +105 -0
- package/dist/standalone/host-adapter.d.ts +5 -0
- package/dist/standalone/host-adapter.js +148 -0
- package/dist/standalone/host-platform.d.ts +13 -0
- package/dist/standalone/host-platform.js +42 -0
- package/dist/standalone/host-types.d.ts +49 -0
- package/dist/standalone/host-types.js +1 -0
- package/dist/standalone/i18n.d.ts +28 -0
- package/dist/standalone/i18n.js +161 -0
- package/dist/standalone/inspect-helper.d.ts +6 -0
- package/dist/standalone/inspect-helper.js +88 -0
- package/dist/standalone/inspect-spk.d.ts +23 -0
- package/dist/standalone/inspect-spk.js +209 -0
- package/dist/standalone/lifecycle-helper.d.ts +2 -0
- package/dist/standalone/lifecycle-helper.js +12 -0
- package/dist/standalone/lifecycle.d.ts +3 -0
- package/dist/standalone/lifecycle.js +53 -0
- package/dist/standalone/manifest.d.ts +73 -0
- package/dist/standalone/manifest.js +279 -0
- package/dist/standalone/reopen-events.d.ts +2 -0
- package/dist/standalone/reopen-events.js +28 -0
- package/dist/standalone/root-messages.d.ts +7 -0
- package/dist/standalone/root-messages.js +259 -0
- package/dist/standalone/root-ops.d.ts +42 -0
- package/dist/standalone/root-ops.js +101 -0
- package/dist/standalone/root-window.d.ts +36 -0
- package/dist/standalone/root-window.js +302 -0
- package/dist/standalone/spk.d.ts +23 -0
- package/dist/standalone/spk.js +192 -0
- package/dist/template-paths.d.ts +2 -0
- package/dist/template-paths.js +9 -0
- package/dist/templates/_daemon/fixture_linux_test.go +15 -0
- package/dist/templates/_daemon/fixture_other_test.go +7 -0
- package/dist/templates/_daemon/go.mod +3 -0
- package/dist/templates/_daemon/main.go +608 -0
- package/dist/templates/_daemon/main_test.go +242 -0
- package/dist/templates/_daemon/process_linux.go +55 -0
- package/dist/templates/_daemon/process_linux_test.go +161 -0
- package/dist/templates/_daemon/process_other.go +14 -0
- package/dist/templates/_daemon/testdata/child.go +41 -0
- package/dist/templates/_shared/GO-LICENSE +27 -0
- package/dist/templates/_shared/GO-PATENTS +22 -0
- package/dist/templates/_shared/LICENSES/TEMPLATE.txt +21 -0
- package/dist/templates/_shared/notice-overrides/index.json +14 -0
- package/dist/templates/_shared/notice-overrides/utils-0.4.2-LICENSE +21 -0
- package/dist/templates/_shared/notice-overrides/utils-0.5.0-LICENSE +21 -0
- package/dist/templates/_shared/third-party-notices.mjs +51 -0
- package/dist/templates/binary/synology-app.yaml +7 -0
- package/dist/templates/hello-files/compose.yaml +0 -1
- package/dist/templates/hello-web/compose.yaml +13 -10
- package/dist/templates/hello-web/html/app.js +1 -23
- package/dist/templates/hello-web/html/index.html +1 -3
- package/dist/templates/hello-web-page/compose.yaml +13 -10
- package/dist/templates/hello-web-page/html/app.js +1 -23
- package/dist/templates/hello-web-page/html/index.html +1 -3
- package/dist/templates/native-go/README.md +324 -0
- package/dist/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +59 -0
- package/dist/templates/native-go/backend/cmd/app/main.go +49 -0
- package/dist/templates/native-go/backend/cmd/dsm-readonly-probe/main_linux.go +46 -0
- package/dist/templates/native-go/backend/cmd/helper/main.go +38 -0
- package/dist/templates/native-go/backend/go.mod +7 -0
- package/dist/templates/native-go/backend/go.sum +4 -0
- package/dist/templates/native-go/backend/internal/api/binary.go +154 -0
- package/dist/templates/native-go/backend/internal/api/binary_test.go +165 -0
- package/dist/templates/native-go/backend/internal/api/errors.go +33 -0
- package/dist/templates/native-go/backend/internal/api/registry.go +104 -0
- package/dist/templates/native-go/backend/internal/api/registry_test.go +329 -0
- package/dist/templates/native-go/backend/internal/api/server.go +159 -0
- package/dist/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +121 -0
- package/dist/templates/native-go/backend/internal/app/nas_refusal_test.go +46 -0
- package/dist/templates/native-go/backend/internal/app/root_none.go +9 -0
- package/dist/templates/native-go/backend/internal/app/routes.go +138 -0
- package/dist/templates/native-go/backend/internal/app/routes_test.go +172 -0
- package/dist/templates/native-go/backend/internal/dsm/auth.go +118 -0
- package/dist/templates/native-go/backend/internal/dsm/auth_test.go +139 -0
- package/dist/templates/native-go/backend/internal/dsmprobe/collector_linux.go +335 -0
- package/dist/templates/native-go/backend/internal/dsmprobe/collector_linux_test.go +41 -0
- package/dist/templates/native-go/backend/internal/dsmprobe/protocol.go +179 -0
- package/dist/templates/native-go/backend/internal/dsmprobe/protocol_test.go +29 -0
- package/dist/templates/native-go/backend/internal/helper/cohort.go +393 -0
- package/dist/templates/native-go/backend/internal/helper/cohort_publication.go +18 -0
- package/dist/templates/native-go/backend/internal/helper/cohort_publication_test.go +105 -0
- package/dist/templates/native-go/backend/internal/helper/cohort_test.go +372 -0
- package/dist/templates/native-go/backend/internal/helper/control.go +424 -0
- package/dist/templates/native-go/backend/internal/helper/control_test.go +250 -0
- package/dist/templates/native-go/backend/internal/helper/data_contract.go +242 -0
- package/dist/templates/native-go/backend/internal/helper/data_contract_test.go +51 -0
- package/dist/templates/native-go/backend/internal/helper/data_decode.go +184 -0
- package/dist/templates/native-go/backend/internal/helper/data_decode_pointer_test.go +30 -0
- package/dist/templates/native-go/backend/internal/helper/data_protocol.go +416 -0
- package/dist/templates/native-go/backend/internal/helper/data_protocol_test.go +449 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_acl_linux.go +139 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_acl_linux_test.go +121 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_acl_syscall_linux.go +95 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_acl_syscall_linux_test.go +56 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_bridge_linux.go +144 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_bridge_linux_test.go +89 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_home_linux.go +107 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_home_linux_test.go +82 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_probe_transport_linux.go +151 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_probe_transport_linux_test.go +66 -0
- package/dist/templates/native-go/backend/internal/helper/grant_authority.go +516 -0
- package/dist/templates/native-go/backend/internal/helper/grant_authority_contract.go +88 -0
- package/dist/templates/native-go/backend/internal/helper/grant_authority_test.go +510 -0
- package/dist/templates/native-go/backend/internal/helper/grant_cohort.go +389 -0
- package/dist/templates/native-go/backend/internal/helper/grant_cohort_test.go +239 -0
- package/dist/templates/native-go/backend/internal/helper/grant_delivery.go +49 -0
- package/dist/templates/native-go/backend/internal/helper/grant_delivery_methods.go +273 -0
- package/dist/templates/native-go/backend/internal/helper/grant_delivery_test.go +322 -0
- package/dist/templates/native-go/backend/internal/helper/grant_operation_contract.go +47 -0
- package/dist/templates/native-go/backend/internal/helper/grant_readonly_test.go +180 -0
- package/dist/templates/native-go/backend/internal/helper/grant_repository_linux.go +415 -0
- package/dist/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +468 -0
- package/dist/templates/native-go/backend/internal/helper/grant_rpc.go +147 -0
- package/dist/templates/native-go/backend/internal/helper/grant_rpc_test.go +51 -0
- package/dist/templates/native-go/backend/internal/helper/grant_snapshot.go +75 -0
- package/dist/templates/native-go/backend/internal/helper/grant_supervisor_linux.go +134 -0
- package/dist/templates/native-go/backend/internal/helper/grant_supervisor_linux_test.go +254 -0
- package/dist/templates/native-go/backend/internal/helper/lease.go +112 -0
- package/dist/templates/native-go/backend/internal/helper/lease_linux.go +44 -0
- package/dist/templates/native-go/backend/internal/helper/lease_other.go +8 -0
- package/dist/templates/native-go/backend/internal/helper/lifecycle.go +234 -0
- package/dist/templates/native-go/backend/internal/helper/lifecycle_test.go +473 -0
- package/dist/templates/native-go/backend/internal/helper/managed_pilot.go +284 -0
- package/dist/templates/native-go/backend/internal/helper/managed_pilot_repository_linux.go +74 -0
- package/dist/templates/native-go/backend/internal/helper/managed_pilot_repository_linux_test.go +40 -0
- package/dist/templates/native-go/backend/internal/helper/managed_pilot_test.go +210 -0
- package/dist/templates/native-go/backend/internal/helper/nas_shipped_refusal_linux_test.go +97 -0
- package/dist/templates/native-go/backend/internal/helper/native_discovery.go +79 -0
- package/dist/templates/native-go/backend/internal/helper/native_identity.go +89 -0
- package/dist/templates/native-go/backend/internal/helper/native_provider.go +159 -0
- package/dist/templates/native-go/backend/internal/helper/native_provider_test.go +421 -0
- package/dist/templates/native-go/backend/internal/helper/observation.go +204 -0
- package/dist/templates/native-go/backend/internal/helper/observation_health_test.go +115 -0
- package/dist/templates/native-go/backend/internal/helper/observation_reload_budget_test.go +117 -0
- package/dist/templates/native-go/backend/internal/helper/observation_test.go +196 -0
- package/dist/templates/native-go/backend/internal/helper/observer_diagnostic.go +109 -0
- package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_linux.go +76 -0
- package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_linux_test.go +124 -0
- package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_test.go +98 -0
- package/dist/templates/native-go/backend/internal/helper/operation_bootstrap_linux.go +193 -0
- package/dist/templates/native-go/backend/internal/helper/operation_credentials_linux.go +56 -0
- package/dist/templates/native-go/backend/internal/helper/operation_linux.go +480 -0
- package/dist/templates/native-go/backend/internal/helper/operation_linux_test.go +528 -0
- package/dist/templates/native-go/backend/internal/helper/peer_linux.go +44 -0
- package/dist/templates/native-go/backend/internal/helper/peer_other.go +7 -0
- package/dist/templates/native-go/backend/internal/helper/process_linux.go +177 -0
- package/dist/templates/native-go/backend/internal/helper/process_other.go +5 -0
- package/dist/templates/native-go/backend/internal/helper/publication_test.go +178 -0
- package/dist/templates/native-go/backend/internal/helper/read_stream_cohort_linux_test.go +156 -0
- package/dist/templates/native-go/backend/internal/helper/read_transfer.go +40 -0
- package/dist/templates/native-go/backend/internal/helper/read_transfer_linux.go +109 -0
- package/dist/templates/native-go/backend/internal/helper/read_transfer_linux_test.go +118 -0
- package/dist/templates/native-go/backend/internal/helper/read_transfer_test.go +177 -0
- package/dist/templates/native-go/backend/internal/helper/readonly.go +105 -0
- package/dist/templates/native-go/backend/internal/helper/readonly_admission.go +85 -0
- package/dist/templates/native-go/backend/internal/helper/readonly_cohort_linux_test.go +253 -0
- package/dist/templates/native-go/backend/internal/helper/readonly_linux_test.go +378 -0
- package/dist/templates/native-go/backend/internal/helper/readonly_mount_linux.go +65 -0
- package/dist/templates/native-go/backend/internal/helper/readonly_mount_proxy_linux.go +113 -0
- package/dist/templates/native-go/backend/internal/helper/readonly_operations_linux.go +168 -0
- package/dist/templates/native-go/backend/internal/helper/readonly_resolver_linux.go +241 -0
- package/dist/templates/native-go/backend/internal/helper/readonly_test.go +40 -0
- package/dist/templates/native-go/backend/internal/helper/relaxed_identity.go +252 -0
- package/dist/templates/native-go/backend/internal/helper/relaxed_identity_contract.go +105 -0
- package/dist/templates/native-go/backend/internal/helper/relaxed_identity_test.go +406 -0
- package/dist/templates/native-go/backend/internal/helper/relaxed_invalidation.go +200 -0
- package/dist/templates/native-go/backend/internal/helper/repair.go +132 -0
- package/dist/templates/native-go/backend/internal/helper/repair_test.go +271 -0
- package/dist/templates/native-go/backend/internal/helper/s1r_actor_acl_linux_test.go +303 -0
- package/dist/templates/native-go/backend/internal/helper/s1r_actor_fixture_linux_test.go +184 -0
- package/dist/templates/native-go/backend/internal/helper/s1r_actor_races_linux_test.go +231 -0
- package/dist/templates/native-go/backend/internal/helper/s1r_fixture_contract_linux_test.go +18 -0
- package/dist/templates/native-go/backend/internal/helper/server_linux.go +124 -0
- package/dist/templates/native-go/backend/internal/helper/status.go +334 -0
- package/dist/templates/native-go/backend/internal/helper/status_test.go +288 -0
- package/dist/templates/native-go/backend/internal/helper/supervision.go +107 -0
- package/dist/templates/native-go/backend/internal/helper/supervision_test.go +124 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_frame.go +76 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_frame_linux_test.go +69 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_frame_test.go +107 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_linux.go +363 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_linux_test.go +913 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_socket_eof_test.go +74 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_socket_test.go +45 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/create.json +23 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/frames.json +67 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/grant-store.json +52 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/intent.json +20 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/list.json +20 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/publish.json +20 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/read.json +22 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/stat.json +22 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/write-stream.json +22 -0
- package/dist/templates/native-go/backend/internal/helper/unit_connection.go +75 -0
- package/dist/templates/native-go/backend/internal/helper/unit_connection_linux_test.go +135 -0
- package/dist/templates/native-go/backend/internal/helper/unit_connection_test.go +133 -0
- package/dist/templates/native-go/backend/internal/helper/unit_frame_test.go +32 -0
- package/dist/templates/native-go/backend/internal/helper/unit_linux.go +364 -0
- package/dist/templates/native-go/backend/internal/helper/unit_linux_test.go +46 -0
- package/dist/templates/native-go/backend/internal/helper/unit_mechanisms_linux_test.go +217 -0
- package/dist/templates/native-go/backend/internal/helper/unit_padding_linux_test.go +178 -0
- package/dist/templates/native-go/backend/internal/helper/unit_query_linux.go +111 -0
- package/dist/templates/native-go/backend/internal/helper/unit_reload_linux_test.go +372 -0
- package/dist/templates/native-go/backend/internal/helper/unit_reload_sequence_linux_test.go +232 -0
- package/dist/templates/native-go/backend/internal/helper/write.go +77 -0
- package/dist/templates/native-go/backend/internal/helper/write_admission.go +260 -0
- package/dist/templates/native-go/backend/internal/helper/write_admission_test.go +135 -0
- package/dist/templates/native-go/backend/internal/helper/write_cohort_linux_test.go +218 -0
- package/dist/templates/native-go/backend/internal/helper/write_files_linux.go +202 -0
- package/dist/templates/native-go/backend/internal/helper/write_files_linux_test.go +199 -0
- package/dist/templates/native-go/backend/internal/helper/write_intent_linux.go +116 -0
- package/dist/templates/native-go/backend/internal/helper/write_intent_linux_test.go +74 -0
- package/dist/templates/native-go/backend/internal/helper/write_operation_linux.go +245 -0
- package/dist/templates/native-go/backend/internal/helper/write_test.go +53 -0
- package/dist/templates/native-go/dsm-package.yaml +58 -0
- package/dist/templates/native-go/gitignore +1 -0
- package/dist/templates/native-go/i18n/glossary.json +662 -0
- package/dist/templates/native-go/i18n/messages/de.json +28 -0
- package/dist/templates/native-go/i18n/messages/en.json +28 -0
- package/dist/templates/native-go/i18n/messages/es.json +28 -0
- package/dist/templates/native-go/i18n/messages/fr.json +28 -0
- package/dist/templates/native-go/i18n/messages/it.json +28 -0
- package/dist/templates/native-go/i18n/messages/ja.json +28 -0
- package/dist/templates/native-go/i18n/messages/ko.json +28 -0
- package/dist/templates/native-go/i18n/messages/zh-CN.json +28 -0
- package/dist/templates/native-go/i18n/messages/zh-TW.json +28 -0
- package/dist/templates/native-go/ui/app.css +35 -0
- package/dist/templates/native-go/ui/app.js +101 -0
- package/dist/templates/native-go-better-auth/backend/internal/app/identity.go +208 -0
- package/dist/templates/native-go-better-auth/backend/internal/app/identity_test.go +113 -0
- package/dist/templates/native-go-better-auth/node/app.mjs +72 -0
- package/dist/templates/native-go-better-auth/node/build.mjs +4 -0
- package/dist/templates/native-go-better-auth/node/package-lock.json +862 -0
- package/dist/templates/native-go-better-auth/node/package.json +1 -0
- package/dist/templates/native-go-better-auth/node/test/auth.test.mjs +31 -0
- package/dist/templates/native-go-integration/backend/internal/app/identity_none.go +6 -0
- package/dist/templates/native-go-integration/backend/internal/app/personal.go +203 -0
- package/dist/templates/native-go-integration/backend/internal/app/personal_test.go +119 -0
- package/dist/templates/native-go-root/backend/internal/app/root.go +107 -0
- package/dist/templates/native-go-root/backend/internal/app/root_test.go +124 -0
- package/dist/templates/native-go-root/root/whoami.sh +6 -0
- package/dist/templates/native-go-vue/README.md +224 -0
- package/dist/templates/native-go-vue/frontend/DESIGN.md +78 -0
- package/dist/templates/native-go-vue/frontend/package-lock.json +2410 -0
- package/dist/templates/native-go-vue/frontend/package.json +6 -0
- package/dist/templates/native-go-vue/frontend/src/App.vue +159 -0
- package/dist/templates/native-go-vue/frontend/src/context.ts +56 -0
- package/dist/templates/native-go-vue/frontend/src/main.ts +29 -0
- package/dist/templates/native-go-vue/frontend/src/nas/NasGrantSettings.vue +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/NasPathPicker.vue +106 -0
- package/dist/templates/native-go-vue/frontend/src/nas/NasUnavailable.vue +20 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/de.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/en.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/es.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/fr.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/it.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/ja.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/ko.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/zh-CN.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/zh-TW.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n.ts +38 -0
- package/dist/templates/native-go-vue/frontend/src/nas/mock-provider.ts +119 -0
- package/dist/templates/native-go-vue/frontend/src/nas/provider.ts +59 -0
- package/dist/templates/native-go-vue/frontend/src/nas/use-request.ts +27 -0
- package/dist/templates/native-go-vue/frontend/src/style.css +31 -0
- package/dist/templates/native-go-vue/frontend/test/apps.test.ts +190 -0
- package/dist/templates/native-go-vue/frontend/test/nas-provider.test.ts +81 -0
- package/dist/templates/native-go-vue/frontend/test/nas-request.test.ts +21 -0
- package/dist/templates/native-go-vue/frontend/test/nas-ui.test.ts +261 -0
- package/dist/templates/native-go-vue/frontend/tsconfig.json +1 -0
- package/dist/templates/native-go-vue/frontend/vite.config.ts +10 -0
- package/dist/templates/native-go-vue/gitignore +2 -0
- package/dist/types.d.ts +1 -1
- package/dist/validate.js +11 -7
- package/package.json +5 -8
- package/schema/synology-app.schema.json +36 -37
- package/skills/SKILL.md +4 -48
- package/skills/reference/create.md +11 -83
- package/skills/reference/deploy.md +7 -78
- package/skills/reference/diagnose.md +4 -101
- package/skills/reference/files.md +5 -41
- package/skills/reference/identity.md +3 -29
- package/skills/reference/wrap.md +0 -2
- package/templates/_daemon/fixture_linux_test.go +15 -0
- package/templates/_daemon/fixture_other_test.go +7 -0
- package/templates/_daemon/go.mod +3 -0
- package/templates/_daemon/main.go +608 -0
- package/templates/_daemon/main_test.go +242 -0
- package/templates/_daemon/process_linux.go +55 -0
- package/templates/_daemon/process_linux_test.go +161 -0
- package/templates/_daemon/process_other.go +14 -0
- package/templates/_daemon/testdata/child.go +41 -0
- package/templates/_shared/GO-LICENSE +27 -0
- package/templates/_shared/GO-PATENTS +22 -0
- package/templates/_shared/LICENSES/TEMPLATE.txt +21 -0
- package/templates/_shared/notice-overrides/index.json +14 -0
- package/templates/_shared/notice-overrides/utils-0.4.2-LICENSE +21 -0
- package/templates/_shared/notice-overrides/utils-0.5.0-LICENSE +21 -0
- package/templates/_shared/third-party-notices.mjs +51 -0
- package/templates/binary/synology-app.yaml +7 -0
- package/templates/hello-files/compose.yaml +0 -1
- package/templates/hello-web/compose.yaml +13 -10
- package/templates/hello-web/html/app.js +1 -23
- package/templates/hello-web/html/index.html +1 -3
- package/templates/hello-web-page/compose.yaml +13 -10
- package/templates/hello-web-page/html/app.js +1 -23
- package/templates/hello-web-page/html/index.html +1 -3
- package/templates/native-go/README.md +324 -0
- package/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +59 -0
- package/templates/native-go/backend/cmd/app/main.go +49 -0
- package/templates/native-go/backend/cmd/dsm-readonly-probe/main_linux.go +46 -0
- package/templates/native-go/backend/cmd/helper/main.go +38 -0
- package/templates/native-go/backend/go.mod +7 -0
- package/templates/native-go/backend/go.sum +4 -0
- package/templates/native-go/backend/internal/api/binary.go +154 -0
- package/templates/native-go/backend/internal/api/binary_test.go +165 -0
- package/templates/native-go/backend/internal/api/errors.go +33 -0
- package/templates/native-go/backend/internal/api/registry.go +104 -0
- package/templates/native-go/backend/internal/api/registry_test.go +329 -0
- package/templates/native-go/backend/internal/api/server.go +159 -0
- package/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +121 -0
- package/templates/native-go/backend/internal/app/nas_refusal_test.go +46 -0
- package/templates/native-go/backend/internal/app/root_none.go +9 -0
- package/templates/native-go/backend/internal/app/routes.go +138 -0
- package/templates/native-go/backend/internal/app/routes_test.go +172 -0
- package/templates/native-go/backend/internal/dsm/auth.go +118 -0
- package/templates/native-go/backend/internal/dsm/auth_test.go +139 -0
- package/templates/native-go/backend/internal/dsmprobe/collector_linux.go +335 -0
- package/templates/native-go/backend/internal/dsmprobe/collector_linux_test.go +41 -0
- package/templates/native-go/backend/internal/dsmprobe/protocol.go +179 -0
- package/templates/native-go/backend/internal/dsmprobe/protocol_test.go +29 -0
- package/templates/native-go/backend/internal/helper/cohort.go +393 -0
- package/templates/native-go/backend/internal/helper/cohort_publication.go +18 -0
- package/templates/native-go/backend/internal/helper/cohort_publication_test.go +105 -0
- package/templates/native-go/backend/internal/helper/cohort_test.go +372 -0
- package/templates/native-go/backend/internal/helper/control.go +424 -0
- package/templates/native-go/backend/internal/helper/control_test.go +250 -0
- package/templates/native-go/backend/internal/helper/data_contract.go +242 -0
- package/templates/native-go/backend/internal/helper/data_contract_test.go +51 -0
- package/templates/native-go/backend/internal/helper/data_decode.go +184 -0
- package/templates/native-go/backend/internal/helper/data_decode_pointer_test.go +30 -0
- package/templates/native-go/backend/internal/helper/data_protocol.go +416 -0
- package/templates/native-go/backend/internal/helper/data_protocol_test.go +449 -0
- package/templates/native-go/backend/internal/helper/dsm_acl_linux.go +139 -0
- package/templates/native-go/backend/internal/helper/dsm_acl_linux_test.go +121 -0
- package/templates/native-go/backend/internal/helper/dsm_acl_syscall_linux.go +95 -0
- package/templates/native-go/backend/internal/helper/dsm_acl_syscall_linux_test.go +56 -0
- package/templates/native-go/backend/internal/helper/dsm_bridge_linux.go +144 -0
- package/templates/native-go/backend/internal/helper/dsm_bridge_linux_test.go +89 -0
- package/templates/native-go/backend/internal/helper/dsm_home_linux.go +107 -0
- package/templates/native-go/backend/internal/helper/dsm_home_linux_test.go +82 -0
- package/templates/native-go/backend/internal/helper/dsm_probe_transport_linux.go +151 -0
- package/templates/native-go/backend/internal/helper/dsm_probe_transport_linux_test.go +66 -0
- package/templates/native-go/backend/internal/helper/grant_authority.go +516 -0
- package/templates/native-go/backend/internal/helper/grant_authority_contract.go +88 -0
- package/templates/native-go/backend/internal/helper/grant_authority_test.go +510 -0
- package/templates/native-go/backend/internal/helper/grant_cohort.go +389 -0
- package/templates/native-go/backend/internal/helper/grant_cohort_test.go +239 -0
- package/templates/native-go/backend/internal/helper/grant_delivery.go +49 -0
- package/templates/native-go/backend/internal/helper/grant_delivery_methods.go +273 -0
- package/templates/native-go/backend/internal/helper/grant_delivery_test.go +322 -0
- package/templates/native-go/backend/internal/helper/grant_operation_contract.go +47 -0
- package/templates/native-go/backend/internal/helper/grant_readonly_test.go +180 -0
- package/templates/native-go/backend/internal/helper/grant_repository_linux.go +415 -0
- package/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +468 -0
- package/templates/native-go/backend/internal/helper/grant_rpc.go +147 -0
- package/templates/native-go/backend/internal/helper/grant_rpc_test.go +51 -0
- package/templates/native-go/backend/internal/helper/grant_snapshot.go +75 -0
- package/templates/native-go/backend/internal/helper/grant_supervisor_linux.go +134 -0
- package/templates/native-go/backend/internal/helper/grant_supervisor_linux_test.go +254 -0
- package/templates/native-go/backend/internal/helper/lease.go +112 -0
- package/templates/native-go/backend/internal/helper/lease_linux.go +44 -0
- package/templates/native-go/backend/internal/helper/lease_other.go +8 -0
- package/templates/native-go/backend/internal/helper/lifecycle.go +234 -0
- package/templates/native-go/backend/internal/helper/lifecycle_test.go +473 -0
- package/templates/native-go/backend/internal/helper/managed_pilot.go +284 -0
- package/templates/native-go/backend/internal/helper/managed_pilot_repository_linux.go +74 -0
- package/templates/native-go/backend/internal/helper/managed_pilot_repository_linux_test.go +40 -0
- package/templates/native-go/backend/internal/helper/managed_pilot_test.go +210 -0
- package/templates/native-go/backend/internal/helper/nas_shipped_refusal_linux_test.go +97 -0
- package/templates/native-go/backend/internal/helper/native_discovery.go +79 -0
- package/templates/native-go/backend/internal/helper/native_identity.go +89 -0
- package/templates/native-go/backend/internal/helper/native_provider.go +159 -0
- package/templates/native-go/backend/internal/helper/native_provider_test.go +421 -0
- package/templates/native-go/backend/internal/helper/observation.go +204 -0
- package/templates/native-go/backend/internal/helper/observation_health_test.go +115 -0
- package/templates/native-go/backend/internal/helper/observation_reload_budget_test.go +117 -0
- package/templates/native-go/backend/internal/helper/observation_test.go +196 -0
- package/templates/native-go/backend/internal/helper/observer_diagnostic.go +109 -0
- package/templates/native-go/backend/internal/helper/observer_diagnostic_linux.go +76 -0
- package/templates/native-go/backend/internal/helper/observer_diagnostic_linux_test.go +124 -0
- package/templates/native-go/backend/internal/helper/observer_diagnostic_test.go +98 -0
- package/templates/native-go/backend/internal/helper/operation_bootstrap_linux.go +193 -0
- package/templates/native-go/backend/internal/helper/operation_credentials_linux.go +56 -0
- package/templates/native-go/backend/internal/helper/operation_linux.go +480 -0
- package/templates/native-go/backend/internal/helper/operation_linux_test.go +528 -0
- package/templates/native-go/backend/internal/helper/peer_linux.go +44 -0
- package/templates/native-go/backend/internal/helper/peer_other.go +7 -0
- package/templates/native-go/backend/internal/helper/process_linux.go +177 -0
- package/templates/native-go/backend/internal/helper/process_other.go +5 -0
- package/templates/native-go/backend/internal/helper/publication_test.go +178 -0
- package/templates/native-go/backend/internal/helper/read_stream_cohort_linux_test.go +156 -0
- package/templates/native-go/backend/internal/helper/read_transfer.go +40 -0
- package/templates/native-go/backend/internal/helper/read_transfer_linux.go +109 -0
- package/templates/native-go/backend/internal/helper/read_transfer_linux_test.go +118 -0
- package/templates/native-go/backend/internal/helper/read_transfer_test.go +177 -0
- package/templates/native-go/backend/internal/helper/readonly.go +105 -0
- package/templates/native-go/backend/internal/helper/readonly_admission.go +85 -0
- package/templates/native-go/backend/internal/helper/readonly_cohort_linux_test.go +253 -0
- package/templates/native-go/backend/internal/helper/readonly_linux_test.go +378 -0
- package/templates/native-go/backend/internal/helper/readonly_mount_linux.go +65 -0
- package/templates/native-go/backend/internal/helper/readonly_mount_proxy_linux.go +113 -0
- package/templates/native-go/backend/internal/helper/readonly_operations_linux.go +168 -0
- package/templates/native-go/backend/internal/helper/readonly_resolver_linux.go +241 -0
- package/templates/native-go/backend/internal/helper/readonly_test.go +40 -0
- package/templates/native-go/backend/internal/helper/relaxed_identity.go +252 -0
- package/templates/native-go/backend/internal/helper/relaxed_identity_contract.go +105 -0
- package/templates/native-go/backend/internal/helper/relaxed_identity_test.go +406 -0
- package/templates/native-go/backend/internal/helper/relaxed_invalidation.go +200 -0
- package/templates/native-go/backend/internal/helper/repair.go +132 -0
- package/templates/native-go/backend/internal/helper/repair_test.go +271 -0
- package/templates/native-go/backend/internal/helper/s1r_actor_acl_linux_test.go +303 -0
- package/templates/native-go/backend/internal/helper/s1r_actor_fixture_linux_test.go +184 -0
- package/templates/native-go/backend/internal/helper/s1r_actor_races_linux_test.go +231 -0
- package/templates/native-go/backend/internal/helper/s1r_fixture_contract_linux_test.go +18 -0
- package/templates/native-go/backend/internal/helper/server_linux.go +124 -0
- package/templates/native-go/backend/internal/helper/status.go +334 -0
- package/templates/native-go/backend/internal/helper/status_test.go +288 -0
- package/templates/native-go/backend/internal/helper/supervision.go +107 -0
- package/templates/native-go/backend/internal/helper/supervision_test.go +124 -0
- package/templates/native-go/backend/internal/helper/supervisor_frame.go +76 -0
- package/templates/native-go/backend/internal/helper/supervisor_frame_linux_test.go +69 -0
- package/templates/native-go/backend/internal/helper/supervisor_frame_test.go +107 -0
- package/templates/native-go/backend/internal/helper/supervisor_linux.go +363 -0
- package/templates/native-go/backend/internal/helper/supervisor_linux_test.go +913 -0
- package/templates/native-go/backend/internal/helper/supervisor_socket_eof_test.go +74 -0
- package/templates/native-go/backend/internal/helper/supervisor_socket_test.go +45 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/create.json +23 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/frames.json +67 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/grant-store.json +52 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/intent.json +20 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/list.json +20 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/publish.json +20 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/read.json +22 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/stat.json +22 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/write-stream.json +22 -0
- package/templates/native-go/backend/internal/helper/unit_connection.go +75 -0
- package/templates/native-go/backend/internal/helper/unit_connection_linux_test.go +135 -0
- package/templates/native-go/backend/internal/helper/unit_connection_test.go +133 -0
- package/templates/native-go/backend/internal/helper/unit_frame_test.go +32 -0
- package/templates/native-go/backend/internal/helper/unit_linux.go +364 -0
- package/templates/native-go/backend/internal/helper/unit_linux_test.go +46 -0
- package/templates/native-go/backend/internal/helper/unit_mechanisms_linux_test.go +217 -0
- package/templates/native-go/backend/internal/helper/unit_padding_linux_test.go +178 -0
- package/templates/native-go/backend/internal/helper/unit_query_linux.go +111 -0
- package/templates/native-go/backend/internal/helper/unit_reload_linux_test.go +372 -0
- package/templates/native-go/backend/internal/helper/unit_reload_sequence_linux_test.go +232 -0
- package/templates/native-go/backend/internal/helper/write.go +77 -0
- package/templates/native-go/backend/internal/helper/write_admission.go +260 -0
- package/templates/native-go/backend/internal/helper/write_admission_test.go +135 -0
- package/templates/native-go/backend/internal/helper/write_cohort_linux_test.go +218 -0
- package/templates/native-go/backend/internal/helper/write_files_linux.go +202 -0
- package/templates/native-go/backend/internal/helper/write_files_linux_test.go +199 -0
- package/templates/native-go/backend/internal/helper/write_intent_linux.go +116 -0
- package/templates/native-go/backend/internal/helper/write_intent_linux_test.go +74 -0
- package/templates/native-go/backend/internal/helper/write_operation_linux.go +245 -0
- package/templates/native-go/backend/internal/helper/write_test.go +53 -0
- package/templates/native-go/dsm-package.yaml +58 -0
- package/templates/native-go/gitignore +1 -0
- package/templates/native-go/i18n/glossary.json +662 -0
- package/templates/native-go/i18n/messages/de.json +28 -0
- package/templates/native-go/i18n/messages/en.json +28 -0
- package/templates/native-go/i18n/messages/es.json +28 -0
- package/templates/native-go/i18n/messages/fr.json +28 -0
- package/templates/native-go/i18n/messages/it.json +28 -0
- package/templates/native-go/i18n/messages/ja.json +28 -0
- package/templates/native-go/i18n/messages/ko.json +28 -0
- package/templates/native-go/i18n/messages/zh-CN.json +28 -0
- package/templates/native-go/i18n/messages/zh-TW.json +28 -0
- package/templates/native-go/ui/app.css +35 -0
- package/templates/native-go/ui/app.js +101 -0
- package/templates/native-go-better-auth/backend/internal/app/identity.go +208 -0
- package/templates/native-go-better-auth/backend/internal/app/identity_test.go +113 -0
- package/templates/native-go-better-auth/node/app.mjs +72 -0
- package/templates/native-go-better-auth/node/build.mjs +4 -0
- package/templates/native-go-better-auth/node/package-lock.json +862 -0
- package/templates/native-go-better-auth/node/package.json +1 -0
- package/templates/native-go-better-auth/node/test/auth.test.mjs +31 -0
- package/templates/native-go-integration/backend/internal/app/identity_none.go +6 -0
- package/templates/native-go-integration/backend/internal/app/personal.go +203 -0
- package/templates/native-go-integration/backend/internal/app/personal_test.go +119 -0
- package/templates/native-go-root/backend/internal/app/root.go +107 -0
- package/templates/native-go-root/backend/internal/app/root_test.go +124 -0
- package/templates/native-go-root/root/whoami.sh +6 -0
- package/templates/native-go-vue/README.md +224 -0
- package/templates/native-go-vue/frontend/DESIGN.md +78 -0
- package/templates/native-go-vue/frontend/package-lock.json +2410 -0
- package/templates/native-go-vue/frontend/package.json +6 -0
- package/templates/native-go-vue/frontend/src/App.vue +159 -0
- package/templates/native-go-vue/frontend/src/context.ts +56 -0
- package/templates/native-go-vue/frontend/src/main.ts +29 -0
- package/templates/native-go-vue/frontend/src/nas/NasGrantSettings.vue +74 -0
- package/templates/native-go-vue/frontend/src/nas/NasPathPicker.vue +106 -0
- package/templates/native-go-vue/frontend/src/nas/NasUnavailable.vue +20 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/de.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/en.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/es.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/fr.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/it.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/ja.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/ko.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/zh-CN.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/zh-TW.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n.ts +38 -0
- package/templates/native-go-vue/frontend/src/nas/mock-provider.ts +119 -0
- package/templates/native-go-vue/frontend/src/nas/provider.ts +59 -0
- package/templates/native-go-vue/frontend/src/nas/use-request.ts +27 -0
- package/templates/native-go-vue/frontend/src/style.css +31 -0
- package/templates/native-go-vue/frontend/test/apps.test.ts +190 -0
- package/templates/native-go-vue/frontend/test/nas-provider.test.ts +81 -0
- package/templates/native-go-vue/frontend/test/nas-request.test.ts +21 -0
- package/templates/native-go-vue/frontend/test/nas-ui.test.ts +261 -0
- package/templates/native-go-vue/frontend/tsconfig.json +1 -0
- package/templates/native-go-vue/frontend/vite.config.ts +10 -0
- package/templates/native-go-vue/gitignore +2 -0
- package/dist/attestation/app-package.d.ts +0 -86
- package/dist/attestation/app-package.js +0 -206
- package/dist/attestation/install-on-host.d.ts +0 -14
- package/dist/attestation/install-on-host.js +0 -52
- package/dist/attestation/keyring.d.ts +0 -21
- package/dist/attestation/keyring.js +0 -168
- package/dist/attestation/platform-service.d.ts +0 -70
- package/dist/attestation/platform-service.js +0 -250
- package/dist/build-spk/broker-glue.d.ts +0 -16
- package/dist/build-spk/broker-glue.js +0 -40
- package/dist/deploy/catalog-publish.d.ts +0 -3
- package/dist/deploy/catalog-publish.js +0 -7
- package/dist/doctor.d.ts +0 -22
- package/dist/doctor.js +0 -822
- package/dist/error-collector.d.ts +0 -2
- package/dist/error-collector.js +0 -46
- package/dist/host/broker-paths.d.ts +0 -1
- package/dist/host/broker-paths.js +0 -1
- package/dist/host/broker-upgrade-preflight.d.ts +0 -61
- package/dist/host/broker-upgrade-preflight.js +0 -156
- package/dist/host/digests.d.ts +0 -5
- package/dist/host/digests.js +0 -63
- package/dist/host/fake-nas.d.ts +0 -49
- package/dist/host/fake-nas.js +0 -193
- package/dist/mock-broker/bootstrap.d.ts +0 -2
- package/dist/mock-broker/bootstrap.js +0 -8
- package/dist/mock-broker/files.d.ts +0 -60
- package/dist/mock-broker/files.js +0 -408
- package/dist/mock-broker/oidc.d.ts +0 -31
- package/dist/mock-broker/oidc.js +0 -161
- package/dist/mock-broker/path.d.ts +0 -9
- package/dist/mock-broker/path.js +0 -50
- package/dist/mock-broker/server.d.ts +0 -19
- package/dist/mock-broker/server.js +0 -350
- package/dist/publish/build-ledger.d.ts +0 -22
- package/dist/publish/build-ledger.js +0 -26
- package/dist/publish/community-path.d.ts +0 -6
- package/dist/publish/community-path.js +0 -41
- package/dist/publish/curated-release.d.ts +0 -78
- package/dist/publish/curated-release.js +0 -883
- package/dist/publish/file-build-ledger.d.ts +0 -18
- package/dist/publish/file-build-ledger.js +0 -268
- package/dist/publish/github-pr.d.ts +0 -25
- package/dist/publish/github-pr.js +0 -85
- package/dist/publish/github-repo.d.ts +0 -8
- package/dist/publish/github-repo.js +0 -21
- package/dist/publish/platform-service-release.d.ts +0 -60
- package/dist/publish/platform-service-release.js +0 -333
- package/dist/publish/preflight.d.ts +0 -24
- package/dist/publish/preflight.js +0 -138
- package/dist/publish/publish.d.ts +0 -27
- package/dist/publish/publish.js +0 -136
- package/dist/publish/sync-definition.d.ts +0 -4
- package/dist/publish/sync-definition.js +0 -48
- package/dist/release-bin.d.ts +0 -2
- package/dist/release-bin.js +0 -23
- package/dist/templates/hello-web/html/sdk.js +0 -68
- package/dist/templates/hello-web-page/html/sdk.js +0 -68
- package/dist/templates/native/synology-app.yaml +0 -7
- package/dist/test-host.d.ts +0 -15
- package/dist/test-host.js +0 -37
- package/templates/hello-web/html/sdk.js +0 -68
- package/templates/hello-web-page/html/sdk.js +0 -68
- package/templates/native/synology-app.yaml +0 -7
- /package/dist/templates/{native → binary}/native.yaml +0 -0
- /package/templates/{native → binary}/native.yaml +0 -0
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
2
|
-
import { resolve } from "node:path";
|
|
3
|
-
import { importJWK } from "jose";
|
|
4
|
-
export const CURATED_ATTESTATION_KEYRING_PATH_ENV = "SYNOPKGLAND_CURATED_ATTESTATION_KEYRING_PATH";
|
|
5
|
-
export const CURATED_ATTESTATION_KEYRING_ENV = "SYNOPKGLAND_CURATED_ATTESTATION_KEYRING";
|
|
6
|
-
const TRUST_ROOT_FIELDS = new Set(["version", "keys"]);
|
|
7
|
-
const TRUST_ROOT_ENTRY_FIELDS = new Set(["kid", "status", "publicJwk"]);
|
|
8
|
-
const PUBLIC_JWK_FIELDS = new Set([
|
|
9
|
-
"kty",
|
|
10
|
-
"n",
|
|
11
|
-
"e",
|
|
12
|
-
"alg",
|
|
13
|
-
"use",
|
|
14
|
-
"key_ops",
|
|
15
|
-
"kid",
|
|
16
|
-
"x5c",
|
|
17
|
-
"x5t",
|
|
18
|
-
"x5t#S256",
|
|
19
|
-
]);
|
|
20
|
-
export class CuratedTrustRootError extends Error {
|
|
21
|
-
code;
|
|
22
|
-
constructor(code, message = code) {
|
|
23
|
-
super(message);
|
|
24
|
-
this.code = code;
|
|
25
|
-
this.name = "CuratedTrustRootError";
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
export async function loadCuratedTrustRoot(env = process.env) {
|
|
29
|
-
const rawFromEnv = env[CURATED_ATTESTATION_KEYRING_ENV]?.trim();
|
|
30
|
-
const pathFromEnv = env[CURATED_ATTESTATION_KEYRING_PATH_ENV]?.trim();
|
|
31
|
-
if (rawFromEnv && pathFromEnv) {
|
|
32
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", "Configure either the curated public keyring JSON or its path, not both.");
|
|
33
|
-
}
|
|
34
|
-
if (!rawFromEnv && !pathFromEnv) {
|
|
35
|
-
throw trustRootError("CURATED_TRUST_ROOT_MISSING", "The release signing custody contract requires a curated public keyring.");
|
|
36
|
-
}
|
|
37
|
-
let raw;
|
|
38
|
-
try {
|
|
39
|
-
raw = rawFromEnv ?? readFileSync(resolve(pathFromEnv), "utf8");
|
|
40
|
-
}
|
|
41
|
-
catch {
|
|
42
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", "Unable to read the curated public keyring.");
|
|
43
|
-
}
|
|
44
|
-
let parsed;
|
|
45
|
-
try {
|
|
46
|
-
parsed = JSON.parse(raw);
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", "The curated public keyring is not valid JSON.");
|
|
50
|
-
}
|
|
51
|
-
return parseCuratedTrustRoot(parsed);
|
|
52
|
-
}
|
|
53
|
-
export function parseCuratedTrustRoot(value) {
|
|
54
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
55
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", "The curated public keyring must be an object.");
|
|
56
|
-
}
|
|
57
|
-
const record = value;
|
|
58
|
-
if (containsPrivateJwkField(record)) {
|
|
59
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", "The curated public keyring contains private RSA material.");
|
|
60
|
-
}
|
|
61
|
-
assertKnownFields(record, TRUST_ROOT_FIELDS, "The curated public keyring");
|
|
62
|
-
if (record.version !== 1 || !Array.isArray(record.keys)) {
|
|
63
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", "The curated public keyring must use schema version 1.");
|
|
64
|
-
}
|
|
65
|
-
const seen = new Set();
|
|
66
|
-
const keys = [];
|
|
67
|
-
for (const rawEntry of record.keys) {
|
|
68
|
-
if (!rawEntry || typeof rawEntry !== "object" || Array.isArray(rawEntry)) {
|
|
69
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", "The curated public keyring contains a malformed entry.");
|
|
70
|
-
}
|
|
71
|
-
const entry = rawEntry;
|
|
72
|
-
assertKnownFields(entry, TRUST_ROOT_ENTRY_FIELDS, "The curated public keyring entry");
|
|
73
|
-
if (typeof entry.kid !== "string" ||
|
|
74
|
-
entry.kid.length === 0 ||
|
|
75
|
-
seen.has(entry.kid) ||
|
|
76
|
-
(entry.status !== "active" && entry.status !== "verify-only" && entry.status !== "revoked") ||
|
|
77
|
-
!entry.publicJwk ||
|
|
78
|
-
typeof entry.publicJwk !== "object" ||
|
|
79
|
-
Array.isArray(entry.publicJwk)) {
|
|
80
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", "The curated public keyring contains an invalid entry.");
|
|
81
|
-
}
|
|
82
|
-
seen.add(entry.kid);
|
|
83
|
-
const publicJwk = entry.publicJwk;
|
|
84
|
-
validatePublicJwk(publicJwk, entry.kid);
|
|
85
|
-
keys.push({ kid: entry.kid, status: entry.status, publicJwk });
|
|
86
|
-
}
|
|
87
|
-
return { version: 1, keys };
|
|
88
|
-
}
|
|
89
|
-
export async function resolveCuratedSigningTrust(root, kid, signingPublicJwk) {
|
|
90
|
-
if (root.keys.length === 0) {
|
|
91
|
-
throw trustRootError("CURATED_TRUST_ROOT_MISSING", "The curated public keyring contains no trusted keys.");
|
|
92
|
-
}
|
|
93
|
-
const entry = root.keys.find((candidate) => candidate.kid === kid);
|
|
94
|
-
if (!entry) {
|
|
95
|
-
throw trustRootError("CURATED_SIGNING_KEY_UNKNOWN", `The signing kid is not in the curated keyring: ${kid}`);
|
|
96
|
-
}
|
|
97
|
-
if (entry.status === "revoked") {
|
|
98
|
-
throw trustRootError("CURATED_SIGNING_KEY_REVOKED", `The signing kid is revoked: ${kid}`);
|
|
99
|
-
}
|
|
100
|
-
if (entry.status !== "active") {
|
|
101
|
-
throw trustRootError("CURATED_SIGNING_KEY_NOT_ACTIVE", `The signing kid is not active: ${kid}`);
|
|
102
|
-
}
|
|
103
|
-
if (signingPublicJwk.kty !== entry.publicJwk.kty ||
|
|
104
|
-
signingPublicJwk.n !== entry.publicJwk.n ||
|
|
105
|
-
signingPublicJwk.e !== entry.publicJwk.e) {
|
|
106
|
-
throw trustRootError("CURATED_SIGNING_KEY_MISMATCH", `The signing material does not match curated kid: ${kid}`);
|
|
107
|
-
}
|
|
108
|
-
try {
|
|
109
|
-
return (await importJWK(entry.publicJwk, "RS256"));
|
|
110
|
-
}
|
|
111
|
-
catch {
|
|
112
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", "The curated public keyring key could not be imported.");
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
function validatePublicJwk(jwk, expectedKid) {
|
|
116
|
-
if (!jwk || typeof jwk !== "object") {
|
|
117
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", "The curated key is not a JWK object.");
|
|
118
|
-
}
|
|
119
|
-
const record = jwk;
|
|
120
|
-
if (containsPrivateJwkField(record)) {
|
|
121
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", "The curated keyring contains private RSA material.");
|
|
122
|
-
}
|
|
123
|
-
assertKnownFields(record, PUBLIC_JWK_FIELDS, "Curated trust-root JWK");
|
|
124
|
-
if (record.kty !== "RSA" ||
|
|
125
|
-
typeof record.n !== "string" ||
|
|
126
|
-
typeof record.e !== "string" ||
|
|
127
|
-
record.alg !== "RS256" ||
|
|
128
|
-
record.kid !== expectedKid) {
|
|
129
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", "Curated trust-root keys must be public RS256 RSA JWKs with matching kid.");
|
|
130
|
-
}
|
|
131
|
-
if (record.use !== undefined && record.use !== "sig") {
|
|
132
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", "Curated trust-root keys must use sig.");
|
|
133
|
-
}
|
|
134
|
-
if (record.key_ops !== undefined &&
|
|
135
|
-
(!Array.isArray(record.key_ops) ||
|
|
136
|
-
record.key_ops.length === 0 ||
|
|
137
|
-
new Set(record.key_ops).size !== record.key_ops.length ||
|
|
138
|
-
record.key_ops.some((operation) => operation !== "verify"))) {
|
|
139
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", "Curated trust-root keys may only verify signatures.");
|
|
140
|
-
}
|
|
141
|
-
if (record.x5c !== undefined &&
|
|
142
|
-
(!Array.isArray(record.x5c) || record.x5c.some((certificate) => typeof certificate !== "string"))) {
|
|
143
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", "Curated trust-root x5c must be an array of strings.");
|
|
144
|
-
}
|
|
145
|
-
if ((record.x5t !== undefined && typeof record.x5t !== "string") ||
|
|
146
|
-
(record["x5t#S256"] !== undefined && typeof record["x5t#S256"] !== "string")) {
|
|
147
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", "Curated trust-root thumbprints must be strings.");
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
function containsPrivateJwkField(value) {
|
|
151
|
-
if (!value || typeof value !== "object") {
|
|
152
|
-
return false;
|
|
153
|
-
}
|
|
154
|
-
if (Array.isArray(value)) {
|
|
155
|
-
return value.some((item) => containsPrivateJwkField(item));
|
|
156
|
-
}
|
|
157
|
-
const record = value;
|
|
158
|
-
return ["d", "p", "q", "dp", "dq", "qi", "oth"].some((field) => Object.prototype.hasOwnProperty.call(record, field)) || Object.values(record).some((nested) => containsPrivateJwkField(nested));
|
|
159
|
-
}
|
|
160
|
-
function assertKnownFields(record, allowed, label) {
|
|
161
|
-
const unknown = Object.keys(record).find((key) => !allowed.has(key));
|
|
162
|
-
if (unknown) {
|
|
163
|
-
throw trustRootError("CURATED_TRUST_ROOT_INVALID", `${label} contains unknown field: ${unknown}`);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
function trustRootError(code, message) {
|
|
167
|
-
return new CuratedTrustRootError(code, message);
|
|
168
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { type JWK } from "jose";
|
|
2
|
-
import type { AppPackageSigningKey } from "./app-package.js";
|
|
3
|
-
/**
|
|
4
|
-
* Trust contract for releasing the platform service (the Broker SPK) itself.
|
|
5
|
-
* This is deliberately a separate issuer, typ and keyring from the curated App
|
|
6
|
-
* chain: the Broker carries the curated trust root as *data*, so that root can
|
|
7
|
-
* never double as the authority that signs the Broker's own releases.
|
|
8
|
-
*/
|
|
9
|
-
export declare const PLATFORM_ATTESTATION_ISSUER = "synopkgland-platform";
|
|
10
|
-
export declare const PLATFORM_SERVICE_RELEASE_ATTESTATION_TYP = "platform-service-release-attestation";
|
|
11
|
-
export declare const PLATFORM_SERVICE_RELEASE_ATTESTATION_VERSION: 1;
|
|
12
|
-
export declare const PLATFORM_SERVICE_PACKAGE_IDENTITY = "SynoPkgLandService";
|
|
13
|
-
export declare const PLATFORM_KEYRING_PURPOSE = "platform-service-release";
|
|
14
|
-
export declare const PLATFORM_ATTESTATION_PRIVATE_JWK_ENV = "SYNOPKGLAND_PLATFORM_ATTESTATION_PRIVATE_JWK";
|
|
15
|
-
export declare const PLATFORM_ATTESTATION_KID_ENV = "SYNOPKGLAND_PLATFORM_ATTESTATION_KID";
|
|
16
|
-
export declare const PLATFORM_ATTESTATION_KEYRING_PATH_ENV = "SYNOPKGLAND_PLATFORM_ATTESTATION_KEYRING_PATH";
|
|
17
|
-
export type PlatformServiceReleaseErrorCode = "PLATFORM_KEYRING_INVALID" | "PLATFORM_KEYRING_PURPOSE_MISMATCH" | "PLATFORM_KEYRING_PRIVATE_MATERIAL" | "PLATFORM_KEYRING_NO_ACTIVE_KEY" | "PLATFORM_SIGNING_MATERIAL_MISSING" | "PLATFORM_SIGNING_MATERIAL_INVALID" | "PLATFORM_SIGNING_KEY_UNKNOWN" | "PLATFORM_ATTESTATION_INPUT_INVALID" | "PLATFORM_ATTESTATION_INVALID";
|
|
18
|
-
export declare class PlatformServiceReleaseError extends Error {
|
|
19
|
-
readonly code: PlatformServiceReleaseErrorCode;
|
|
20
|
-
constructor(code: PlatformServiceReleaseErrorCode, detail?: string);
|
|
21
|
-
}
|
|
22
|
-
export interface PlatformServiceReleaseAttestationInput {
|
|
23
|
-
packageIdentity: string;
|
|
24
|
-
/** Source version without any Build suffix; the constants file keeps it. */
|
|
25
|
-
sourceVersion: string;
|
|
26
|
-
packageBuild: number;
|
|
27
|
-
/** `${sourceVersion}-<zero-padded Build>`; must agree with packageBuild. */
|
|
28
|
-
packageVersion: string;
|
|
29
|
-
/** SHA-256 of the final SPK bytes. */
|
|
30
|
-
artifactDigest: string;
|
|
31
|
-
/** Git commit the trusted workflow checked out and built. */
|
|
32
|
-
sourceRevision: string;
|
|
33
|
-
osMinVer: string;
|
|
34
|
-
arch: "noarch";
|
|
35
|
-
}
|
|
36
|
-
export interface PlatformServiceReleaseAttestationClaims extends PlatformServiceReleaseAttestationInput {
|
|
37
|
-
typ: typeof PLATFORM_SERVICE_RELEASE_ATTESTATION_TYP;
|
|
38
|
-
version: typeof PLATFORM_SERVICE_RELEASE_ATTESTATION_VERSION;
|
|
39
|
-
issuedAt: string;
|
|
40
|
-
}
|
|
41
|
-
export type PlatformKeyStatus = "active" | "verify-only" | "revoked";
|
|
42
|
-
export interface PlatformKeyringDocument {
|
|
43
|
-
version: 1;
|
|
44
|
-
purpose: typeof PLATFORM_KEYRING_PURPOSE;
|
|
45
|
-
keys: Array<{
|
|
46
|
-
kid: string;
|
|
47
|
-
status: PlatformKeyStatus;
|
|
48
|
-
publicJwk: JWK;
|
|
49
|
-
}>;
|
|
50
|
-
}
|
|
51
|
-
export interface PlatformAttestationSigner {
|
|
52
|
-
sign(input: PlatformServiceReleaseAttestationInput): Promise<{
|
|
53
|
-
token: string;
|
|
54
|
-
attestationDigest: string;
|
|
55
|
-
claims: PlatformServiceReleaseAttestationClaims;
|
|
56
|
-
}>;
|
|
57
|
-
verify(token: string): Promise<PlatformServiceReleaseAttestationClaims>;
|
|
58
|
-
verificationJwk: JWK;
|
|
59
|
-
}
|
|
60
|
-
export declare function parsePlatformKeyringDocument(raw: unknown): PlatformKeyringDocument;
|
|
61
|
-
export declare function readPlatformKeyringFile(path: string): PlatformKeyringDocument;
|
|
62
|
-
export declare function canonicalPlatformServiceReleaseClaims(claims: PlatformServiceReleaseAttestationClaims): string;
|
|
63
|
-
export declare function digestPlatformServiceReleaseClaims(claims: PlatformServiceReleaseAttestationClaims): string;
|
|
64
|
-
export declare function signPlatformServiceReleaseAttestationToken(input: PlatformServiceReleaseAttestationInput, key: AppPackageSigningKey): Promise<{
|
|
65
|
-
token: string;
|
|
66
|
-
attestationDigest: string;
|
|
67
|
-
claims: PlatformServiceReleaseAttestationClaims;
|
|
68
|
-
}>;
|
|
69
|
-
export declare function verifyPlatformServiceReleaseAttestationToken(token: string, keyring: PlatformKeyringDocument): Promise<PlatformServiceReleaseAttestationClaims>;
|
|
70
|
-
export declare function createPlatformAttestationSignerFromEnv(env?: NodeJS.Dict<string>): Promise<PlatformAttestationSigner>;
|
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
import { readFileSync } from "node:fs";
|
|
3
|
-
import { SignJWT, importJWK, jwtVerify } from "jose";
|
|
4
|
-
/**
|
|
5
|
-
* Trust contract for releasing the platform service (the Broker SPK) itself.
|
|
6
|
-
* This is deliberately a separate issuer, typ and keyring from the curated App
|
|
7
|
-
* chain: the Broker carries the curated trust root as *data*, so that root can
|
|
8
|
-
* never double as the authority that signs the Broker's own releases.
|
|
9
|
-
*/
|
|
10
|
-
export const PLATFORM_ATTESTATION_ISSUER = "synopkgland-platform";
|
|
11
|
-
export const PLATFORM_SERVICE_RELEASE_ATTESTATION_TYP = "platform-service-release-attestation";
|
|
12
|
-
export const PLATFORM_SERVICE_RELEASE_ATTESTATION_VERSION = 1;
|
|
13
|
-
export const PLATFORM_SERVICE_PACKAGE_IDENTITY = "SynoPkgLandService";
|
|
14
|
-
export const PLATFORM_KEYRING_PURPOSE = "platform-service-release";
|
|
15
|
-
export const PLATFORM_ATTESTATION_PRIVATE_JWK_ENV = "SYNOPKGLAND_PLATFORM_ATTESTATION_PRIVATE_JWK";
|
|
16
|
-
export const PLATFORM_ATTESTATION_KID_ENV = "SYNOPKGLAND_PLATFORM_ATTESTATION_KID";
|
|
17
|
-
export const PLATFORM_ATTESTATION_KEYRING_PATH_ENV = "SYNOPKGLAND_PLATFORM_ATTESTATION_KEYRING_PATH";
|
|
18
|
-
export class PlatformServiceReleaseError extends Error {
|
|
19
|
-
code;
|
|
20
|
-
constructor(code, detail) {
|
|
21
|
-
super(detail ? `${code}: ${detail}` : code);
|
|
22
|
-
this.code = code;
|
|
23
|
-
this.name = "PlatformServiceReleaseError";
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
const PRIVATE_JWK_FIELDS = ["d", "p", "q", "dp", "dq", "qi", "oth", "k"];
|
|
27
|
-
const KEY_STATUSES = new Set(["active", "verify-only", "revoked"]);
|
|
28
|
-
export function parsePlatformKeyringDocument(raw) {
|
|
29
|
-
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
30
|
-
throw new PlatformServiceReleaseError("PLATFORM_KEYRING_INVALID", "not an object");
|
|
31
|
-
}
|
|
32
|
-
const document = raw;
|
|
33
|
-
if (document.version !== 1 || !Array.isArray(document.keys)) {
|
|
34
|
-
throw new PlatformServiceReleaseError("PLATFORM_KEYRING_INVALID", "unsupported document shape");
|
|
35
|
-
}
|
|
36
|
-
if (document.purpose !== PLATFORM_KEYRING_PURPOSE) {
|
|
37
|
-
// A curated keyring document has no purpose field at all; refusing here is
|
|
38
|
-
// what keeps the Broker's bundled trust root from signing the Broker.
|
|
39
|
-
throw new PlatformServiceReleaseError("PLATFORM_KEYRING_PURPOSE_MISMATCH");
|
|
40
|
-
}
|
|
41
|
-
for (const entry of document.keys) {
|
|
42
|
-
if (!entry ||
|
|
43
|
-
typeof entry.kid !== "string" ||
|
|
44
|
-
entry.kid.length === 0 ||
|
|
45
|
-
!KEY_STATUSES.has(entry.status) ||
|
|
46
|
-
!entry.publicJwk ||
|
|
47
|
-
typeof entry.publicJwk !== "object") {
|
|
48
|
-
throw new PlatformServiceReleaseError("PLATFORM_KEYRING_INVALID", "invalid key entry");
|
|
49
|
-
}
|
|
50
|
-
if (PRIVATE_JWK_FIELDS.some((field) => field in entry.publicJwk)) {
|
|
51
|
-
throw new PlatformServiceReleaseError("PLATFORM_KEYRING_PRIVATE_MATERIAL");
|
|
52
|
-
}
|
|
53
|
-
if (entry.publicJwk.kty !== "RSA" || typeof entry.publicJwk.n !== "string") {
|
|
54
|
-
throw new PlatformServiceReleaseError("PLATFORM_KEYRING_INVALID", "not a public RSA key");
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
if (!document.keys.some((entry) => entry.status === "active")) {
|
|
58
|
-
throw new PlatformServiceReleaseError("PLATFORM_KEYRING_NO_ACTIVE_KEY");
|
|
59
|
-
}
|
|
60
|
-
return document;
|
|
61
|
-
}
|
|
62
|
-
export function readPlatformKeyringFile(path) {
|
|
63
|
-
let raw;
|
|
64
|
-
try {
|
|
65
|
-
raw = readFileSync(path, "utf8");
|
|
66
|
-
}
|
|
67
|
-
catch (error) {
|
|
68
|
-
throw new PlatformServiceReleaseError("PLATFORM_KEYRING_INVALID", `unable to read keyring: ${error instanceof Error ? error.message : String(error)}`);
|
|
69
|
-
}
|
|
70
|
-
let parsed;
|
|
71
|
-
try {
|
|
72
|
-
parsed = JSON.parse(raw);
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
throw new PlatformServiceReleaseError("PLATFORM_KEYRING_INVALID", "keyring is not valid JSON");
|
|
76
|
-
}
|
|
77
|
-
return parsePlatformKeyringDocument(parsed);
|
|
78
|
-
}
|
|
79
|
-
export function canonicalPlatformServiceReleaseClaims(claims) {
|
|
80
|
-
return JSON.stringify({
|
|
81
|
-
arch: claims.arch,
|
|
82
|
-
artifactDigest: claims.artifactDigest,
|
|
83
|
-
issuedAt: claims.issuedAt,
|
|
84
|
-
osMinVer: claims.osMinVer,
|
|
85
|
-
packageBuild: claims.packageBuild,
|
|
86
|
-
packageIdentity: claims.packageIdentity,
|
|
87
|
-
packageVersion: claims.packageVersion,
|
|
88
|
-
sourceRevision: claims.sourceRevision,
|
|
89
|
-
sourceVersion: claims.sourceVersion,
|
|
90
|
-
typ: claims.typ,
|
|
91
|
-
version: claims.version,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
export function digestPlatformServiceReleaseClaims(claims) {
|
|
95
|
-
return createHash("sha256").update(canonicalPlatformServiceReleaseClaims(claims)).digest("hex");
|
|
96
|
-
}
|
|
97
|
-
export async function signPlatformServiceReleaseAttestationToken(input, key) {
|
|
98
|
-
assertPlatformInput(input);
|
|
99
|
-
if (typeof key.kid !== "string" || key.kid.length === 0) {
|
|
100
|
-
throw new PlatformServiceReleaseError("PLATFORM_SIGNING_MATERIAL_INVALID", "kid required");
|
|
101
|
-
}
|
|
102
|
-
const claims = {
|
|
103
|
-
typ: PLATFORM_SERVICE_RELEASE_ATTESTATION_TYP,
|
|
104
|
-
version: PLATFORM_SERVICE_RELEASE_ATTESTATION_VERSION,
|
|
105
|
-
packageIdentity: input.packageIdentity,
|
|
106
|
-
sourceVersion: input.sourceVersion,
|
|
107
|
-
packageBuild: input.packageBuild,
|
|
108
|
-
packageVersion: input.packageVersion,
|
|
109
|
-
artifactDigest: input.artifactDigest,
|
|
110
|
-
sourceRevision: input.sourceRevision,
|
|
111
|
-
osMinVer: input.osMinVer,
|
|
112
|
-
arch: input.arch,
|
|
113
|
-
issuedAt: new Date().toISOString(),
|
|
114
|
-
};
|
|
115
|
-
const attestationDigest = digestPlatformServiceReleaseClaims(claims);
|
|
116
|
-
const token = await new SignJWT({ ...claims })
|
|
117
|
-
.setProtectedHeader({ alg: "RS256", kid: key.kid, typ: "JWT" })
|
|
118
|
-
.setIssuer(PLATFORM_ATTESTATION_ISSUER)
|
|
119
|
-
.setSubject(claims.packageIdentity)
|
|
120
|
-
.setJti(attestationDigest)
|
|
121
|
-
.sign(key.privateKey);
|
|
122
|
-
return { token, attestationDigest, claims };
|
|
123
|
-
}
|
|
124
|
-
export async function verifyPlatformServiceReleaseAttestationToken(token, keyring) {
|
|
125
|
-
parsePlatformKeyringDocument(keyring);
|
|
126
|
-
try {
|
|
127
|
-
const header = decodeHeader(token);
|
|
128
|
-
const entry = keyring.keys.find((candidate) => candidate.kid === header.kid && candidate.status !== "revoked");
|
|
129
|
-
if (!entry) {
|
|
130
|
-
throw new Error("unknown or revoked kid");
|
|
131
|
-
}
|
|
132
|
-
const publicKey = (await importJWK(entry.publicJwk, "RS256"));
|
|
133
|
-
const result = await jwtVerify(token, publicKey, {
|
|
134
|
-
algorithms: ["RS256"],
|
|
135
|
-
issuer: PLATFORM_ATTESTATION_ISSUER,
|
|
136
|
-
});
|
|
137
|
-
if (result.protectedHeader.alg !== "RS256" ||
|
|
138
|
-
result.protectedHeader.typ !== "JWT" ||
|
|
139
|
-
result.protectedHeader.kid !== entry.kid) {
|
|
140
|
-
throw new Error("token header mismatch");
|
|
141
|
-
}
|
|
142
|
-
const payload = result.payload;
|
|
143
|
-
if (payload.typ !== PLATFORM_SERVICE_RELEASE_ATTESTATION_TYP ||
|
|
144
|
-
payload.version !== PLATFORM_SERVICE_RELEASE_ATTESTATION_VERSION) {
|
|
145
|
-
throw new Error("token typ mismatch");
|
|
146
|
-
}
|
|
147
|
-
const claims = {
|
|
148
|
-
typ: payload.typ,
|
|
149
|
-
version: payload.version,
|
|
150
|
-
packageIdentity: payload.packageIdentity,
|
|
151
|
-
sourceVersion: payload.sourceVersion,
|
|
152
|
-
packageBuild: payload.packageBuild,
|
|
153
|
-
packageVersion: payload.packageVersion,
|
|
154
|
-
artifactDigest: payload.artifactDigest,
|
|
155
|
-
sourceRevision: payload.sourceRevision,
|
|
156
|
-
osMinVer: payload.osMinVer,
|
|
157
|
-
arch: payload.arch,
|
|
158
|
-
issuedAt: payload.issuedAt,
|
|
159
|
-
};
|
|
160
|
-
assertPlatformInput(claims);
|
|
161
|
-
if (typeof claims.issuedAt !== "string" || Number.isNaN(Date.parse(claims.issuedAt))) {
|
|
162
|
-
throw new Error("issuedAt is not a timestamp");
|
|
163
|
-
}
|
|
164
|
-
if (result.payload.jti !== digestPlatformServiceReleaseClaims(claims)) {
|
|
165
|
-
throw new Error("jti does not bind the claims");
|
|
166
|
-
}
|
|
167
|
-
return claims;
|
|
168
|
-
}
|
|
169
|
-
catch (error) {
|
|
170
|
-
if (error instanceof PlatformServiceReleaseError) {
|
|
171
|
-
throw new PlatformServiceReleaseError("PLATFORM_ATTESTATION_INVALID", error.message);
|
|
172
|
-
}
|
|
173
|
-
throw new PlatformServiceReleaseError("PLATFORM_ATTESTATION_INVALID", error instanceof Error ? error.message : String(error));
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
export async function createPlatformAttestationSignerFromEnv(env = process.env) {
|
|
177
|
-
const jwkRaw = env[PLATFORM_ATTESTATION_PRIVATE_JWK_ENV]?.trim();
|
|
178
|
-
const kidFromEnv = env[PLATFORM_ATTESTATION_KID_ENV]?.trim();
|
|
179
|
-
const keyringPath = env[PLATFORM_ATTESTATION_KEYRING_PATH_ENV]?.trim();
|
|
180
|
-
if (!jwkRaw) {
|
|
181
|
-
throw new PlatformServiceReleaseError("PLATFORM_SIGNING_MATERIAL_MISSING");
|
|
182
|
-
}
|
|
183
|
-
if (!keyringPath) {
|
|
184
|
-
throw new PlatformServiceReleaseError("PLATFORM_KEYRING_INVALID", `${PLATFORM_ATTESTATION_KEYRING_PATH_ENV} is required`);
|
|
185
|
-
}
|
|
186
|
-
const keyring = readPlatformKeyringFile(keyringPath);
|
|
187
|
-
let privateJwk;
|
|
188
|
-
let privateKey;
|
|
189
|
-
try {
|
|
190
|
-
privateJwk = JSON.parse(jwkRaw);
|
|
191
|
-
privateKey = (await importJWK(privateJwk, "RS256"));
|
|
192
|
-
}
|
|
193
|
-
catch {
|
|
194
|
-
throw new PlatformServiceReleaseError("PLATFORM_SIGNING_MATERIAL_INVALID");
|
|
195
|
-
}
|
|
196
|
-
const kid = kidFromEnv || (typeof privateJwk.kid === "string" ? privateJwk.kid : "");
|
|
197
|
-
if (!kid) {
|
|
198
|
-
throw new PlatformServiceReleaseError("PLATFORM_SIGNING_MATERIAL_INVALID", "kid required");
|
|
199
|
-
}
|
|
200
|
-
const trustEntry = keyring.keys.find((entry) => entry.kid === kid && entry.status === "active");
|
|
201
|
-
if (!trustEntry) {
|
|
202
|
-
throw new PlatformServiceReleaseError("PLATFORM_SIGNING_KEY_UNKNOWN");
|
|
203
|
-
}
|
|
204
|
-
const signingKey = { kid, privateKey };
|
|
205
|
-
return {
|
|
206
|
-
sign: (input) => signPlatformServiceReleaseAttestationToken(input, signingKey),
|
|
207
|
-
verify: (token) => verifyPlatformServiceReleaseAttestationToken(token, keyring),
|
|
208
|
-
verificationJwk: trustEntry.publicJwk,
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
function assertPlatformInput(input) {
|
|
212
|
-
const fail = (detail) => {
|
|
213
|
-
throw new PlatformServiceReleaseError("PLATFORM_ATTESTATION_INPUT_INVALID", detail);
|
|
214
|
-
};
|
|
215
|
-
if (input.packageIdentity !== PLATFORM_SERVICE_PACKAGE_IDENTITY) {
|
|
216
|
-
fail("packageIdentity must be the platform service identity");
|
|
217
|
-
}
|
|
218
|
-
if (!/^\d+\.\d+\.\d+$/.test(input.sourceVersion)) {
|
|
219
|
-
fail("sourceVersion must be plain semver without a Build suffix");
|
|
220
|
-
}
|
|
221
|
-
if (!Number.isSafeInteger(input.packageBuild) || input.packageBuild < 1) {
|
|
222
|
-
fail("packageBuild must be a positive safe integer");
|
|
223
|
-
}
|
|
224
|
-
if (input.packageVersion !== `${input.sourceVersion}-${String(input.packageBuild).padStart(4, "0")}`) {
|
|
225
|
-
fail("packageVersion must be sourceVersion plus the zero-padded Build");
|
|
226
|
-
}
|
|
227
|
-
if (!/^[a-f0-9]{64}$/.test(input.artifactDigest)) {
|
|
228
|
-
fail("artifactDigest must be a lowercase SHA-256 digest");
|
|
229
|
-
}
|
|
230
|
-
if (!/^[a-f0-9]{40}$/.test(input.sourceRevision)) {
|
|
231
|
-
fail("sourceRevision must be a full git commit SHA");
|
|
232
|
-
}
|
|
233
|
-
if (!/^\d+\.\d+-\d+$/.test(input.osMinVer)) {
|
|
234
|
-
fail("osMinVer must look like 7.2-69057");
|
|
235
|
-
}
|
|
236
|
-
if (input.arch !== "noarch") {
|
|
237
|
-
fail("the platform service is noarch");
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
function decodeHeader(token) {
|
|
241
|
-
const parts = token.split(".");
|
|
242
|
-
if (parts.length !== 3 || parts.some((part) => part.length === 0)) {
|
|
243
|
-
throw new Error("not a compact JWT");
|
|
244
|
-
}
|
|
245
|
-
const header = JSON.parse(Buffer.from(parts[0], "base64url").toString("utf8"));
|
|
246
|
-
if (!header || typeof header !== "object" || Array.isArray(header)) {
|
|
247
|
-
throw new Error("invalid JWT header");
|
|
248
|
-
}
|
|
249
|
-
return header;
|
|
250
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The Broker installer glue every Managed Profile App carries, independent of
|
|
3
|
-
* runtime. Compose and native Apps install through the same socket, so the
|
|
4
|
-
* Local Attestation gate and the registration-status probe live here once.
|
|
5
|
-
*/
|
|
6
|
-
/** Shell variable preamble locating the Broker installer and its socket. */
|
|
7
|
-
export declare const BROKER_INSTALLER_VARS = "INSTALLER=\"${BROKER_INSTALLER:-/var/packages/SynoPkgLandService/target/bin/synopkgland-installer}\"\nSOCKET=\"${BROKER_SOCKET:-/var/packages/SynoPkgLandService/var/installer.sock}\"";
|
|
8
|
-
/**
|
|
9
|
-
* The `status` probe: asks the Broker whether this App is still registered.
|
|
10
|
-
* `removed` exits 150 so DSM shows the App as removed by the platform;
|
|
11
|
-
* `unknown` exits 4. Anything else falls through to the caller, which decides
|
|
12
|
-
* what "running" means for its runtime.
|
|
13
|
-
*/
|
|
14
|
-
export declare function renderBrokerStatusProbe(packageIdentity: string): string;
|
|
15
|
-
/** `preinst` / `preupgrade`: refuse to install when the Broker socket is absent. */
|
|
16
|
-
export declare const BROKER_SOCKET_REQUIRED_SCRIPT = "#!/bin/sh\nSOCKET=\"${BROKER_SOCKET:-/var/packages/SynoPkgLandService/var/installer.sock}\"\nif [ ! -S \"$SOCKET\" ]; then\n echo \"SynoPkgLandService installer socket is not available\" >&2\n exit 1\nfi\nexit 0\n";
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The Broker installer glue every Managed Profile App carries, independent of
|
|
3
|
-
* runtime. Compose and native Apps install through the same socket, so the
|
|
4
|
-
* Local Attestation gate and the registration-status probe live here once.
|
|
5
|
-
*/
|
|
6
|
-
/** Shell variable preamble locating the Broker installer and its socket. */
|
|
7
|
-
export const BROKER_INSTALLER_VARS = `INSTALLER="\${BROKER_INSTALLER:-/var/packages/SynoPkgLandService/target/bin/synopkgland-installer}"
|
|
8
|
-
SOCKET="\${BROKER_SOCKET:-/var/packages/SynoPkgLandService/var/installer.sock}"`;
|
|
9
|
-
/**
|
|
10
|
-
* The `status` probe: asks the Broker whether this App is still registered.
|
|
11
|
-
* `removed` exits 150 so DSM shows the App as removed by the platform;
|
|
12
|
-
* `unknown` exits 4. Anything else falls through to the caller, which decides
|
|
13
|
-
* what "running" means for its runtime.
|
|
14
|
-
*/
|
|
15
|
-
export function renderBrokerStatusProbe(packageIdentity) {
|
|
16
|
-
return ` if [ -x "$INSTALLER" ] && [ -S "$SOCKET" ]; then
|
|
17
|
-
"$INSTALLER" --socket "$SOCKET" --phase status --attempt-id "status-$$" \\
|
|
18
|
-
--package-identity "${packageIdentity}" --package-version "\${SYNOPKG_PKGVER}" \\
|
|
19
|
-
--package-path "\${SYNOPKG_PKGDEST}" --bundle-path "\${SYNOPKG_PKGDEST}" \\
|
|
20
|
-
--pkg-var "\${SYNOPKG_PKGVAR}" --pkg-home "\${SYNOPKG_PKGHOME}" >/tmp/synopkgland-status.$$ 2>/dev/null || true
|
|
21
|
-
if grep -q '"registrationStatus":"removed"' /tmp/synopkgland-status.$$ 2>/dev/null; then
|
|
22
|
-
rm -f /tmp/synopkgland-status.$$
|
|
23
|
-
exit 150
|
|
24
|
-
fi
|
|
25
|
-
if grep -q '"registrationStatus":"unknown"' /tmp/synopkgland-status.$$ 2>/dev/null; then
|
|
26
|
-
rm -f /tmp/synopkgland-status.$$
|
|
27
|
-
exit 4
|
|
28
|
-
fi
|
|
29
|
-
rm -f /tmp/synopkgland-status.$$
|
|
30
|
-
fi`;
|
|
31
|
-
}
|
|
32
|
-
/** `preinst` / `preupgrade`: refuse to install when the Broker socket is absent. */
|
|
33
|
-
export const BROKER_SOCKET_REQUIRED_SCRIPT = `#!/bin/sh
|
|
34
|
-
SOCKET="\${BROKER_SOCKET:-/var/packages/SynoPkgLandService/var/installer.sock}"
|
|
35
|
-
if [ ! -S "$SOCKET" ]; then
|
|
36
|
-
echo "SynoPkgLandService installer socket is not available" >&2
|
|
37
|
-
exit 1
|
|
38
|
-
fi
|
|
39
|
-
exit 0
|
|
40
|
-
`;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { publishSpkToSource, resolvePublishTarget, } from "@synopackageland/package-source/publish-spk";
|
|
2
|
-
export async function publishBuiltSpk(spkPath) {
|
|
3
|
-
return publishSpkToSource(spkPath, resolvePublishTarget());
|
|
4
|
-
}
|
|
5
|
-
export function packageSourceOrigin() {
|
|
6
|
-
return resolvePublishTarget().origin;
|
|
7
|
-
}
|
package/dist/doctor.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { ProjectRoot } from "./discovery.js";
|
|
2
|
-
import type { NasHost } from "./host/types.js";
|
|
3
|
-
export type DoctorCheckStatus = "pass" | "fail" | "skip" | "warn";
|
|
4
|
-
export interface DoctorCheck {
|
|
5
|
-
id: string;
|
|
6
|
-
status: DoctorCheckStatus;
|
|
7
|
-
code?: string;
|
|
8
|
-
message: string;
|
|
9
|
-
suggestion?: string;
|
|
10
|
-
}
|
|
11
|
-
export interface DoctorReport {
|
|
12
|
-
ok: boolean;
|
|
13
|
-
checks: DoctorCheck[];
|
|
14
|
-
}
|
|
15
|
-
export interface RunDoctorOptions {
|
|
16
|
-
project?: ProjectRoot | null;
|
|
17
|
-
host?: NasHost | null;
|
|
18
|
-
packageId?: string;
|
|
19
|
-
dev?: boolean;
|
|
20
|
-
}
|
|
21
|
-
export declare function runDoctor(options: RunDoctorOptions): Promise<DoctorReport>;
|
|
22
|
-
export declare function formatDoctorReport(report: DoctorReport): string;
|