Skip to content

Commit b3d74d1

Browse files
add admin additional role to mlp.project.post (#91)
* Update bootstrap.go * add bootstrap test * Update admin role to have default permission * update bootstrap test * edit bootstrap config and add test * update test name * fix long test name
1 parent cae72b7 commit b3d74d1

2 files changed

Lines changed: 99 additions & 10 deletions

File tree

api/cmd/bootstrap.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,14 @@ var (
3030
if err != nil {
3131
log.Panicf("unable to load role members from input file: %v", err)
3232
}
33-
err = startKetoBootstrap(bootstrapConfig)
33+
authEnforcer, err := enforcer.NewEnforcerBuilder().
34+
KetoEndpoints(bootstrapConfig.KetoRemoteRead, bootstrapConfig.KetoRemoteWrite).
35+
Build()
36+
if err != nil {
37+
log.Panicf("unable to create keto enforcer: %v", err)
38+
}
39+
40+
err = startKetoBootstrap(authEnforcer, bootstrapConfig.ProjectReaders, bootstrapConfig.MLPAdmins)
3441
if err != nil {
3542
log.Panicf("unable to bootstrap keto: %v", err)
3643
}
@@ -64,15 +71,11 @@ func loadBootstrapConfig(path string) (*BootstrapConfig, error) {
6471
return bootstrapCfg, nil
6572
}
6673

67-
func startKetoBootstrap(bootstrapCfg *BootstrapConfig) error {
68-
authEnforcer, err := enforcer.NewEnforcerBuilder().
69-
KetoEndpoints(bootstrapCfg.KetoRemoteRead, bootstrapCfg.KetoRemoteWrite).
70-
Build()
71-
if err != nil {
72-
return err
73-
}
74+
func startKetoBootstrap(authEnforcer enforcer.Enforcer, projectReaders []string, mlpAdmins []string) error {
75+
defaultMLPAdminPermissions := []string{"mlp.projects.post"}
7476
updateRequest := enforcer.NewAuthorizationUpdateRequest()
75-
updateRequest.SetRoleMembers(enforcer.MLPProjectsReaderRole, bootstrapCfg.ProjectReaders)
76-
updateRequest.SetRoleMembers(enforcer.MLPAdminRole, bootstrapCfg.MLPAdmins)
77+
updateRequest.SetRoleMembers(enforcer.MLPProjectsReaderRole, projectReaders)
78+
updateRequest.SetRoleMembers(enforcer.MLPAdminRole, mlpAdmins)
79+
updateRequest.AddRolePermissions(enforcer.MLPAdminRole, defaultMLPAdminPermissions)
7780
return authEnforcer.UpdateAuthorization(context.Background(), updateRequest)
7881
}

api/cmd/bootstrap_test.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package cmd
2+
3+
import (
4+
"testing"
5+
6+
"github.com/caraml-dev/mlp/api/pkg/authz/enforcer"
7+
enforcerMock "github.com/caraml-dev/mlp/api/pkg/authz/enforcer/mocks"
8+
"github.com/stretchr/testify/mock"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestStartKetoBootsrap(t *testing.T) {
13+
tests := []struct {
14+
name string
15+
projectReaders []string
16+
mlpAdmins []string
17+
expectedUpdateAuthorizationRequest enforcer.AuthorizationUpdateRequest
18+
}{
19+
{
20+
"admin role must have project post even there are no project readers",
21+
[]string{},
22+
[]string{"admin1"},
23+
enforcer.AuthorizationUpdateRequest{
24+
RolePermissions: map[string][]string{
25+
"mlp.administrator": {"mlp.projects.post"},
26+
},
27+
RoleMembers: map[string][]string{
28+
"mlp.projects.reader": {},
29+
"mlp.administrator": {"admin1"},
30+
},
31+
},
32+
},
33+
{
34+
"admin role should have project post, even there are no mlp admins or project readers",
35+
[]string{},
36+
[]string{},
37+
enforcer.AuthorizationUpdateRequest{
38+
RolePermissions: map[string][]string{
39+
"mlp.administrator": {"mlp.projects.post"},
40+
},
41+
RoleMembers: map[string][]string{
42+
"mlp.projects.reader": {},
43+
"mlp.administrator": {},
44+
},
45+
},
46+
},
47+
{
48+
"only admin role should have project post, even no mlp admins and project readers exist",
49+
[]string{"readers1", "readers2"},
50+
[]string{},
51+
enforcer.AuthorizationUpdateRequest{
52+
RolePermissions: map[string][]string{
53+
"mlp.administrator": {"mlp.projects.post"},
54+
},
55+
RoleMembers: map[string][]string{
56+
"mlp.projects.reader": {"readers1", "readers2"},
57+
"mlp.administrator": {},
58+
},
59+
},
60+
},
61+
{
62+
"only admin role should have project post, even project readers exist",
63+
[]string{"readers1", "readers2"},
64+
[]string{"admin1"},
65+
enforcer.AuthorizationUpdateRequest{
66+
RolePermissions: map[string][]string{
67+
"mlp.administrator": {"mlp.projects.post"},
68+
},
69+
RoleMembers: map[string][]string{
70+
"mlp.projects.reader": {"readers1", "readers2"},
71+
"mlp.administrator": {"admin1"},
72+
},
73+
},
74+
},
75+
}
76+
for _, tt := range tests {
77+
t.Run(tt.name, func(t *testing.T) {
78+
authEnforcer := &enforcerMock.Enforcer{}
79+
80+
authEnforcer.On("UpdateAuthorization", mock.Anything, tt.expectedUpdateAuthorizationRequest).Return(nil)
81+
err := startKetoBootstrap(authEnforcer, tt.projectReaders, tt.mlpAdmins)
82+
authEnforcer.AssertExpectations(t)
83+
require.NoError(t, err)
84+
})
85+
}
86+
}

0 commit comments

Comments
 (0)