diff --git a/pkg/api/org_users_test.go b/pkg/api/org_users_test.go index f2bc6297baa..3634879e3f0 100644 --- a/pkg/api/org_users_test.go +++ b/pkg/api/org_users_test.go @@ -19,13 +19,12 @@ import ( "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/sqlstore" "github.com/grafana/grafana/pkg/services/sqlstore/mockstore" - "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/util" ) func setUpGetOrgUsersDB(t *testing.T, sqlStore *sqlstore.SQLStore) { - setting.AutoAssignOrg = true - setting.AutoAssignOrgId = int(testOrgID) + sqlStore.Cfg.AutoAssignOrg = true + sqlStore.Cfg.AutoAssignOrgId = int(testOrgID) _, err := sqlStore.CreateUser(context.Background(), models.CreateUserCommand{Email: "testUser@grafana.com", Login: testUserLogin}) require.NoError(t, err) diff --git a/pkg/services/dashboards/database/acl_test.go b/pkg/services/dashboards/database/acl_test.go index 159ccb90fc1..2e823bc57b0 100644 --- a/pkg/services/dashboards/database/acl_test.go +++ b/pkg/services/dashboards/database/acl_test.go @@ -6,7 +6,6 @@ import ( "github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/services/sqlstore" - "github.com/grafana/grafana/pkg/setting" "github.com/stretchr/testify/require" ) @@ -248,9 +247,9 @@ func TestIntegrationDashboardAclDataAccess(t *testing.T) { func createUser(t *testing.T, sqlStore *sqlstore.SQLStore, name string, role string, isAdmin bool) models.User { t.Helper() - setting.AutoAssignOrg = true - setting.AutoAssignOrgId = 1 - setting.AutoAssignOrgRole = role + sqlStore.Cfg.AutoAssignOrg = true + sqlStore.Cfg.AutoAssignOrgId = 1 + sqlStore.Cfg.AutoAssignOrgRole = role currentUserCmd := models.CreateUserCommand{Login: name, Email: name + "@test.com", Name: "a " + name, IsAdmin: isAdmin} currentUser, err := sqlStore.CreateUser(context.Background(), currentUserCmd) require.NoError(t, err) diff --git a/pkg/services/dashboards/database/database_test.go b/pkg/services/dashboards/database/database_test.go index c7c2c148e95..fedd4cd3726 100644 --- a/pkg/services/dashboards/database/database_test.go +++ b/pkg/services/dashboards/database/database_test.go @@ -18,7 +18,6 @@ import ( "github.com/grafana/grafana/pkg/services/sqlstore/searchstore" "github.com/grafana/grafana/pkg/services/star" "github.com/grafana/grafana/pkg/services/star/starimpl" - "github.com/grafana/grafana/pkg/setting" ) func TestIntegrationDashboardDataAccess(t *testing.T) { @@ -657,9 +656,9 @@ func insertTestRule(t *testing.T, sqlStore *sqlstore.SQLStore, foderOrgID int64, func CreateUser(t *testing.T, sqlStore *sqlstore.SQLStore, name string, role string, isAdmin bool) models.User { t.Helper() - setting.AutoAssignOrg = true - setting.AutoAssignOrgId = 1 - setting.AutoAssignOrgRole = role + sqlStore.Cfg.AutoAssignOrg = true + sqlStore.Cfg.AutoAssignOrgId = 1 + sqlStore.Cfg.AutoAssignOrgRole = role currentUserCmd := models.CreateUserCommand{Login: name, Email: name + "@test.com", Name: "a " + name, IsAdmin: isAdmin} currentUser, err := sqlStore.CreateUser(context.Background(), currentUserCmd) require.NoError(t, err) diff --git a/pkg/services/serviceaccounts/api/api_test.go b/pkg/services/serviceaccounts/api/api_test.go index 053903b08d0..9508f627c23 100644 --- a/pkg/services/serviceaccounts/api/api_test.go +++ b/pkg/services/serviceaccounts/api/api_test.go @@ -36,10 +36,10 @@ func TestServiceAccountsAPI_CreateServiceAccount(t *testing.T) { store := sqlstore.InitTestDB(t) svcmock := tests.ServiceAccountMock{} - autoAssignOrg := setting.AutoAssignOrg - setting.AutoAssignOrg = true + autoAssignOrg := store.Cfg.AutoAssignOrg + store.Cfg.AutoAssignOrg = true defer func() { - setting.AutoAssignOrg = autoAssignOrg + store.Cfg.AutoAssignOrg = autoAssignOrg }() orgCmd := &models.CreateOrgCommand{Name: "Some Test Org"} diff --git a/pkg/services/sqlstore/org.go b/pkg/services/sqlstore/org.go index af65873fb47..182c5ff12ff 100644 --- a/pkg/services/sqlstore/org.go +++ b/pkg/services/sqlstore/org.go @@ -7,7 +7,6 @@ import ( "github.com/grafana/grafana/pkg/events" "github.com/grafana/grafana/pkg/models" - "github.com/grafana/grafana/pkg/setting" "xorm.io/xorm" ) @@ -317,49 +316,3 @@ func (ss *SQLStore) getOrCreateOrg(sess *DBSession, orgName string) (int64, erro return org.Id, nil } - -func getOrCreateOrg(sess *DBSession, orgName string) (int64, error) { - var org models.Org - if setting.AutoAssignOrg { - has, err := sess.Where("id=?", setting.AutoAssignOrgId).Get(&org) - if err != nil { - return 0, err - } - if has { - return org.Id, nil - } - - if setting.AutoAssignOrgId != 1 { - sqlog.Error("Could not create user: organization ID does not exist", "orgID", - setting.AutoAssignOrgId) - return 0, fmt.Errorf("could not create user: organization ID %d does not exist", - setting.AutoAssignOrgId) - } - - org.Name = MainOrgName - org.Id = int64(setting.AutoAssignOrgId) - } else { - org.Name = orgName - } - - org.Created = time.Now() - org.Updated = time.Now() - - if org.Id != 0 { - if _, err := sess.InsertId(&org); err != nil { - return 0, err - } - } else { - if _, err := sess.InsertOne(&org); err != nil { - return 0, err - } - } - - sess.publishAfterCommit(&events.OrgCreated{ - Timestamp: org.Created, - Id: org.Id, - Name: org.Name, - }) - - return org.Id, nil -} diff --git a/pkg/services/sqlstore/org_test.go b/pkg/services/sqlstore/org_test.go index 9c498def546..9f866db87ec 100644 --- a/pkg/services/sqlstore/org_test.go +++ b/pkg/services/sqlstore/org_test.go @@ -11,7 +11,6 @@ import ( "github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/services/accesscontrol" - "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/util" ) @@ -78,9 +77,9 @@ func TestIntegrationAccountDataAccess(t *testing.T) { }) t.Run("Given single org mode", func(t *testing.T) { - setting.AutoAssignOrg = true - setting.AutoAssignOrgId = 1 - setting.AutoAssignOrgRole = "Viewer" + sqlStore.Cfg.AutoAssignOrg = true + sqlStore.Cfg.AutoAssignOrgId = 1 + sqlStore.Cfg.AutoAssignOrgRole = "Viewer" t.Run("Users should be added to default organization", func(t *testing.T) { ac1cmd := models.CreateUserCommand{Login: "ac1", Email: "ac1@test.com", Name: "ac1 name"} @@ -105,9 +104,9 @@ func TestIntegrationAccountDataAccess(t *testing.T) { t.Run("Given single org and 2 users inserted", func(t *testing.T) { sqlStore = InitTestDB(t) - setting.AutoAssignOrg = true - setting.AutoAssignOrgId = 1 - setting.AutoAssignOrgRole = "Viewer" + sqlStore.Cfg.AutoAssignOrg = true + sqlStore.Cfg.AutoAssignOrgId = 1 + sqlStore.Cfg.AutoAssignOrgRole = "Viewer" ac1cmd := models.CreateUserCommand{Login: "ac1", Email: "ac1@test.com", Name: "ac1 name"} ac2cmd := models.CreateUserCommand{Login: "ac2", Email: "ac2@test.com", Name: "ac2 name"} @@ -146,7 +145,7 @@ func TestIntegrationAccountDataAccess(t *testing.T) { t.Run("Given two saved users", func(t *testing.T) { sqlStore = InitTestDB(t) - setting.AutoAssignOrg = false + sqlStore.Cfg.AutoAssignOrg = false ac1cmd := models.CreateUserCommand{Login: "ac1", Email: "ac1@test.com", Name: "ac1 name"} ac2cmd := models.CreateUserCommand{Login: "ac2", Email: "ac2@test.com", Name: "ac2 name", IsAdmin: true} diff --git a/pkg/services/sqlstore/sqlstore.go b/pkg/services/sqlstore/sqlstore.go index dedafc95fbb..7dcf2143fd4 100644 --- a/pkg/services/sqlstore/sqlstore.go +++ b/pkg/services/sqlstore/sqlstore.go @@ -177,12 +177,12 @@ func (ss *SQLStore) ensureMainOrgAndAdminUser() error { // ensure admin user if !ss.Cfg.DisableInitAdminCreation { ss.log.Debug("Creating default admin user") - if _, err := ss.createUser(ctx, sess, userCreationArgs{ + if _, err := ss.createUser(ctx, sess, models.CreateUserCommand{ Login: ss.Cfg.AdminUser, Email: ss.Cfg.AdminUser + "@localhost", Password: ss.Cfg.AdminPassword, IsAdmin: true, - }, false); err != nil { + }); err != nil { return fmt.Errorf("failed to create admin user: %s", err) } diff --git a/pkg/services/sqlstore/user.go b/pkg/services/sqlstore/user.go index 51f68366bfb..9cd80da3967 100644 --- a/pkg/services/sqlstore/user.go +++ b/pkg/services/sqlstore/user.go @@ -11,51 +11,15 @@ import ( "github.com/grafana/grafana/pkg/events" "github.com/grafana/grafana/pkg/models" ac "github.com/grafana/grafana/pkg/services/accesscontrol" - "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/util" ) -func getOrgIdForNewUser(sess *DBSession, cmd models.CreateUserCommand) (int64, error) { - if cmd.SkipOrgSetup { - return -1, nil - } - - if setting.AutoAssignOrg && cmd.OrgId != 0 { - err := verifyExistingOrg(sess, cmd.OrgId) - if err != nil { +func (ss *SQLStore) getOrgIDForNewUser(sess *DBSession, args models.CreateUserCommand) (int64, error) { + if ss.Cfg.AutoAssignOrg && args.OrgId != 0 { + if err := verifyExistingOrg(sess, args.OrgId); err != nil { return -1, err } - return cmd.OrgId, nil - } - - orgName := cmd.OrgName - if len(orgName) == 0 { - orgName = util.StringsFallback2(cmd.Email, cmd.Login) - } - - return getOrCreateOrg(sess, orgName) -} - -type userCreationArgs struct { - Login string - Email string - Name string - Company string - Password string - IsAdmin bool - IsDisabled bool - EmailVerified bool - OrgID int64 - OrgName string - DefaultOrgRole string -} - -func (ss *SQLStore) getOrgIDForNewUser(sess *DBSession, args userCreationArgs) (int64, error) { - if ss.Cfg.AutoAssignOrg && args.OrgID != 0 { - if err := verifyExistingOrg(sess, args.OrgID); err != nil { - return -1, err - } - return args.OrgID, nil + return args.OrgId, nil } orgName := args.OrgName @@ -67,10 +31,10 @@ func (ss *SQLStore) getOrgIDForNewUser(sess *DBSession, args userCreationArgs) ( } // createUser creates a user in the database -func (ss *SQLStore) createUser(ctx context.Context, sess *DBSession, args userCreationArgs, skipOrgSetup bool) (models.User, error) { +func (ss *SQLStore) createUser(ctx context.Context, sess *DBSession, args models.CreateUserCommand) (models.User, error) { var user models.User var orgID int64 = -1 - if !skipOrgSetup { + if !args.SkipOrgSetup { var err error orgID, err = ss.getOrgIDForNewUser(sess, args) if err != nil { @@ -103,7 +67,7 @@ func (ss *SQLStore) createUser(ctx context.Context, sess *DBSession, args userCr Created: time.Now(), Updated: time.Now(), LastSeenAt: time.Now().AddDate(-10, 0, 0), - IsServiceAccount: false, + IsServiceAccount: args.IsServiceAccount, } salt, err := util.GetRandomString(10) @@ -140,7 +104,7 @@ func (ss *SQLStore) createUser(ctx context.Context, sess *DBSession, args userCr }) // create org user link - if !skipOrgSetup { + if !args.SkipOrgSetup { orgUser := models.OrgUser{ OrgId: orgID, UserId: user.Id, @@ -166,101 +130,12 @@ func (ss *SQLStore) createUser(ctx context.Context, sess *DBSession, args userCr } func (ss *SQLStore) CreateUser(ctx context.Context, cmd models.CreateUserCommand) (*models.User, error) { - var user *models.User - err := ss.WithTransactionalDbSession(ctx, func(sess *DBSession) error { - orgId, err := getOrgIdForNewUser(sess, cmd) - if err != nil { - return err - } - - if cmd.Email == "" { - cmd.Email = cmd.Login - } - - exists, err := sess.Where("email=? OR login=?", cmd.Email, cmd.Login).Get(&models.User{}) - if err != nil { - return err - } - if exists { - return models.ErrUserAlreadyExists - } - - // create user - user = &models.User{ - Email: cmd.Email, - Name: cmd.Name, - Login: cmd.Login, - Company: cmd.Company, - IsAdmin: cmd.IsAdmin, - IsDisabled: cmd.IsDisabled, - OrgId: orgId, - EmailVerified: cmd.EmailVerified, - Created: time.Now(), - Updated: time.Now(), - LastSeenAt: time.Now().AddDate(-10, 0, 0), - IsServiceAccount: cmd.IsServiceAccount, - } - - salt, err := util.GetRandomString(10) - if err != nil { - return err - } - user.Salt = salt - rands, err := util.GetRandomString(10) - if err != nil { - return err - } - user.Rands = rands - - if len(cmd.Password) > 0 { - encodedPassword, err := util.EncodePassword(cmd.Password, user.Salt) - if err != nil { - return err - } - user.Password = encodedPassword - } - - sess.UseBool("is_admin") - - if _, err := sess.Insert(user); err != nil { - return err - } - - sess.publishAfterCommit(&events.UserCreated{ - Timestamp: user.Created, - Id: user.Id, - Name: user.Name, - Login: user.Login, - Email: user.Email, - }) - - // create org user link - if !cmd.SkipOrgSetup { - orgUser := models.OrgUser{ - OrgId: orgId, - UserId: user.Id, - Role: models.ROLE_ADMIN, - Created: time.Now(), - Updated: time.Now(), - } - - if setting.AutoAssignOrg && !user.IsAdmin { - if len(cmd.DefaultOrgRole) > 0 { - orgUser.Role = models.RoleType(cmd.DefaultOrgRole) - } else { - orgUser.Role = models.RoleType(setting.AutoAssignOrgRole) - } - } - - if _, err = sess.Insert(&orgUser); err != nil { - return err - } - } - - return nil + var user models.User + createErr := ss.WithTransactionalDbSession(ctx, func(sess *DBSession) (err error) { + user, err = ss.createUser(ctx, sess, cmd) + return }) - - return user, err + return &user, createErr } func notServiceAccountFilter(ss *SQLStore) string { diff --git a/pkg/services/sqlstore/user_test.go b/pkg/services/sqlstore/user_test.go index 662fd67e11d..5377eec1635 100644 --- a/pkg/services/sqlstore/user_test.go +++ b/pkg/services/sqlstore/user_test.go @@ -6,7 +6,6 @@ import ( "testing" "github.com/grafana/grafana/pkg/models" - "github.com/grafana/grafana/pkg/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -74,10 +73,10 @@ func TestIntegrationUserDataAccess(t *testing.T) { t.Run("Testing DB - create user assigned to other organization", func(t *testing.T) { ss = InitTestDB(t) - autoAssignOrg := setting.AutoAssignOrg - setting.AutoAssignOrg = true + autoAssignOrg := ss.Cfg.AutoAssignOrg + ss.Cfg.AutoAssignOrg = true defer func() { - setting.AutoAssignOrg = autoAssignOrg + ss.Cfg.AutoAssignOrg = autoAssignOrg }() orgCmd := &models.CreateOrgCommand{Name: "Some Test Org"} diff --git a/pkg/tests/api/alerting/api_alertmanager_test.go b/pkg/tests/api/alerting/api_alertmanager_test.go index 705f882d9a9..4f3adaff6da 100644 --- a/pkg/tests/api/alerting/api_alertmanager_test.go +++ b/pkg/tests/api/alerting/api_alertmanager_test.go @@ -2743,6 +2743,9 @@ func rulesNamespaceWithoutVariableValues(t *testing.T, b []byte) (string, map[st func createUser(t *testing.T, store *sqlstore.SQLStore, cmd models.CreateUserCommand) int64 { t.Helper() + store.Cfg.AutoAssignOrg = true + store.Cfg.AutoAssignOrgId = 1 + u, err := store.CreateUser(context.Background(), cmd) require.NoError(t, err) return u.Id diff --git a/pkg/tests/api/dashboards/api_dashboards_test.go b/pkg/tests/api/dashboards/api_dashboards_test.go index 9292002ee36..421a1023e76 100644 --- a/pkg/tests/api/dashboards/api_dashboards_test.go +++ b/pkg/tests/api/dashboards/api_dashboards_test.go @@ -92,6 +92,10 @@ func TestDashboardQuota(t *testing.T) { func createUser(t *testing.T, store *sqlstore.SQLStore, cmd models.CreateUserCommand) int64 { t.Helper() + + store.Cfg.AutoAssignOrg = true + store.Cfg.AutoAssignOrgId = 1 + u, err := store.CreateUser(context.Background(), cmd) require.NoError(t, err) return u.Id diff --git a/pkg/tests/api/plugins/api_plugins_test.go b/pkg/tests/api/plugins/api_plugins_test.go index bf44d6202f4..a63281d4b0f 100644 --- a/pkg/tests/api/plugins/api_plugins_test.go +++ b/pkg/tests/api/plugins/api_plugins_test.go @@ -107,6 +107,9 @@ func TestPlugins(t *testing.T) { func createUser(t *testing.T, store *sqlstore.SQLStore, cmd models.CreateUserCommand) { t.Helper() + store.Cfg.AutoAssignOrg = true + store.Cfg.AutoAssignOrgId = 1 + _, err := store.CreateUser(context.Background(), cmd) require.NoError(t, err) }