Skip to content

Commit 6552fd5

Browse files
authored
[spicedb] Grant all org members project "editor" role (#18733)
1 parent 3cf0cf2 commit 6552fd5

File tree

4 files changed

+35
-52
lines changed

4 files changed

+35
-52
lines changed

components/server/src/authorization/definitions.ts

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,10 @@ export type OrganizationPermission =
7777

7878
export type ProjectResourceType = "project";
7979

80-
export type ProjectRelation = "org" | "editor" | "viewer";
80+
export type ProjectRelation = "org" | "viewer";
8181

8282
export type ProjectPermission =
83+
| "editor"
8384
| "read_info"
8485
| "write_info"
8586
| "delete"
@@ -341,26 +342,6 @@ export const rel = {
341342
};
342343
},
343344

344-
get editor() {
345-
const result2 = {
346-
...result,
347-
relation: "editor",
348-
};
349-
return {
350-
user(objectId: string) {
351-
return {
352-
...result2,
353-
subject: {
354-
object: {
355-
objectType: "user",
356-
objectId: objectId,
357-
},
358-
},
359-
} as v1.Relationship;
360-
},
361-
};
362-
},
363-
364345
get viewer() {
365346
const result2 = {
366347
...result,

components/server/src/projects/projects-service.spec.db.ts

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -90,45 +90,47 @@ describe("ProjectsService", async () => {
9090

9191
it("should deleteProject", async () => {
9292
const ps = container.get(ProjectsService);
93-
const project = await createTestProject(ps, org, owner);
93+
const project1 = await createTestProject(ps, org, owner);
94+
95+
await ps.deleteProject(member.id, project1.id);
96+
let projects = await ps.getProjects(member.id, org.id);
97+
expect(projects.length).to.equal(0);
9498

95-
await expectError(ErrorCodes.PERMISSION_DENIED, () => ps.deleteProject(member.id, project.id));
96-
await expectError(ErrorCodes.NOT_FOUND, () => ps.deleteProject(stranger.id, project.id));
99+
const project2 = await createTestProject(ps, org, owner);
100+
await expectError(ErrorCodes.NOT_FOUND, () => ps.deleteProject(stranger.id, project2.id));
97101

98-
await ps.deleteProject(owner.id, project.id);
99-
const projects = await ps.getProjects(owner.id, org.id);
102+
await ps.deleteProject(owner.id, project2.id);
103+
projects = await ps.getProjects(owner.id, org.id);
100104
expect(projects.length).to.equal(0);
101105
});
102106

103107
it("should updateProject", async () => {
104108
const ps = container.get(ProjectsService);
105109
const project = await createTestProject(ps, org, owner);
110+
106111
await ps.updateProject(owner, {
107112
id: project.id,
108113
settings: {
109-
useIncrementalPrebuilds: !project.settings?.useIncrementalPrebuilds,
114+
prebuildEveryNthCommit: 1,
110115
},
111116
});
117+
const updatedProject1 = await ps.getProject(owner.id, project.id);
118+
expect(updatedProject1?.settings?.prebuildEveryNthCommit).to.equal(1);
112119

113-
const updatedProject = await ps.getProject(owner.id, project.id);
114-
115-
expect(updatedProject?.settings?.useIncrementalPrebuilds).to.not.equal(
116-
project.settings?.useIncrementalPrebuilds,
117-
);
120+
await ps.updateProject(member, {
121+
id: project.id,
122+
settings: {
123+
prebuildEveryNthCommit: 2,
124+
},
125+
});
126+
const updatedProject2 = await ps.getProject(member.id, project.id);
127+
expect(updatedProject2?.settings?.prebuildEveryNthCommit).to.equal(2);
118128

119-
await expectError(ErrorCodes.PERMISSION_DENIED, () =>
120-
ps.updateProject(member, {
121-
id: project.id,
122-
settings: {
123-
useIncrementalPrebuilds: !project.settings?.useIncrementalPrebuilds,
124-
},
125-
}),
126-
);
127129
await expectError(ErrorCodes.NOT_FOUND, () =>
128130
ps.updateProject(stranger, {
129131
id: project.id,
130132
settings: {
131-
useIncrementalPrebuilds: !project.settings?.useIncrementalPrebuilds,
133+
prebuildEveryNthCommit: 3,
132134
},
133135
}),
134136
);

components/server/src/user/env-var-service.spec.db.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ describe("EnvVarService", async () => {
223223
expect(emptyEnvVars.length).to.equal(0);
224224
});
225225

226-
it("should not let members create, delete but allow get project env vars", async () => {
226+
it("let members create, delete and get project env vars", async () => {
227227
await es.addProjectEnvVar(owner.id, project.id, { name: "FOO", value: "BAR", censored: false });
228228

229229
const envVars = await es.listProjectEnvVars(member.id, project.id);
@@ -232,12 +232,9 @@ describe("EnvVarService", async () => {
232232
const envVarById = await es.getProjectEnvVarById(member.id, envVars[0].id);
233233
expect(envVarById?.name).to.equal("FOO");
234234

235-
await expectError(ErrorCodes.PERMISSION_DENIED, es.deleteProjectEnvVar(member.id, envVars[0].id));
235+
await es.deleteProjectEnvVar(member.id, envVars[0].id);
236236

237-
await expectError(
238-
ErrorCodes.PERMISSION_DENIED,
239-
es.addProjectEnvVar(member.id, project.id, { name: "FOO", value: "BAR", censored: false }),
240-
);
237+
await es.addProjectEnvVar(owner.id, project.id, { name: "FOO", value: "BAR", censored: false });
241238
});
242239

243240
it("should not let strangers create, delete and get project env vars", async () => {

components/spicedb/schema/schema.yaml

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,15 @@ schema: |-
9191
definition project {
9292
relation org: organization
9393
94-
relation editor: user
95-
9694
// A subject is a viewer, if:
9795
// * the users with access are directly assigned as a viewer
9896
// * the project has granted access to all members in an organization
9997
// * the project has granted access to _any_ user on this installation
10098
relation viewer: user | organization#member | user:*
99+
100+
// All org members are editors for now, to model the existing behavior.
101+
permission editor = org->member
102+
101103
permission read_info = viewer + editor + org->owner + org->installation_admin
102104
permission write_info = editor + org->owner + org->installation_admin
103105
permission delete = editor + org->owner + org->installation_admin
@@ -209,10 +211,14 @@ assertions:
209211
- organization:org_1#delete@user:user_0
210212
# Org owner can delete projects
211213
- project:project_1#delete@user:user_0
214+
# org members can delete project
215+
- project:project_1#delete@user:user_1
212216
# Org member can view projects
213217
- project:project_1#read_info@user:user_1
214218
# Org member can create projects
215219
- organization:org_1#create_project@user:user_1
220+
# user 10 can access project_2
221+
- project:project_2#write_info@user:user_10
216222
# installation user can create orgs
217223
- installation:installation_0#create_organization@user:user_0
218224
# Installation admin can do what org owners can
@@ -230,7 +236,6 @@ assertions:
230236
assertFalse:
231237
# user 10 cannot access project_1
232238
- project:project_1#read_info@user:user_10
233-
- project:project_2#write_info@user:user_10
234239
# non-member/owner cannot access organization
235240
- organization:org_1#read_info@user:user_3
236241
- organization:org_1#write_info@user:user_3
@@ -244,7 +249,5 @@ assertions:
244249
- organization:org_1#write_git_provider@user:user_1
245250
# org member can not delete org
246251
- organization:org_1#delete@user:user_1
247-
# org members can not delete project
248-
- project:project_1#delete@user:user_1
249252
# stranger can't access other's non-shared workspace
250253
- workspace:workspace_1#access@user:user_2

0 commit comments

Comments
 (0)