Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/spicedb/schema/schema.yaml
2498 views
1
# Copyright (c) 2023 Gitpod GmbH. All rights reserved.
2
# Licensed under the GNU Affero General Public License (AGPL).
3
# See License.AGPL.txt in the project root for license information.
4
5
schema: |-
6
definition user {
7
relation self: user
8
9
// Only ONE of the following relations is ever present for a given user (XOR)
10
relation organization: organization
11
relation installation: installation
12
13
// permissions
14
permission read_info = self + organization->member + organization->owner + installation->admin
15
permission write_info = self
16
permission delete = self + organization->owner + installation->admin
17
18
permission make_admin = installation->admin + organization->installation_admin
19
20
// administrate is for changes such as blocking or verifiying, i.e. things that only admins can do on user
21
permission admin_control = installation->admin + organization->installation_admin
22
23
permission read_ssh = self
24
permission write_ssh = self
25
26
permission read_tokens = self
27
permission write_tokens = self
28
29
permission read_env_var = self
30
permission write_env_var = self
31
32
// only used in specified cell, check EXP-1084
33
permission write_temporary_token = organization->installation_admin
34
35
permission code_sync = self
36
}
37
38
// There's only one global installation
39
definition installation {
40
41
// only users that are not owned by an org are considered installation-level users
42
relation member: user
43
relation admin: user
44
45
// orgs can only be created by installation-level users
46
permission create_organization = member + admin
47
48
// any global runtime configurations, such as the list of blocked repositories
49
permission configure = admin
50
}
51
52
definition organization {
53
relation installation: installation
54
55
// Every user in an organization is automatically a member
56
relation member: user
57
// Some users in an organization may additionally have the `owner` role
58
relation owner: user
59
// users who can snapshot workspaces
60
relation snapshoter: organization#member
61
// Some users in an organization may additionally have the `collaborator` role
62
// collaborator can't access members, projects and usage
63
relation collaborator: user
64
65
66
// synthetic permission for installation->admin (because https://github.com/authzed/spicedb/issues/15)
67
permission installation_admin = installation->admin
68
permission installation_member = installation->member
69
70
// General operations on organization
71
permission read_info = member + owner + collaborator + installation->admin
72
permission write_info = owner + installation->admin
73
permission delete = owner + installation->admin
74
75
permission read_settings = member + owner + collaborator + installation->admin
76
permission write_settings = owner + installation->admin
77
78
permission read_env_var = member + owner + collaborator + installation->admin
79
permission write_env_var = owner + installation->admin
80
81
permission read_audit_logs = owner + installation->admin
82
83
// Maintenance mode permission
84
permission maintenance = owner + installation->admin
85
86
// Operations on Organization's Members
87
permission read_members = member + owner + installation->admin
88
permission invite_members = member + owner + installation->admin
89
permission write_members = owner + installation->admin
90
permission leave = owner + member + collaborator + installation->admin
91
92
// Permissions on (sub-)resources
93
permission create_project = member + owner + installation->admin
94
95
permission read_git_provider = owner + member + collaborator + installation->admin
96
permission write_git_provider = owner + installation->admin
97
98
permission read_billing = member + owner + installation->admin
99
permission write_billing = owner + installation->admin
100
101
// Note that there are two different read_prebuild permissions: this one, guarding primarily the listPrebuilds method in the API and then the other under projects, which is the actual permission used for checking if a user can use a prebuild for a repository.
102
// Today, the difference is that collaborators can't read prebuilds on an org but can on a repository (project).
103
permission read_prebuild = member + owner + installation->admin
104
105
permission create_workspace = member + collaborator
106
107
permission read_sessions = owner + installation->admin
108
109
// can add credit notes and change the spending limits even for free users
110
permission write_billing_admin = installation->admin
111
}
112
113
definition project {
114
relation org: organization
115
116
// A subject is a viewer, if:
117
// * the users with access are directly assigned as a viewer
118
// * the project has granted access to all members in an organization
119
// * the project has granted access to _any_ user on this installation
120
relation viewer: user | organization#member | user:*
121
122
// All org members are editors for now, to model the existing behavior.
123
permission editor = org->member
124
125
permission read_info = viewer + editor + org->owner + org->installation_admin
126
permission write_info = editor + org->owner + org->installation_admin
127
permission delete = editor + org->owner + org->installation_admin
128
129
permission read_env_var = viewer + editor + org->collaborator + org->owner + org->installation_admin
130
permission write_env_var = editor + org->owner + org->installation_admin
131
132
permission read_prebuild = viewer + editor + org->collaborator + org->owner + org->installation_admin
133
permission write_prebuild = editor + org->owner
134
}
135
136
definition workspace {
137
relation org: organization
138
// The user that created the workspace
139
relation owner: user
140
// Whether this workspace is shared (globally)
141
relation shared: user:*
142
143
// Whether a user can access a workspace (with an IDE)
144
permission access = owner + shared + org->installation_admin
145
146
// Note: All of this is modelled after current behavior.
147
// There are a lot of improvements we can make here in the light of Organizations, but we explicitly do that as a separate step
148
permission start = owner
149
permission stop = owner + org->installation_admin + org->owner
150
permission delete = owner
151
152
// Whether a user can read basic info/metadata of a workspace
153
permission read_info = owner + shared + org->member
154
155
permission create_snapshot = owner & org->snapshoter
156
157
// Whether someone is allowed to do administrative tasks on a workspace, e.g. un-delete etc.
158
permission admin_control = org->installation_admin
159
}
160
# relationships to be used for assertions & validation
161
relationships: |-
162
// we have one installation
163
installation:installation_0#member@user:user_0
164
user:user_0#installation@installation:installation_0
165
166
installation:installation_0#admin@user:user_admin
167
168
// We have an organization org_1, which has some members & owners
169
organization:org_1#installation@installation:installation_0
170
organization:org_1#member@user:user_0
171
organization:org_1#owner@user:user_0
172
organization:org_1#member@user:user_1
173
organization:org_1#member@user:user_2
174
user:user_0#organization@organization:org_1
175
user:user_1#organization@organization:org_1
176
user:user_2#organization@organization:org_1
177
178
// org_1 has a project
179
project:project_1#org@organization:org_1
180
// project_1 can be accessed by anyone in the organization - it's visibility is public
181
project:project_1#viewer@organization:org_1#member
182
183
// We have another organization org_2, which has some users, some of which are also members of org_1
184
organization:org_2#member@user:user_0
185
organization:org_2#owner@user:user_0
186
organization:org_2#member@user:user_1
187
organization:org_2#member@user:user_10
188
// user_2 is a collaborator of org_2
189
organization:org_2#collaborator@user:user_2
190
user:user_10#organization@organization:org_2
191
192
// org_2 has a project project_2
193
project:project_2#org@organization:org_2
194
// user_1 is viewer of project_2
195
project:project_2#viewer@user:user_1
196
197
workspace:workspace_1#org@organization:org_1
198
workspace:workspace_1#owner@user:user_1
199
workspace:workspace_2_shared#org@organization:org_1
200
workspace:workspace_2_shared#owner@user:user_1
201
workspace:workspace_2_shared#shared@user:*
202
203
# validation should assert that a particular relation exists between an entity, and a subject
204
# validations are not used to assert that a permission exists
205
validation:
206
installation:installation_0#member:
207
- "[user:user_0] is <installation:installation_0#member>"
208
installation:installation_0#admin:
209
- "[user:user_admin] is <installation:installation_0#admin>"
210
organization:org_1#member:
211
- "[user:user_0] is <organization:org_1#member>"
212
- "[user:user_1] is <organization:org_1#member>"
213
- "[user:user_2] is <organization:org_1#member>"
214
organization:org_1#owner:
215
- "[user:user_0] is <organization:org_1#owner>"
216
project:project_1#org:
217
- "[organization:org_1] is <project:project_1#org>"
218
219
# assertions should assert that a particular permission holds, or not
220
assertions:
221
assertTrue:
222
# user 0 can read org_1 because they are a member
223
- organization:org_1#read_info@user:user_0
224
# user 1 can read git providers because they are a member
225
- organization:org_1#read_git_provider@user:user_1
226
# user 0 can edit project_0, because they are the Org Owner
227
- project:project_1#write_info@user:user_0
228
- organization:org_1#write_settings@user:user_0
229
- organization:org_1#write_git_provider@user:user_0
230
# user 0 can invite members to the organization
231
- organization:org_1#read_members@user:user_0
232
- organization:org_1#write_members@user:user_0
233
- organization:org_1#invite_members@user:user_0
234
# user 1 can read and invite members to the organization
235
- organization:org_1#read_members@user:user_1
236
- organization:org_1#invite_members@user:user_1
237
# Org owner can delete the organization
238
- organization:org_1#delete@user:user_0
239
# Org owner can delete projects
240
- project:project_1#delete@user:user_0
241
# org members can delete project
242
- project:project_1#delete@user:user_1
243
# Org member can view projects
244
- project:project_1#read_info@user:user_1
245
# Org member can create projects
246
- organization:org_1#create_project@user:user_1
247
# user 10 can access project_2
248
- project:project_2#write_info@user:user_10
249
# installation user can create orgs
250
- installation:installation_0#create_organization@user:user_0
251
# Installation admin can do what org owners can
252
- project:project_1#delete@user:user_admin
253
- organization:org_1#delete@user:user_admin
254
- organization:org_1#write_settings@user:user_admin
255
- organization:org_1#write_git_provider@user:user_admin
256
# installation admin can create an org
257
- installation:installation_0#create_organization@user:user_admin
258
# owner can access their workspaces
259
- workspace:workspace_1#access@user:user_1
260
- workspace:workspace_2_shared#access@user:user_1
261
# stranger can access other's workspaces
262
- workspace:workspace_2_shared#access@user:user_2
263
# installation admin can create temp token
264
- user:user_0#write_temporary_token@user:user_admin
265
- user:user_1#write_temporary_token@user:user_admin
266
- user:user_2#write_temporary_token@user:user_admin
267
assertFalse:
268
# user 10 cannot access project_1
269
- project:project_1#read_info@user:user_10
270
# non-member/owner cannot access organization
271
- organization:org_1#read_info@user:user_3
272
- organization:org_1#write_info@user:user_3
273
- organization:org_1#write_settings@user:user_1
274
- organization:org_1#read_members@user:user_3
275
- organization:org_1#write_members@user:user_3
276
- organization:org_1#invite_members@user:user_3
277
# user 1 (member) can not write members
278
- organization:org_1#write_members@user:user_1
279
# members are not allowed to:
280
- organization:org_1#write_git_provider@user:user_1
281
# org member can not delete org
282
- organization:org_1#delete@user:user_1
283
# stranger can't access other's non-shared workspace
284
- workspace:workspace_1#access@user:user_2
285
# collaborator(user_2) can't access members, projects, usage
286
- organization:org_2#read_members@user:user_2
287
- project:project_2#read_info@user:user_2
288
- project:project_2#write_info@user:user_2
289
- project:project_2#delete@user:user_2
290
- organization:org_2#read_billing@user:user_2
291
# org owner cant write_temporary_token, because they are not installation admin
292
- user:user_1#write_temporary_token@user:user_0
293
# org_2 is not belong to installation_0
294
- user:user_10#write_temporary_token@user:user_admin
295
296