@@ -4196,6 +4196,50 @@ func TestAccessRequestAuditLog(t *testing.T) {
4196
4196
require .Equal (t , "APPROVED" , arc .RequestState )
4197
4197
}
4198
4198
4199
+ func testCreateRole (t * testing.T , server * TestTLSServer , name string , setup func (* types.RoleSpecV6 )) types.Role {
4200
+ t .Helper ()
4201
+ ctx := context .Background ()
4202
+
4203
+ spec := types.RoleSpecV6 {
4204
+ Allow : types.RoleConditions {
4205
+ Request : & types.AccessRequestConditions {
4206
+ Reason : & types.AccessRequestConditionsReason {},
4207
+ },
4208
+ ReviewRequests : & types.AccessReviewConditions {},
4209
+ },
4210
+ Deny : types.RoleConditions {
4211
+ Request : & types.AccessRequestConditions {},
4212
+ ReviewRequests : & types.AccessReviewConditions {},
4213
+ },
4214
+ }
4215
+ setup (& spec )
4216
+
4217
+ role , err := types .NewRole (name , spec )
4218
+ require .NoError (t , err , "types.NewRole" )
4219
+
4220
+ createdRole , err := server .AuthServer .AuthServer .UpsertRole (ctx , role )
4221
+ require .NoError (t , err , "AuthServer.UpsertRole" )
4222
+
4223
+ return createdRole
4224
+ }
4225
+
4226
+ func testCreateUserWithRoles (t * testing.T , server * TestTLSServer , user string , roles ... string ) (TestIdentity , * authclient.Client ) {
4227
+ t .Helper ()
4228
+ ctx := context .Background ()
4229
+
4230
+ u , err := types .NewUser (user )
4231
+ require .NoError (t , err , "types.NewUser" )
4232
+ u .SetRoles (roles )
4233
+ _ , err = server .AuthServer .AuthServer .UpsertUser (ctx , u )
4234
+ require .NoError (t , err , "AuthServer.UpsertUser" )
4235
+
4236
+ identity := TestUser (user )
4237
+ client , err := server .NewClient (identity )
4238
+ require .NoError (t , err , "server.NewClient" )
4239
+
4240
+ return identity , client
4241
+ }
4242
+
4199
4243
func TestAccessRequestNotifications (t * testing.T ) {
4200
4244
t .Parallel ()
4201
4245
ctx := context .Background ()
@@ -4214,69 +4258,36 @@ func TestAccessRequestNotifications(t *testing.T) {
4214
4258
requesterUsername := "requester"
4215
4259
requestRoleName := "requestRole"
4216
4260
4217
- reviewerRole , err := types .NewRole (reviewerUsername , types.RoleSpecV6 {
4218
- Allow : types.RoleConditions {
4219
- Logins : []string {"user" },
4220
- ReviewRequests : & types.AccessReviewConditions {
4221
- Roles : []string {"requestRole" },
4222
- },
4223
- },
4261
+ reviewerRole := testCreateRole (t , testTLSServer , reviewerUsername , func (spec * types.RoleSpecV6 ) {
4262
+ spec .Allow .Logins = []string {"user" }
4263
+ spec .Allow .ReviewRequests .Roles = []string {"requestRole" }
4224
4264
})
4225
- require .NoError (t , err )
4226
4265
4227
- requesterRole , err := types .NewRole (requesterUsername , types.RoleSpecV6 {
4228
- Allow : types.RoleConditions {
4229
- Request : & types.AccessRequestConditions {
4230
- Roles : []string {requestRoleName },
4231
- },
4232
- },
4266
+ requesterRole := testCreateRole (t , testTLSServer , requesterUsername , func (spec * types.RoleSpecV6 ) {
4267
+ spec .Allow .Request .Roles = []string {requestRoleName }
4233
4268
})
4234
- require .NoError (t , err )
4235
4269
4236
- requestedRole , err := types .NewRole (requestRoleName , types.RoleSpecV6 {
4237
- Allow : types.RoleConditions {
4238
- Request : & types.AccessRequestConditions {
4239
- Roles : []string {requestRoleName },
4240
- },
4241
- },
4270
+ requestRole := testCreateRole (t , testTLSServer , requestRoleName , func (spec * types.RoleSpecV6 ) {
4271
+ spec .Allow .Request .Roles = []string {requestRoleName }
4242
4272
})
4243
- require .NoError (t , err )
4244
- _ , err = testTLSServer .AuthServer .AuthServer .UpsertRole (ctx , requestedRole )
4245
- require .NoError (t , err )
4246
4273
4247
- _ , err = testTLSServer .AuthServer .AuthServer .UpsertRole (ctx , reviewerRole )
4248
- require .NoError (t , err )
4249
- reviewer , err := types .NewUser (reviewerUsername )
4250
- require .NoError (t , err )
4251
- reviewer .SetRoles ([]string {reviewerUsername })
4252
- _ , err = testTLSServer .AuthServer .AuthServer .UpsertUser (ctx , reviewer )
4253
- require .NoError (t , err )
4274
+ reviewer , reviewerClient := testCreateUserWithRoles (t , testTLSServer , reviewerUsername , reviewerRole .GetName ())
4254
4275
4255
- _ , err = testTLSServer .AuthServer .AuthServer .UpsertRole (ctx , requesterRole )
4256
- require .NoError (t , err )
4257
- requester , err := types .NewUser (requesterUsername )
4258
- require .NoError (t , err )
4259
- requester .SetRoles ([]string {requesterUsername })
4260
- _ , err = testTLSServer .AuthServer .AuthServer .UpsertUser (ctx , requester )
4261
- require .NoError (t , err )
4276
+ requester , _ := testCreateUserWithRoles (t , testTLSServer , requesterUsername , requesterRole .GetName ())
4262
4277
4263
- accessRequest , err := types .NewAccessRequest (uuid .NewString (), requesterUsername , requestRoleName )
4278
+ accessRequest , err := types .NewAccessRequest (uuid .NewString (), requester . GetUsername (), requestRole . GetName () )
4264
4279
require .NoError (t , err )
4265
- req , err := testTLSServer .AuthServer .AuthServer .CreateAccessRequestV2 (ctx , accessRequest , TestUser ( requesterUsername ) .I .GetIdentity ())
4280
+ req , err := testTLSServer .AuthServer .AuthServer .CreateAccessRequestV2 (ctx , accessRequest , reviewer .I .GetIdentity ())
4266
4281
require .NoError (t , err )
4267
4282
4268
4283
// Verify that a global notification was created which matches for users who can review the requestRole.
4269
4284
globalNotifsResp , _ , err := testTLSServer .AuthServer .AuthServer .Notifications .ListGlobalNotifications (ctx , 100 , "" )
4270
4285
require .NoError (t , err )
4271
4286
require .Len (t , globalNotifsResp , 1 )
4272
4287
require .Equal (t , & types.AccessReviewConditions {
4273
- Roles : []string {requestRoleName },
4288
+ Roles : []string {requestRole . GetName () },
4274
4289
}, globalNotifsResp [0 ].GetSpec ().GetByPermissions ().GetRoleConditions ()[0 ].ReviewRequests )
4275
4290
4276
- reviewerIdentity := TestUser (reviewerUsername )
4277
- reviewerClient , err := testTLSServer .NewClient (reviewerIdentity )
4278
- require .NoError (t , err )
4279
-
4280
4291
// Approve the request
4281
4292
_ , err = reviewerClient .SubmitAccessReview (ctx , types.AccessReviewSubmission {
4282
4293
RequestID : req .GetName (),
@@ -4292,9 +4303,9 @@ func TestAccessRequestNotifications(t *testing.T) {
4292
4303
require .Contains (t , userNotifsResp [0 ].GetMetadata ().GetLabels ()[types .NotificationTitleLabel ], "reviewer approved your access request" )
4293
4304
4294
4305
// Create another access request.
4295
- accessRequest , err = types .NewAccessRequest (uuid .NewString (), requesterUsername , requestRoleName )
4306
+ accessRequest , err = types .NewAccessRequest (uuid .NewString (), requester . GetUsername (), requestRole . GetName () )
4296
4307
require .NoError (t , err )
4297
- req , err = testTLSServer .AuthServer .AuthServer .CreateAccessRequestV2 (ctx , accessRequest , TestUser (requesterUsername ).I .GetIdentity ())
4308
+ req , err = testTLSServer .AuthServer .AuthServer .CreateAccessRequestV2 (ctx , accessRequest , TestUser (requester . GetUsername () ).I .GetIdentity ())
4298
4309
require .NoError (t , err )
4299
4310
4300
4311
// Deny the request.
@@ -4312,6 +4323,165 @@ func TestAccessRequestNotifications(t *testing.T) {
4312
4323
require .Contains (t , userNotifsResp [1 ].GetMetadata ().GetLabels ()[types .NotificationTitleLabel ], "reviewer denied your access request" )
4313
4324
}
4314
4325
4326
+ func testNewAccessRequest (t * testing.T , user string , roles ... string ) types.AccessRequest {
4327
+ t .Helper ()
4328
+ r , err := types .NewAccessRequest (uuid .NewString (), user , roles ... )
4329
+ require .NoError (t , err , "types.NewAccessRequest" )
4330
+ return r
4331
+ }
4332
+
4333
+ func TestAccessRequestDryRunEnrichment (t * testing.T ) {
4334
+ t .Parallel ()
4335
+ ctx := context .Background ()
4336
+
4337
+ testAuthServer , err := NewTestAuthServer (TestAuthServerConfig {
4338
+ Dir : t .TempDir (),
4339
+ Clock : clockwork .NewFakeClock (),
4340
+ })
4341
+ require .NoError (t , err )
4342
+ testTLSServer , err := testAuthServer .NewTestTLSServer ()
4343
+ require .NoError (t , err )
4344
+
4345
+ someRole := testCreateRole (t , testTLSServer , "some-role" , func (spec * types.RoleSpecV6 ) {})
4346
+
4347
+ someRoleRequesterRole := testCreateRole (t , testTLSServer , "some-role-requester" , func (spec * types.RoleSpecV6 ) {
4348
+ spec .Allow .Request .Roles = []string {someRole .GetName ()}
4349
+ })
4350
+
4351
+ someRoleRequesterRoleRequiringReason := testCreateRole (t , testTLSServer , "some-role-requester-requiring-reason" , func (spec * types.RoleSpecV6 ) {
4352
+ spec .Allow .Request .Roles = []string {someRole .GetName ()}
4353
+ spec .Allow .Request .Reason .Mode = types .RequestReasonModeRequired
4354
+ })
4355
+
4356
+ globalPromptRole1 := testCreateRole (t , testTLSServer , "prompt-role-1" , func (spec * types.RoleSpecV6 ) {
4357
+ spec .Options .RequestPrompt = "test prompt #1"
4358
+ })
4359
+ globalPromptRole2 := testCreateRole (t , testTLSServer , "prompt-role-2" , func (spec * types.RoleSpecV6 ) {
4360
+ spec .Options .RequestPrompt = "test prompt #2"
4361
+ })
4362
+
4363
+ t .Run ("requesting-role-no-reason-required-no-prompts" , func (t * testing.T ) {
4364
+ requester , requesterClient := testCreateUserWithRoles (t , testTLSServer , "requester" ,
4365
+ someRoleRequesterRole .GetName (),
4366
+ )
4367
+
4368
+ dryRunAccessRequest := testNewAccessRequest (t , requester .GetUsername (), someRole .GetName ())
4369
+ dryRunAccessRequest .SetDryRun (true )
4370
+
4371
+ resp , err := requesterClient .CreateAccessRequestV2 (ctx , dryRunAccessRequest )
4372
+ require .NoError (t , err )
4373
+
4374
+ require .NotNil (t , resp .GetDryRunEnrichment ())
4375
+ // check reason mode
4376
+ require .Equal (t , types .RequestReasonModeOptional , resp .GetDryRunEnrichment ().ReasonMode )
4377
+ // check prompts
4378
+ require .Len (t , resp .GetDryRunEnrichment ().ReasonPrompts , 0 )
4379
+ })
4380
+
4381
+ t .Run ("requesting-role-reason-required" , func (t * testing.T ) {
4382
+ requester , requesterClient := testCreateUserWithRoles (t , testTLSServer , "requester" ,
4383
+ someRoleRequesterRoleRequiringReason .GetName (),
4384
+ )
4385
+
4386
+ dryRunAccessRequest := testNewAccessRequest (t , requester .GetUsername (), someRole .GetName ())
4387
+ dryRunAccessRequest .SetDryRun (true )
4388
+
4389
+ resp , err := requesterClient .CreateAccessRequestV2 (ctx , dryRunAccessRequest )
4390
+ require .NoError (t , err )
4391
+
4392
+ require .NotNil (t , resp .GetDryRunEnrichment ())
4393
+ // check reason mode
4394
+ require .Equal (t , types .RequestReasonModeRequired , resp .GetDryRunEnrichment ().ReasonMode )
4395
+ // check prompts
4396
+ require .Len (t , resp .GetDryRunEnrichment ().ReasonPrompts , 0 )
4397
+ })
4398
+
4399
+ t .Run ("requesting-role-multiple-prompts" , func (t * testing.T ) {
4400
+ requester , requesterClient := testCreateUserWithRoles (t , testTLSServer , "requester" ,
4401
+ someRoleRequesterRole .GetName (),
4402
+ globalPromptRole1 .GetName (),
4403
+ globalPromptRole2 .GetName (),
4404
+ )
4405
+
4406
+ dryRunAccessRequest := testNewAccessRequest (t , requester .GetUsername (), someRole .GetName ())
4407
+ dryRunAccessRequest .SetDryRun (true )
4408
+
4409
+ resp , err := requesterClient .CreateAccessRequestV2 (ctx , dryRunAccessRequest )
4410
+ require .NoError (t , err )
4411
+
4412
+ require .NotNil (t , resp .GetDryRunEnrichment ())
4413
+ // check reason mode
4414
+ require .Equal (t , types .RequestReasonModeOptional , resp .GetDryRunEnrichment ().ReasonMode )
4415
+ // check prompts
4416
+ require .Len (t , resp .GetDryRunEnrichment ().ReasonPrompts , 2 )
4417
+ require .Contains (t , resp .GetDryRunEnrichment ().ReasonPrompts , globalPromptRole1 .GetOptions ().RequestPrompt )
4418
+ require .Contains (t , resp .GetDryRunEnrichment ().ReasonPrompts , globalPromptRole2 .GetOptions ().RequestPrompt )
4419
+ })
4420
+
4421
+ t .Run ("requesting-role-reason-required-and-multiple-prompts" , func (t * testing.T ) {
4422
+ requester , requesterClient := testCreateUserWithRoles (t , testTLSServer , "requester" ,
4423
+ someRoleRequesterRole .GetName (),
4424
+ someRoleRequesterRoleRequiringReason .GetName (),
4425
+ globalPromptRole1 .GetName (),
4426
+ globalPromptRole2 .GetName (),
4427
+ )
4428
+
4429
+ dryRunAccessRequest := testNewAccessRequest (t , requester .GetUsername (), someRole .GetName ())
4430
+ dryRunAccessRequest .SetDryRun (true )
4431
+
4432
+ resp , err := requesterClient .CreateAccessRequestV2 (ctx , dryRunAccessRequest )
4433
+ require .NoError (t , err )
4434
+
4435
+ require .NotNil (t , resp .GetDryRunEnrichment ())
4436
+ // check reason mode
4437
+ require .Equal (t , types .RequestReasonModeRequired , resp .GetDryRunEnrichment ().ReasonMode )
4438
+ // check prompts
4439
+ require .Len (t , resp .GetDryRunEnrichment ().ReasonPrompts , 2 )
4440
+ require .Contains (t , resp .GetDryRunEnrichment ().ReasonPrompts , globalPromptRole1 .GetOptions ().RequestPrompt )
4441
+ require .Contains (t , resp .GetDryRunEnrichment ().ReasonPrompts , globalPromptRole2 .GetOptions ().RequestPrompt )
4442
+ })
4443
+
4444
+ t .Run ("requesting-role-prompts-sorted-and-duplicated" , func (t * testing.T ) {
4445
+ globalPromptRole1 := testCreateRole (t , testTLSServer , "prompt-role-1" , func (spec * types.RoleSpecV6 ) {
4446
+ spec .Options .RequestPrompt = "C test prompt"
4447
+ })
4448
+ globalPromptRole2 := testCreateRole (t , testTLSServer , "prompt-role-2" , func (spec * types.RoleSpecV6 ) {
4449
+ spec .Options .RequestPrompt = "A test prompt"
4450
+ })
4451
+ globalPromptRole3 := testCreateRole (t , testTLSServer , "prompt-role-3" , func (spec * types.RoleSpecV6 ) {
4452
+ spec .Options .RequestPrompt = "B test prompt"
4453
+ })
4454
+ globalPromptRole4 := testCreateRole (t , testTLSServer , "prompt-role-4" , func (spec * types.RoleSpecV6 ) {
4455
+ spec .Options .RequestPrompt = "B test prompt"
4456
+ })
4457
+ globalPromptRole5 := testCreateRole (t , testTLSServer , "prompt-role-5" , func (spec * types.RoleSpecV6 ) {
4458
+ spec .Options .RequestPrompt = "C test prompt"
4459
+ })
4460
+
4461
+ requester , requesterClient := testCreateUserWithRoles (t , testTLSServer , "requester" ,
4462
+ someRoleRequesterRole .GetName (),
4463
+ globalPromptRole1 .GetName (),
4464
+ globalPromptRole2 .GetName (),
4465
+ globalPromptRole3 .GetName (),
4466
+ globalPromptRole4 .GetName (),
4467
+ globalPromptRole5 .GetName (),
4468
+ )
4469
+
4470
+ dryRunAccessRequest := testNewAccessRequest (t , requester .GetUsername (), someRole .GetName ())
4471
+ dryRunAccessRequest .SetDryRun (true )
4472
+
4473
+ resp , err := requesterClient .CreateAccessRequestV2 (ctx , dryRunAccessRequest )
4474
+ require .NoError (t , err )
4475
+
4476
+ require .NotNil (t , resp .GetDryRunEnrichment ())
4477
+ // check prompts
4478
+ require .Len (t , resp .GetDryRunEnrichment ().ReasonPrompts , 3 )
4479
+ require .Equal (t , "A test prompt" , resp .GetDryRunEnrichment ().ReasonPrompts [0 ])
4480
+ require .Equal (t , "B test prompt" , resp .GetDryRunEnrichment ().ReasonPrompts [1 ])
4481
+ require .Equal (t , "C test prompt" , resp .GetDryRunEnrichment ().ReasonPrompts [2 ])
4482
+ })
4483
+ }
4484
+
4315
4485
func TestCleanupNotifications (t * testing.T ) {
4316
4486
ctx , cancel := context .WithCancel (context .Background ())
4317
4487
t .Cleanup (cancel )
0 commit comments