@@ -243,7 +243,28 @@ func (r *dynamicRenderer) getWorkspaceOwnerData(ctx context.Context, ownerID uui
243
243
return nil // already fetched
244
244
}
245
245
246
- user , err := r .db .GetUserByID (ctx , ownerID )
246
+ owner , err := WorkspaceOwner (ctx , r .db , r .data .templateVersion .OrganizationID , ownerID )
247
+ if err != nil {
248
+ return err
249
+ }
250
+
251
+ r .currentOwner = owner
252
+ return nil
253
+ }
254
+
255
+ func (r * dynamicRenderer ) Close () {
256
+ r .once .Do (r .close )
257
+ }
258
+
259
+ func ProvisionerVersionSupportsDynamicParameters (version string ) bool {
260
+ major , minor , err := apiversion .Parse (version )
261
+ // If the api version is not valid or less than 1.6, we need to use the static parameters
262
+ useStaticParams := err != nil || major < 1 || (major == 1 && minor < 6 )
263
+ return ! useStaticParams
264
+ }
265
+
266
+ func WorkspaceOwner (ctx context.Context , db database.Store , org uuid.UUID , ownerID uuid.UUID ) (* previewtypes.WorkspaceOwner , error ) {
267
+ user , err := db .GetUserByID (ctx , ownerID )
247
268
if err != nil {
248
269
// If the user failed to read, we also try to read the user from their
249
270
// organization member. You only need to be able to read the organization member
@@ -252,37 +273,37 @@ func (r *dynamicRenderer) getWorkspaceOwnerData(ctx context.Context, ownerID uui
252
273
// Only the terraform files can therefore leak more information than the
253
274
// caller should have access to. All this info should be public assuming you can
254
275
// read the user though.
255
- mem , err := database .ExpectOne (r . db .OrganizationMembers (ctx , database.OrganizationMembersParams {
256
- OrganizationID : r . data . templateVersion . OrganizationID ,
276
+ mem , err := database .ExpectOne (db .OrganizationMembers (ctx , database.OrganizationMembersParams {
277
+ OrganizationID : org ,
257
278
UserID : ownerID ,
258
279
IncludeSystem : true ,
259
280
}))
260
281
if err != nil {
261
- return xerrors .Errorf ("fetch user: %w" , err )
282
+ return nil , xerrors .Errorf ("fetch user: %w" , err )
262
283
}
263
284
264
285
// Org member fetched, so use the provisioner context to fetch the user.
265
286
//nolint:gocritic // Has the correct permissions, and matches the provisioning flow.
266
- user , err = r . db .GetUserByID (dbauthz .AsProvisionerd (ctx ), mem .OrganizationMember .UserID )
287
+ user , err = db .GetUserByID (dbauthz .AsProvisionerd (ctx ), mem .OrganizationMember .UserID )
267
288
if err != nil {
268
- return xerrors .Errorf ("fetch user: %w" , err )
289
+ return nil , xerrors .Errorf ("fetch user: %w" , err )
269
290
}
270
291
}
271
292
272
293
// nolint:gocritic // This is kind of the wrong query to use here, but it
273
294
// matches how the provisioner currently works. We should figure out
274
295
// something that needs less escalation but has the correct behavior.
275
- row , err := r . db .GetAuthorizationUserRoles (dbauthz .AsProvisionerd (ctx ), ownerID )
296
+ row , err := db .GetAuthorizationUserRoles (dbauthz .AsProvisionerd (ctx ), ownerID )
276
297
if err != nil {
277
- return xerrors .Errorf ("user roles: %w" , err )
298
+ return nil , xerrors .Errorf ("user roles: %w" , err )
278
299
}
279
300
roles , err := row .RoleNames ()
280
301
if err != nil {
281
- return xerrors .Errorf ("expand roles: %w" , err )
302
+ return nil , xerrors .Errorf ("expand roles: %w" , err )
282
303
}
283
304
ownerRoles := make ([]previewtypes.WorkspaceOwnerRBACRole , 0 , len (roles ))
284
305
for _ , it := range roles {
285
- if it .OrganizationID != uuid .Nil && it .OrganizationID != r . data . templateVersion . OrganizationID {
306
+ if it .OrganizationID != uuid .Nil && it .OrganizationID != org {
286
307
continue
287
308
}
288
309
var orgID string
@@ -298,28 +319,28 @@ func (r *dynamicRenderer) getWorkspaceOwnerData(ctx context.Context, ownerID uui
298
319
// The correct public key has to be sent. This will not be leaked
299
320
// unless the template leaks it.
300
321
// nolint:gocritic
301
- key , err := r . db .GetGitSSHKey (dbauthz .AsProvisionerd (ctx ), ownerID )
322
+ key , err := db .GetGitSSHKey (dbauthz .AsProvisionerd (ctx ), ownerID )
302
323
if err != nil && ! xerrors .Is (err , sql .ErrNoRows ) {
303
- return xerrors .Errorf ("ssh key: %w" , err )
324
+ return nil , xerrors .Errorf ("ssh key: %w" , err )
304
325
}
305
326
306
327
// The groups need to be sent to preview. These groups are not exposed to the
307
328
// user, unless the template does it through the parameters. Regardless, we need
308
329
// the correct groups, and a user might not have read access.
309
330
// nolint:gocritic
310
- groups , err := r . db .GetGroups (dbauthz .AsProvisionerd (ctx ), database.GetGroupsParams {
311
- OrganizationID : r . data . templateVersion . OrganizationID ,
331
+ groups , err := db .GetGroups (dbauthz .AsProvisionerd (ctx ), database.GetGroupsParams {
332
+ OrganizationID : org ,
312
333
HasMemberID : ownerID ,
313
334
})
314
335
if err != nil {
315
- return xerrors .Errorf ("groups: %w" , err )
336
+ return nil , xerrors .Errorf ("groups: %w" , err )
316
337
}
317
338
groupNames := make ([]string , 0 , len (groups ))
318
339
for _ , it := range groups {
319
340
groupNames = append (groupNames , it .Group .Name )
320
341
}
321
342
322
- r . currentOwner = & previewtypes.WorkspaceOwner {
343
+ return & previewtypes.WorkspaceOwner {
323
344
ID : user .ID .String (),
324
345
Name : user .Username ,
325
346
FullName : user .Name ,
@@ -328,17 +349,5 @@ func (r *dynamicRenderer) getWorkspaceOwnerData(ctx context.Context, ownerID uui
328
349
RBACRoles : ownerRoles ,
329
350
SSHPublicKey : key .PublicKey ,
330
351
Groups : groupNames ,
331
- }
332
- return nil
333
- }
334
-
335
- func (r * dynamicRenderer ) Close () {
336
- r .once .Do (r .close )
337
- }
338
-
339
- func ProvisionerVersionSupportsDynamicParameters (version string ) bool {
340
- major , minor , err := apiversion .Parse (version )
341
- // If the api version is not valid or less than 1.6, we need to use the static parameters
342
- useStaticParams := err != nil || major < 1 || (major == 1 && minor < 6 )
343
- return ! useStaticParams
352
+ }, nil
344
353
}
0 commit comments