@@ -378,6 +378,7 @@ var (
378
378
policy .ActionCreate , policy .ActionDelete , policy .ActionRead , policy .ActionUpdate ,
379
379
policy .ActionWorkspaceStart , policy .ActionWorkspaceStop ,
380
380
},
381
+ rbac .ResourceSystem .Type : {policy .ActionRead },
381
382
}),
382
383
},
383
384
}),
@@ -1137,13 +1138,29 @@ func (q *querier) BulkMarkNotificationMessagesSent(ctx context.Context, arg data
1137
1138
return q .db .BulkMarkNotificationMessagesSent (ctx , arg )
1138
1139
}
1139
1140
1140
- func (q * querier ) ClaimPrebuiltWorkspace (ctx context.Context , newOwnerID database.ClaimPrebuiltWorkspaceParams ) (database.ClaimPrebuiltWorkspaceRow , error ) {
1141
- if err := q .authorizeContext (ctx , policy .ActionUpdate , rbac .ResourceWorkspace ); err != nil {
1142
- return database.ClaimPrebuiltWorkspaceRow {
1143
- ID : uuid .Nil ,
1144
- }, err
1141
+ func (q * querier ) ClaimPrebuiltWorkspace (ctx context.Context , arg database.ClaimPrebuiltWorkspaceParams ) (database.ClaimPrebuiltWorkspaceRow , error ) {
1142
+ empty := database.ClaimPrebuiltWorkspaceRow {}
1143
+
1144
+ preset , err := q .db .GetPresetByID (ctx , arg .PresetID )
1145
+ if err != nil {
1146
+ return empty , err
1147
+ }
1148
+
1149
+ workspaceObject := rbac .ResourceWorkspace .WithOwner (arg .NewUserID .String ()).InOrg (preset .OrganizationID )
1150
+ err = q .authorizeContext (ctx , policy .ActionCreate , workspaceObject .RBACObject ())
1151
+ if err != nil {
1152
+ return empty , err
1153
+ }
1154
+
1155
+ tpl , err := q .GetTemplateByID (ctx , preset .TemplateID .UUID )
1156
+ if err != nil {
1157
+ return empty , xerrors .Errorf ("verify template by id: %w" , err )
1145
1158
}
1146
- return q .db .ClaimPrebuiltWorkspace (ctx , newOwnerID )
1159
+ if err := q .authorizeContext (ctx , policy .ActionUse , tpl ); err != nil {
1160
+ return empty , xerrors .Errorf ("use template for workspace: %w" , err )
1161
+ }
1162
+
1163
+ return q .db .ClaimPrebuiltWorkspace (ctx , arg )
1147
1164
}
1148
1165
1149
1166
func (q * querier ) CleanTailnetCoordinators (ctx context.Context ) error {
@@ -1168,7 +1185,7 @@ func (q *querier) CleanTailnetTunnels(ctx context.Context) error {
1168
1185
}
1169
1186
1170
1187
func (q * querier ) CountInProgressPrebuilds (ctx context.Context ) ([]database.CountInProgressPrebuildsRow , error ) {
1171
- if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceTemplate ); err != nil {
1188
+ if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceSystem ); err != nil {
1172
1189
return nil , err
1173
1190
}
1174
1191
return q .db .CountInProgressPrebuilds (ctx )
@@ -2118,12 +2135,27 @@ func (q *querier) GetParameterSchemasByJobID(ctx context.Context, jobID uuid.UUI
2118
2135
}
2119
2136
2120
2137
func (q * querier ) GetPrebuildMetrics (ctx context.Context ) ([]database.GetPrebuildMetricsRow , error ) {
2121
- if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceTemplate ); err != nil {
2138
+ if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceSystem ); err != nil {
2122
2139
return nil , err
2123
2140
}
2124
2141
return q .db .GetPrebuildMetrics (ctx )
2125
2142
}
2126
2143
2144
+ func (q * querier ) GetPresetByID (ctx context.Context , presetID uuid.UUID ) (database.GetPresetByIDRow , error ) {
2145
+ empty := database.GetPresetByIDRow {}
2146
+
2147
+ preset , err := q .db .GetPresetByID (ctx , presetID )
2148
+ if err != nil {
2149
+ return empty , err
2150
+ }
2151
+ _ , err = q .GetTemplateByID (ctx , preset .TemplateID .UUID )
2152
+ if err != nil {
2153
+ return empty , err
2154
+ }
2155
+
2156
+ return preset , nil
2157
+ }
2158
+
2127
2159
func (q * querier ) GetPresetByWorkspaceBuildID (ctx context.Context , workspaceID uuid.UUID ) (database.TemplateVersionPreset , error ) {
2128
2160
if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceTemplate ); err != nil {
2129
2161
return database.TemplateVersionPreset {}, err
@@ -2142,7 +2174,7 @@ func (q *querier) GetPresetParametersByTemplateVersionID(ctx context.Context, te
2142
2174
}
2143
2175
2144
2176
func (q * querier ) GetPresetsBackoff (ctx context.Context , lookback time.Time ) ([]database.GetPresetsBackoffRow , error ) {
2145
- if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceTemplate ); err != nil {
2177
+ if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceSystem ); err != nil {
2146
2178
return nil , err
2147
2179
}
2148
2180
return q .db .GetPresetsBackoff (ctx , lookback )
@@ -2299,7 +2331,7 @@ func (q *querier) GetReplicasUpdatedAfter(ctx context.Context, updatedAt time.Ti
2299
2331
}
2300
2332
2301
2333
func (q * querier ) GetRunningPrebuiltWorkspaces (ctx context.Context ) ([]database.GetRunningPrebuiltWorkspacesRow , error ) {
2302
- if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceTemplate ); err != nil {
2334
+ if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceSystem ); err != nil {
2303
2335
return nil , err
2304
2336
}
2305
2337
return q .db .GetRunningPrebuiltWorkspaces (ctx )
@@ -2433,7 +2465,7 @@ func (q *querier) GetTemplatePresetsWithPrebuilds(ctx context.Context, templateI
2433
2465
// Although this fetches presets. It filters them by prebuilds and is only of use to the prebuild system.
2434
2466
// As such, we authorize this in line with other prebuild queries, not with other preset queries.
2435
2467
2436
- if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceTemplate ); err != nil {
2468
+ if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceSystem ); err != nil {
2437
2469
return nil , err
2438
2470
}
2439
2471
return q .db .GetTemplatePresetsWithPrebuilds (ctx , templateID )
0 commit comments