From d45fe6e25c310e97fc7f318bf80901e3779f01d7 Mon Sep 17 00:00:00 2001 From: Todd Treece <360020+toddtreece@users.noreply.github.com> Date: Thu, 3 Nov 2022 09:03:29 -0400 Subject: [PATCH] Chore: Add NewAnonymousSignedInUser to user service (#57537) --- pkg/services/user/user.go | 1 + pkg/services/user/userimpl/user.go | 26 ++++++++++++++++++ pkg/services/user/userimpl/user_test.go | 36 +++++++++++++++++++++++++ pkg/services/user/usertest/fake.go | 4 +++ 4 files changed, 67 insertions(+) diff --git a/pkg/services/user/user.go b/pkg/services/user/user.go index ecf19c6bfc4..b66962c48f9 100644 --- a/pkg/services/user/user.go +++ b/pkg/services/user/user.go @@ -16,6 +16,7 @@ type Service interface { SetUsingOrg(context.Context, *SetUsingOrgCommand) error GetSignedInUserWithCacheCtx(context.Context, *GetSignedInUserQuery) (*SignedInUser, error) GetSignedInUser(context.Context, *GetSignedInUserQuery) (*SignedInUser, error) + NewAnonymousSignedInUser(context.Context) (*SignedInUser, error) Search(context.Context, *SearchUsersQuery) (*SearchUserQueryResult, error) Disable(context.Context, *DisableUserCommand) error BatchDisableUsers(context.Context, *BatchDisableUsersCommand) error diff --git a/pkg/services/user/userimpl/user.go b/pkg/services/user/userimpl/user.go index 2325fc64522..96dab700d94 100644 --- a/pkg/services/user/userimpl/user.go +++ b/pkg/services/user/userimpl/user.go @@ -9,6 +9,7 @@ import ( "github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/localcache" "github.com/grafana/grafana/pkg/models" + "github.com/grafana/grafana/pkg/models/roletype" ac "github.com/grafana/grafana/pkg/services/accesscontrol" "github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/team" @@ -254,6 +255,31 @@ func (s *Service) GetSignedInUser(ctx context.Context, query *user.GetSignedInUs return signedInUser, err } +func (s *Service) NewAnonymousSignedInUser(ctx context.Context) (*user.SignedInUser, error) { + if !s.cfg.AnonymousEnabled { + return nil, fmt.Errorf("anonymous access is disabled") + } + + usr := &user.SignedInUser{ + IsAnonymous: true, + OrgRole: roletype.RoleType(s.cfg.AnonymousOrgRole), + } + + if s.cfg.AnonymousOrgName == "" { + return usr, nil + } + + getOrg := org.GetOrgByNameQuery{Name: s.cfg.AnonymousOrgName} + anonymousOrg, err := s.orgService.GetByName(ctx, &getOrg) + if err != nil { + return nil, err + } + + usr.OrgID = anonymousOrg.ID + usr.OrgName = anonymousOrg.Name + return usr, nil +} + func (s *Service) Search(ctx context.Context, query *user.SearchUsersQuery) (*user.SearchUserQueryResult, error) { return s.store.Search(ctx, query) } diff --git a/pkg/services/user/userimpl/user_test.go b/pkg/services/user/userimpl/user_test.go index c6611fe2ae5..a371c74789d 100644 --- a/pkg/services/user/userimpl/user_test.go +++ b/pkg/services/user/userimpl/user_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/grafana/grafana/pkg/infra/localcache" + "github.com/grafana/grafana/pkg/models/roletype" "github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/org/orgtest" "github.com/grafana/grafana/pkg/services/team/teamtest" @@ -126,6 +127,41 @@ func TestUserService(t *testing.T) { require.NotNil(t, result2) assert.Equal(t, query2.OrgID, result2.OrgID) }) + + t.Run("NewAnonymousSignedInUser", func(t *testing.T) { + t.Run("should error when anonymous access is disabled", func(t *testing.T) { + userService.cfg = setting.NewCfg() + userService.cfg.AnonymousEnabled = false + _, err := userService.NewAnonymousSignedInUser(context.Background()) + require.Error(t, err) + }) + + t.Run("should return user when anonymous access is enabled and org is not set", func(t *testing.T) { + userService.cfg = setting.NewCfg() + userService.cfg.AnonymousEnabled = true + u, err := userService.NewAnonymousSignedInUser(context.Background()) + require.NoError(t, err) + require.Equal(t, true, u.IsAnonymous) + require.Equal(t, int64(0), u.UserID) + require.Equal(t, "", u.OrgName) + require.Equal(t, roletype.RoleType(""), u.OrgRole) + }) + + t.Run("should return user with org info when anonymous access is enabled and org is set", func(t *testing.T) { + userService.cfg = setting.NewCfg() + userService.cfg.AnonymousEnabled = true + userService.cfg.AnonymousOrgName = "anonymous" + userService.cfg.AnonymousOrgRole = "anonymous" + orgService.ExpectedOrg = &org.Org{Name: "anonymous", ID: 123} + u, err := userService.NewAnonymousSignedInUser(context.Background()) + require.NoError(t, err) + require.Equal(t, true, u.IsAnonymous) + require.Equal(t, int64(0), u.UserID) + require.Equal(t, orgService.ExpectedOrg.ID, u.OrgID) + require.Equal(t, orgService.ExpectedOrg.Name, u.OrgName) + require.Equal(t, roletype.RoleType(userService.cfg.AnonymousOrgRole), u.OrgRole) + }) + }) } type FakeUserStore struct { diff --git a/pkg/services/user/usertest/fake.go b/pkg/services/user/usertest/fake.go index 009d6185fbe..0041dd9e8d3 100644 --- a/pkg/services/user/usertest/fake.go +++ b/pkg/services/user/usertest/fake.go @@ -74,6 +74,10 @@ func (f *FakeUserService) GetSignedInUser(ctx context.Context, query *user.GetSi return f.ExpectedSignedInUser, f.ExpectedError } +func (f *FakeUserService) NewAnonymousSignedInUser(ctx context.Context) (*user.SignedInUser, error) { + return f.ExpectedSignedInUser, f.ExpectedError +} + func (f *FakeUserService) Search(ctx context.Context, query *user.SearchUsersQuery) (*user.SearchUserQueryResult, error) { return &f.ExpectedSearchUsers, f.ExpectedError }