From f77fb432a667ab670fcd116654336031dabed071 Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Mon, 23 Jul 2018 14:00:35 +0200 Subject: [PATCH] upd(rbac): full sessions impl and tests --- rbac/sessions.go | 46 ++++++++++++++++++++++++++++-- rbac/sessions_test.go | 66 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 105 insertions(+), 7 deletions(-) diff --git a/rbac/sessions.go b/rbac/sessions.go index fc5667e6c..f1e7a2069 100644 --- a/rbac/sessions.go +++ b/rbac/sessions.go @@ -13,9 +13,12 @@ type ( } SessionsInterface interface { - Create(sessionID string, username string, roles []string) error + Create(sessionID string, username string, roles ...string) error Get(sessionID string) (*types.Session, error) Delete(sessionID string) error + + ActivateRole(sessionID string, roles ...string) error + DeactivateRole(sessionID string, roles ...string) error } ) @@ -23,9 +26,11 @@ const ( sessionsCreate = "/sessions/%s" sessionsGet = "/sessions/%s" sessionsDelete = "/sessions/%s" + sessionsActivateRole = "/sessions/%s/activateRole" + sessionsDeactivateRole = "/sessions/%s/deactivateRole" ) -func (u *Sessions) Create(sessionID string, username string, roles []string) error { +func (u *Sessions) Create(sessionID string, username string, roles ...string) error { body := struct { Username string `json:"username"` Roles []string `json:"roles,omitempty"` @@ -73,4 +78,41 @@ func (u *Sessions) Delete(sessionID string) error { } } +func (u *Sessions) ActivateRole(sessionID string, roles ...string) error { + body := struct { + Roles []string `json:"roles"` + }{roles} + + resp, err := u.Client.Patch(fmt.Sprintf(sessionsActivateRole, sessionID), body) + if err != nil { + return errors.Wrap(err, "request failed") + } + defer resp.Body.Close() + switch resp.StatusCode { + case 200: + return nil + default: + return toError(resp) + } +} + +func (u *Sessions) DeactivateRole(sessionID string, roles ...string) error { + body := struct { + Roles []string `json:"roles"` + }{roles} + + resp, err := u.Client.Patch(fmt.Sprintf(sessionsDeactivateRole, sessionID), body) + if err != nil { + return errors.Wrap(err, "request failed") + } + defer resp.Body.Close() + switch resp.StatusCode { + case 200: + return nil + default: + return toError(resp) + } +} + + var _ SessionsInterface = &Sessions{} diff --git a/rbac/sessions_test.go b/rbac/sessions_test.go index 82b260cfc..e1ec34d2b 100644 --- a/rbac/sessions_test.go +++ b/rbac/sessions_test.go @@ -9,25 +9,81 @@ func TestSessions(t *testing.T) { if err != nil { t.Errorf("Unexpected error when creating RBAC instance: %+v", err) } - rbac.Debug(false) + rbac.Debug("info") sessions := rbac.Sessions() users := rbac.Users() + roles := rbac.Roles() // clean up data users.Delete("test-user") sessions.Delete("test-session") + roles.Delete("test-role") + + if err := roles.Create("test-role"); err != nil { + t.Errorf("Unexpected error when creating test-role, %+v", err) + return + } if err := users.Create("test-user", "test-password"); err != nil { t.Errorf("Unexpected error when creating test-user, %+v", err) return } - if err := sessions.Create("test-session", "test-user", []string{}); err != nil { - t.Errorf("Unexpected error when creating test-session, %+v", err) + + if err := users.Assign("test-user", "test-role"); err != nil { + t.Errorf("Unexpected error when assigning test-role to test-user, %+v", err) + return } - if _, err := sessions.Get("test-session"); err != nil { - t.Errorf("Unexpected error when getting test-session, %+v", err) + if err := sessions.Create("test-session", "test-user", "test-role"); err != nil { + t.Errorf("Unexpected error when creating test-session, %+v", err) + return + } + + // check role is created + { + session, err := sessions.Get("test-session") + assert(t, err == nil, "Unexpected error when getting test-session, %+v", err) + // @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) + if !assert(t, len(session.Roles) == 1, "Expected one session role, got %+v", session.Roles) { + return + } + assert(t, session.Roles[0] == "test-role", "Unexpected session role, test-role != '%s'", session.Roles[0]) + } + + if err := sessions.DeactivateRole("test-session", "test-role"); err != nil { + t.Errorf("Unexpected error when deactivating session role, %+v", err) + } + + // check role is deactivated + { + session, err := sessions.Get("test-session") + assert(t, err == nil, "Unexpected error when getting test-session, %+v", err) + // @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) + if !assert(t, len(session.Roles) == 0, "Expected one session role, got %+v", session.Roles) { + return + } + } + + if err := sessions.ActivateRole("test-session", "test-role"); err != nil { + t.Errorf("Unexpected error when deactivating session role, %+v", err) + } + + // check role is activated + { + session, err := sessions.Get("test-session") + assert(t, err == nil, "Unexpected error when getting test-session, %+v", err) + // @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) + if !assert(t, len(session.Roles) == 1, "Expected one session role, got %+v", session.Roles) { + return + } + assert(t, session.Roles[0] == "test-role", "Unexpected session role, test-role != '%s'", session.Roles[0]) } if err := sessions.Delete("test-session"); err != nil {