@stigmer/server 3.22.1-dev.20260922095755 → 3.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/authorization/authorizer.d.ts +8 -4
- package/dist/authorization/authorizer.d.ts.map +1 -1
- package/dist/authorization/authorizer.js +9 -5
- package/dist/authorization/authorizer.js.map +1 -1
- package/dist/authorization/derived-tuples.d.ts.map +1 -1
- package/dist/authorization/derived-tuples.js +25 -10
- package/dist/authorization/derived-tuples.js.map +1 -1
- package/dist/authorization/evaluator.d.ts +8 -7
- package/dist/authorization/evaluator.d.ts.map +1 -1
- package/dist/authorization/evaluator.js +20 -4
- package/dist/authorization/evaluator.js.map +1 -1
- package/dist/authorization/list-read-scope.d.ts.map +1 -1
- package/dist/authorization/list-read-scope.js +9 -5
- package/dist/authorization/list-read-scope.js.map +1 -1
- package/dist/authorization/model/agent.d.ts.map +1 -1
- package/dist/authorization/model/agent.js +5 -4
- package/dist/authorization/model/agent.js.map +1 -1
- package/dist/authorization/model/agent_instance.d.ts.map +1 -1
- package/dist/authorization/model/agent_instance.js +2 -2
- package/dist/authorization/model/agent_instance.js.map +1 -1
- package/dist/authorization/model/mcp_server.d.ts.map +1 -1
- package/dist/authorization/model/mcp_server.js +2 -2
- package/dist/authorization/model/mcp_server.js.map +1 -1
- package/dist/authorization/model/plugin.d.ts.map +1 -1
- package/dist/authorization/model/plugin.js +4 -3
- package/dist/authorization/model/plugin.js.map +1 -1
- package/dist/authorization/model/rewrite.d.ts +10 -8
- package/dist/authorization/model/rewrite.d.ts.map +1 -1
- package/dist/authorization/model/rewrite.js +3 -0
- package/dist/authorization/model/rewrite.js.map +1 -1
- package/dist/authorization/model/skill.d.ts.map +1 -1
- package/dist/authorization/model/skill.js +2 -2
- package/dist/authorization/model/skill.js.map +1 -1
- package/dist/authorization/model/workflow.d.ts.map +1 -1
- package/dist/authorization/model/workflow.js +2 -2
- package/dist/authorization/model/workflow.js.map +1 -1
- package/dist/authorization/model/workflow_instance.d.ts.map +1 -1
- package/dist/authorization/model/workflow_instance.js +2 -2
- package/dist/authorization/model/workflow_instance.js.map +1 -1
- package/dist/authorization/organization-directory.d.ts.map +1 -1
- package/dist/authorization/organization-directory.js +3 -2
- package/dist/authorization/organization-directory.js.map +1 -1
- package/dist/authorization/store-test-kit.d.ts +6 -0
- package/dist/authorization/store-test-kit.d.ts.map +1 -1
- package/dist/authorization/store-test-kit.js +62 -16
- package/dist/authorization/store-test-kit.js.map +1 -1
- package/dist/authorization/tuples.d.ts +32 -13
- package/dist/authorization/tuples.d.ts.map +1 -1
- package/dist/authorization/tuples.js +11 -3
- package/dist/authorization/tuples.js.map +1 -1
- package/dist/domain/agent/controller.d.ts.map +1 -1
- package/dist/domain/agent/controller.js +4 -4
- package/dist/domain/agent/controller.js.map +1 -1
- package/dist/domain/agentchannel/controller.d.ts.map +1 -1
- package/dist/domain/agentchannel/controller.js +1 -3
- package/dist/domain/agentchannel/controller.js.map +1 -1
- package/dist/domain/agentexecution/controller.d.ts.map +1 -1
- package/dist/domain/agentexecution/controller.js +1 -3
- package/dist/domain/agentexecution/controller.js.map +1 -1
- package/dist/domain/agentinstance/controller.d.ts.map +1 -1
- package/dist/domain/agentinstance/controller.js +4 -3
- package/dist/domain/agentinstance/controller.js.map +1 -1
- package/dist/domain/agentshare/constants.d.ts +11 -6
- package/dist/domain/agentshare/constants.d.ts.map +1 -1
- package/dist/domain/agentshare/constants.js +16 -8
- package/dist/domain/agentshare/constants.js.map +1 -1
- package/dist/domain/agentshare/controller.d.ts.map +1 -1
- package/dist/domain/agentshare/controller.js +1 -3
- package/dist/domain/agentshare/controller.js.map +1 -1
- package/dist/domain/agentshare/steps.d.ts +25 -18
- package/dist/domain/agentshare/steps.d.ts.map +1 -1
- package/dist/domain/agentshare/steps.js +142 -41
- package/dist/domain/agentshare/steps.js.map +1 -1
- package/dist/domain/environment/controller.d.ts.map +1 -1
- package/dist/domain/environment/controller.js +3 -2
- package/dist/domain/environment/controller.js.map +1 -1
- package/dist/domain/executioncontext/controller.d.ts.map +1 -1
- package/dist/domain/executioncontext/controller.js +1 -2
- package/dist/domain/executioncontext/controller.js.map +1 -1
- package/dist/domain/mcpserver/controller.d.ts.map +1 -1
- package/dist/domain/mcpserver/controller.js +4 -3
- package/dist/domain/mcpserver/controller.js.map +1 -1
- package/dist/domain/plugin/controller.d.ts.map +1 -1
- package/dist/domain/plugin/controller.js +3 -1
- package/dist/domain/plugin/controller.js.map +1 -1
- package/dist/domain/plugin/push.d.ts +5 -7
- package/dist/domain/plugin/push.d.ts.map +1 -1
- package/dist/domain/plugin/push.js +14 -8
- package/dist/domain/plugin/push.js.map +1 -1
- package/dist/domain/schedule/controller.d.ts.map +1 -1
- package/dist/domain/schedule/controller.js +1 -3
- package/dist/domain/schedule/controller.js.map +1 -1
- package/dist/domain/session/controller.d.ts.map +1 -1
- package/dist/domain/session/controller.js +2 -3
- package/dist/domain/session/controller.js.map +1 -1
- package/dist/domain/skill/controller.d.ts.map +1 -1
- package/dist/domain/skill/controller.js +2 -0
- package/dist/domain/skill/controller.js.map +1 -1
- package/dist/domain/workflow/controller.d.ts.map +1 -1
- package/dist/domain/workflow/controller.js +6 -14
- package/dist/domain/workflow/controller.js.map +1 -1
- package/dist/domain/workflow/registry/data/task-kind-registry.json +1 -1
- package/dist/domain/workflow/validation/task-config-constraints.d.ts +1 -10
- package/dist/domain/workflow/validation/task-config-constraints.d.ts.map +1 -1
- package/dist/domain/workflow/validation/task-config-constraints.js +2 -3
- package/dist/domain/workflow/validation/task-config-constraints.js.map +1 -1
- package/dist/domain/workflowexecution/controller.d.ts.map +1 -1
- package/dist/domain/workflowexecution/controller.js +2 -4
- package/dist/domain/workflowexecution/controller.js.map +1 -1
- package/dist/domain/workflowinstance/controller.d.ts.map +1 -1
- package/dist/domain/workflowinstance/controller.js +4 -3
- package/dist/domain/workflowinstance/controller.js.map +1 -1
- package/dist/extensions/authorization-queries.d.ts +5 -6
- package/dist/extensions/authorization-queries.d.ts.map +1 -1
- package/dist/extensions/list-read-scope.d.ts +1 -1
- package/dist/extensions/resource-authorization.d.ts +2 -3
- package/dist/extensions/resource-authorization.d.ts.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/pipeline/apiresource-meta.d.ts +3 -12
- package/dist/pipeline/apiresource-meta.d.ts.map +1 -1
- package/dist/pipeline/apiresource-meta.js +10 -21
- package/dist/pipeline/apiresource-meta.js.map +1 -1
- package/dist/pipeline/steps/authorization-tuples.d.ts +3 -9
- package/dist/pipeline/steps/authorization-tuples.d.ts.map +1 -1
- package/dist/pipeline/steps/authorization-tuples.js +11 -9
- package/dist/pipeline/steps/authorization-tuples.js.map +1 -1
- package/dist/pipeline/steps/references.d.ts +20 -178
- package/dist/pipeline/steps/references.d.ts.map +1 -1
- package/dist/pipeline/steps/references.js +43 -344
- package/dist/pipeline/steps/references.js.map +1 -1
- package/dist/pipeline/steps/visibility-gates.d.ts +27 -0
- package/dist/pipeline/steps/visibility-gates.d.ts.map +1 -0
- package/dist/pipeline/steps/visibility-gates.js +139 -0
- package/dist/pipeline/steps/visibility-gates.js.map +1 -0
- package/dist/query/search/controller.js +1 -0
- package/dist/query/search/controller.js.map +1 -1
- package/dist/query/search/criteria.d.ts +5 -1
- package/dist/query/search/criteria.d.ts.map +1 -1
- package/dist/query/search/criteria.js +13 -3
- package/dist/query/search/criteria.js.map +1 -1
- package/dist/query/search/handler.d.ts +4 -5
- package/dist/query/search/handler.d.ts.map +1 -1
- package/dist/query/search/handler.js +6 -7
- package/dist/query/search/handler.js.map +1 -1
- package/dist/query/search/query-store.d.ts.map +1 -1
- package/dist/query/search/query-store.js +2 -0
- package/dist/query/search/query-store.js.map +1 -1
- package/dist/store/interface.d.ts +6 -3
- package/dist/store/interface.d.ts.map +1 -1
- package/dist/store/interface.js.map +1 -1
- package/dist/store/postgres/migrations.d.ts +1 -3
- package/dist/store/postgres/migrations.d.ts.map +1 -1
- package/dist/store/postgres/migrations.js +1 -35
- package/dist/store/postgres/migrations.js.map +1 -1
- package/dist/store/postgres/store.d.ts.map +1 -1
- package/dist/store/postgres/store.js +9 -4
- package/dist/store/postgres/store.js.map +1 -1
- package/dist/store/sqlite/migrations.d.ts +1 -3
- package/dist/store/sqlite/migrations.d.ts.map +1 -1
- package/dist/store/sqlite/migrations.js +1 -36
- package/dist/store/sqlite/migrations.js.map +1 -1
- package/dist/store/sqlite/store.d.ts.map +1 -1
- package/dist/store/sqlite/store.js +8 -4
- package/dist/store/sqlite/store.js.map +1 -1
- package/package.json +6 -6
- package/src/authorization/README.md +26 -24
- package/src/authorization/__tests__/authorizer.test.ts +9 -10
- package/src/authorization/__tests__/derived-tuples.test.ts +11 -4
- package/src/authorization/__tests__/evaluator.test.ts +73 -14
- package/src/authorization/__tests__/facts.test.ts +2 -2
- package/src/authorization/__tests__/fixtures/fga/agent-instance-creation.fga.yaml +185 -0
- package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +98 -6
- package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +98 -0
- package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +61 -4
- package/src/authorization/__tests__/fixtures/fga/mcp-server-authoring.fga.yaml +143 -0
- package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +21 -1
- package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +25 -1
- package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +52 -0
- package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +3 -1
- package/src/authorization/__tests__/list-read-scope.test.ts +17 -18
- package/src/authorization/__tests__/store-tests.test.ts +8 -1
- package/src/authorization/__tests__/tuples.test.ts +11 -12
- package/src/authorization/authorizer.ts +9 -4
- package/src/authorization/derived-tuples.ts +31 -14
- package/src/authorization/evaluator.ts +44 -8
- package/src/authorization/list-read-scope.ts +11 -5
- package/src/authorization/model/agent.ts +5 -2
- package/src/authorization/model/agent_instance.ts +2 -0
- package/src/authorization/model/mcp_server.ts +2 -0
- package/src/authorization/model/plugin.ts +4 -1
- package/src/authorization/model/rewrite.ts +13 -8
- package/src/authorization/model/skill.ts +2 -0
- package/src/authorization/model/workflow.ts +2 -0
- package/src/authorization/model/workflow_instance.ts +2 -0
- package/src/authorization/organization-directory.ts +3 -1
- package/src/authorization/store-test-kit.ts +75 -16
- package/src/authorization/tuples.ts +39 -16
- package/src/domain/agent/__tests__/agent.test.ts +4 -11
- package/src/domain/agent/controller.ts +7 -7
- package/src/domain/agentchannel/__tests__/agentchannel.test.ts +48 -223
- package/src/domain/agentchannel/controller.ts +1 -6
- package/src/domain/agentexecution/controller.ts +1 -6
- package/src/domain/agentinstance/controller.ts +12 -6
- package/src/domain/agentshare/__tests__/agentshare.test.ts +172 -196
- package/src/domain/agentshare/__tests__/create-authorization.test.ts +31 -16
- package/src/domain/agentshare/constants.ts +26 -14
- package/src/domain/agentshare/controller.ts +1 -6
- package/src/domain/agentshare/steps.ts +194 -41
- package/src/domain/environment/controller.ts +8 -5
- package/src/domain/executioncontext/controller.ts +1 -5
- package/src/domain/mcpserver/__tests__/mcpserver.test.ts +28 -115
- package/src/domain/mcpserver/__tests__/oauth-handshake.test.ts +18 -53
- package/src/domain/mcpserver/controller.ts +12 -6
- package/src/domain/plugin/controller.ts +8 -1
- package/src/domain/plugin/push.ts +16 -8
- package/src/domain/schedule/controller.ts +1 -6
- package/src/domain/session/controller.ts +4 -12
- package/src/domain/skill/controller.ts +7 -0
- package/src/domain/workflow/controller.ts +10 -28
- package/src/domain/workflow/registry/data/task-kind-registry.json +1 -1
- package/src/domain/workflow/validation/task-config-constraints.ts +3 -7
- package/src/domain/workflowexecution/controller.ts +2 -7
- package/src/domain/workflowinstance/controller.ts +12 -6
- package/src/extensions/__tests__/built-in-authorization-composed.test.ts +19 -32
- package/src/extensions/__tests__/extension-composition.test.ts +4 -4
- package/src/extensions/__tests__/list-read-scope-composed.test.ts +6 -9
- package/src/extensions/authorization-queries.ts +5 -6
- package/src/extensions/list-read-scope.ts +1 -1
- package/src/extensions/resource-authorization.ts +5 -3
- package/src/index.ts +14 -0
- package/src/pipeline/apiresource-meta.ts +10 -21
- package/src/pipeline/steps/__tests__/authorization-tuples.test.ts +31 -18
- package/src/pipeline/steps/__tests__/visibility-gates.test.ts +187 -0
- package/src/pipeline/steps/authorization-tuples.ts +11 -9
- package/src/pipeline/steps/references.ts +70 -578
- package/src/pipeline/steps/visibility-gates.ts +174 -0
- package/src/query/search/__tests__/criteria.test.ts +4 -0
- package/src/query/search/__tests__/query-store.test.ts +40 -11
- package/src/query/search/controller.ts +1 -0
- package/src/query/search/criteria.ts +14 -0
- package/src/query/search/handler.ts +7 -6
- package/src/query/search/query-store.ts +2 -0
- package/src/store/__tests__/store-contract.ts +51 -6
- package/src/store/interface.ts +6 -3
- package/src/store/postgres/__tests__/migrations.test.ts +6 -187
- package/src/store/postgres/__tests__/store-contract.test.ts +2 -0
- package/src/store/postgres/migrations.ts +1 -48
- package/src/store/postgres/store.ts +11 -4
- package/src/store/sqlite/__tests__/migrations.test.ts +5 -191
- package/src/store/sqlite/migrations.ts +1 -45
- package/src/store/sqlite/store.ts +10 -4
- package/dist/domain/workflow/agent-call-references.d.ts +0 -54
- package/dist/domain/workflow/agent-call-references.d.ts.map +0 -1
- package/dist/domain/workflow/agent-call-references.js +0 -97
- package/dist/domain/workflow/agent-call-references.js.map +0 -1
- package/dist/store/public-visibility-retired.d.ts +0 -67
- package/dist/store/public-visibility-retired.d.ts.map +0 -1
- package/dist/store/public-visibility-retired.js +0 -55
- package/dist/store/public-visibility-retired.js.map +0 -1
- package/src/domain/workflow/__tests__/agent-call-references.test.ts +0 -222
- package/src/domain/workflow/agent-call-references.ts +0 -157
- package/src/pipeline/__tests__/supports-visibility.test.ts +0 -112
- package/src/pipeline/steps/__tests__/references.test.ts +0 -703
- package/src/store/__tests__/public-visibility-retired.test.ts +0 -127
- package/src/store/public-visibility-retired.ts +0 -119
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pins the PUBLIC-visibility operator gates (C2 Stage 3, the Java
|
|
3
|
+
* PublicVisibilityEscalationPolicy port): the create door fires only on a
|
|
4
|
+
* new state declaring PUBLIC, the update door only on an ESCALATION to
|
|
5
|
+
* public (re-asserting stored public passes), both answer the Java deny
|
|
6
|
+
* copy on denial and pass under the permissive default (OSS
|
|
7
|
+
* byte-identity), internal callers skip, and a missing loaded target is
|
|
8
|
+
* a loud wiring fault.
|
|
9
|
+
*/
|
|
10
|
+
import { describe, expect, it } from "vitest";
|
|
11
|
+
import { Code, ConnectError } from "@connectrpc/connect";
|
|
12
|
+
import { create } from "@bufbuild/protobuf";
|
|
13
|
+
|
|
14
|
+
import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
15
|
+
import { AgentCommandController } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/command_pb";
|
|
16
|
+
import { UpdateVisibilityInputSchema } from "@stigmer/protos/ai/stigmer/commons/apiresource/io_pb";
|
|
17
|
+
import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
|
|
18
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
19
|
+
import { IamPermission } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
|
|
20
|
+
|
|
21
|
+
import type { Authorizer, AuthzCheck } from "../../../extensions/authorizer.js";
|
|
22
|
+
import type { CallerIdentity } from "../../../extensions/identity.js";
|
|
23
|
+
import { RequestContext } from "../../request-context.js";
|
|
24
|
+
import { newPermissiveSingleTeamAuthorizer } from "../authorize.js";
|
|
25
|
+
import {
|
|
26
|
+
newAuthorizeVisibilityTransitionStep,
|
|
27
|
+
newGuardPublicVisibilityStep,
|
|
28
|
+
PUBLIC_VISIBILITY_DENY_MESSAGE,
|
|
29
|
+
} from "../visibility-gates.js";
|
|
30
|
+
|
|
31
|
+
const USER: CallerIdentity = {
|
|
32
|
+
identityId: "ida_alice",
|
|
33
|
+
callerClass: "user",
|
|
34
|
+
issuer: "stigmer",
|
|
35
|
+
rawToken: "tok",
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const TARGET_KEY = "updateVisibilityAgent";
|
|
39
|
+
|
|
40
|
+
function denying(observed?: AuthzCheck[]): Authorizer {
|
|
41
|
+
return {
|
|
42
|
+
authorize: (_caller, check) => {
|
|
43
|
+
observed?.push(check);
|
|
44
|
+
return Promise.resolve({ kind: "deny", reason: "" });
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function createCtx(
|
|
50
|
+
visibility: ApiResourceVisibility,
|
|
51
|
+
): RequestContext<typeof AgentSchema> {
|
|
52
|
+
return new RequestContext(
|
|
53
|
+
AgentSchema,
|
|
54
|
+
create(AgentSchema, { metadata: { name: "a", visibility } }),
|
|
55
|
+
USER,
|
|
56
|
+
ApiResourceKind.agent,
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
type UvDesc = typeof AgentCommandController.method.updateVisibility.input;
|
|
61
|
+
|
|
62
|
+
function updateCtx(
|
|
63
|
+
requested: ApiResourceVisibility,
|
|
64
|
+
stored: ApiResourceVisibility | undefined,
|
|
65
|
+
): RequestContext<UvDesc> {
|
|
66
|
+
const ctx = new RequestContext(
|
|
67
|
+
AgentCommandController.method.updateVisibility.input,
|
|
68
|
+
create(UpdateVisibilityInputSchema, {
|
|
69
|
+
resourceId: "agt_1",
|
|
70
|
+
visibility: requested,
|
|
71
|
+
}),
|
|
72
|
+
USER,
|
|
73
|
+
ApiResourceKind.agent,
|
|
74
|
+
);
|
|
75
|
+
if (stored !== undefined) {
|
|
76
|
+
ctx.set(
|
|
77
|
+
TARGET_KEY,
|
|
78
|
+
create(AgentSchema, { metadata: { visibility: stored } }),
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
return ctx;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
describe("GuardPublicVisibility (the create door)", () => {
|
|
85
|
+
it("denies a PUBLIC create for non-operators with the Java copy", async () => {
|
|
86
|
+
const step = newGuardPublicVisibilityStep<typeof AgentSchema>(denying());
|
|
87
|
+
const error = await step
|
|
88
|
+
.execute(createCtx(ApiResourceVisibility.visibility_public))
|
|
89
|
+
?.catch((e: unknown) => e);
|
|
90
|
+
expect((error as ConnectError).code).toBe(Code.PermissionDenied);
|
|
91
|
+
expect((error as ConnectError).rawMessage).toBe(
|
|
92
|
+
PUBLIC_VISIBILITY_DENY_MESSAGE,
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it("non-public creates never reach the Authorizer (the lazy contract)", async () => {
|
|
97
|
+
const observed: AuthzCheck[] = [];
|
|
98
|
+
const step = newGuardPublicVisibilityStep<typeof AgentSchema>(
|
|
99
|
+
denying(observed),
|
|
100
|
+
);
|
|
101
|
+
await step.execute(createCtx(ApiResourceVisibility.visibility_org));
|
|
102
|
+
expect(observed).toEqual([]);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it("the permissive default allows public creates (OSS byte-identity)", async () => {
|
|
106
|
+
const step = newGuardPublicVisibilityStep<typeof AgentSchema>(
|
|
107
|
+
newPermissiveSingleTeamAuthorizer(),
|
|
108
|
+
);
|
|
109
|
+
await expect(
|
|
110
|
+
Promise.resolve(
|
|
111
|
+
step.execute(createCtx(ApiResourceVisibility.visibility_public)),
|
|
112
|
+
),
|
|
113
|
+
).resolves.toBeUndefined();
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
describe("AuthorizeVisibilityTransition (the update door)", () => {
|
|
118
|
+
it("denies escalation to public with the operator check", async () => {
|
|
119
|
+
const observed: AuthzCheck[] = [];
|
|
120
|
+
const step = newAuthorizeVisibilityTransitionStep<UvDesc>(
|
|
121
|
+
TARGET_KEY,
|
|
122
|
+
denying(observed),
|
|
123
|
+
);
|
|
124
|
+
const error = await step
|
|
125
|
+
.execute(
|
|
126
|
+
updateCtx(
|
|
127
|
+
ApiResourceVisibility.visibility_public,
|
|
128
|
+
ApiResourceVisibility.visibility_org,
|
|
129
|
+
),
|
|
130
|
+
)
|
|
131
|
+
?.catch((e: unknown) => e);
|
|
132
|
+
expect((error as ConnectError).code).toBe(Code.PermissionDenied);
|
|
133
|
+
expect((error as ConnectError).rawMessage).toBe(
|
|
134
|
+
PUBLIC_VISIBILITY_DENY_MESSAGE,
|
|
135
|
+
);
|
|
136
|
+
expect(observed).toEqual([
|
|
137
|
+
{
|
|
138
|
+
permission: IamPermission.can_set_public_visibility,
|
|
139
|
+
resourceKind: ApiResourceKind.platform,
|
|
140
|
+
resourceId: "stigmer",
|
|
141
|
+
},
|
|
142
|
+
]);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it("re-asserting a stored PUBLIC is not an escalation", async () => {
|
|
146
|
+
const step = newAuthorizeVisibilityTransitionStep<UvDesc>(
|
|
147
|
+
TARGET_KEY,
|
|
148
|
+
denying(),
|
|
149
|
+
);
|
|
150
|
+
await expect(
|
|
151
|
+
Promise.resolve(
|
|
152
|
+
step.execute(
|
|
153
|
+
updateCtx(
|
|
154
|
+
ApiResourceVisibility.visibility_public,
|
|
155
|
+
ApiResourceVisibility.visibility_public,
|
|
156
|
+
),
|
|
157
|
+
),
|
|
158
|
+
),
|
|
159
|
+
).resolves.toBeUndefined();
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it("non-public targets never reach the Authorizer", async () => {
|
|
163
|
+
const observed: AuthzCheck[] = [];
|
|
164
|
+
const step = newAuthorizeVisibilityTransitionStep<UvDesc>(
|
|
165
|
+
TARGET_KEY,
|
|
166
|
+
denying(observed),
|
|
167
|
+
);
|
|
168
|
+
await step.execute(
|
|
169
|
+
updateCtx(
|
|
170
|
+
ApiResourceVisibility.visibility_org,
|
|
171
|
+
ApiResourceVisibility.visibility_public,
|
|
172
|
+
),
|
|
173
|
+
);
|
|
174
|
+
expect(observed).toEqual([]);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it("a missing loaded target is a loud wiring fault, never a silent pass", async () => {
|
|
178
|
+
const step = newAuthorizeVisibilityTransitionStep<UvDesc>(
|
|
179
|
+
TARGET_KEY,
|
|
180
|
+
denying(),
|
|
181
|
+
);
|
|
182
|
+
const error = await step
|
|
183
|
+
.execute(updateCtx(ApiResourceVisibility.visibility_public, undefined))
|
|
184
|
+
?.catch((e: unknown) => e);
|
|
185
|
+
expect((error as ConnectError).code).toBe(Code.Internal);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
@@ -94,15 +94,9 @@ import { metadataOf, parentIdOf } from "./shapes.js";
|
|
|
94
94
|
* validation).
|
|
95
95
|
*
|
|
96
96
|
* The org floor: kinds flagged defaults_to_org_visibility (blueprints —
|
|
97
|
-
* shared org assets) keep the org-viewer shape at
|
|
98
|
-
* sharing a blueprint beyond the org never hides it from its
|
|
99
|
-
* catalog.
|
|
100
|
-
*
|
|
101
|
-
* The retired public level has no shape here. No stored row holds it once
|
|
102
|
-
* the store migration has run, so no transition FROM it reaches this
|
|
103
|
-
* policy; a deployment that still holds public rows must move them through
|
|
104
|
-
* updateVisibility on the release that knew the level, whose reconciler
|
|
105
|
-
* deletes the wildcard grant, before it runs this one.
|
|
97
|
+
* shared org assets) keep the org-viewer shape at public and platform
|
|
98
|
+
* levels, so sharing a blueprint beyond the org never hides it from its
|
|
99
|
+
* own org's catalog (ListObjects suppresses the public wildcard).
|
|
106
100
|
*/
|
|
107
101
|
export function visibilityShapesFor(
|
|
108
102
|
kind: ApiResourceKind,
|
|
@@ -118,6 +112,14 @@ export function visibilityShapesFor(
|
|
|
118
112
|
shapes.add("org-viewer");
|
|
119
113
|
}
|
|
120
114
|
break;
|
|
115
|
+
case ApiResourceVisibility.visibility_public:
|
|
116
|
+
if (config?.supportsPublic === true) {
|
|
117
|
+
shapes.add("public-viewer");
|
|
118
|
+
if (orgFloor) {
|
|
119
|
+
shapes.add("org-viewer");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
break;
|
|
121
123
|
case ApiResourceVisibility.visibility_platform:
|
|
122
124
|
if (config?.supportsPlatform === true) {
|
|
123
125
|
shapes.add("platform-viewer");
|