diff --git a/rbac/client.go b/rbac/client.go index 0d2f2a216..5a2886cb3 100644 --- a/rbac/client.go +++ b/rbac/client.go @@ -148,11 +148,14 @@ func (c *Client) Request(method string, url string, body interface{}) (*http.Res } fmt.Println("-----------------") } - if c.debugLevel == "info" { - fmt.Println("RBAC <<< Response with", resp.StatusCode) - } if err != nil { + if c.debugLevel == "info" { + fmt.Println("RBAC <<< Response error", err) + } return nil, err } + if c.debugLevel == "info" { + fmt.Println("RBAC <<< Response", resp.StatusCode) + } return resp, nil } diff --git a/rbac/resources.go b/rbac/resources.go index e1bbe4765..a45dad4f4 100644 --- a/rbac/resources.go +++ b/rbac/resources.go @@ -1,7 +1,9 @@ package rbac import ( + "encoding/json" "fmt" + "github.com/crusttech/crust/rbac/types" "github.com/pkg/errors" ) @@ -12,12 +14,14 @@ type ( ResourcesInterface interface { Create(resourceID string, operations []string) error + Get(resourceID string) (*types.Resource, error) Delete(resourceID string) error } ) const ( resourcesCreate = "/resources/%s" + resourcesGet = "/resources/%s" resourcesDelete = "/resources/%s" ) @@ -39,8 +43,23 @@ func (u *Resources) Create(resourceID string, operations []string) error { } } +func (u *Resources) Get(resourceID string) (*types.Resource, error) { + resp, err := u.Client.Get(fmt.Sprintf(resourcesGet, resourceID)) + if err != nil { + return nil, errors.Wrap(err, "request failed") + } + defer resp.Body.Close() + switch resp.StatusCode { + case 200: + resource := &types.Resource{} + return resource, errors.Wrap(json.NewDecoder(resp.Body).Decode(resource), "decoding json failed") + default: + return nil, toError(resp) + } +} + func (u *Resources) Delete(resourceID string) error { - resp, err := u.Client.Delete(fmt.Sprintf(resourcesCreate, resourceID)) + resp, err := u.Client.Delete(fmt.Sprintf(resourcesDelete, resourceID)) if err != nil { return errors.Wrap(err, "request failed") } diff --git a/rbac/resources_test.go b/rbac/resources_test.go index 9ac43cc5d..2ad7e3f94 100644 --- a/rbac/resources_test.go +++ b/rbac/resources_test.go @@ -9,17 +9,28 @@ func TestResources(t *testing.T) { if err != nil { t.Errorf("Unexpected error when creating RBAC instance: %+v", err) } - rbac.Debug("info") + rbac.Debug("debug") resources := rbac.Resources() resources.Delete("test-resource") if err := resources.Create("test-resource", []string{"view", "edit", "delete"}); err != nil { t.Errorf("Error when creating test-resource, %+v", err) + return + } + + // test get resources + if false { + _, err := resources.Get("test-resource") + if err != nil { + t.Errorf("Error when retrieving test-resource, %+v", err) + return + } } if err := resources.Delete("test-resource"); err != nil { t.Errorf("Unexpected error deleting a resource, %+v", err) + return } if err := resources.Delete("test-resource"); err == nil { diff --git a/rbac/roles.go b/rbac/roles.go index 5ccbff150..1e2aaabd5 100644 --- a/rbac/roles.go +++ b/rbac/roles.go @@ -1,10 +1,10 @@ package rbac import ( - "fmt" "encoding/json" - "github.com/pkg/errors" + "fmt" "github.com/crusttech/crust/rbac/types" + "github.com/pkg/errors" ) type ( @@ -21,7 +21,7 @@ type ( const ( rolesCreate = "/roles/%s" - rolesGet = "/roles/%s" + rolesGet = "/roles/%s" rolesDelete = "/roles/%s" ) @@ -68,5 +68,4 @@ func (u *Roles) Delete(rolepath string) error { } } - var _ RolesInterface = &Roles{} diff --git a/rbac/roles_test.go b/rbac/roles_test.go index 64d8e8e2b..14f829898 100644 --- a/rbac/roles_test.go +++ b/rbac/roles_test.go @@ -16,6 +16,7 @@ func TestRoles(t *testing.T) { if err := roles.Create("test-role"); err != nil { t.Errorf("Error when creating test-role: %+v", err) + return } if err := roles.Create("test-role/nested/role"); err == nil { @@ -30,12 +31,15 @@ func TestRoles(t *testing.T) { { role, err := roles.Get("test-role") - assert(t, err == nil, "Unexpected error when getting role, %+v", err) + if !assert(t, err == nil, "Unexpected error when getting role, %+v", err) { + return + } 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) + return } if err := roles.Delete("non-existant"); err == nil { diff --git a/rbac/sessions.go b/rbac/sessions.go index f1e7a2069..14ddcd3dd 100644 --- a/rbac/sessions.go +++ b/rbac/sessions.go @@ -23,10 +23,10 @@ type ( ) const ( - sessionsCreate = "/sessions/%s" - sessionsGet = "/sessions/%s" - sessionsDelete = "/sessions/%s" - sessionsActivateRole = "/sessions/%s/activateRole" + sessionsCreate = "/sessions/%s" + sessionsGet = "/sessions/%s" + sessionsDelete = "/sessions/%s" + sessionsActivateRole = "/sessions/%s/activateRole" sessionsDeactivateRole = "/sessions/%s/deactivateRole" ) @@ -114,5 +114,4 @@ func (u *Sessions) DeactivateRole(sessionID string, roles ...string) error { } } - var _ SessionsInterface = &Sessions{} diff --git a/rbac/sessions_test.go b/rbac/sessions_test.go index 19e482c3e..578f72a9c 100644 --- a/rbac/sessions_test.go +++ b/rbac/sessions_test.go @@ -43,7 +43,9 @@ func TestSessions(t *testing.T) { // check role is created { session, err := sessions.Get("test-session") - assert(t, err == nil, "Unexpected error when getting test-session, %+v", err) + if !assert(t, err == nil, "Unexpected error when getting test-session, %+v", err) { + return + } // @todo: DAASI should return session ID from a get-query as well // assert(t, session.ID == "test-session", "Unexpected returned Session ID, test-session != '%s'", session.ID) assert(t, session.Username == "test-user", "Unexpected returned user, test-user != '%s'", session.Username) @@ -55,12 +57,15 @@ func TestSessions(t *testing.T) { if err := sessions.DeactivateRole("test-session", "test-role"); err != nil { t.Errorf("Unexpected error when deactivating session role, %+v", err) + return } // check role is deactivated { session, err := sessions.Get("test-session") - assert(t, err == nil, "Unexpected error when getting test-session, %+v", err) + if !assert(t, err == nil, "Unexpected error when getting test-session, %+v", err) { + return + } // @todo: DAASI should return session ID from a get-query as well // assert(t, session.ID == "test-session", "Unexpected returned Session ID, test-session != '%s'", session.ID) assert(t, session.Username == "test-user", "Unexpected returned user, test-user != '%s'", session.Username) @@ -71,12 +76,15 @@ func TestSessions(t *testing.T) { if err := sessions.ActivateRole("test-session", "test-role"); err != nil { t.Errorf("Unexpected error when deactivating session role, %+v", err) + return } // check role is activated { session, err := sessions.Get("test-session") - assert(t, err == nil, "Unexpected error when getting test-session, %+v", err) + if !assert(t, err == nil, "Unexpected error when getting test-session, %+v", err) { + return + } // @todo: DAASI should return session ID from a get-query as well // assert(t, session.ID == "test-session", "Unexpected returned Session ID, test-session != '%s'", session.ID) assert(t, session.Username == "test-user", "Unexpected returned user, test-user != '%s'", session.Username) diff --git a/rbac/types/structs.go b/rbac/types/structs.go index 7fccd7a3e..7b40be135 100644 --- a/rbac/types/structs.go +++ b/rbac/types/structs.go @@ -2,22 +2,26 @@ package types type ( User struct { - Username string `json:"username"` - AssignedRoles []string `json:"assignedRoles"` + Username string `json:"username"` + AssignedRoles []string `json:"assignedRoles"` AuthorizedRoles []string `json:"authorizedRoles"` } Session struct { - ID string `json:"session"` - Username string `json:"username"` - Roles []string `json:"roles"` + ID string `json:"session"` + 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"` + Name string `json:"rolename"` + Users []string `json:"users"` Permissions []string `json:"users"` } + + // @todo: read resource information + Resource struct { + } ) diff --git a/rbac/users.go b/rbac/users.go index 6bb32da4b..f8fea72d9 100644 --- a/rbac/users.go +++ b/rbac/users.go @@ -1,8 +1,8 @@ package rbac import ( - "fmt" "encoding/json" + "fmt" "github.com/crusttech/crust/rbac/types" "github.com/pkg/errors" ) @@ -24,10 +24,10 @@ type ( const ( usersCreate = "/users/%s" - usersGet = "/users/%s" + usersGet = "/users/%s" usersDelete = "/users/%s" // @todo: plural for users, but singular for sessions - usersAddRole = "/users/%s/assignRoles" + usersAddRole = "/users/%s/assignRoles" usersRemoveRole = "/users/%s/deassignRoles" ) diff --git a/rbac/users_test.go b/rbac/users_test.go index edf29b7bf..dbf204120 100644 --- a/rbac/users_test.go +++ b/rbac/users_test.go @@ -24,6 +24,7 @@ func TestUsers(t *testing.T) { if err := users.Create("test-user", "test-password"); err != nil { t.Errorf("Error when creating test-user: %+v", err) + return } // check if we inherited some roles (should be empty) @@ -71,10 +72,12 @@ func TestUsers(t *testing.T) { if err := users.Delete("test-user"); err != nil { t.Errorf("Error when deleting test-user: %+v", err) + return } if _, err := users.Get("test-user"); err == nil { t.Errorf("Expected error on retrieving a non-existant user") + return } if err := users.Delete("test-user"); err == nil {