From 5afc852d2b5892d78be1def179a96f7b6f0e4126 Mon Sep 17 00:00:00 2001 From: Marcos Lilljedahl Date: Tue, 5 Mar 2019 16:58:20 -0300 Subject: [PATCH] Add support to ban users from creating sessions --- handlers/new_session.go | 2 +- pwd/session.go | 4 ++++ pwd/session_test.go | 37 +++++++++++++++++++++++++++++++++++++ pwd/types/user.go | 1 + 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/handlers/new_session.go b/handlers/new_session.go index 1f01a39..59738bb 100644 --- a/handlers/new_session.go +++ b/handlers/new_session.go @@ -84,7 +84,7 @@ func NewSession(rw http.ResponseWriter, req *http.Request) { http.Redirect(rw, req, "/ooc", http.StatusFound) return } - log.Println(err) + log.Printf("%#v \n", err) http.Redirect(rw, req, "/500", http.StatusInternalServerError) return //TODO: Return some error code diff --git a/pwd/session.go b/pwd/session.go index 5e3ec20..d0a1fc7 100644 --- a/pwd/session.go +++ b/pwd/session.go @@ -47,6 +47,10 @@ type SessionSetupInstanceConf struct { func (p *pwd) SessionNew(ctx context.Context, config types.SessionConfig) (*types.Session, error) { defer observeAction("SessionNew", time.Now()) + if u, _ := p.storage.UserGet(config.UserId); u.IsBanned { + return nil, fmt.Errorf("User %s is banned\n", config.UserId) + } + s := &types.Session{} s.Id = p.generator.NewId() s.CreatedAt = time.Now() diff --git a/pwd/session_test.go b/pwd/session_test.go index ad8895b..6accba5 100644 --- a/pwd/session_test.go +++ b/pwd/session_test.go @@ -77,6 +77,43 @@ func TestSessionNew(t *testing.T) { _e.M.AssertExpectations(t) } +func TestSessionFailWhenUserIsBanned(t *testing.T) { + config.PWDContainerName = "pwd" + + _d := &docker.Mock{} + _f := &docker.FactoryMock{} + _s := &storage.Mock{} + _g := &id.MockGenerator{} + _e := &event.Mock{} + + ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_g, _f, _s)) + sp := provisioner.NewOverlaySessionProvisioner(_f) + + _g.On("NewId").Return("aaaabbbbcccc") + _f.On("GetForSession", mock.AnythingOfType("*types.Session")).Return(_d, nil) + _d.On("NetworkCreate", "aaaabbbbcccc", dtypes.NetworkCreate{Attachable: true, Driver: "overlay"}).Return(nil) + _d.On("DaemonHost").Return("localhost") + _d.On("NetworkConnect", config.L2ContainerName, "aaaabbbbcccc", "").Return("10.0.0.1", nil) + _s.On("SessionPut", mock.AnythingOfType("*types.Session")).Return(nil) + _s.On("UserGet", mock.Anything).Return(&types.User{IsBanned: true}, nil) + _s.On("SessionCount").Return(1, nil) + _s.On("InstanceCount").Return(0, nil) + _s.On("ClientCount").Return(0, nil) + + var nilArgs []interface{} + _e.M.On("Emit", event.SESSION_NEW, "aaaabbbbcccc", nilArgs).Return() + + p := NewPWD(_f, _e, _s, sp, ipf) + p.generator = _g + + playground := &types.Playground{Id: "foobar"} + sConfig := types.SessionConfig{Playground: playground, UserId: "", Duration: time.Hour, Stack: "", StackName: "", ImageName: ""} + s, e := p.SessionNew(context.Background(), sConfig) + assert.NotNil(t, e) + assert.Nil(t, s) + assert.Contains(t, e.Error(), "banned") +} + /* ************************** Not sure how to test this as it can pick any manager as the first node in the swarm cluster. diff --git a/pwd/types/user.go b/pwd/types/user.go index ccabcd5..9516dda 100644 --- a/pwd/types/user.go +++ b/pwd/types/user.go @@ -7,6 +7,7 @@ type User struct { Avatar string `json:"avatar" bson:"avatar"` Provider string `json:"provider" bson:"provider"` Email string `json:"email" bson:"email"` + IsBanned bool `json:"banned" bson:"banned"` } type LoginRequest struct {