@@ -62,33 +62,36 @@ number(set) := c if {
62
62
}
63
63
64
64
65
+ prebuild_workspace_type:= " prebuilt_workspace"
66
+ default_object_set:= [input.object.type," *" ]
65
67
is_prebuild_workspace if {
66
68
input.object.type= " workspace"
67
69
input.object.owner= " c42fdf75-3097-471c-8c33-fb52454d81c0"
68
70
}
69
71
70
- object_set:= object_types if {
71
- is_prebuild_workspace
72
- object_types:= [input.object.type," prebuilt_workspace" ," *" ]
73
- }
74
-
75
- object_set:= object_types if {
76
- not is_prebuild_workspace
77
- object_types:= [input.object.type," *" ]
78
- }
79
-
80
72
# site, org, and user rules are all similar. Each rule should return a number
81
73
# from [-1, 1]. The number corresponds to "negative", "abstain", and "positive"
82
74
# for the given level. See the 'allow' rules for how these numbers are used.
83
75
default site:= 0
84
76
85
- site:= site_allow (input.subject.roles)
77
+ site:= num if {
78
+ not is_prebuild_workspace
79
+ num:= site_allow (input.subject.roles, default_object_set)
80
+ }
81
+
82
+ site:= num if {
83
+ is_prebuild_workspace
84
+ num:= number ([
85
+ site_allow (input.subject.roles, default_object_set),
86
+ site_allow (input.subject.roles, [prebuild_workspace_type])
87
+ ])
88
+ }
86
89
87
90
default scope_site:= 0
88
91
89
- scope_site:= site_allow ([input.subject.scope])
92
+ scope_site:= site_allow ([input.subject.scope], default_object_set )
90
93
91
- site_allow (roles):= num if {
94
+ site_allow (roles, object_set ):= num if {
92
95
# allow is a set of boolean values without duplicates.
93
96
allow:= {x|
94
97
# Iterate over all site permissions in all roles
@@ -111,11 +114,22 @@ org_members := {orgID |
111
114
# that the actor is a member of.
112
115
default org:= 0
113
116
114
- org:= org_allow (input.subject.roles)
117
+ org:= num if {
118
+ not is_prebuild_workspace
119
+ num:= org_allow (input.subject.roles, default_object_set)
120
+ }
121
+
122
+ org:= num if {
123
+ is_prebuild_workspace
124
+ num:= number ([
125
+ org_allow (input.subject.roles, default_object_set),
126
+ org_allow (input.subject.roles, [prebuild_workspace_type])
127
+ ])
128
+ }
115
129
116
130
default scope_org:= 0
117
131
118
- scope_org:= org_allow ([input.scope])
132
+ scope_org:= org_allow ([input.scope], default_object_set )
119
133
120
134
# org_allow_set is a helper function that iterates over all orgs that the actor
121
135
# is a member of. For each organization it sets the numerical allow value
@@ -127,7 +141,7 @@ scope_org := org_allow([input.scope])
127
141
# The reason we calculate this for all orgs, and not just the input.object.org_owner
128
142
# is that sometimes the input.object.org_owner is unknown. In those cases
129
143
# we have a list of org_ids that can we use in a SQL 'WHERE' clause.
130
- org_allow_set (roles):= allow_set if {
144
+ org_allow_set (roles, object_set ):= allow_set if {
131
145
allow_set:= {id: num|
132
146
id:= org_members[_]
133
147
set:= {x|
@@ -140,11 +154,11 @@ org_allow_set(roles) := allow_set if {
140
154
}
141
155
}
142
156
143
- org_allow (roles):= num if {
157
+ org_allow (roles, object_set ):= num if {
144
158
# If the object has "any_org" set to true, then use the other
145
159
# org_allow block.
146
160
not input.object.any_org
147
- allow:= org_allow_set (roles)
161
+ allow:= org_allow_set (roles, object_set )
148
162
149
163
# Return only the org value of the input's org.
150
164
# The reason why we do not do this up front, is that we need to make sure
@@ -160,9 +174,9 @@ org_allow(roles) := num if {
160
174
# This is useful for UI elements when we want to conclude, "Can the user create
161
175
# a new template in any organization?"
162
176
# It is easier than iterating over every organization the user is apart of.
163
- org_allow (roles):= num if {
177
+ org_allow (roles, object_set ):= num if {
164
178
input.object.any_org# if this is false, this code block is not used
165
- allow:= org_allow_set (roles)
179
+ allow:= org_allow_set (roles, object_set )
166
180
167
181
# allow is a map of {"<org_id>": <number>}. We only care about values
168
182
# that are 1, and ignore the rest.
@@ -211,13 +225,24 @@ org_ok if {
211
225
# the user is apart of the org (if the object has an org).
212
226
default user:= 0
213
227
214
- user:= user_allow (input.subject.roles)
228
+ user:= num if {
229
+ not is_prebuild_workspace
230
+ num:= user_allow (input.subject.roles, default_object_set)
231
+ }
232
+
233
+ user:= num if {
234
+ is_prebuild_workspace
235
+ num:= number ([
236
+ user_allow (input.subject.roles, default_object_set),
237
+ user_allow (input.subject.roles, [prebuild_workspace_type])
238
+ ])
239
+ }
215
240
216
241
default user_scope:= 0
217
242
218
- scope_user:= user_allow ([input.scope])
243
+ scope_user:= user_allow ([input.scope], default_object_set )
219
244
220
- user_allow (roles):= num if {
245
+ user_allow (roles, object_set ):= num if {
221
246
input.object.owner!= " "
222
247
input.subject.id= input.object.owner
223
248
allow:= {x|