diff --git a/server/me.go b/server/me.go index 469b025d71..b228a4b4d3 100644 --- a/server/me.go +++ b/server/me.go @@ -302,14 +302,17 @@ func (s *Service) Me(w http.ResponseWriter, r *http.Request) { func (s *Service) firstUser() bool { serverCtx := serverContext(context.Background()) - users, err := s.Store.Users(serverCtx).All(serverCtx) + numUsers, err := s.Store.Users(serverCtx).Num(serverCtx) if err != nil { return false } - return len(users) == 0 + return numUsers == 0 } func (s *Service) newUsersAreSuperAdmin() bool { + if s.firstUser() { + return true + } return !s.NewUsersNotSuperAdmin } diff --git a/server/me_test.go b/server/me_test.go index 7716ee6131..a6435101d3 100644 --- a/server/me_test.go +++ b/server/me_test.go @@ -79,9 +79,9 @@ func TestService_Me(t *testing.T) { }, }, UsersStore: &mocks.UsersStore{ - AllF: func(ctx context.Context) ([]chronograf.User, error) { + NumF: func(ctx context.Context) (int, error) { // This function gets to verify that there is at least one first user - return []chronograf.User{{}}, nil + return 1, nil }, GetF: func(ctx context.Context, q chronograf.UserQuery) (*chronograf.User, error) { if q.Name == nil || q.Provider == nil || q.Scheme == nil { @@ -144,6 +144,10 @@ func TestService_Me(t *testing.T) { }, }, UsersStore: &mocks.UsersStore{ + NumF: func(ctx context.Context) (int, error) { + // This function gets to verify that there is at least one first user + return 1, nil + }, GetF: func(ctx context.Context, q chronograf.UserQuery) (*chronograf.User, error) { if q.Name == nil || q.Provider == nil || q.Scheme == nil { return nil, fmt.Errorf("Invalid user query: missing Name, Provider, and/or Scheme") @@ -197,6 +201,10 @@ func TestService_Me(t *testing.T) { }, }, UsersStore: &mocks.UsersStore{ + NumF: func(ctx context.Context) (int, error) { + // This function gets to verify that there is at least one first user + return 1, nil + }, GetF: func(ctx context.Context, q chronograf.UserQuery) (*chronograf.User, error) { if q.Name == nil || q.Provider == nil || q.Scheme == nil { return nil, fmt.Errorf("Invalid user query: missing Name, Provider, and/or Scheme") @@ -221,7 +229,7 @@ func TestService_Me(t *testing.T) { `, }, { - name: "New user - New users not super admin", + name: "New user - New users not super admin, not first user", args: args{ w: httptest.NewRecorder(), r: httptest.NewRequest("GET", "http://example.com/foo", nil), @@ -249,6 +257,10 @@ func TestService_Me(t *testing.T) { }, }, UsersStore: &mocks.UsersStore{ + NumF: func(ctx context.Context) (int, error) { + // This function gets to verify that there is at least one first user + return 1, nil + }, GetF: func(ctx context.Context, q chronograf.UserQuery) (*chronograf.User, error) { if q.Name == nil || q.Provider == nil || q.Scheme == nil { return nil, fmt.Errorf("Invalid user query: missing Name, Provider, and/or Scheme") @@ -270,6 +282,62 @@ func TestService_Me(t *testing.T) { wantStatus: http.StatusOK, wantContentType: "application/json", wantBody: `{"name":"secret","roles":[{"name":"viewer","organization":"0"}],"provider":"auth0","scheme":"oauth2","links":{"self":"/chronograf/v1/users/0"},"organizations":[{"id":"0","name":"The Gnarly Default","public":true,"defaultRole":"viewer"}],"currentOrganization":{"id":"0","name":"The Gnarly Default","public":true,"defaultRole":"viewer"}} +`, + }, + { + name: "New user - New users not super admin, first user", + args: args{ + w: httptest.NewRecorder(), + r: httptest.NewRequest("GET", "http://example.com/foo", nil), + }, + fields: fields{ + UseAuth: true, + NewUsersNotSuperAdmin: true, + Logger: log.New(log.DebugLevel), + OrganizationsStore: &mocks.OrganizationsStore{ + DefaultOrganizationF: func(ctx context.Context) (*chronograf.Organization, error) { + return &chronograf.Organization{ + ID: 0, + Name: "The Gnarly Default", + DefaultRole: roles.ViewerRoleName, + Public: true, + }, nil + }, + GetF: func(ctx context.Context, q chronograf.OrganizationQuery) (*chronograf.Organization, error) { + return &chronograf.Organization{ + ID: 0, + Name: "The Gnarly Default", + DefaultRole: roles.ViewerRoleName, + Public: true, + }, nil + }, + }, + UsersStore: &mocks.UsersStore{ + NumF: func(ctx context.Context) (int, error) { + // This function gets to verify that there is at least one first user + return 0, nil + }, + GetF: func(ctx context.Context, q chronograf.UserQuery) (*chronograf.User, error) { + if q.Name == nil || q.Provider == nil || q.Scheme == nil { + return nil, fmt.Errorf("Invalid user query: missing Name, Provider, and/or Scheme") + } + return nil, chronograf.ErrUserNotFound + }, + AddF: func(ctx context.Context, u *chronograf.User) (*chronograf.User, error) { + return u, nil + }, + UpdateF: func(ctx context.Context, u *chronograf.User) error { + return nil + }, + }, + }, + principal: oauth2.Principal{ + Subject: "secret", + Issuer: "auth0", + }, + wantStatus: http.StatusOK, + wantContentType: "application/json", + wantBody: `{"name":"secret","superAdmin":true,"roles":[{"name":"viewer","organization":"0"}],"provider":"auth0","scheme":"oauth2","links":{"self":"/chronograf/v1/users/0"},"organizations":[{"id":"0","name":"The Gnarly Default","public":true,"defaultRole":"viewer"}],"currentOrganization":{"id":"0","name":"The Gnarly Default","public":true,"defaultRole":"viewer"}} `, }, { @@ -297,6 +365,10 @@ func TestService_Me(t *testing.T) { }, }, UsersStore: &mocks.UsersStore{ + NumF: func(ctx context.Context) (int, error) { + // This function gets to verify that there is at least one first user + return 1, nil + }, GetF: func(ctx context.Context, q chronograf.UserQuery) (*chronograf.User, error) { return nil, chronograf.ErrUserNotFound }, @@ -370,9 +442,9 @@ func TestService_Me(t *testing.T) { }, }, UsersStore: &mocks.UsersStore{ - AllF: func(ctx context.Context) ([]chronograf.User, error) { + NumF: func(ctx context.Context) (int, error) { // This function gets to verify that there is at least one first user - return []chronograf.User{{}}, nil + return 1, nil }, GetF: func(ctx context.Context, q chronograf.UserQuery) (*chronograf.User, error) { if q.Name == nil || q.Provider == nil || q.Scheme == nil {