@opensoha/contracts 0.1.27 → 0.2.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/COMPATIBILITY.md +141 -16
- package/README.md +153 -50
- package/agent/agent-protocol.schema.json +2 -2
- package/agent/dsh-runtime.README.md +207 -0
- package/agent/dsh-runtime.schema.json +1165 -0
- package/agent/environment/mcp_stdio.go +30 -0
- package/agent/guest/runtime.go +1 -1
- package/agent/guest/runtime_test.go +1 -1
- package/auth/catalog_generated.go +2 -2
- package/auth/docker_permissions_test.go +44 -0
- package/auth/permission-catalog.json +65 -1
- package/auth/radius_permissions_test.go +44 -0
- package/compat/consumer-revisions.json +6 -6
- package/compat/json-schema-ecosystem-0.1.0.json +1 -1
- package/compat/openapi-loose-boundaries-0.1.0.json +5 -1
- package/docker/runtime/compose.go +128 -0
- package/docker/runtime/compose_replicas_test.go +20 -0
- package/docker/runtime/container_set.go +50 -0
- package/docker/runtime/container_set_test.go +31 -0
- package/docker/runtime/identity.go +130 -0
- package/docker/runtime/identity_test.go +91 -0
- package/docker/runtime/read.go +141 -0
- package/docker/runtime/read_result.go +93 -0
- package/docker/runtime/read_result_test.go +111 -0
- package/docker/runtime/read_test.go +63 -0
- package/docker/runtime/terminal.go +86 -0
- package/docker/runtime/terminal_test.go +50 -0
- package/examples/relations_compat_test.go +1 -1
- package/fixtures/json-schema/agent-protocol/valid/dsh-agent-status.json +17 -0
- package/fixtures/json-schema/docker-container-identity/invalid/name-instead-of-id.json +8 -0
- package/fixtures/json-schema/docker-container-identity/invalid/short-id.json +8 -0
- package/fixtures/json-schema/docker-container-identity/invalid/unknown-field.json +9 -0
- package/fixtures/json-schema/docker-container-identity/invalid/unsafe-service.json +8 -0
- package/fixtures/json-schema/docker-container-identity/valid/bound-container.json +8 -0
- package/fixtures/json-schema/docker-project-identity/invalid/injected-field.json +7 -0
- package/fixtures/json-schema/docker-project-identity/invalid/invalid-uid.json +6 -0
- package/fixtures/json-schema/docker-project-identity/invalid/legacy-protocol.json +6 -0
- package/fixtures/json-schema/docker-project-identity/invalid/nil-uid.json +6 -0
- package/fixtures/json-schema/docker-project-identity/invalid/slug-namespace.json +6 -0
- package/fixtures/json-schema/docker-project-identity/valid/bound-project.json +6 -0
- package/fixtures/json-schema/docker-runtime-read/invalid/1.json +14 -0
- package/fixtures/json-schema/docker-runtime-read/invalid/2.json +14 -0
- package/fixtures/json-schema/docker-runtime-read/invalid/3.json +14 -0
- package/fixtures/json-schema/docker-runtime-read/invalid/4.json +16 -0
- package/fixtures/json-schema/docker-runtime-read/invalid/5.json +14 -0
- package/fixtures/json-schema/docker-runtime-read/invalid/6.json +15 -0
- package/fixtures/json-schema/docker-runtime-read/invalid/7.json +15 -0
- package/fixtures/json-schema/docker-runtime-read/valid/1.json +14 -0
- package/fixtures/json-schema/docker-runtime-read/valid/2.json +14 -0
- package/fixtures/json-schema/docker-runtime-read/valid/3.json +17 -0
- package/fixtures/json-schema/docker-runtime-read/valid/4.json +17 -0
- package/fixtures/json-schema/docker-runtime-read-result/invalid/contradictory-completeness.json +21 -0
- package/fixtures/json-schema/docker-runtime-read-result/invalid/host-source-leak.json +28 -0
- package/fixtures/json-schema/docker-runtime-read-result/invalid/missing-files.json +20 -0
- package/fixtures/json-schema/docker-runtime-read-result/invalid/unsupported-browse.json +27 -0
- package/fixtures/json-schema/docker-runtime-read-result/valid/logs.json +21 -0
- package/fixtures/json-schema/docker-runtime-read-result/valid/volumes.json +27 -0
- package/fixtures/json-schema/dsh-runtime/invalid/assembly-report-credential.json +21 -0
- package/fixtures/json-schema/dsh-runtime/invalid/attempt-zero.json +18 -0
- package/fixtures/json-schema/dsh-runtime/invalid/bad-deadline.json +18 -0
- package/fixtures/json-schema/dsh-runtime/invalid/bad-hash.json +18 -0
- package/fixtures/json-schema/dsh-runtime/invalid/event-delta-missing.json +10 -0
- package/fixtures/json-schema/dsh-runtime/invalid/event-grant.json +12 -0
- package/fixtures/json-schema/dsh-runtime/invalid/event-sequence-zero.json +12 -0
- package/fixtures/json-schema/dsh-runtime/invalid/fence-zero.json +18 -0
- package/fixtures/json-schema/dsh-runtime/invalid/health-unknown-field.json +12 -0
- package/fixtures/json-schema/dsh-runtime/invalid/output-budget-zero.json +18 -0
- package/fixtures/json-schema/dsh-runtime/invalid/receipt-grant.json +12 -0
- package/fixtures/json-schema/dsh-runtime/invalid/start-assembly-url.json +32 -0
- package/fixtures/json-schema/dsh-runtime/invalid/start-chat-write-tool.json +38 -0
- package/fixtures/json-schema/dsh-runtime/invalid/start-client-base-url.json +19 -0
- package/fixtures/json-schema/dsh-runtime/invalid/start-client-callback.json +19 -0
- package/fixtures/json-schema/dsh-runtime/invalid/start-missing-readonly.json +37 -0
- package/fixtures/json-schema/dsh-runtime/invalid/status-grant.json +19 -0
- package/fixtures/json-schema/dsh-runtime/invalid/status-usage-missing.json +13 -0
- package/fixtures/json-schema/dsh-runtime/invalid/status-usage-unknown.json +18 -0
- package/fixtures/json-schema/dsh-runtime/invalid/tool-call-missing-call-id.json +13 -0
- package/fixtures/json-schema/dsh-runtime/invalid/tool-result-missing-hash.json +13 -0
- package/fixtures/json-schema/dsh-runtime/invalid/union-extra-field.json +12 -0
- package/fixtures/json-schema/dsh-runtime/invalid/unsupported-version.json +18 -0
- package/fixtures/json-schema/dsh-runtime/valid/assembly-decision.json +21 -0
- package/fixtures/json-schema/dsh-runtime/valid/assembly-report-mcp.json +34 -0
- package/fixtures/json-schema/dsh-runtime/valid/assembly-report.json +20 -0
- package/fixtures/json-schema/dsh-runtime/valid/cancel.json +8 -0
- package/fixtures/json-schema/dsh-runtime/valid/event-delta.json +12 -0
- package/fixtures/json-schema/dsh-runtime/valid/event-hook-observed.json +14 -0
- package/fixtures/json-schema/dsh-runtime/valid/event-terminal.json +13 -0
- package/fixtures/json-schema/dsh-runtime/valid/health.json +11 -0
- package/fixtures/json-schema/dsh-runtime/valid/receipt.json +11 -0
- package/fixtures/json-schema/dsh-runtime/valid/start-assembly.json +31 -0
- package/fixtures/json-schema/dsh-runtime/valid/start-chat.json +18 -0
- package/fixtures/json-schema/dsh-runtime/valid/start-heya.json +38 -0
- package/fixtures/json-schema/dsh-runtime/valid/status-completed.json +18 -0
- package/fixtures/json-schema/dsh-runtime/valid/status-unknown.json +13 -0
- package/fixtures/json-schema/dsh-runtime/valid/tool-call.json +1 -0
- package/fixtures/json-schema/dsh-runtime/valid/tool-result-denied.json +15 -0
- package/fixtures/json-schema/dsh-runtime/valid/tool-result.json +14 -0
- package/fixtures/json-schema/memory-policy/invalid/invalid-mode.json +17 -0
- package/fixtures/json-schema/memory-policy/valid/scoped.json +17 -0
- package/fixtures/json-schema/memory-record/invalid/invalid-source-hash.json +21 -0
- package/fixtures/json-schema/memory-record/invalid/invalid-sync-status.json +21 -0
- package/fixtures/json-schema/memory-record/invalid/quarantine-reason-too-long.json +23 -0
- package/fixtures/json-schema/memory-record/valid/quarantined.json +23 -0
- package/fixtures/json-schema/memory-record/valid/synced.json +21 -0
- package/fixtures/json-schema/network-ingest-event/invalid/proxy-runtime-epoch-without-sequence.json +23 -0
- package/fixtures/json-schema/network-ingest-event/invalid/proxy-runtime-unsafe-sequence.json +24 -0
- package/fixtures/json-schema/network-ingest-event/valid/proxy-runtime-epoch.json +24 -0
- package/fixtures/json-schema/network-runtime-protocol/invalid/eap-activate-partial-profile.json +16 -0
- package/fixtures/json-schema/network-runtime-protocol/invalid/eap-revoke-other-kind.json +16 -0
- package/fixtures/json-schema/network-runtime-protocol/invalid/enrollment-duplicate-capability.json +30 -0
- package/fixtures/json-schema/network-runtime-protocol/invalid/enrollment-unknown-capability.json +30 -0
- package/fixtures/json-schema/network-runtime-protocol/invalid/legacy-with-proof.json +19 -0
- package/fixtures/json-schema/network-runtime-protocol/invalid/ttls-certificate.json +42 -0
- package/fixtures/json-schema/network-runtime-protocol/invalid/ttls-device-override.json +19 -0
- package/fixtures/json-schema/network-runtime-protocol/invalid/ttls-no-proof.json +17 -0
- package/fixtures/json-schema/network-runtime-protocol/invalid/ttls-nonstation-identity.json +18 -0
- package/fixtures/json-schema/network-runtime-protocol/invalid/ttls-profile-without-pap.json +40 -0
- package/fixtures/json-schema/network-runtime-protocol/valid/app-default-enrollment.json +29 -0
- package/fixtures/json-schema/network-runtime-protocol/valid/app-mihomo-enrollment.json +32 -0
- package/fixtures/json-schema/network-runtime-protocol/valid/eap-activate-profile.json +17 -0
- package/fixtures/json-schema/network-runtime-protocol/valid/eap-revoke-result.json +16 -0
- package/fixtures/json-schema/network-runtime-protocol/valid/eap-revoke.json +16 -0
- package/fixtures/json-schema/network-runtime-protocol/valid/proxy-default-enrollment.json +23 -0
- package/fixtures/json-schema/network-runtime-protocol/valid/ttls-authorization.json +18 -0
- package/fixtures/json-schema/network-runtime-protocol/valid/ttls-profile-enrollment.json +23 -0
- package/fixtures/json-schema/network-runtime-protocol/valid/ttls-profile.json +41 -0
- package/fixtures/json-schema/proxy-adapter/invalid/apply-incomplete-result.json +11 -0
- package/fixtures/json-schema/proxy-adapter/invalid/close-incomplete-result.json +9 -0
- package/fixtures/json-schema/proxy-adapter/invalid/handshake-incomplete-result.json +11 -0
- package/fixtures/json-schema/proxy-adapter/invalid/invalid-method.json +11 -0
- package/fixtures/json-schema/proxy-adapter/invalid/major.json +11 -0
- package/fixtures/json-schema/proxy-adapter/invalid/missing-challenge.json +9 -0
- package/fixtures/json-schema/proxy-adapter/invalid/multiple-outcomes.json +12 -0
- package/fixtures/json-schema/proxy-adapter/invalid/observe-incomplete-result.json +9 -0
- package/fixtures/json-schema/proxy-adapter/invalid/unknown-field.json +12 -0
- package/fixtures/json-schema/proxy-adapter/valid/apply-result.json +12 -0
- package/fixtures/json-schema/proxy-adapter/valid/close-result.json +11 -0
- package/fixtures/json-schema/proxy-adapter/valid/handshake-result.json +19 -0
- package/fixtures/json-schema/proxy-adapter/valid/handshake.json +11 -0
- package/fixtures/json-schema/proxy-adapter/valid/observe-result.json +20 -0
- package/fixtures/json-schema/proxy-runtime/invalid/deployment-stop-accepting.json +19 -0
- package/fixtures/json-schema/proxy-runtime/invalid/deployment-stopped-unknown.json +21 -0
- package/fixtures/json-schema/proxy-runtime/invalid/duplicate-capability.json +20 -0
- package/fixtures/json-schema/proxy-runtime/invalid/guarded-udp-unknown.json +19 -0
- package/fixtures/json-schema/proxy-runtime/invalid/ingress-check-cross-payload.json +9 -0
- package/fixtures/json-schema/proxy-runtime/invalid/ingress-check-result-cross-payload.json +9 -0
- package/fixtures/json-schema/proxy-runtime/invalid/publication-ready-cross-payload.json +9 -0
- package/fixtures/json-schema/proxy-runtime/invalid/unknown-field.json +18 -0
- package/fixtures/json-schema/proxy-runtime/valid/deployment-process-stopped.json +21 -0
- package/fixtures/json-schema/proxy-runtime/valid/deployment-stop-required.json +19 -0
- package/fixtures/json-schema/proxy-runtime/valid/guarded-udp.json +20 -0
- package/fixtures/json-schema/proxy-runtime/valid/ingress-check-result.json +15 -0
- package/fixtures/json-schema/proxy-runtime/valid/ingress-check.json +18 -0
- package/fixtures/json-schema/proxy-runtime/valid/management-capabilities.json +26 -0
- package/fixtures/json-schema/proxy-runtime/valid/observation.json +17 -0
- package/fixtures/json-schema/proxy-runtime/valid/publication-ready.json +16 -0
- package/fixtures/json-schema/radius-password-verifier/invalid/bare-pap.json +9 -0
- package/fixtures/json-schema/radius-password-verifier/invalid/empty-password.json +9 -0
- package/fixtures/json-schema/radius-password-verifier/invalid/enumeration.json +4 -0
- package/fixtures/json-schema/radius-password-verifier/invalid/failure-with-subject.json +5 -0
- package/fixtures/json-schema/radius-password-verifier/invalid/invalid-station.json +9 -0
- package/fixtures/json-schema/radius-password-verifier/invalid/radius-xlat.json +16 -0
- package/fixtures/json-schema/radius-password-verifier/invalid/raw-password.json +10 -0
- package/fixtures/json-schema/radius-password-verifier/invalid/success-without-receipt.json +5 -0
- package/fixtures/json-schema/radius-password-verifier/invalid/too-long.json +9 -0
- package/fixtures/json-schema/radius-password-verifier/invalid/url-base64.json +9 -0
- package/fixtures/json-schema/radius-password-verifier/invalid/wrong-method.json +9 -0
- package/fixtures/json-schema/radius-password-verifier/valid/failure.json +4 -0
- package/fixtures/json-schema/radius-password-verifier/valid/radius-success.json +16 -0
- package/fixtures/json-schema/radius-password-verifier/valid/request.json +9 -0
- package/fixtures/json-schema/radius-password-verifier/valid/success.json +6 -0
- package/fixtures/json-schema/radius-runtime/invalid/control-with-secret.json +30 -0
- package/fixtures/json-schema/radius-runtime/invalid/known-null.json +21 -0
- package/fixtures/json-schema/radius-runtime/invalid/known-without-count.json +20 -0
- package/fixtures/json-schema/radius-runtime/invalid/stopped-still-accepting.json +21 -0
- package/fixtures/json-schema/radius-runtime/invalid/stopped-with-live-state.json +21 -0
- package/fixtures/json-schema/radius-runtime/invalid/unknown-with-zero.json +21 -0
- package/fixtures/json-schema/radius-runtime/valid/bootstrap-control.json +29 -0
- package/fixtures/json-schema/radius-runtime/valid/known-zero.json +21 -0
- package/fixtures/json-schema/radius-runtime/valid/owned-child-stopped.json +21 -0
- package/fixtures/json-schema/radius-runtime/valid/unknown-state.json +20 -0
- package/fixtures/openapi/AIMemoryPolicy/invalid/invalid-mode.json +16 -0
- package/fixtures/openapi/AIMemoryPolicy/valid/legacy-global.json +12 -0
- package/fixtures/openapi/AIMemoryPolicy/valid/scoped.json +16 -0
- package/fixtures/openapi/AIMemoryPolicyInput/invalid/invalid-mode.json +9 -0
- package/fixtures/openapi/AIMemoryPolicyInput/invalid/owner-spoof.json +10 -0
- package/fixtures/openapi/AIMemoryPolicyInput/valid/heya-automatic.json +9 -0
- package/fixtures/openapi/AIMemoryPolicyInput/valid/scoped.json +9 -0
- package/fixtures/openapi/AIMemoryRecord/invalid/invalid-source-hash.json +20 -0
- package/fixtures/openapi/AIMemoryRecord/invalid/invalid-sync-status.json +20 -0
- package/fixtures/openapi/AIMemoryRecord/invalid/quarantine-reason-too-long.json +22 -0
- package/fixtures/openapi/AIMemoryRecord/valid/delete-pending.json +21 -0
- package/fixtures/openapi/AIMemoryRecord/valid/quarantined.json +22 -0
- package/fixtures/openapi/AIMemoryRecord/valid/synced.json +20 -0
- package/fixtures/openapi/AgentConditionalResourceMutationRequest/invalid/preconditions-v1.json +8 -0
- package/fixtures/openapi/AgentConditionalResourceMutationRequest/valid/preconditions-v1.json +9 -0
- package/fixtures/openapi/AgentConditionalResourceYamlRequest/invalid/preconditions-v1.json +6 -0
- package/fixtures/openapi/AgentConditionalResourceYamlRequest/valid/preconditions-v1.json +10 -0
- package/fixtures/openapi/AgentPodArgvResult/invalid/native-pod-execution-v1.json +17 -0
- package/fixtures/openapi/AgentPodArgvResult/valid/native-pod-execution-v1.json +24 -0
- package/fixtures/openapi/AgentPodExecutionCapabilities/invalid/native-pod-execution-v1.json +7 -0
- package/fixtures/openapi/AgentPodExecutionCapabilities/valid/native-pod-execution-v1.json +7 -0
- package/fixtures/openapi/AgentRunCallbackRequest/valid/dsh-agent-status.json +17 -0
- package/fixtures/openapi/AlertOwnershipInput/invalid/workbench.json +3 -0
- package/fixtures/openapi/AlertOwnershipInput/valid/workbench.json +4 -0
- package/fixtures/openapi/ApplicationEnvironmentListEnvelope/invalid/legacy-list-alias.json +4 -0
- package/fixtures/openapi/ApplicationEnvironmentListEnvelope/valid/legacy-list-alias.json +4 -0
- package/fixtures/openapi/ApplicationListEnvelope/invalid/legacy-list-alias.json +4 -0
- package/fixtures/openapi/ApplicationListEnvelope/valid/legacy-list-alias.json +4 -0
- package/fixtures/openapi/ApplicationServiceListEnvelope/invalid/legacy-list-alias.json +4 -0
- package/fixtures/openapi/ApplicationServiceListEnvelope/valid/legacy-list-alias.json +4 -0
- package/fixtures/openapi/CLIAuthContext/invalid/cli-boundary.json +13 -0
- package/fixtures/openapi/CLIAuthContext/valid/cli-boundary.json +12 -0
- package/fixtures/openapi/CLIAuthOptions/invalid/cli-boundary.json +14 -0
- package/fixtures/openapi/CLIAuthOptions/valid/cli-boundary.json +13 -0
- package/fixtures/openapi/CLIAuthOptions/valid/governed-ai.json +14 -0
- package/fixtures/openapi/CLIDeviceAuthorization/invalid/cli-boundary.json +10 -0
- package/fixtures/openapi/CLIDeviceAuthorization/invalid/numeric-code.json +9 -0
- package/fixtures/openapi/CLIDeviceAuthorization/valid/cli-boundary.json +9 -0
- package/fixtures/openapi/CLIDeviceAuthorizationCreateRequest/invalid/basic.json +5 -0
- package/fixtures/openapi/CLIDeviceAuthorizationCreateRequest/valid/basic.json +5 -0
- package/fixtures/openapi/CLIDeviceCancelRequest/invalid/cli-boundary.json +5 -0
- package/fixtures/openapi/CLIDeviceCancelRequest/valid/cli-boundary.json +4 -0
- package/fixtures/openapi/CLIDeviceDecisionRequest/invalid/basic.json +6 -0
- package/fixtures/openapi/CLIDeviceDecisionRequest/valid/basic.json +6 -0
- package/fixtures/openapi/CLIDeviceInspectRequest/invalid/basic.json +4 -0
- package/fixtures/openapi/CLIDeviceInspectRequest/valid/basic.json +4 -0
- package/fixtures/openapi/CLIDeviceTokenRequest/invalid/basic.json +5 -0
- package/fixtures/openapi/CLIDeviceTokenRequest/valid/basic.json +5 -0
- package/fixtures/openapi/CLILogoutRequest/invalid/cli-boundary.json +4 -0
- package/fixtures/openapi/CLILogoutRequest/valid/cli-boundary.json +3 -0
- package/fixtures/openapi/CLIRefreshRequest/invalid/basic.json +3 -0
- package/fixtures/openapi/CLIRefreshRequest/valid/basic.json +4 -0
- package/fixtures/openapi/CLISession/invalid/cli-boundary.json +12 -0
- package/fixtures/openapi/CLISession/valid/cli-boundary.json +11 -0
- package/fixtures/openapi/DeliveryBlueprintListEnvelope/invalid/legacy-list-alias.json +4 -0
- package/fixtures/openapi/DeliveryBlueprintListEnvelope/valid/legacy-list-alias.json +4 -0
- package/fixtures/openapi/DeliveryEnvironmentListEnvelope/invalid/legacy-list-alias.json +4 -0
- package/fixtures/openapi/DeliveryEnvironmentListEnvelope/valid/legacy-list-alias.json +4 -0
- package/fixtures/openapi/DeliveryPlanServiceReferenceImpact/invalid/hidden-count.json +24 -0
- package/fixtures/openapi/DeliveryPlanServiceReferenceImpact/invalid/hidden-identities.json +26 -0
- package/fixtures/openapi/DeliveryPlanServiceReferenceImpact/invalid/invalid-frozen-revision.json +23 -0
- package/fixtures/openapi/DeliveryPlanServiceReferenceImpact/invalid/missing-current-revision.json +22 -0
- package/fixtures/openapi/DeliveryPlanServiceReferenceImpact/invalid/private-complete-snapshot.json +37 -0
- package/fixtures/openapi/DeliveryPlanServiceReferenceImpact/invalid/too-many-items.json +1223 -0
- package/fixtures/openapi/DeliveryPlanServiceReferenceImpact/valid/current-plan.json +23 -0
- package/fixtures/openapi/DeliveryPlanServiceReferenceImpact/valid/stale-plan-current-visible-page.json +23 -0
- package/fixtures/openapi/DeliveryTemplateUsageApplication/invalid/unknown-field.json +4 -0
- package/fixtures/openapi/DeliveryTemplateUsageApplication/valid/minimal.json +3 -0
- package/fixtures/openapi/DeliveryTemplateUsageBinding/invalid/unknown-field.json +6 -0
- package/fixtures/openapi/DeliveryTemplateUsageBinding/valid/minimal.json +5 -0
- package/fixtures/openapi/DeliveryTemplateUsageBuildSource/invalid/unknown-field.json +7 -0
- package/fixtures/openapi/DeliveryTemplateUsageBuildSource/valid/minimal.json +6 -0
- package/fixtures/openapi/DeliveryTemplateUsageEnvironment/invalid/unknown-field.json +5 -0
- package/fixtures/openapi/DeliveryTemplateUsageEnvironment/valid/minimal.json +4 -0
- package/fixtures/openapi/DeliveryTemplateUsageRuntimeItem/invalid/unknown-field.json +6 -0
- package/fixtures/openapi/DeliveryTemplateUsageRuntimeItem/valid/minimal.json +5 -0
- package/fixtures/openapi/DeliveryTemplateUsageRuntimeSummary/invalid/unknown-field.json +20 -0
- package/fixtures/openapi/DeliveryTemplateUsageRuntimeSummary/valid/minimal.json +19 -0
- package/fixtures/openapi/DeliveryTemplateUsageSummary/invalid/missing-kind.json +16 -0
- package/fixtures/openapi/DeliveryTemplateUsageSummary/valid/static.json +17 -0
- package/fixtures/openapi/DeliveryTemplateUsageSummaryEnvelope/invalid/legacy-items.json +3 -0
- package/fixtures/openapi/DeliveryTemplateUsageSummaryEnvelope/valid/static.json +19 -0
- package/fixtures/openapi/DirectorySyncRequestEnvelope/invalid/original-request.json +25 -0
- package/fixtures/openapi/DirectorySyncRequestEnvelope/valid/original-request.json +24 -0
- package/fixtures/openapi/DirectorySyncRequestInput/invalid/original-request.json +4 -0
- package/fixtures/openapi/DirectorySyncRequestInput/valid/original-request.json +3 -0
- package/fixtures/openapi/DirectorySyncRequestOrganizations/invalid/original-request.json +7 -0
- package/fixtures/openapi/DirectorySyncRequestOrganizations/valid/original-request.json +6 -0
- package/fixtures/openapi/DirectorySyncRequestPeople/invalid/original-request.json +7 -0
- package/fixtures/openapi/DirectorySyncRequestPeople/valid/original-request.json +6 -0
- package/fixtures/openapi/DirectorySyncRequestReceipt/invalid/original-request.json +23 -0
- package/fixtures/openapi/DirectorySyncRequestReceipt/valid/original-request.json +22 -0
- package/fixtures/openapi/DirectorySyncRequestRun/invalid/cancel-flag.json +1 -0
- package/fixtures/openapi/DirectorySyncRequestRun/invalid/original-request.json +19 -0
- package/fixtures/openapi/DirectorySyncRequestRun/valid/original-request.json +19 -0
- package/fixtures/openapi/DockerConfigurationChange/invalid/field.json +5 -0
- package/fixtures/openapi/DockerConfigurationChange/invalid/integer-overflow.json +4 -0
- package/fixtures/openapi/DockerConfigurationChange/valid/field.json +4 -0
- package/fixtures/openapi/DockerConfigurationDeleteInput/invalid/delete.json +7 -0
- package/fixtures/openapi/DockerConfigurationDeleteInput/valid/delete.json +7 -0
- package/fixtures/openapi/DockerConfigurationMapValue/invalid/map.json +1 -0
- package/fixtures/openapi/DockerConfigurationMapValue/valid/map.json +3 -0
- package/fixtures/openapi/DockerConfigurationPatchInput/invalid/missing-target-host.json +13 -0
- package/fixtures/openapi/DockerConfigurationPatchInput/invalid/patch.json +8 -0
- package/fixtures/openapi/DockerConfigurationPatchInput/invalid/unused-target-host.json +14 -0
- package/fixtures/openapi/DockerConfigurationPatchInput/valid/explicit-zero-and-empty.json +21 -0
- package/fixtures/openapi/DockerConfigurationPatchInput/valid/host-move.json +14 -0
- package/fixtures/openapi/DockerConfigurationPatchInput/valid/patch.json +13 -0
- package/fixtures/openapi/DockerConfigurationPreconditions/invalid/identity.json +3 -0
- package/fixtures/openapi/DockerConfigurationPreconditions/valid/identity.json +4 -0
- package/fixtures/openapi/DockerConfigurationReceipt/invalid/receipt.json +15 -0
- package/fixtures/openapi/DockerConfigurationReceipt/valid/receipt.json +14 -0
- package/fixtures/openapi/DockerConfigurationReceiptEnvelope/invalid/receipt.json +16 -0
- package/fixtures/openapi/DockerConfigurationReceiptEnvelope/valid/receipt.json +16 -0
- package/fixtures/openapi/DockerConfigurationScalar/invalid/simple.json +1 -0
- package/fixtures/openapi/DockerConfigurationScalar/valid/simple.json +1 -0
- package/fixtures/openapi/DockerHostRegistration/invalid/host.json +4 -0
- package/fixtures/openapi/DockerHostRegistration/valid/host.json +6 -0
- package/fixtures/openapi/DockerHostRegistrationInput/invalid/registration.json +4 -0
- package/fixtures/openapi/DockerHostRegistrationInput/valid/registration.json +6 -0
- package/fixtures/openapi/DockerNativeTerminalCreated/invalid/native-v1.json +24 -0
- package/fixtures/openapi/DockerNativeTerminalCreated/valid/native-v1.json +23 -0
- package/fixtures/openapi/DockerNativeTerminalCreatedEnvelope/invalid/native-v1.json +26 -0
- package/fixtures/openapi/DockerNativeTerminalCreatedEnvelope/valid/native-v1.json +25 -0
- package/fixtures/openapi/DockerNativeTerminalInput/invalid/native-v1.json +9 -0
- package/fixtures/openapi/DockerNativeTerminalInput/valid/native-v1.json +8 -0
- package/fixtures/openapi/DockerNativeTerminalSession/invalid/native-v1.json +21 -0
- package/fixtures/openapi/DockerNativeTerminalSession/valid/native-v1.json +20 -0
- package/fixtures/openapi/DockerNativeTerminalSessionEnvelope/invalid/native-v1.json +23 -0
- package/fixtures/openapi/DockerNativeTerminalSessionEnvelope/valid/native-v1.json +22 -0
- package/fixtures/openapi/DockerProjectDeployInput/invalid/missing-host.json +8 -0
- package/fixtures/openapi/DockerProjectDeployInput/valid/bound.json +14 -0
- package/fixtures/openapi/DockerProjectDeployInput/valid/legacy.json +1 -0
- package/fixtures/openapi/DockerProjectDeployPreconditions/invalid/missing-host.json +6 -0
- package/fixtures/openapi/DockerProjectDeployPreconditions/valid/bound.json +11 -0
- package/fixtures/openapi/DockerResourceIdentity/invalid/configuration-leak.json +9 -0
- package/fixtures/openapi/DockerResourceIdentity/invalid/host-with-host.json +7 -0
- package/fixtures/openapi/DockerResourceIdentity/invalid/invalid-uid.json +6 -0
- package/fixtures/openapi/DockerResourceIdentity/invalid/missing-revision.json +5 -0
- package/fixtures/openapi/DockerResourceIdentity/invalid/missing-uid.json +5 -0
- package/fixtures/openapi/DockerResourceIdentity/invalid/project-without-host.json +6 -0
- package/fixtures/openapi/DockerResourceIdentity/invalid/wrong-kind.json +6 -0
- package/fixtures/openapi/DockerResourceIdentity/valid/host.json +6 -0
- package/fixtures/openapi/DockerResourceIdentity/valid/project.json +7 -0
- package/fixtures/openapi/DockerResourceIdentityEnvelope/invalid/array-data.json +10 -0
- package/fixtures/openapi/DockerResourceIdentityEnvelope/invalid/missing-data.json +1 -0
- package/fixtures/openapi/DockerResourceIdentityEnvelope/invalid/unexpected-payload.json +11 -0
- package/fixtures/openapi/DockerResourceIdentityEnvelope/valid/host.json +8 -0
- package/fixtures/openapi/DockerResourceIdentityEnvelope/valid/project.json +9 -0
- package/fixtures/openapi/DockerRuntimeContainerBinding/invalid/identity-bound.json +8 -0
- package/fixtures/openapi/DockerRuntimeContainerBinding/valid/identity-bound.json +8 -0
- package/fixtures/openapi/DockerRuntimeFileEntry/invalid/identity-bound.json +8 -0
- package/fixtures/openapi/DockerRuntimeFileEntry/valid/identity-bound.json +8 -0
- package/fixtures/openapi/DockerRuntimeReadEnvelope/invalid/identity-bound.json +23 -0
- package/fixtures/openapi/DockerRuntimeReadEnvelope/valid/identity-bound.json +23 -0
- package/fixtures/openapi/DockerRuntimeReadResult/invalid/identity-bound.json +21 -0
- package/fixtures/openapi/DockerRuntimeReadResult/valid/identity-bound.json +21 -0
- package/fixtures/openapi/DockerRuntimeVolume/invalid/identity-bound.json +7 -0
- package/fixtures/openapi/DockerRuntimeVolume/valid/identity-bound.json +7 -0
- package/fixtures/openapi/EnvironmentServiceReference/invalid/candidate-state.json +60 -0
- package/fixtures/openapi/EnvironmentServiceReference/invalid/missing-current-source-revision.json +59 -0
- package/fixtures/openapi/EnvironmentServiceReference/invalid/missing-identity-revision.json +59 -0
- package/fixtures/openapi/EnvironmentServiceReference/invalid/private-snapshot.json +61 -0
- package/fixtures/openapi/EnvironmentServiceReference/valid/active.json +60 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidate/invalid/active.json +63 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidate/invalid/raw-secret.json +66 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidate/valid/generic-operator.json +63 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidate/valid/helm-root.json +49 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateDeleteInput/invalid/missing-binding-cas.json +4 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateDeleteInput/invalid/missing-identity.json +4 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateDeleteInput/valid/delete-without-source.json +5 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateEnvelope/invalid/missing-revision.json +64 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateEnvelope/valid/generic-operator.json +65 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateEnvelope/valid/helm-root.json +51 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateInput/invalid/activation.json +11 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateInput/invalid/create-with-old-id.json +11 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateInput/invalid/empty-targets.json +8 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateInput/invalid/missing-digest.json +9 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateInput/invalid/missing-targets.json +7 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateInput/invalid/null-targets.json +8 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateInput/invalid/update-without-id.json +10 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateInput/valid/create.json +10 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateInput/valid/update.json +11 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidatePage/invalid/source-content.json +17 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidatePage/valid/page.json +13 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateSummary/invalid/source-leak.json +9 -0
- package/fixtures/openapi/EnvironmentServiceReferenceCandidateSummary/valid/consumer-metadata.json +8 -0
- package/fixtures/openapi/EnvironmentServiceReferenceConsumer/invalid/duplicate-target-ids.json +13 -0
- package/fixtures/openapi/EnvironmentServiceReferenceConsumer/invalid/source-content.json +38 -0
- package/fixtures/openapi/EnvironmentServiceReferenceConsumer/invalid/too-many-target-ids.json +112 -0
- package/fixtures/openapi/EnvironmentServiceReferenceConsumer/valid/visible.json +12 -0
- package/fixtures/openapi/EnvironmentServiceReferenceConsumerPage/invalid/hidden-count.json +19 -0
- package/fixtures/openapi/EnvironmentServiceReferenceConsumerPage/invalid/hidden-identities.json +21 -0
- package/fixtures/openapi/EnvironmentServiceReferenceConsumerPage/invalid/missing-restricted-flag.json +17 -0
- package/fixtures/openapi/EnvironmentServiceReferenceConsumerPage/invalid/too-many-items.json +1218 -0
- package/fixtures/openapi/EnvironmentServiceReferenceConsumerPage/valid/all-consumers-restricted.json +4 -0
- package/fixtures/openapi/EnvironmentServiceReferenceConsumerPage/valid/visible-page-with-restricted-consumers.json +18 -0
- package/fixtures/openapi/EnvironmentServiceReferenceDeleteInput/invalid/caller-force.json +6 -0
- package/fixtures/openapi/EnvironmentServiceReferenceDeleteInput/invalid/missing-consumer-cas.json +4 -0
- package/fixtures/openapi/EnvironmentServiceReferenceDeleteInput/invalid/missing-reference-id.json +4 -0
- package/fixtures/openapi/EnvironmentServiceReferenceDeleteInput/invalid/zero-reference-revision.json +5 -0
- package/fixtures/openapi/EnvironmentServiceReferenceDeleteInput/valid/detach-without-source-access.json +5 -0
- package/fixtures/openapi/EnvironmentServiceReferenceEnvelope/invalid/missing-fresh-uid.json +61 -0
- package/fixtures/openapi/EnvironmentServiceReferenceEnvelope/valid/active.json +62 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/caller-force.json +9 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/caller-ownership.json +9 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/caller-source.json +9 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/caller-targets.json +11 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/create-with-reference-id.json +9 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/empty-candidate-id.json +8 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/invalid-consumer-time.json +8 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/invalid-source-digest.json +8 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/invalid-source-time.json +8 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/missing-candidate-id.json +7 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/missing-candidate-revision.json +7 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/missing-consumer-cas.json +7 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/missing-source-cas.json +7 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/missing-source-digest.json +7 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/negative-reference-revision.json +8 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/oversized-candidate-id.json +8 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/update-without-reference-id.json +8 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/invalid/zero-candidate-revision.json +8 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/valid/activate.json +8 -0
- package/fixtures/openapi/EnvironmentServiceReferenceInput/valid/explicit-rebind.json +9 -0
- package/fixtures/openapi/EnvironmentServiceReferencePage/invalid/global-count.json +14 -0
- package/fixtures/openapi/EnvironmentServiceReferencePage/invalid/source-content.json +64 -0
- package/fixtures/openapi/EnvironmentServiceReferencePage/invalid/too-many-items.json +813 -0
- package/fixtures/openapi/EnvironmentServiceReferencePage/valid/empty.json +3 -0
- package/fixtures/openapi/EnvironmentServiceReferencePage/valid/page.json +13 -0
- package/fixtures/openapi/EnvironmentServiceReferencePreviewEnvelope/invalid/missing-uid.json +54 -0
- package/fixtures/openapi/EnvironmentServiceReferencePreviewEnvelope/invalid/raw-values.json +58 -0
- package/fixtures/openapi/EnvironmentServiceReferencePreviewEnvelope/valid/generic-operator.json +55 -0
- package/fixtures/openapi/EnvironmentServiceReferencePreviewEnvelope/valid/helm-root.json +41 -0
- package/fixtures/openapi/EnvironmentServiceReferencePreviewInput/invalid/duplicate-targets.json +10 -0
- package/fixtures/openapi/EnvironmentServiceReferencePreviewInput/invalid/empty-targets.json +7 -0
- package/fixtures/openapi/EnvironmentServiceReferencePreviewInput/invalid/invalid-revision.json +7 -0
- package/fixtures/openapi/EnvironmentServiceReferencePreviewInput/invalid/missing-source-cas.json +5 -0
- package/fixtures/openapi/EnvironmentServiceReferencePreviewInput/invalid/null-targets.json +7 -0
- package/fixtures/openapi/EnvironmentServiceReferencePreviewInput/invalid/unexpected-write.json +7 -0
- package/fixtures/openapi/EnvironmentServiceReferencePreviewInput/valid/all-source-targets.json +6 -0
- package/fixtures/openapi/EnvironmentServiceReferencePreviewInput/valid/explicit-group.json +11 -0
- package/fixtures/openapi/EnvironmentServiceReferenceResolvedTarget/invalid/missing-origin.json +40 -0
- package/fixtures/openapi/EnvironmentServiceReferenceResolvedTarget/invalid/missing-source-uid.json +48 -0
- package/fixtures/openapi/EnvironmentServiceReferenceResolvedTarget/invalid/missing-view.json +40 -0
- package/fixtures/openapi/EnvironmentServiceReferenceResolvedTarget/invalid/yaml-is-not-authorized.json +50 -0
- package/fixtures/openapi/EnvironmentServiceReferenceResolvedTarget/invalid/zero-reference-revision.json +49 -0
- package/fixtures/openapi/EnvironmentServiceReferenceResolvedTarget/valid/consumer-view-source-origin.json +49 -0
- package/fixtures/openapi/EnvironmentServiceReferenceSummary/invalid/source-leak.json +9 -0
- package/fixtures/openapi/EnvironmentServiceReferenceSummary/invalid/zero-reference-revision.json +8 -0
- package/fixtures/openapi/EnvironmentServiceReferenceSummary/valid/consumer-metadata.json +8 -0
- package/fixtures/openapi/ExecutionArtifactListEnvelope/invalid/legacy-list-alias.json +4 -0
- package/fixtures/openapi/ExecutionArtifactListEnvelope/valid/legacy-list-alias.json +4 -0
- package/fixtures/openapi/ExecutionLog/invalid/missing-task.json +6 -0
- package/fixtures/openapi/ExecutionLog/valid/nested-metadata.json +16 -0
- package/fixtures/openapi/ExecutionLog/valid/row.json +7 -0
- package/fixtures/openapi/ExecutionLogListEnvelope/invalid/wrong-wrapper.json +3 -0
- package/fixtures/openapi/ExecutionLogListEnvelope/valid/empty.json +3 -0
- package/fixtures/openapi/ExecutionTaskActionInput/invalid/reason-type.json +3 -0
- package/fixtures/openapi/ExecutionTaskActionInput/invalid/unknown.json +3 -0
- package/fixtures/openapi/ExecutionTaskActionInput/valid/empty.json +1 -0
- package/fixtures/openapi/ExecutionTaskActionInput/valid/reason.json +3 -0
- package/fixtures/openapi/ExecutionTaskControlInput/invalid/missing-action.json +3 -0
- package/fixtures/openapi/ExecutionTaskControlInput/invalid/reason-too-long.json +4 -0
- package/fixtures/openapi/ExecutionTaskControlInput/invalid/unknown-field.json +4 -0
- package/fixtures/openapi/ExecutionTaskControlInput/invalid/unsupported-action.json +3 -0
- package/fixtures/openapi/ExecutionTaskControlInput/valid/cancel.json +4 -0
- package/fixtures/openapi/ExecutionTaskControlInput/valid/retry.json +3 -0
- package/fixtures/openapi/ExecutionTaskControlInput/valid/unicode-reason.json +4 -0
- package/fixtures/openapi/ExecutionTaskListEnvelope/invalid/legacy-list-alias.json +4 -0
- package/fixtures/openapi/ExecutionTaskListEnvelope/valid/legacy-list-alias.json +4 -0
- package/fixtures/openapi/GovernedAITokenBinding/invalid/binding.json +5 -0
- package/fixtures/openapi/GovernedAITokenBinding/valid/binding.json +5 -0
- package/fixtures/openapi/HealingOriginalRequestEnvelope/invalid/original-request.json +19 -0
- package/fixtures/openapi/HealingOriginalRequestEnvelope/valid/original-request.json +18 -0
- package/fixtures/openapi/HealingOriginalRequestInput/invalid/original-request.json +5 -0
- package/fixtures/openapi/HealingOriginalRequestInput/valid/original-request.json +4 -0
- package/fixtures/openapi/HealingOriginalRequestReceipt/invalid/original-request.json +17 -0
- package/fixtures/openapi/HealingOriginalRequestReceipt/valid/original-request.json +16 -0
- package/fixtures/openapi/HealingOriginalRun/invalid/original-request.json +13 -0
- package/fixtures/openapi/HealingOriginalRun/valid/original-request.json +12 -0
- package/fixtures/openapi/HelmReleaseImportInput/invalid/explicit-service-id.json +4 -0
- package/fixtures/openapi/HelmReleaseImportInput/valid/explicit-service-id.json +4 -0
- package/fixtures/openapi/IdentityOutpostClaimRequest/invalid/unsupported-control.json +7 -0
- package/fixtures/openapi/IdentityOutpostClaimRequest/valid/control-capable.json +7 -0
- package/fixtures/openapi/IdentityOutpostHeartbeatRequest/invalid/control-ack.json +11 -0
- package/fixtures/openapi/IdentityOutpostHeartbeatRequest/valid/control-ack.json +11 -0
- package/fixtures/openapi/IdentityOutpostHeartbeatRequest/valid/legacy.json +6 -0
- package/fixtures/openapi/IdentityOutpostRuntime/invalid/runtime.json +10 -0
- package/fixtures/openapi/IdentityOutpostRuntime/valid/observed-zero.json +18 -0
- package/fixtures/openapi/IdentityOutpostRuntime/valid/runtime.json +11 -0
- package/fixtures/openapi/IdentityOutpostRuntimeBindingInput/invalid/runtime.json +6 -0
- package/fixtures/openapi/IdentityOutpostRuntimeBindingInput/valid/runtime.json +5 -0
- package/fixtures/openapi/IdentityOutpostRuntimeControl/invalid/runtime.json +12 -0
- package/fixtures/openapi/IdentityOutpostRuntimeControl/valid/runtime.json +12 -0
- package/fixtures/openapi/IdentityOutpostRuntimeControlInput/invalid/arbitrary-target.json +6 -0
- package/fixtures/openapi/IdentityOutpostRuntimeControlInput/invalid/empty-request-id.json +5 -0
- package/fixtures/openapi/IdentityOutpostRuntimeControlInput/invalid/negative-generation.json +6 -0
- package/fixtures/openapi/IdentityOutpostRuntimeControlInput/invalid/reconcile-replicas.json +6 -0
- package/fixtures/openapi/IdentityOutpostRuntimeControlInput/invalid/runtime.json +6 -0
- package/fixtures/openapi/IdentityOutpostRuntimeControlInput/valid/reconcile.json +5 -0
- package/fixtures/openapi/IdentityOutpostRuntimeControlInput/valid/runtime.json +6 -0
- package/fixtures/openapi/IdentityOutpostRuntimeExecutorClaimRequest/invalid/runtime.json +6 -0
- package/fixtures/openapi/IdentityOutpostRuntimeExecutorClaimRequest/valid/runtime.json +3 -0
- package/fixtures/openapi/KubernetesClusterRegistrationRequest/invalid/metric-cluster-value-length.json +3 -0
- package/fixtures/openapi/KubernetesClusterRegistrationRequest/invalid/metric-cluster-value-type.json +3 -0
- package/fixtures/openapi/KubernetesClusterRegistrationRequest/valid/metric-cluster-alias.json +5 -0
- package/fixtures/openapi/KubernetesClusterRegistrationRequest/valid/metric-cluster-dedicated.json +5 -0
- package/fixtures/openapi/KubernetesClusterRegistrationRequest/valid/metric-cluster-reset.json +3 -0
- package/fixtures/openapi/KubernetesConditionalResourceYamlInput/invalid/preconditions-v1.json +3 -0
- package/fixtures/openapi/KubernetesConditionalResourceYamlInput/valid/preconditions-v1.json +7 -0
- package/fixtures/openapi/KubernetesConditionalWorkloadActionInput/invalid/preconditions-v1.json +7 -0
- package/fixtures/openapi/KubernetesConditionalWorkloadActionInput/valid/preconditions-v1.json +8 -0
- package/fixtures/openapi/KubernetesConditionalWorkloadActionReceipt/invalid/preconditions-v1.json +14 -0
- package/fixtures/openapi/KubernetesConditionalWorkloadActionReceipt/valid/preconditions-v1.json +14 -0
- package/fixtures/openapi/KubernetesConditionalWorkloadActionReceiptEnvelope/invalid/preconditions-v1.json +16 -0
- package/fixtures/openapi/KubernetesConditionalWorkloadActionReceiptEnvelope/valid/preconditions-v1.json +16 -0
- package/fixtures/openapi/KubernetesHelmReleaseValuesUpdateInput/invalid/revision-overflow.json +4 -0
- package/fixtures/openapi/KubernetesHelmReleaseValuesUpdateInput/valid/legacy.json +3 -0
- package/fixtures/openapi/KubernetesHelmReleaseValuesUpdateInput/valid/observed-revision.json +4 -0
- package/fixtures/openapi/KubernetesJobDetail/invalid/execution-observation.json +23 -0
- package/fixtures/openapi/KubernetesJobDetail/valid/execution-observation.json +23 -0
- package/fixtures/openapi/KubernetesNode/invalid/labels.json +10 -0
- package/fixtures/openapi/KubernetesNode/valid/labels.json +11 -0
- package/fixtures/openapi/KubernetesPodArgvInput/invalid/blank-executable.json +6 -0
- package/fixtures/openapi/KubernetesPodArgvInput/invalid/invalid-stdin.json +7 -0
- package/fixtures/openapi/KubernetesPodArgvInput/invalid/native-pod-execution-v1.json +4 -0
- package/fixtures/openapi/KubernetesPodArgvInput/invalid/nul-argv.json +7 -0
- package/fixtures/openapi/KubernetesPodArgvInput/valid/native-pod-execution-v1.json +7 -0
- package/fixtures/openapi/KubernetesPodArgvToolInput/invalid/empty-argv.json +10 -0
- package/fixtures/openapi/KubernetesPodArgvToolInput/invalid/missing-key.json +16 -0
- package/fixtures/openapi/KubernetesPodArgvToolInput/invalid/nested-unknown.json +18 -0
- package/fixtures/openapi/KubernetesPodArgvToolInput/invalid/timeout.json +17 -0
- package/fixtures/openapi/KubernetesPodArgvToolInput/invalid/unknown-shell.json +18 -0
- package/fixtures/openapi/KubernetesPodArgvToolInput/invalid/wrong-namespace.json +17 -0
- package/fixtures/openapi/KubernetesPodArgvToolInput/valid/reviewed-argv.json +17 -0
- package/fixtures/openapi/KubernetesPodExecutionLookupInput/invalid/both.json +7 -0
- package/fixtures/openapi/KubernetesPodExecutionLookupInput/invalid/empty-key.json +6 -0
- package/fixtures/openapi/KubernetesPodExecutionLookupInput/invalid/neither.json +5 -0
- package/fixtures/openapi/KubernetesPodExecutionLookupInput/invalid/noncanonical-id.json +6 -0
- package/fixtures/openapi/KubernetesPodExecutionLookupInput/invalid/unknown-command.json +11 -0
- package/fixtures/openapi/KubernetesPodExecutionLookupInput/valid/by-id.json +6 -0
- package/fixtures/openapi/KubernetesPodExecutionLookupInput/valid/by-key.json +6 -0
- package/fixtures/openapi/KubernetesPodExecutionOutput/invalid/native-pod-execution-v1.json +15 -0
- package/fixtures/openapi/KubernetesPodExecutionOutput/valid/native-pod-execution-v1.json +15 -0
- package/fixtures/openapi/KubernetesPodExecutionReceipt/invalid/native-pod-execution-v1.json +29 -0
- package/fixtures/openapi/KubernetesPodExecutionReceipt/valid/native-pod-execution-v1.json +29 -0
- package/fixtures/openapi/KubernetesPodExecutionReceiptEnvelope/invalid/native-pod-execution-v1.json +1 -0
- package/fixtures/openapi/KubernetesPodExecutionReceiptEnvelope/valid/native-pod-execution-v1.json +31 -0
- package/fixtures/openapi/KubernetesPodExecutionTarget/invalid/native-pod-execution-v1.json +7 -0
- package/fixtures/openapi/KubernetesPodExecutionTarget/valid/native-pod-execution-v1.json +7 -0
- package/fixtures/openapi/KubernetesPodGatewayResult/invalid/encoded-output.json +32 -0
- package/fixtures/openapi/KubernetesPodGatewayResult/invalid/missing-text.json +17 -0
- package/fixtures/openapi/KubernetesPodGatewayResult/invalid/raw-receipt-availability.json +32 -0
- package/fixtures/openapi/KubernetesPodGatewayResult/invalid/raw-receipt-output.json +47 -0
- package/fixtures/openapi/KubernetesPodGatewayResult/invalid/withheld-text.json +32 -0
- package/fixtures/openapi/KubernetesPodGatewayResult/valid/binary-withheld.json +17 -0
- package/fixtures/openapi/KubernetesPodGatewayResult/valid/redacted.json +32 -0
- package/fixtures/openapi/KubernetesPodGatewayResult/valid/text.json +32 -0
- package/fixtures/openapi/KubernetesPodGatewayResult/valid/unavailable.json +17 -0
- package/fixtures/openapi/KubernetesPodListEnvelope/invalid/empty-uid.json +13 -0
- package/fixtures/openapi/KubernetesPodListEnvelope/invalid/invalid-container-state.json +20 -0
- package/fixtures/openapi/KubernetesPodListEnvelope/invalid/missing-container-ready.json +19 -0
- package/fixtures/openapi/KubernetesPodListEnvelope/valid/container-statuses.json +67 -0
- package/fixtures/openapi/KubernetesPodListEnvelope/valid/running-pod.json +1 -0
- package/fixtures/openapi/KubernetesPodTerminalCreated/invalid/terminal.json +21 -0
- package/fixtures/openapi/KubernetesPodTerminalCreated/valid/terminal.json +21 -0
- package/fixtures/openapi/KubernetesPodTerminalCreatedEnvelope/invalid/terminal.json +3 -0
- package/fixtures/openapi/KubernetesPodTerminalCreatedEnvelope/valid/terminal.json +23 -0
- package/fixtures/openapi/KubernetesPodTerminalInput/invalid/terminal.json +4 -0
- package/fixtures/openapi/KubernetesPodTerminalInput/valid/terminal.json +3 -0
- package/fixtures/openapi/KubernetesPodTerminalResult/invalid/terminal.json +8 -0
- package/fixtures/openapi/KubernetesPodTerminalResult/valid/terminal.json +8 -0
- package/fixtures/openapi/KubernetesPodTerminalSession/invalid/terminal.json +18 -0
- package/fixtures/openapi/KubernetesPodTerminalSession/valid/terminal.json +18 -0
- package/fixtures/openapi/KubernetesPodTerminalSessionEnvelope/invalid/terminal.json +3 -0
- package/fixtures/openapi/KubernetesPodTerminalSessionEnvelope/valid/terminal.json +20 -0
- package/fixtures/openapi/KubernetesPrometheusDetail/invalid/metric-cluster-value-type.json +4 -0
- package/fixtures/openapi/KubernetesPrometheusDetail/valid/metric-cluster-alias.json +5 -0
- package/fixtures/openapi/KubernetesResourceDeletionReceipt/invalid/preconditions-v1.json +11 -0
- package/fixtures/openapi/KubernetesResourceDeletionReceipt/valid/preconditions-v1.json +11 -0
- package/fixtures/openapi/KubernetesResourceDeletionReceiptEnvelope/invalid/preconditions-v1.json +5 -0
- package/fixtures/openapi/KubernetesResourceDeletionReceiptEnvelope/valid/preconditions-v1.json +13 -0
- package/fixtures/openapi/KubernetesResourceGraphEnvelope/invalid/network-edge-source-payload.json +73 -0
- package/fixtures/openapi/KubernetesResourceGraphEnvelope/valid/network-edge-facts.json +67 -0
- package/fixtures/openapi/KubernetesResourceIdentity/invalid/preconditions-v1.json +11 -0
- package/fixtures/openapi/KubernetesResourceIdentity/valid/preconditions-v1.json +8 -0
- package/fixtures/openapi/KubernetesResourceIdentityEnvelope/invalid/preconditions-v1.json +3 -0
- package/fixtures/openapi/KubernetesResourceIdentityEnvelope/valid/preconditions-v1.json +10 -0
- package/fixtures/openapi/KubernetesResourceMutationPreconditions/invalid/preconditions-v1.json +3 -0
- package/fixtures/openapi/KubernetesResourceMutationPreconditions/valid/preconditions-v1.json +4 -0
- package/fixtures/openapi/KubernetesResourcePresence/invalid/absence-with-uid.json +11 -0
- package/fixtures/openapi/KubernetesResourcePresence/invalid/missing-collection-version.json +9 -0
- package/fixtures/openapi/KubernetesResourcePresence/invalid/missing-state.json +9 -0
- package/fixtures/openapi/KubernetesResourcePresence/invalid/old-protocol.json +10 -0
- package/fixtures/openapi/KubernetesResourcePresence/invalid/present-without-uid.json +10 -0
- package/fixtures/openapi/KubernetesResourcePresence/invalid/unknown-field.json +11 -0
- package/fixtures/openapi/KubernetesResourcePresence/valid/absent.json +10 -0
- package/fixtures/openapi/KubernetesResourcePresence/valid/present.json +12 -0
- package/fixtures/openapi/KubernetesSecretCertificate/invalid/secret-data.json +1 -0
- package/fixtures/openapi/KubernetesSecretCertificate/invalid/status.json +1 -0
- package/fixtures/openapi/KubernetesSecretCertificate/valid/available.json +1 -0
- package/fixtures/openapi/KubernetesSecretCertificate/valid/missing.json +1 -0
- package/fixtures/openapi/KubernetesWorkloadImportInput/invalid/explicit-service-id.json +5 -0
- package/fixtures/openapi/KubernetesWorkloadImportInput/valid/explicit-service-id.json +7 -0
- package/fixtures/openapi/ManifestBindingListEnvelope/invalid/legacy-object.json +4 -0
- package/fixtures/openapi/ManifestBindingListEnvelope/valid/empty-alias.json +4 -0
- package/fixtures/openapi/ManifestRevision/invalid/missing-files.json +8 -0
- package/fixtures/openapi/ManifestRevision/valid/minimal.json +9 -0
- package/fixtures/openapi/ManifestRevisionListEnvelope/invalid/legacy-object.json +4 -0
- package/fixtures/openapi/ManifestRevisionListEnvelope/valid/legacy-alias.json +24 -0
- package/fixtures/openapi/NativeTerminalClientFrame/invalid/terminal.json +12 -0
- package/fixtures/openapi/NativeTerminalClientFrame/valid/terminal.json +4 -0
- package/fixtures/openapi/NativeTerminalServerFrame/invalid/terminal.json +4 -0
- package/fixtures/openapi/NativeTerminalServerFrame/valid/terminal.json +11 -0
- package/fixtures/openapi/NetworkConflictAnalysisRequest/invalid/ipv6-range.json +9 -0
- package/fixtures/openapi/NetworkEAPServerTrust/invalid/peap.json +10 -0
- package/fixtures/openapi/NetworkEAPServerTrust/invalid/tls-inner.json +11 -0
- package/fixtures/openapi/NetworkEAPServerTrust/invalid/ttls-incomplete.json +10 -0
- package/fixtures/openapi/NetworkEAPServerTrust/valid/ttls.json +12 -0
- package/fixtures/openapi/NetworkMihomoProfileInput/invalid/direct-bundle-raw-source.json +21 -0
- package/fixtures/openapi/NetworkMihomoProfileInput/invalid/mapped-raw-source.json +21 -0
- package/fixtures/openapi/NetworkMihomoProfileInput/valid/direct-bundle.json +19 -0
- package/fixtures/openapi/NetworkMihomoProfileInput/valid/mapped-nodes.json +19 -0
- package/fixtures/openapi/NetworkProxyBundleInput/invalid/unknown.json +25 -0
- package/fixtures/openapi/NetworkProxyBundleInput/valid/basic.json +24 -0
- package/fixtures/openapi/NetworkProxyBundleReadback/invalid/missing-identity.json +9 -0
- package/fixtures/openapi/NetworkProxyBundleReadback/invalid/unknown-field.json +11 -0
- package/fixtures/openapi/NetworkProxyBundleReadback/valid/basic.json +10 -0
- package/fixtures/openapi/NetworkProxyCapability/invalid/unknown-version.json +1 -0
- package/fixtures/openapi/NetworkProxyCapability/valid/guarded-udp.json +1 -0
- package/fixtures/openapi/NetworkProxyDeployment/invalid/negative-observation.json +7 -0
- package/fixtures/openapi/NetworkProxyDeployment/invalid/null-observation.json +7 -0
- package/fixtures/openapi/NetworkProxyDeployment/valid/positive.json +7 -0
- package/fixtures/openapi/NetworkProxyDeployment/valid/stopped.json +7 -0
- package/fixtures/openapi/NetworkProxyDeployment/valid/unobserved.json +6 -0
- package/fixtures/openapi/NetworkProxyDeploymentControlInput/invalid/unknown.json +7 -0
- package/fixtures/openapi/NetworkProxyDeploymentControlInput/valid/basic.json +6 -0
- package/fixtures/openapi/NetworkProxyDeploymentRuntimeAck/invalid/stopped-accepting.json +15 -0
- package/fixtures/openapi/NetworkProxyDeploymentRuntimeAck/invalid/stopped-active.json +15 -0
- package/fixtures/openapi/NetworkProxyDeploymentRuntimeAck/invalid/stopped-missing-count.json +14 -0
- package/fixtures/openapi/NetworkProxyDeploymentRuntimeAck/invalid/stopped-unknown.json +15 -0
- package/fixtures/openapi/NetworkProxyDeploymentRuntimeAck/valid/false-with-active-unknown.json +15 -0
- package/fixtures/openapi/NetworkProxyDeploymentRuntimeAck/valid/omitted-with-active-unknown.json +14 -0
- package/fixtures/openapi/NetworkProxyDeploymentRuntimeAck/valid/process-stopped.json +15 -0
- package/fixtures/openapi/NetworkProxyDeploymentRuntimeControl/invalid/stop-while-accepting.json +13 -0
- package/fixtures/openapi/NetworkProxyDeploymentRuntimeControl/valid/false-can-serve.json +13 -0
- package/fixtures/openapi/NetworkProxyDeploymentRuntimeControl/valid/omitted-can-serve.json +12 -0
- package/fixtures/openapi/NetworkProxyDeploymentRuntimeControl/valid/stop-required.json +13 -0
- package/fixtures/openapi/NetworkProxyDirectProjection/invalid/gateway-credential.json +22 -0
- package/fixtures/openapi/NetworkProxyDirectProjection/invalid/original-source-url.json +20 -0
- package/fixtures/openapi/NetworkProxyDirectProjection/invalid/protected-projection.json +41 -0
- package/fixtures/openapi/NetworkProxyDirectProjection/invalid/wrong-mode.json +19 -0
- package/fixtures/openapi/NetworkProxyDirectProjection/valid/explicit-direct.json +19 -0
- package/fixtures/openapi/NetworkProxyEmployeeProjection/invalid/direct-upstream-content.json +42 -0
- package/fixtures/openapi/NetworkProxyEmployeeProjection/invalid/unsafe-endpoint.json +41 -0
- package/fixtures/openapi/NetworkProxyEmployeeProjection/invalid/upstream.json +42 -0
- package/fixtures/openapi/NetworkProxyEmployeeProjection/valid/scoped.json +41 -0
- package/fixtures/openapi/NetworkProxyIngressCheckInput/invalid/arbitrary-url.json +12 -0
- package/fixtures/openapi/NetworkProxyIngressCheckInput/invalid/missing-identity.json +11 -0
- package/fixtures/openapi/NetworkProxyIngressCheckInput/invalid/unknown-field.json +13 -0
- package/fixtures/openapi/NetworkProxyIngressCheckInput/valid/basic.json +12 -0
- package/fixtures/openapi/NetworkProxyIngressCheckResult/invalid/missing-identity.json +8 -0
- package/fixtures/openapi/NetworkProxyIngressCheckResult/invalid/unknown-field.json +10 -0
- package/fixtures/openapi/NetworkProxyIngressCheckResult/valid/basic.json +9 -0
- package/fixtures/openapi/NetworkProxyInstanceInput/invalid/external.json +5 -0
- package/fixtures/openapi/NetworkProxyInstanceInput/valid/external.json +15 -0
- package/fixtures/openapi/NetworkProxyRule/invalid/unknown.json +15 -0
- package/fixtures/openapi/NetworkProxyRule/valid/basic.json +14 -0
- package/fixtures/openapi/NetworkProxyRuntimeCommandInput/invalid/unknown.json +8 -0
- package/fixtures/openapi/NetworkProxyRuntimeCommandInput/valid/basic.json +7 -0
- package/fixtures/openapi/NetworkProxyServerPublication/invalid/arbitrary-listener.json +21 -0
- package/fixtures/openapi/NetworkProxyServerPublication/invalid/missing-identity.json +19 -0
- package/fixtures/openapi/NetworkProxyServerPublication/invalid/unknown-field.json +21 -0
- package/fixtures/openapi/NetworkProxyServerPublication/valid/basic.json +20 -0
- package/fixtures/openapi/NetworkProxySourceInput/invalid/node-quota.json +912 -0
- package/fixtures/openapi/NetworkProxySourceInput/invalid/unknown.json +8 -0
- package/fixtures/openapi/NetworkProxySourceInput/invalid/unsupported-format.json +7 -0
- package/fixtures/openapi/NetworkProxySourceInput/invalid/untyped-direct-format.json +7 -0
- package/fixtures/openapi/NetworkProxySourceInput/valid/basic.json +7 -0
- package/fixtures/openapi/NetworkProxySourceInput/valid/converted-direct.json +7 -0
- package/fixtures/openapi/NetworkProxyTrafficSample/invalid/known-as-null.json +10 -0
- package/fixtures/openapi/NetworkProxyTrafficSample/valid/gap-rate.json +10 -0
- package/fixtures/openapi/NetworkProxyTrafficSample/valid/known-zero.json +10 -0
- package/fixtures/openapi/NetworkProxyTrafficSample/valid/legacy-numeric.json +7 -0
- package/fixtures/openapi/NetworkProxyTrafficSample/valid/unknown-rate.json +10 -0
- package/fixtures/openapi/NetworkRADIUSConfigurationInput/invalid/arbitrary-image.json +6 -0
- package/fixtures/openapi/NetworkRADIUSConfigurationInput/valid/input.json +5 -0
- package/fixtures/openapi/NetworkRADIUSControlInput/invalid/arbitrary-image.json +8 -0
- package/fixtures/openapi/NetworkRADIUSControlInput/valid/input.json +7 -0
- package/fixtures/openapi/NetworkRADIUSOptions/invalid/secret.json +18 -0
- package/fixtures/openapi/NetworkRADIUSOptions/valid/approved.json +17 -0
- package/fixtures/openapi/NetworkRADIUSPoolInput/invalid/arbitrary-image.json +10 -0
- package/fixtures/openapi/NetworkRADIUSPoolInput/valid/create-approved-binding.json +9 -0
- package/fixtures/openapi/NetworkRADIUSPoolInput/valid/input.json +9 -0
- package/fixtures/openapi/NetworkRADIUSRuntimeACK/invalid/missing-zero.json +20 -0
- package/fixtures/openapi/NetworkRADIUSRuntimeACK/invalid/secret.json +22 -0
- package/fixtures/openapi/NetworkRADIUSRuntimeACK/valid/current.json +21 -0
- package/fixtures/openapi/NetworkRADIUSRuntimeACK/valid/stopped-no-hooks.json +21 -0
- package/fixtures/openapi/NetworkRADIUSRuntimeControl/invalid/secret.json +30 -0
- package/fixtures/openapi/NetworkRADIUSRuntimeControl/valid/current.json +29 -0
- package/fixtures/openapi/OperationCommentInput/invalid/workbench.json +4 -0
- package/fixtures/openapi/OperationCommentInput/valid/workbench.json +3 -0
- package/fixtures/openapi/PersonalAssistantArtifactListEnvelope/invalid/legacy-object.json +4 -0
- package/fixtures/openapi/PersonalAssistantArtifactListEnvelope/valid/legacy-alias.json +4 -0
- package/fixtures/openapi/ReleaseTargetInput/invalid/explicit-service-id.json +8 -0
- package/fixtures/openapi/ReleaseTargetInput/valid/explicit-service-id.json +8 -0
- package/fixtures/openapi/TokenRotationRecord/invalid/cli-boundary.json +10 -0
- package/fixtures/openapi/TokenRotationRecord/valid/cli-boundary.json +9 -0
- package/fixtures/openapi/WorkbenchAgentRunListEnvelope/valid/dsh-session.json +18 -0
- package/fixtures/openapi/WorkbenchSendMessageStreamRequest/invalid/unicode-request-id.json +4 -0
- package/fixtures/openapi/WorkbenchSendMessageStreamRequest/valid/unicode-request-id.json +4 -0
- package/fixtures/openapi/WorkbenchStreamEvent/valid/dsh-agent-status.json +11 -0
- package/fixtures/openapi/WorkbenchStreamEvent/valid/native-system-notice.json +11 -0
- package/fixtures/openapi/WorkflowRequestInput/invalid/original-request.json +6 -0
- package/fixtures/openapi/WorkflowRequestInput/valid/original-request.json +7 -0
- package/fixtures/openapi/WorkflowRequestReceipt/invalid/original-request.json +6 -0
- package/fixtures/openapi/WorkflowRequestReceipt/valid/original-request.json +6 -0
- package/fixtures/openapi/WorkflowRequestReceiptEnvelope/invalid/receipt.json +8 -0
- package/fixtures/openapi/WorkflowRequestReceiptEnvelope/valid/receipt.json +17 -0
- package/fixtures/openapi/WorkflowRunEnvelope/invalid/receipt.json +3 -0
- package/fixtures/openapi/WorkflowRunEnvelope/valid/receipt.json +11 -0
- package/fixtures/openapi/WorkflowTriggerRequest/invalid/workbench.json +4 -0
- package/fixtures/openapi/WorkflowTriggerRequest/valid/workbench.json +9 -0
- package/gen/go/sohaapi/client.go +108 -1
- package/gen/go/sohaapi/client_test.go +85 -0
- package/gen/go/sohaapi/docker_configuration_test.go +32 -0
- package/gen/go/sohaapi/kubernetes_workload_optional_test.go +40 -0
- package/gen/go/sohaapi/memory_types_test.go +59 -0
- package/gen/go/sohaapi/pod_status_compat_test.go +36 -0
- package/gen/go/sohaapi/proxy_deployment_presence_test.go +47 -0
- package/gen/go/sohaapi/proxy_deployment_stop_test.go +40 -0
- package/gen/go/sohaapi/proxy_traffic_test.go +41 -0
- package/gen/go/sohaapi/radius_presence_test.go +35 -0
- package/gen/go/sohaapi/types.go +6580 -365
- package/gen/go/sohaapi/types_test.go +63 -0
- package/gen/ts/sohaapi/index.ts +36358 -26252
- package/go.mod +5 -2
- package/go.sum +8 -0
- package/helmrelease/delivery.go +1 -1
- package/helmrelease/delivery_test.go +1 -1
- package/helmrelease/initialization.go +1 -1
- package/helmrelease/result.go +1 -1
- package/helmrelease/runtime/delivery.go +4 -4
- package/helmrelease/runtime/delivery_test.go +2 -2
- package/helmrelease/runtime/initialization.go +2 -2
- package/helmrelease/runtime/initialization_test.go +2 -2
- package/helmrelease/runtime/values_upgrade.go +78 -0
- package/helmrelease/runtime/values_upgrade_test.go +123 -0
- package/helmrelease/values.go +1 -1
- package/helmrelease/values_update.go +31 -0
- package/memory/memory-policy.schema.json +5 -1
- package/memory/memory-record.schema.json +5 -1
- package/network/README.md +79 -0
- package/network/network-ingest-event.schema.json +4 -1
- package/network/network-runtime-protocol.schema.json +381 -20
- package/network/proxy-adapter.schema.json +1018 -0
- package/network/proxy-runtime.schema.json +1732 -16
- package/network/radius-password-verifier.schema.json +263 -0
- package/network/radius-runtime.schema.json +929 -0
- package/network/schema.go +12 -0
- package/openapi/soha-api.json +70695 -49969
- package/openapi/soha-api.yaml +39327 -27176
- package/openapi/spec_generated.go +3 -3
- package/package.json +19 -6
- package/proxyadapter/mihomo_udp.go +15 -0
- package/proxyadapter/mihomo_udp_test.go +21 -0
- package/proxyadapter/protocol.go +286 -0
- package/proxyadapter/protocol_test.go +76 -0
- package/proxypolicy/destination_test.go +48 -0
- package/proxypolicy/narrow.go +152 -0
- package/proxypolicy/narrow_test.go +138 -0
- package/proxypolicy/policy.go +329 -0
- package/proxypolicy/policy_test.go +36 -0
- package/proxytransport/README.md +141 -0
- package/proxytransport/handler.go +5 -1
- package/proxytransport/native_egress_test.go +236 -0
- package/proxytransport/probe.go +5 -1
- package/proxytransport/probe_test.go +106 -0
- package/proxytransport/refresh_test.go +74 -0
- package/proxytransport/scope.go +23 -3
- package/proxytransport/socks_upstream.go +440 -0
- package/proxytransport/socks_upstream_test.go +368 -0
- package/proxytransport/udp_conn.go +234 -0
- package/proxytransport/udp_gate.go +521 -0
- package/proxytransport/udp_http.go +372 -0
- package/proxytransport/udp_socks.go +288 -0
- package/proxytransport/udp_test.go +793 -0
- package/proxytransport/username.go +51 -0
- package/proxytransport/username_test.go +98 -0
- package/resource/agent_profiles.go +9 -15
- package/resource/agent_profiles_test.go +9 -3
- package/resource/conditional_workload_action.go +63 -0
- package/resource/custom_graph_page.go +18 -0
- package/resource/models.go +102 -57
- package/resource/mutation_preconditions.go +67 -0
- package/resource/network_topology.go +22 -0
- package/resource/network_topology_projection.go +36 -22
- package/resource/network_topology_projection_test.go +4 -0
- package/resource/network_topology_test.go +20 -0
- package/resource/network_topology_validation.go +5 -0
- package/resource/observed_workload.go +18 -0
- package/resource/pod_execution.go +206 -0
- package/resource/pod_execution_gateway.go +119 -0
- package/resource/pod_execution_gateway_test.go +149 -0
- package/resource/pod_execution_test.go +48 -0
- package/resource/pod_status_test.go +22 -0
- package/resource/pod_terminal.go +188 -0
- package/resource/pod_terminal_test.go +63 -0
- package/resource/presence.go +60 -0
- package/resource/presence_test.go +28 -0
- package/resource/rbac_graph.go +4 -0
- package/resource/rollout_optional_test.go +33 -0
- package/resource/root_cr.go +1 -1
- package/resource/runtime/argocd_observation.go +1 -1
- package/resource/runtime/conditional_workload_action.go +141 -0
- package/resource/runtime/conditional_workload_action_test.go +259 -0
- package/resource/runtime/health.go +1 -1
- package/resource/runtime/health_test.go +1 -1
- package/resource/runtime/initialization.go +1 -1
- package/resource/runtime/initialization_test.go +1 -1
- package/resource/runtime/mutation_preconditions.go +106 -0
- package/resource/runtime/mutation_preconditions_test.go +172 -0
- package/resource/runtime/network_relationship_primitives.go +66 -0
- package/resource/runtime/network_relationship_primitives_test.go +147 -0
- package/resource/runtime/network_topology.go +18 -6
- package/resource/runtime/network_topology_builder.go +405 -0
- package/resource/runtime/network_topology_builder_backends.go +195 -0
- package/resource/runtime/network_topology_builder_gateway_l4_test.go +86 -0
- package/resource/runtime/network_topology_builder_ingress.go +302 -0
- package/resource/runtime/network_topology_builder_legacy.go +66 -0
- package/resource/runtime/network_topology_builder_providers.go +242 -0
- package/resource/runtime/network_topology_builder_test.go +186 -0
- package/resource/runtime/network_topology_declarations.go +329 -0
- package/resource/runtime/network_topology_test.go +1 -1
- package/resource/runtime/node_drain.go +1 -1
- package/resource/runtime/node_drain_test.go +1 -1
- package/resource/runtime/pod_execution.go +199 -0
- package/resource/runtime/pod_execution_test.go +194 -0
- package/resource/runtime/pod_execution_transport.go +79 -0
- package/resource/runtime/pod_terminal.go +178 -0
- package/resource/runtime/pod_terminal_test.go +170 -0
- package/resource/runtime/presence.go +58 -0
- package/resource/runtime/presence_metadata.go +85 -0
- package/resource/runtime/presence_metadata_test.go +56 -0
- package/resource/runtime/presence_test.go +85 -0
- package/resource/runtime/relations.go +1 -1
- package/resource/runtime/relations_test.go +1 -1
- package/resource/runtime/resource_edit.go +22 -0
- package/resource/runtime/resource_edit_test.go +32 -0
- package/resource/runtime/resource_graph_collect.go +325 -0
- package/resource/runtime/resource_graph_configuration.go +59 -0
- package/resource/runtime/resource_graph_configuration_collect.go +198 -0
- package/resource/runtime/resource_graph_configuration_test.go +470 -0
- package/resource/runtime/resource_graph_custom_page.go +159 -0
- package/resource/runtime/resource_graph_custom_root.go +132 -0
- package/resource/runtime/resource_graph_custom_root_test.go +197 -0
- package/resource/runtime/resource_graph_enrichment.go +417 -0
- package/resource/runtime/resource_graph_enrichment_hpa_test.go +117 -0
- package/resource/runtime/resource_graph_enrichment_test.go +201 -0
- package/resource/runtime/resource_graph_metadata.go +125 -0
- package/resource/runtime/resource_graph_metadata_test.go +204 -0
- package/resource/runtime/resource_graph_network.go +224 -0
- package/resource/runtime/resource_graph_network_collect.go +174 -0
- package/resource/runtime/resource_graph_network_collect_test.go +147 -0
- package/resource/runtime/resource_graph_network_test.go +342 -0
- package/resource/runtime/resource_graph_rbac.go +278 -0
- package/resource/runtime/resource_graph_rbac_test.go +372 -0
- package/resource/runtime/resource_graph_rules.go +834 -0
- package/resource/runtime/resource_graph_storage.go +144 -0
- package/resource/runtime/resource_graph_storage_collect.go +163 -0
- package/resource/runtime/resource_graph_storage_test.go +397 -0
- package/resource/runtime/resource_graph_test.go +627 -0
- package/resource/runtime/resource_monitoring.go +1 -1
- package/resource/runtime/rollout_integration_test.go +1 -1
- package/resource/runtime/rollout_observation.go +1 -1
- package/resource/runtime/rollout_operation.go +1 -1
- package/resource/runtime/rollout_task.go +2 -2
- package/resource/runtime/rollout_test.go +1 -1
- package/resource/runtime/root_cr.go +2 -2
- package/resource/runtime/root_cr_test.go +1 -1
- package/resource/runtime/secret_certificate.go +44 -0
- package/resource/runtime/secret_certificate_test.go +87 -0
- package/resource/storage_graph.go +4 -0
- package/resource/terminal_options.go +38 -0
- package/resource/terminalstream/stream.go +481 -0
- package/resource/terminalstream/stream_test.go +277 -0
- package/runner/docker-container-identity.schema.json +37 -0
- package/runner/docker-project-identity.schema.json +39 -0
- package/runner/docker-runtime-read-result.schema.json +317 -0
- package/runner/docker-runtime-read.schema.json +85 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
package proxypolicy
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"reflect"
|
|
6
|
+
"testing"
|
|
7
|
+
|
|
8
|
+
api "github.com/opensoha/soha/contracts/gen/go/sohaapi"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
func narrowFixture() ([]api.NetworkProxyGroup, []api.NetworkProxyRule) {
|
|
12
|
+
groups := []api.NetworkProxyGroup{{GroupID: "choice", Label: "Choice", Type: "select", NodeIDs: []string{"a", "b"}, SelectedNodeID: "a"}, {GroupID: "only-a", Label: "A", Type: "select", NodeIDs: []string{"a"}, SelectedNodeID: "a"}}
|
|
13
|
+
rules := []api.NetworkProxyRule{rule("mandatory", "organization_required", "domain", "example.invalid", "node"), rule("personal", "personal", "all", "", "group"), rule("empty-group", "organization_default", "all", "", "group"), rule("protected", "protection", "cidr", "10.0.0.0/8", "reject")}
|
|
14
|
+
rules[0].Action.TargetID = "a"
|
|
15
|
+
rules[0].Order = 9
|
|
16
|
+
rules[1].Action.TargetID = "choice"
|
|
17
|
+
rules[2].Action.TargetID = "only-a"
|
|
18
|
+
rules[2].Enabled = false
|
|
19
|
+
return groups, rules
|
|
20
|
+
}
|
|
21
|
+
func TestNarrowTargetsPreservesPolicyAndInput(t *testing.T) {
|
|
22
|
+
groups, rules := narrowFixture()
|
|
23
|
+
before, _ := json.Marshal([]any{groups, rules})
|
|
24
|
+
got, err := NarrowTargets(groups, rules, []string{"b"})
|
|
25
|
+
if err != nil {
|
|
26
|
+
t.Fatal(err)
|
|
27
|
+
}
|
|
28
|
+
if len(got.Groups) != 1 || !reflect.DeepEqual(got.Groups[0].NodeIDs, []string{"b"}) || got.Groups[0].SelectedNodeID != "" {
|
|
29
|
+
t.Fatalf("selection was replaced or group retained: %+v", got.Groups)
|
|
30
|
+
}
|
|
31
|
+
if got.Rules[0].Action.Type != "reject" || got.Rules[0].Action.TargetID != "" || got.Rules[0].Source != rules[0].Source || got.Rules[0].Matcher != rules[0].Matcher || got.Rules[0].Order != 9 || !got.Rules[0].Enabled {
|
|
32
|
+
t.Fatalf("mandatory weakened: %+v", got.Rules[0])
|
|
33
|
+
}
|
|
34
|
+
if got.Rules[1].Action != rules[1].Action || got.Rules[2].Action.Type != "reject" || got.Rules[2].Enabled || len(got.Conflicts) != 2 {
|
|
35
|
+
t.Fatalf("rules/conflicts: %+v", got)
|
|
36
|
+
}
|
|
37
|
+
for _, c := range got.Conflicts {
|
|
38
|
+
if c.ReasonCode != "invalid_target" || c.BlockingRuleID != c.RuleID {
|
|
39
|
+
t.Fatalf("invalid conflict: %+v", c)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
after, _ := json.Marshal([]any{groups, rules})
|
|
43
|
+
if string(before) != string(after) {
|
|
44
|
+
t.Fatal("mutated input")
|
|
45
|
+
}
|
|
46
|
+
got.Groups[0].NodeIDs[0] = "changed"
|
|
47
|
+
got.Rules[0].Matcher.Value = "changed"
|
|
48
|
+
after, _ = json.Marshal([]any{groups, rules})
|
|
49
|
+
if string(before) != string(after) {
|
|
50
|
+
t.Fatal("output aliases input")
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
func TestNarrowTargetsComposesEffectivePolicy(t *testing.T) {
|
|
54
|
+
groups, rules := narrowFixture()
|
|
55
|
+
for _, s1 := range [][]string{{"a", "b"}, {"a"}, {"b"}, {}} {
|
|
56
|
+
for _, s2 := range [][]string{{"a", "b"}, {"a"}, {"b"}, {}} {
|
|
57
|
+
subset := true
|
|
58
|
+
for _, id := range s2 {
|
|
59
|
+
found := false
|
|
60
|
+
for _, old := range s1 {
|
|
61
|
+
found = found || id == old
|
|
62
|
+
}
|
|
63
|
+
subset = subset && found
|
|
64
|
+
}
|
|
65
|
+
if !subset {
|
|
66
|
+
continue
|
|
67
|
+
}
|
|
68
|
+
first, err := NarrowTargets(groups, rules, s1)
|
|
69
|
+
if err != nil {
|
|
70
|
+
t.Fatal(err)
|
|
71
|
+
}
|
|
72
|
+
twice, err := NarrowTargets(first.Groups, first.Rules, s2)
|
|
73
|
+
if err != nil {
|
|
74
|
+
t.Fatal(err)
|
|
75
|
+
}
|
|
76
|
+
direct, err := NarrowTargets(groups, rules, s2)
|
|
77
|
+
if err != nil {
|
|
78
|
+
t.Fatal(err)
|
|
79
|
+
}
|
|
80
|
+
// Diagnostics are per invocation; original references are deliberately lost
|
|
81
|
+
// after reject. Only effective Groups/Rules obey the composition identity.
|
|
82
|
+
if !reflect.DeepEqual(twice.Groups, direct.Groups) || !reflect.DeepEqual(twice.Rules, direct.Rules) {
|
|
83
|
+
t.Fatalf("nonmonotonic %v -> %v", s1, s2)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
empty, err := NarrowTargets(groups, rules, nil)
|
|
88
|
+
if err != nil || len(empty.Groups) != 0 {
|
|
89
|
+
t.Fatalf("empty scope: %+v %v", empty, err)
|
|
90
|
+
}
|
|
91
|
+
for _, r := range empty.Rules {
|
|
92
|
+
if r.Action.Type != "reject" {
|
|
93
|
+
t.Fatalf("empty scope widened: %+v", r)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
func TestNarrowTargetsRejectsInvalidFields(t *testing.T) {
|
|
98
|
+
for _, tc := range []struct {
|
|
99
|
+
name string
|
|
100
|
+
mutate func(*[]api.NetworkProxyGroup, *[]api.NetworkProxyRule, *[]string)
|
|
101
|
+
}{
|
|
102
|
+
{"empty allowed ID", func(_ *[]api.NetworkProxyGroup, _ *[]api.NetworkProxyRule, a *[]string) { *a = []string{""} }},
|
|
103
|
+
{"duplicate allowed ID", func(_ *[]api.NetworkProxyGroup, _ *[]api.NetworkProxyRule, a *[]string) { *a = []string{"a", "a"} }},
|
|
104
|
+
{"unknown group type", func(g *[]api.NetworkProxyGroup, _ *[]api.NetworkProxyRule, _ *[]string) { (*g)[0].Type = "unknown" }},
|
|
105
|
+
{"invalid group selection", func(g *[]api.NetworkProxyGroup, _ *[]api.NetworkProxyRule, _ *[]string) {
|
|
106
|
+
(*g)[0].SelectedNodeID = "missing"
|
|
107
|
+
}},
|
|
108
|
+
{"unknown matcher", func(_ *[]api.NetworkProxyGroup, r *[]api.NetworkProxyRule, _ *[]string) {
|
|
109
|
+
(*r)[0].Matcher.Type = "regex"
|
|
110
|
+
}},
|
|
111
|
+
{"unknown source", func(_ *[]api.NetworkProxyGroup, r *[]api.NetworkProxyRule, _ *[]string) { (*r)[0].Source = "unknown" }},
|
|
112
|
+
{"unknown action", func(_ *[]api.NetworkProxyGroup, r *[]api.NetworkProxyRule, _ *[]string) {
|
|
113
|
+
(*r)[0].Action.Type = "unknown"
|
|
114
|
+
}},
|
|
115
|
+
{"invalid target syntax", func(_ *[]api.NetworkProxyGroup, r *[]api.NetworkProxyRule, _ *[]string) {
|
|
116
|
+
(*r)[0].Action.TargetID = "bad/id"
|
|
117
|
+
}},
|
|
118
|
+
{"extra reject target", func(_ *[]api.NetworkProxyGroup, r *[]api.NetworkProxyRule, _ *[]string) {
|
|
119
|
+
(*r)[3].Action.TargetID = "a"
|
|
120
|
+
}},
|
|
121
|
+
{"extra all matcher value", func(_ *[]api.NetworkProxyGroup, r *[]api.NetworkProxyRule, _ *[]string) {
|
|
122
|
+
(*r)[1].Matcher.Value = "unexpected"
|
|
123
|
+
}},
|
|
124
|
+
{"mandatory process", func(_ *[]api.NetworkProxyGroup, r *[]api.NetworkProxyRule, _ *[]string) {
|
|
125
|
+
(*r)[0].Matcher.Type = "process_name"
|
|
126
|
+
(*r)[0].Matcher.Value = "browser"
|
|
127
|
+
}},
|
|
128
|
+
} {
|
|
129
|
+
t.Run(tc.name, func(t *testing.T) {
|
|
130
|
+
g, r := narrowFixture()
|
|
131
|
+
a := []string{"b"}
|
|
132
|
+
tc.mutate(&g, &r, &a)
|
|
133
|
+
if _, err := NarrowTargets(g, r, a); err == nil {
|
|
134
|
+
t.Fatal("invalid policy silently narrowed")
|
|
135
|
+
}
|
|
136
|
+
})
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
// Package proxypolicy owns deterministic managed/personal proxy rule composition.
|
|
2
|
+
// It is shared by server and endpoint consumers and has no runtime dependencies.
|
|
3
|
+
package proxypolicy
|
|
4
|
+
|
|
5
|
+
import (
|
|
6
|
+
"errors"
|
|
7
|
+
"fmt"
|
|
8
|
+
"net/netip"
|
|
9
|
+
"sort"
|
|
10
|
+
"strings"
|
|
11
|
+
|
|
12
|
+
api "github.com/opensoha/soha/contracts/gen/go/sohaapi"
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
type Rule = api.NetworkProxyRule
|
|
16
|
+
type Matcher = api.NetworkProxyRuleMatcher
|
|
17
|
+
type Action = api.NetworkProxyRuleAction
|
|
18
|
+
type Conflict = api.NetworkProxyRuleConflict
|
|
19
|
+
type Composition struct {
|
|
20
|
+
OrgRevision int64 `json:"orgRevision"`
|
|
21
|
+
PersonalRevision int64 `json:"personalRevision"`
|
|
22
|
+
EffectiveRules []Rule `json:"effectiveRules"`
|
|
23
|
+
Conflicts []Conflict `json:"conflicts"`
|
|
24
|
+
}
|
|
25
|
+
type Target struct {
|
|
26
|
+
ID string
|
|
27
|
+
Kind string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
var ErrRevisionConflict = errors.New("proxy rule revision conflict")
|
|
31
|
+
|
|
32
|
+
func CheckRevision(expectedOrg, expectedPersonal, actualOrg, actualPersonal int64) error {
|
|
33
|
+
if expectedOrg != actualOrg || expectedPersonal != actualPersonal {
|
|
34
|
+
return ErrRevisionConflict
|
|
35
|
+
}
|
|
36
|
+
return nil
|
|
37
|
+
}
|
|
38
|
+
func layer(s string) int {
|
|
39
|
+
switch s {
|
|
40
|
+
case "protection":
|
|
41
|
+
return 0
|
|
42
|
+
case "organization_required":
|
|
43
|
+
return 1
|
|
44
|
+
case "personal":
|
|
45
|
+
return 2
|
|
46
|
+
case "organization_default":
|
|
47
|
+
return 3
|
|
48
|
+
case "fallback":
|
|
49
|
+
return 4
|
|
50
|
+
}
|
|
51
|
+
return -1
|
|
52
|
+
}
|
|
53
|
+
func value(m Matcher) string {
|
|
54
|
+
return m.Value
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// IsMandatory identifies only the two trusted mandatory layers.
|
|
58
|
+
func IsMandatory(r Rule) bool {
|
|
59
|
+
return string(r.Source) == "protection" || string(r.Source) == "organization_required"
|
|
60
|
+
}
|
|
61
|
+
func mandatory(r Rule) bool { return IsMandatory(r) }
|
|
62
|
+
func ValidateRule(r Rule, targets []Target, server bool) error {
|
|
63
|
+
if r.RuleID == "" || len(r.RuleID) > 128 || r.Order < 0 || layer(string(r.Source)) < 0 {
|
|
64
|
+
return errors.New("invalid rule identity/source/order")
|
|
65
|
+
}
|
|
66
|
+
if err := validateMatcher(r.Matcher, server && mandatory(r)); err != nil {
|
|
67
|
+
return err
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
switch string(r.Action.Type) {
|
|
71
|
+
case "reject", "direct":
|
|
72
|
+
if r.Action.TargetID != "" {
|
|
73
|
+
return errors.New("unexpected target")
|
|
74
|
+
}
|
|
75
|
+
case "node", "group":
|
|
76
|
+
if r.Action.TargetID == "" {
|
|
77
|
+
return errors.New("missing logical target")
|
|
78
|
+
}
|
|
79
|
+
found := false
|
|
80
|
+
for _, t := range targets {
|
|
81
|
+
if t.ID == r.Action.TargetID && t.Kind == string(r.Action.Type) {
|
|
82
|
+
found = true
|
|
83
|
+
break
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if !found {
|
|
87
|
+
return errors.New("invalid_target")
|
|
88
|
+
}
|
|
89
|
+
default:
|
|
90
|
+
return errors.New("unsupported action")
|
|
91
|
+
}
|
|
92
|
+
if string(r.Source) == "protection" && string(r.Action.Type) != "reject" {
|
|
93
|
+
return errors.New("protection must reject")
|
|
94
|
+
}
|
|
95
|
+
return nil
|
|
96
|
+
}
|
|
97
|
+
func sameAction(a, b Action) bool {
|
|
98
|
+
return a.Type == b.Type && a.TargetID == b.TargetID
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// overlap is deliberately conservative for cross-family matchers: a process and
|
|
102
|
+
// destination matcher can match the same flow. Unprovable mandatory conflicts fail.
|
|
103
|
+
func overlap(a, b Matcher) bool {
|
|
104
|
+
at, bt := string(a.Type), string(b.Type)
|
|
105
|
+
av, bv := strings.ToLower(value(a)), strings.ToLower(value(b))
|
|
106
|
+
if at == "all" || bt == "all" {
|
|
107
|
+
return true
|
|
108
|
+
}
|
|
109
|
+
if at == "cidr" && bt == "cidr" {
|
|
110
|
+
ap, _ := netip.ParsePrefix(av)
|
|
111
|
+
bp, _ := netip.ParsePrefix(bv)
|
|
112
|
+
return ap.Overlaps(bp)
|
|
113
|
+
}
|
|
114
|
+
if (at == "domain" || at == "domain_suffix") && (bt == "domain" || bt == "domain_suffix") {
|
|
115
|
+
if at == "domain" && bt == "domain" {
|
|
116
|
+
return av == bv
|
|
117
|
+
}
|
|
118
|
+
return av == bv || (at == "domain_suffix" && strings.HasSuffix(bv, "."+av)) || (bt == "domain_suffix" && strings.HasSuffix(av, "."+bv))
|
|
119
|
+
}
|
|
120
|
+
if at == bt && (at == "process_name" || at == "process_path") {
|
|
121
|
+
return value(a) == value(b)
|
|
122
|
+
}
|
|
123
|
+
return true
|
|
124
|
+
}
|
|
125
|
+
func covers(a, b Matcher) bool {
|
|
126
|
+
if string(a.Type) == "all" {
|
|
127
|
+
return true
|
|
128
|
+
}
|
|
129
|
+
if a.Type == b.Type && value(a) == value(b) {
|
|
130
|
+
return true
|
|
131
|
+
}
|
|
132
|
+
if string(a.Type) == "domain_suffix" && (string(b.Type) == "domain" || string(b.Type) == "domain_suffix") {
|
|
133
|
+
av, bv := strings.ToLower(value(a)), strings.ToLower(value(b))
|
|
134
|
+
return av == bv || strings.HasSuffix(bv, "."+av)
|
|
135
|
+
}
|
|
136
|
+
if string(a.Type) == "cidr" && string(b.Type) == "cidr" {
|
|
137
|
+
ap, _ := netip.ParsePrefix(value(a))
|
|
138
|
+
bp, _ := netip.ParsePrefix(value(b))
|
|
139
|
+
return ap.Bits() <= bp.Bits() && ap.Contains(bp.Addr())
|
|
140
|
+
}
|
|
141
|
+
return false
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Compose never mutates the input/draft. ProtectedSet deny precedes all rules;
|
|
145
|
+
// required organization, personal, organization defaults and fallback follow.
|
|
146
|
+
// Mandatory contradictions reject the publication. Partial masks remain ordered
|
|
147
|
+
// and explained; a wholly masked personal rule is retained only in its draft.
|
|
148
|
+
func Compose(orgRevision, personalRevision int64, rules []Rule, targets []Target, server bool) (Composition, error) {
|
|
149
|
+
out := Composition{OrgRevision: orgRevision, PersonalRevision: personalRevision, EffectiveRules: []Rule{}, Conflicts: []Conflict{}}
|
|
150
|
+
if orgRevision < 0 || personalRevision < 0 {
|
|
151
|
+
return out, errors.New("negative revision")
|
|
152
|
+
}
|
|
153
|
+
ordered := append([]Rule(nil), rules...)
|
|
154
|
+
seen := map[string]bool{}
|
|
155
|
+
counts := map[string]int{}
|
|
156
|
+
for _, r := range ordered {
|
|
157
|
+
counts[string(r.Source)]++
|
|
158
|
+
if counts[string(r.Source)] > 2048 {
|
|
159
|
+
return out, errors.New("rule layer quota exceeded")
|
|
160
|
+
}
|
|
161
|
+
if seen[r.RuleID] {
|
|
162
|
+
return out, errors.New("duplicate ruleId")
|
|
163
|
+
}
|
|
164
|
+
seen[r.RuleID] = true
|
|
165
|
+
if err := ValidateRule(r, targets, server); err != nil {
|
|
166
|
+
return out, fmt.Errorf("rule %s: %w", r.RuleID, err)
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
sort.SliceStable(ordered, func(i, j int) bool {
|
|
170
|
+
a, b := ordered[i], ordered[j]
|
|
171
|
+
if layer(string(a.Source)) != layer(string(b.Source)) {
|
|
172
|
+
return layer(string(a.Source)) < layer(string(b.Source))
|
|
173
|
+
}
|
|
174
|
+
if a.Order != b.Order {
|
|
175
|
+
return a.Order < b.Order
|
|
176
|
+
}
|
|
177
|
+
return a.RuleID < b.RuleID
|
|
178
|
+
})
|
|
179
|
+
for i, r := range ordered {
|
|
180
|
+
if !r.Enabled {
|
|
181
|
+
continue
|
|
182
|
+
}
|
|
183
|
+
masked := false
|
|
184
|
+
for _, higher := range ordered[:i] {
|
|
185
|
+
if !higher.Enabled || !overlap(higher.Matcher, r.Matcher) || sameAction(higher.Action, r.Action) {
|
|
186
|
+
continue
|
|
187
|
+
}
|
|
188
|
+
if mandatory(higher) && mandatory(r) && string(higher.Source) != "protection" {
|
|
189
|
+
return out, fmt.Errorf("mandatory_conflict: %s and %s", higher.RuleID, r.RuleID)
|
|
190
|
+
}
|
|
191
|
+
if mandatory(higher) && string(r.Source) == "personal" {
|
|
192
|
+
out.Conflicts = append(out.Conflicts, Conflict{RuleID: r.RuleID, BlockingRuleID: higher.RuleID, ReasonCode: api.NetworkProxyRuleConflictReasonCode("masked_by_required")})
|
|
193
|
+
if covers(higher.Matcher, r.Matcher) {
|
|
194
|
+
masked = true
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if !masked {
|
|
199
|
+
out.EffectiveRules = append(out.EffectiveRules, r)
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return out, nil
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
func validateMatcher(m Matcher, serverMandatory bool) error {
|
|
206
|
+
v := value(m)
|
|
207
|
+
switch string(m.Type) {
|
|
208
|
+
case "domain", "domain_suffix":
|
|
209
|
+
if v == "" || len(v) > 253 || strings.ContainsAny(v, " /:@*\\\t\r\n") || strings.HasPrefix(v, ".") || strings.HasSuffix(v, ".") {
|
|
210
|
+
return errors.New("invalid domain matcher")
|
|
211
|
+
}
|
|
212
|
+
case "cidr":
|
|
213
|
+
p, e := netip.ParsePrefix(v)
|
|
214
|
+
if e != nil || p.Masked().String() != v {
|
|
215
|
+
return errors.New("noncanonical CIDR")
|
|
216
|
+
}
|
|
217
|
+
case "process_name", "process_path":
|
|
218
|
+
if v == "" || len(v) > 1024 {
|
|
219
|
+
return errors.New("invalid process matcher")
|
|
220
|
+
}
|
|
221
|
+
if serverMandatory {
|
|
222
|
+
return errors.New("unsupported_matcher: mandatory process identity is not trusted at server")
|
|
223
|
+
}
|
|
224
|
+
case "all":
|
|
225
|
+
if m.Value != "" {
|
|
226
|
+
return errors.New("all matcher forbids value")
|
|
227
|
+
}
|
|
228
|
+
default:
|
|
229
|
+
return errors.New("unsupported_matcher")
|
|
230
|
+
}
|
|
231
|
+
return nil
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// MatchesDestination evaluates only destination-visible matchers. The supplied
|
|
235
|
+
// addresses must be the complete resolved, pinned destination set. A CIDR match
|
|
236
|
+
// against any address is a match; a missing address set cannot bypass CIDR rules.
|
|
237
|
+
// Process conditions cannot be established by a remote proxy and return an error.
|
|
238
|
+
func MatchesDestination(m Matcher, host string, addresses []netip.Addr) (bool, error) {
|
|
239
|
+
if err := validateMatcher(m, true); err != nil {
|
|
240
|
+
return false, err
|
|
241
|
+
}
|
|
242
|
+
if strings.TrimSpace(host) != host || host == "" || strings.ContainsAny(host, "/@?#\\\t\r\n%") {
|
|
243
|
+
return false, errors.New("invalid destination host")
|
|
244
|
+
}
|
|
245
|
+
host = strings.TrimSuffix(strings.ToLower(host), ".")
|
|
246
|
+
switch string(m.Type) {
|
|
247
|
+
case "all":
|
|
248
|
+
return true, nil
|
|
249
|
+
case "domain":
|
|
250
|
+
return strings.EqualFold(host, m.Value), nil
|
|
251
|
+
case "domain_suffix":
|
|
252
|
+
suffix := strings.ToLower(m.Value)
|
|
253
|
+
return host == suffix || strings.HasSuffix(host, "."+suffix), nil
|
|
254
|
+
case "cidr":
|
|
255
|
+
prefix, _ := netip.ParsePrefix(m.Value)
|
|
256
|
+
candidates := append([]netip.Addr(nil), addresses...)
|
|
257
|
+
if literal, err := netip.ParseAddr(host); err == nil {
|
|
258
|
+
candidates = append(candidates, literal)
|
|
259
|
+
}
|
|
260
|
+
if len(candidates) == 0 {
|
|
261
|
+
return false, errors.New("resolved destination addresses required for CIDR matcher")
|
|
262
|
+
}
|
|
263
|
+
matched := false
|
|
264
|
+
for _, addr := range candidates {
|
|
265
|
+
if !addr.IsValid() {
|
|
266
|
+
return false, errors.New("invalid resolved destination address")
|
|
267
|
+
}
|
|
268
|
+
if prefix.Contains(addr.Unmap()) {
|
|
269
|
+
matched = true
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return matched, nil
|
|
273
|
+
}
|
|
274
|
+
return false, errors.New("unsupported destination matcher")
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// EvaluateMandatory shares destination enforcement between Core and App.
|
|
278
|
+
// Rules must come from the authenticated policy and their logical targets must
|
|
279
|
+
// already be checked against the current inventory/scope. This function checks
|
|
280
|
+
// rule shape and matching; it never grants access to an unverified target.
|
|
281
|
+
// A matching reject wins over every matching route action. Contradictory route
|
|
282
|
+
// actions or unsupported mandatory process conditions fail closed. matched=false
|
|
283
|
+
// is not an authorization grant and must not be interpreted as automatic DIRECT.
|
|
284
|
+
func EvaluateMandatory(rules []Rule, host string, addresses []netip.Addr) (action Action, matched bool, err error) {
|
|
285
|
+
reject := false
|
|
286
|
+
conflict := false
|
|
287
|
+
for _, r := range rules {
|
|
288
|
+
if !r.Enabled {
|
|
289
|
+
continue
|
|
290
|
+
}
|
|
291
|
+
if layer(string(r.Source)) < 0 {
|
|
292
|
+
return Action{}, false, errors.New("invalid rule source")
|
|
293
|
+
}
|
|
294
|
+
if !IsMandatory(r) {
|
|
295
|
+
continue
|
|
296
|
+
}
|
|
297
|
+
// Validate structural action shape without claiming inventory authorization.
|
|
298
|
+
targets := []Target(nil)
|
|
299
|
+
if r.Action.TargetID != "" {
|
|
300
|
+
targets = append(targets, Target{ID: r.Action.TargetID, Kind: string(r.Action.Type)})
|
|
301
|
+
}
|
|
302
|
+
if err := ValidateRule(r, targets, true); err != nil {
|
|
303
|
+
return Action{}, false, err
|
|
304
|
+
}
|
|
305
|
+
matches, e := MatchesDestination(r.Matcher, host, addresses)
|
|
306
|
+
if e != nil {
|
|
307
|
+
return Action{}, false, e
|
|
308
|
+
}
|
|
309
|
+
if !matches {
|
|
310
|
+
continue
|
|
311
|
+
}
|
|
312
|
+
if string(r.Action.Type) == "reject" {
|
|
313
|
+
reject = true
|
|
314
|
+
continue
|
|
315
|
+
}
|
|
316
|
+
if matched && !sameAction(action, r.Action) {
|
|
317
|
+
conflict = true
|
|
318
|
+
}
|
|
319
|
+
action = r.Action
|
|
320
|
+
matched = true
|
|
321
|
+
}
|
|
322
|
+
if reject {
|
|
323
|
+
return Action{Type: api.NetworkProxyRuleActionType("reject")}, true, nil
|
|
324
|
+
}
|
|
325
|
+
if conflict {
|
|
326
|
+
return Action{}, false, errors.New("mandatory_conflict")
|
|
327
|
+
}
|
|
328
|
+
return action, matched, nil
|
|
329
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
package proxypolicy
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
api "github.com/opensoha/soha/contracts/gen/go/sohaapi"
|
|
5
|
+
"testing"
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
func rule(id, source, matcher, v, action string) Rule {
|
|
9
|
+
r := Rule{RuleID: id, Source: api.NetworkProxyRuleSource(source), Enabled: true, Matcher: Matcher{Type: api.NetworkProxyRuleMatcherType(matcher)}, Action: Action{Type: api.NetworkProxyRuleActionType(action)}}
|
|
10
|
+
if v != "" {
|
|
11
|
+
r.Matcher.Value = v
|
|
12
|
+
}
|
|
13
|
+
return r
|
|
14
|
+
}
|
|
15
|
+
func TestComposePriorityAndDraft(t *testing.T) {
|
|
16
|
+
rules := []Rule{rule("mine", "personal", "domain", "x.example.invalid", "direct"), rule("guard", "protection", "domain_suffix", "example.invalid", "reject"), rule("default", "organization_default", "all", "", "direct")}
|
|
17
|
+
got, err := Compose(2, 3, rules, nil, false)
|
|
18
|
+
if err != nil || len(got.EffectiveRules) != 2 || len(got.Conflicts) != 1 || got.EffectiveRules[0].RuleID != "guard" || rules[0].RuleID != "mine" {
|
|
19
|
+
t.Fatalf("%+v %v", got, err)
|
|
20
|
+
}
|
|
21
|
+
if CheckRevision(2, 2, 2, 3) == nil {
|
|
22
|
+
t.Fatal("stale CAS accepted")
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
func TestMandatoryAndUnknownReject(t *testing.T) {
|
|
26
|
+
for _, rules := range [][]Rule{{rule("a", "organization_required", "all", "", "reject"), rule("b", "organization_required", "all", "", "direct")}, {rule("a", "organization_required", "process_name", "app", "reject")}, {rule("a", "personal", "regex", ".*", "direct")}} {
|
|
27
|
+
if _, err := Compose(0, 0, rules, nil, true); err == nil {
|
|
28
|
+
t.Fatalf("accepted %+v", rules)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
func TestDomainBoundary(t *testing.T) {
|
|
33
|
+
if overlap(rule("a", "personal", "domain_suffix", "example.invalid", "reject").Matcher, rule("b", "personal", "domain", "notexample.invalid", "direct").Matcher) {
|
|
34
|
+
t.Fatal("suffix crossed label boundary")
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Guarded proxy transports
|
|
2
|
+
|
|
3
|
+
TCP keeps the existing `New` / `Handler` behavior. UDP is opt-in plumbing; it
|
|
4
|
+
is not proof of Mihomo/upstream/platform UDP compatibility. Advertise
|
|
5
|
+
`guarded_udp_v1` only after installing and verifying the real guarded chain.
|
|
6
|
+
`ErrPacketUnsupported` from a verified dial callback maps to a static HTTP 501
|
|
7
|
+
with the UDP transport header. The client recognizes it only after verified TLS
|
|
8
|
+
and exact protocol-header checks, without reading/echoing the response body.
|
|
9
|
+
Other unsafe protocol responses are not converted into unsupported.
|
|
10
|
+
TCP-only upstreams must produce that static unsupported result, never a direct OS
|
|
11
|
+
UDP fallback or a downloaded replacement transport.
|
|
12
|
+
|
|
13
|
+
## Frozen UDP v1
|
|
14
|
+
|
|
15
|
+
The approved internal HTTPS endpoint accepts HTTP/1 CONNECT `host:port` with
|
|
16
|
+
exactly one `Soha-Transport: udp/1` and the existing HTTP Basic mapped username
|
|
17
|
+
(`EncodeMappedUsername`) and credential secret. The 200 response must echo
|
|
18
|
+
exactly one identical transport header. Missing/unknown/duplicate transport
|
|
19
|
+
values fail the UDP handshake. Header-free requests continue to the existing
|
|
20
|
+
TCP Handler. This private protocol is **not** RFC 9298 CONNECT-UDP.
|
|
21
|
+
|
|
22
|
+
After the headers, each datagram is a two-byte unsigned big-endian payload length
|
|
23
|
+
followed by exactly that many bytes. Zero is a valid empty datagram, not EOF.
|
|
24
|
+
The payload maximum is 65507 bytes. Oversize/truncated frames and insufficient
|
|
25
|
+
Read buffers close the association; data is never truncated. Each remote
|
|
26
|
+
association has one immutable destination; frames contain no alternative target,
|
|
27
|
+
credential or upstream/source metadata. TLS stream transport can cause head of
|
|
28
|
+
line blocking; this does not claim native UDP timing, QUIC performance or loss
|
|
29
|
+
semantics.
|
|
30
|
+
|
|
31
|
+
A SOCKS UDP datagram must additionally fit its **whole header plus payload**
|
|
32
|
+
within 65507 bytes. Header space is charged per address type; oversized replies
|
|
33
|
+
are rejected, not fragmented/truncated. RSV is zero and FRAG must be zero;
|
|
34
|
+
SOCKS fragmentation is unsupported. This rule does not promise that the OS or
|
|
35
|
+
an upstream network never performs IP fragmentation.
|
|
36
|
+
|
|
37
|
+
## Shared APIs
|
|
38
|
+
|
|
39
|
+
```go
|
|
40
|
+
type DialPacket func(context.Context, string /* user */, string /* target */) (net.Conn, error)
|
|
41
|
+
type PacketAuthorize func(context.Context, string /* user */, string /* target */) error
|
|
42
|
+
|
|
43
|
+
NewPacketConn(net.Conn, time.Time) (*PacketConn, error)
|
|
44
|
+
NewPacketHandler(map[string]string, DialPacket, PacketAuthorize, time.Time) (*PacketHandler, error)
|
|
45
|
+
DialPacketTunnel(context.Context, net.Conn /* verified *tls.Conn */, string /* target */, string /* user */, string /* secret */, time.Time) (*PacketConn, error)
|
|
46
|
+
NewSOCKS5Gate(map[string]string, Dial, DialPacket, PacketAuthorize, time.Time) (*SOCKS5Gate, error)
|
|
47
|
+
DialSOCKS5UDP(context.Context, string /* owned loopback backend */, string /* user */, string /* secret */, string /* pinned literal IP:port */, time.Time) (net.Conn, error)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
`Read` / `Write` on packet connections each represent one datagram, including
|
|
51
|
+
empty datagrams. Never use `io.Copy` to bridge a packet connection.
|
|
52
|
+
`PacketConn.Refresh`, `PacketHandler.Refresh` and `SOCKS5Gate.Refresh` require
|
|
53
|
+
that the previous lease is still alive. The next expiry must be in the future
|
|
54
|
+
and at most five minutes from now. There is no arbitrary five-minute lifetime
|
|
55
|
+
limit on a continuously authorized flow. Callers cap renewal by the current
|
|
56
|
+
configuration/certificate/credential limits and cannot renew old authorization
|
|
57
|
+
past an in-flight check's expiry. Expired, closed or idle packet connections
|
|
58
|
+
cannot be revived; a new association needs fresh authorization.
|
|
59
|
+
|
|
60
|
+
`PacketAuthorize` is required before forwarding **each datagram in both
|
|
61
|
+
directions**. Callers recheck current node/credential/epoch/scope, ProtectedSet,
|
|
62
|
+
mandatory rules, approved destination resolution and their hard expiry. A
|
|
63
|
+
bounded current grant/cache may be used only until its expiry; online grants
|
|
64
|
+
must expire within five seconds. The package does not grant access based on
|
|
65
|
+
capabilities or a successful earlier handshake. Dial callbacks resolve, validate
|
|
66
|
+
all DNS answers and pin one authorized IP. Packet callbacks and dials have
|
|
67
|
+
bounded contexts; callers must honor cancellation.
|
|
68
|
+
|
|
69
|
+
Packet connections have a 30-second activity idle window. Renewals do not reset
|
|
70
|
+
activity. Per-packet operations are serialized per direction, with no unbounded
|
|
71
|
+
queue or multiplexing buffer. Each gate permits at most 4096 controls and at
|
|
72
|
+
most 4096 destination-specific UDP associations; each local SOCKS control has
|
|
73
|
+
at most 128 inner destinations. These are upper bounds, not capacity claims.
|
|
74
|
+
`ActiveCount` counts admitted **UDP destination associations**, not TCP controls,
|
|
75
|
+
and is not an overall TCP+UDP service count. Callers combine it with TCP counts
|
|
76
|
+
for drain/stop proof, or track the returned connections themselves.
|
|
77
|
+
|
|
78
|
+
## Local SOCKS boundary and backend
|
|
79
|
+
|
|
80
|
+
`SOCKS5Gate.Serve` accepts only a loopback listener and loopback clients. It
|
|
81
|
+
supports RFC 1929 password authentication, TCP CONNECT via the supplied existing
|
|
82
|
+
`Dial`, and UDP ASSOCIATE through `DialPacket`. Local usernames/passwords have a
|
|
83
|
+
255-byte RFC limit: use short random/node-local names, not the potentially
|
|
84
|
+
354-byte mapped HTTP username. Keep local credentials private.
|
|
85
|
+
|
|
86
|
+
Each TCP UDP control owns a dedicated loopback UDP socket. The source IP must
|
|
87
|
+
match the TCP peer. A requested nonzero port must match exactly; port zero pins
|
|
88
|
+
the first valid datagram's source port. A malicious local process capable of
|
|
89
|
+
racing/spoofing that source remains inside the local-host trust boundary; this
|
|
90
|
+
is not process identity isolation. The control's close/expiry closes its socket
|
|
91
|
+
and children. Multiple destinations on one SOCKS control get independent
|
|
92
|
+
single-destination inner associations; there is no remote wildcard association.
|
|
93
|
+
|
|
94
|
+
`DialSOCKS5UDP` connects only to an installer-owned **literal loopback** TCP
|
|
95
|
+
backend, performs password authentication and UDP ASSOCIATE, and requires a
|
|
96
|
+
literal loopback relay reply. It connects an OS UDP socket only to that relay;
|
|
97
|
+
the owned engine routes to the target. Replies must carry the pinned target,
|
|
98
|
+
RSV=0 and FRAG=0. Closing it closes both relay UDP and control TCP. The caller
|
|
99
|
+
verifies backend process/port ownership and UDP support for the selected node;
|
|
100
|
+
loopback address validation alone is not ownership proof.
|
|
101
|
+
|
|
102
|
+
## Lifecycle and integration
|
|
103
|
+
|
|
104
|
+
Use an explicit HTTP dispatcher: requests with `Soha-Transport` go to
|
|
105
|
+
`PacketHandler`; absent header goes to the legacy TCP handler. No existing TCP
|
|
106
|
+
code or authentication behavior is changed by installing these new types.
|
|
107
|
+
|
|
108
|
+
`NoNew` denies new associations and new local SOCKS destinations, retaining
|
|
109
|
+
already admitted destinations for bounded drain. `Close` terminates the gate
|
|
110
|
+
and all owned associations/controls. It cannot be reversed with Refresh.
|
|
111
|
+
Callers retain per-user/node connection registries and close only revoked node
|
|
112
|
+
connections immediately; the next per-packet check independently rejects stale
|
|
113
|
+
scope. Do not implement node revocation by closing a shared gate for unrelated B.
|
|
114
|
+
|
|
115
|
+
Secrets, payloads, original source URLs and upstream parameters must never be
|
|
116
|
+
logged or exported. Shared code emits static errors only. Real validation still
|
|
117
|
+
requires the pinned Mihomo native SOCKS UDP backend, distinct A/B upstreams,
|
|
118
|
+
ProtectedSet/rule refusal, revoked A with surviving B, grant expiry/late renewal,
|
|
119
|
+
and drain/stop confirmation; package socket tests are not that acceptance.
|
|
120
|
+
|
|
121
|
+
## Original SOCKS5 upstream relay boundary
|
|
122
|
+
|
|
123
|
+
`UpstreamConnect func(context.Context) (net.Conn, error)` is supplied by the
|
|
124
|
+
caller. Both `DialSOCKS5UpstreamTCP` and `DialSOCKS5UpstreamUDP` take
|
|
125
|
+
`(ctx, connect, approvedUpstreamIP netip.Addr, user, secret, pinnedTarget, deadline)`.
|
|
126
|
+
The caller owns source Scope resolution/pinning, verified TLS/SNI when required,
|
|
127
|
+
source credentials/authentication choice and original-node compatibility. The
|
|
128
|
+
factory returns the connected TCP/TLS stream before SOCKS negotiation. The helpers
|
|
129
|
+
first check that the connected TCP/TLS `RemoteAddr` equals the explicit approved
|
|
130
|
+
source IP, then perform SOCKS authentication and request negotiation. Empty user plus empty secret selects NoAuth;
|
|
131
|
+
otherwise upstream RFC 1929 credentials are bounded to 255 bytes each.
|
|
132
|
+
|
|
133
|
+
The UDP helper accepts only a literal same-IP BND relay; unspecified IPv4/IPv6
|
|
134
|
+
BND addresses become the approved IP. Other IPs, hostnames and invalid ports are
|
|
135
|
+
rejected before creating the UDP socket. The OS socket connects only to the
|
|
136
|
+
approved proxy IP and validated relay port, never directly to `pinnedTarget`.
|
|
137
|
+
Replies must retain the literal pinned target, FRAG=0 and the total datagram
|
|
138
|
+
budget. This helper supplements caller authorization/protection/lease checks;
|
|
139
|
+
it neither grants source/target access nor proves an upstream server's UDP
|
|
140
|
+
support. Only the original SOCKS5 node needs this controlled second loopback
|
|
141
|
+
bridge; it is not a general-purpose network sandbox.
|
|
@@ -35,7 +35,7 @@ func New(credentials map[string]string, dial Dial, deadline time.Time) (*Handler
|
|
|
35
35
|
}
|
|
36
36
|
h := &Handler{credentials: map[string][32]byte{}, dial: dial, deadline: deadline.UTC(), connections: map[net.Conn]struct{}{}}
|
|
37
37
|
for user, password := range credentials {
|
|
38
|
-
if user == "" || len(user) >
|
|
38
|
+
if user == "" || len(user) > MaxUsernameBytes || len(password) < 32 {
|
|
39
39
|
return nil, errors.New("invalid proxy transport credential")
|
|
40
40
|
}
|
|
41
41
|
h.credentials[user] = sha256.Sum256([]byte(password))
|
|
@@ -53,6 +53,10 @@ func (h *Handler) Refresh(deadline time.Time) error {
|
|
|
53
53
|
h.deadline = deadline
|
|
54
54
|
for conn := range h.connections {
|
|
55
55
|
if err := conn.SetDeadline(deadline); err != nil {
|
|
56
|
+
if errors.Is(err, net.ErrClosed) {
|
|
57
|
+
delete(h.connections, conn)
|
|
58
|
+
continue
|
|
59
|
+
}
|
|
56
60
|
return err
|
|
57
61
|
}
|
|
58
62
|
}
|