From 51b36d7bc721862d63be84d8ba397573bc5c34ef Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Mon, 23 Jul 2018 14:26:07 +0200 Subject: [PATCH] upd(rbac): test nested roles, get role info --- rbac/roles.go | 32 ++++++++++++++++++++++++++------ rbac/roles_test.go | 16 ++++++++++++++++ rbac/types/structs.go | 8 ++++++++ 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/rbac/roles.go b/rbac/roles.go index 3e7d9749e..5ccbff150 100644 --- a/rbac/roles.go +++ b/rbac/roles.go @@ -2,7 +2,9 @@ package rbac import ( "fmt" + "encoding/json" "github.com/pkg/errors" + "github.com/crusttech/crust/rbac/types" ) type ( @@ -11,18 +13,20 @@ type ( } RolesInterface interface { - Create(role string) error - Delete(role string) error + Create(rolepath string) error + Delete(rolepath string) error + Get(rolepath string) (*types.Role, error) } ) const ( rolesCreate = "/roles/%s" + rolesGet = "/roles/%s" rolesDelete = "/roles/%s" ) -func (u *Roles) Create(role string) error { - resp, err := u.Client.Post(fmt.Sprintf(rolesCreate, role), nil) +func (u *Roles) Create(rolepath string) error { + resp, err := u.Client.Post(fmt.Sprintf(rolesCreate, rolepath), nil) if err != nil { return errors.Wrap(err, "request failed") } @@ -35,8 +39,23 @@ func (u *Roles) Create(role string) error { } } -func (u *Roles) Delete(role string) error { - resp, err := u.Client.Delete(fmt.Sprintf(rolesDelete, role)) +func (u *Roles) Get(rolepath string) (*types.Role, error) { + resp, err := u.Client.Get(fmt.Sprintf(rolesDelete, rolepath)) + if err != nil { + return nil, errors.Wrap(err, "request failed") + } + defer resp.Body.Close() + switch resp.StatusCode { + case 200: + role := &types.Role{} + return role, errors.Wrap(json.NewDecoder(resp.Body).Decode(role), "decoding json failed") + default: + return nil, toError(resp) + } +} + +func (u *Roles) Delete(rolepath string) error { + resp, err := u.Client.Delete(fmt.Sprintf(rolesDelete, rolepath)) if err != nil { return errors.Wrap(err, "request failed") } @@ -49,4 +68,5 @@ func (u *Roles) Delete(role string) error { } } + var _ RolesInterface = &Roles{} diff --git a/rbac/roles_test.go b/rbac/roles_test.go index aed5354a9..64d8e8e2b 100644 --- a/rbac/roles_test.go +++ b/rbac/roles_test.go @@ -18,6 +18,22 @@ func TestRoles(t *testing.T) { t.Errorf("Error when creating test-role: %+v", err) } + if err := roles.Create("test-role/nested/role"); err == nil { + t.Errorf("Expected error when creating deep nested role, got nil") + return + } + + if err := roles.Create("test-role/nested"); err != nil { + t.Errorf("Expected error when creating deep nested role, got nil") + return + } + + { + role, err := roles.Get("test-role") + assert(t, err == nil, "Unexpected error when getting role, %+v", err) + assert(t, role.Name == "test-role", "Unexpected role name, test-role != '%s'", role.Name) + } + if err := roles.Delete("test-role"); err != nil { t.Errorf("Error when deleting test-role: %+v", err) } diff --git a/rbac/types/structs.go b/rbac/types/structs.go index 2a0fe5335..7fccd7a3e 100644 --- a/rbac/types/structs.go +++ b/rbac/types/structs.go @@ -12,4 +12,12 @@ type ( Username string `json:"username"` Roles []string `json:"roles"` } + + // @todo: need to list nested roles, + // @todo: don't return users=null - return users: []? + Role struct { + Name string `json:"rolename"` + Users []string `json:"users"` + Permissions []string `json:"users"` + } )