| 
									
										
										
										
											2020-10-16 15:46:14 +08:00
										 |  |  | // +build integration
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-08 21:20:07 +08:00
										 |  |  | package sqlstore | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2018-06-16 03:23:57 +08:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2017-02-08 21:20:07 +08:00
										 |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-14 16:50:38 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/models" | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/setting" | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/require" | 
					
						
							| 
									
										
										
										
											2017-02-08 21:20:07 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestUserDataAccess(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	ss := InitTestDB(t) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("Testing DB - creates and loads user", func(t *testing.T) { | 
					
						
							|  |  |  | 		cmd := models.CreateUserCommand{ | 
					
						
							|  |  |  | 			Email: "usertest@test.com", | 
					
						
							|  |  |  | 			Name:  "user name", | 
					
						
							|  |  |  | 			Login: "user_test_login", | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		user, err := ss.CreateUser(context.Background(), cmd) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		query := models.GetUserByIdQuery{Id: user.Id} | 
					
						
							| 
									
										
										
										
											2021-06-21 13:51:33 +08:00
										 |  |  | 		err = GetUserById(context.Background(), &query) | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Equal(t, query.Result.Email, "usertest@test.com") | 
					
						
							|  |  |  | 		require.Equal(t, query.Result.Password, "") | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Rands, 10) | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Salt, 10) | 
					
						
							|  |  |  | 		require.False(t, query.Result.IsDisabled) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		query = models.GetUserByIdQuery{Id: user.Id} | 
					
						
							| 
									
										
										
										
											2021-06-21 13:51:33 +08:00
										 |  |  | 		err = GetUserById(context.Background(), &query) | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Equal(t, query.Result.Email, "usertest@test.com") | 
					
						
							|  |  |  | 		require.Equal(t, query.Result.Password, "") | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Rands, 10) | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Salt, 10) | 
					
						
							|  |  |  | 		require.False(t, query.Result.IsDisabled) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("Testing DB - creates and loads disabled user", func(t *testing.T) { | 
					
						
							|  |  |  | 		ss = InitTestDB(t) | 
					
						
							|  |  |  | 		cmd := models.CreateUserCommand{ | 
					
						
							|  |  |  | 			Email:      "usertest@test.com", | 
					
						
							|  |  |  | 			Name:       "user name", | 
					
						
							|  |  |  | 			Login:      "user_test_login", | 
					
						
							|  |  |  | 			IsDisabled: true, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		user, err := ss.CreateUser(context.Background(), cmd) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		query := models.GetUserByIdQuery{Id: user.Id} | 
					
						
							| 
									
										
										
										
											2021-06-21 13:51:33 +08:00
										 |  |  | 		err = GetUserById(context.Background(), &query) | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Equal(t, query.Result.Email, "usertest@test.com") | 
					
						
							|  |  |  | 		require.Equal(t, query.Result.Password, "") | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Rands, 10) | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Salt, 10) | 
					
						
							|  |  |  | 		require.True(t, query.Result.IsDisabled) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("Testing DB - create user assigned to other organization", func(t *testing.T) { | 
					
						
							|  |  |  | 		ss = InitTestDB(t) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		autoAssignOrg := setting.AutoAssignOrg | 
					
						
							|  |  |  | 		setting.AutoAssignOrg = true | 
					
						
							|  |  |  | 		defer func() { | 
					
						
							|  |  |  | 			setting.AutoAssignOrg = autoAssignOrg | 
					
						
							|  |  |  | 		}() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		orgCmd := &models.CreateOrgCommand{Name: "Some Test Org"} | 
					
						
							|  |  |  | 		err := CreateOrg(orgCmd) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		cmd := models.CreateUserCommand{ | 
					
						
							|  |  |  | 			Email: "usertest@test.com", | 
					
						
							|  |  |  | 			Name:  "user name", | 
					
						
							|  |  |  | 			Login: "user_test_login", | 
					
						
							|  |  |  | 			OrgId: orgCmd.Result.Id, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		user, err := ss.CreateUser(context.Background(), cmd) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		query := models.GetUserByIdQuery{Id: user.Id} | 
					
						
							| 
									
										
										
										
											2021-06-21 13:51:33 +08:00
										 |  |  | 		err = GetUserById(context.Background(), &query) | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Equal(t, query.Result.Email, "usertest@test.com") | 
					
						
							|  |  |  | 		require.Equal(t, query.Result.Password, "") | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Rands, 10) | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Salt, 10) | 
					
						
							|  |  |  | 		require.False(t, query.Result.IsDisabled) | 
					
						
							|  |  |  | 		require.Equal(t, query.Result.OrgId, orgCmd.Result.Id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		const nonExistingOrgID = 10000 | 
					
						
							|  |  |  | 		cmd = models.CreateUserCommand{ | 
					
						
							|  |  |  | 			Email: "usertest@test.com", | 
					
						
							|  |  |  | 			Name:  "user name", | 
					
						
							|  |  |  | 			Login: "user_test_login", | 
					
						
							|  |  |  | 			OrgId: nonExistingOrgID, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		_, err = ss.CreateUser(context.Background(), cmd) | 
					
						
							|  |  |  | 		require.Equal(t, err, models.ErrOrgNotFound) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("Testing DB - multiple users", func(t *testing.T) { | 
					
						
							|  |  |  | 		ss = InitTestDB(t) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-29 16:18:42 +08:00
										 |  |  | 		createFiveTestUsers(t, ss, func(i int) *models.CreateUserCommand { | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 			return &models.CreateUserCommand{ | 
					
						
							|  |  |  | 				Email:      fmt.Sprint("user", i, "@test.com"), | 
					
						
							|  |  |  | 				Name:       fmt.Sprint("user", i), | 
					
						
							|  |  |  | 				Login:      fmt.Sprint("loginuser", i), | 
					
						
							|  |  |  | 				IsDisabled: false, | 
					
						
							| 
									
										
										
										
											2018-08-21 19:30:39 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Return the first page of users and a total count
 | 
					
						
							|  |  |  | 		query := models.SearchUsersQuery{Query: "", Page: 1, Limit: 3} | 
					
						
							|  |  |  | 		err := SearchUsers(&query) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Users, 3) | 
					
						
							|  |  |  | 		require.EqualValues(t, query.Result.TotalCount, 5) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Return the second page of users and a total count
 | 
					
						
							|  |  |  | 		query = models.SearchUsersQuery{Query: "", Page: 2, Limit: 3} | 
					
						
							|  |  |  | 		err = SearchUsers(&query) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Users, 2) | 
					
						
							|  |  |  | 		require.EqualValues(t, query.Result.TotalCount, 5) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Return list of users matching query on user name
 | 
					
						
							|  |  |  | 		query = models.SearchUsersQuery{Query: "use", Page: 1, Limit: 3} | 
					
						
							|  |  |  | 		err = SearchUsers(&query) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Users, 3) | 
					
						
							|  |  |  | 		require.EqualValues(t, query.Result.TotalCount, 5) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		query = models.SearchUsersQuery{Query: "ser1", Page: 1, Limit: 3} | 
					
						
							|  |  |  | 		err = SearchUsers(&query) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Users, 1) | 
					
						
							|  |  |  | 		require.EqualValues(t, query.Result.TotalCount, 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		query = models.SearchUsersQuery{Query: "USER1", Page: 1, Limit: 3} | 
					
						
							|  |  |  | 		err = SearchUsers(&query) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Users, 1) | 
					
						
							|  |  |  | 		require.EqualValues(t, query.Result.TotalCount, 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		query = models.SearchUsersQuery{Query: "idontexist", Page: 1, Limit: 3} | 
					
						
							|  |  |  | 		err = SearchUsers(&query) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Users, 0) | 
					
						
							|  |  |  | 		require.EqualValues(t, query.Result.TotalCount, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Return list of users matching query on email
 | 
					
						
							|  |  |  | 		query = models.SearchUsersQuery{Query: "ser1@test.com", Page: 1, Limit: 3} | 
					
						
							|  |  |  | 		err = SearchUsers(&query) | 
					
						
							| 
									
										
										
										
											2018-08-21 19:30:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Users, 1) | 
					
						
							|  |  |  | 		require.EqualValues(t, query.Result.TotalCount, 1) | 
					
						
							| 
									
										
										
										
											2018-08-21 19:30:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		// Return list of users matching query on login name
 | 
					
						
							|  |  |  | 		query = models.SearchUsersQuery{Query: "loginuser1", Page: 1, Limit: 3} | 
					
						
							|  |  |  | 		err = SearchUsers(&query) | 
					
						
							| 
									
										
										
										
											2018-08-21 19:30:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Users, 1) | 
					
						
							|  |  |  | 		require.EqualValues(t, query.Result.TotalCount, 1) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("Testing DB - return list users based on their is_disabled flag", func(t *testing.T) { | 
					
						
							|  |  |  | 		ss = InitTestDB(t) | 
					
						
							|  |  |  | 		createFiveTestUsers(t, ss, func(i int) *models.CreateUserCommand { | 
					
						
							|  |  |  | 			return &models.CreateUserCommand{ | 
					
						
							|  |  |  | 				Email:      fmt.Sprint("user", i, "@test.com"), | 
					
						
							|  |  |  | 				Name:       fmt.Sprint("user", i), | 
					
						
							|  |  |  | 				Login:      fmt.Sprint("loginuser", i), | 
					
						
							|  |  |  | 				IsDisabled: i%2 == 0, | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-07-15 14:14:32 +08:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		isDisabled := false | 
					
						
							|  |  |  | 		query := models.SearchUsersQuery{IsDisabled: &isDisabled} | 
					
						
							|  |  |  | 		err := SearchUsers(&query) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Len(t, query.Result.Users, 2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		first, third := false, false | 
					
						
							|  |  |  | 		for _, user := range query.Result.Users { | 
					
						
							|  |  |  | 			if user.Name == "user1" { | 
					
						
							|  |  |  | 				first = true | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if user.Name == "user3" { | 
					
						
							|  |  |  | 				third = true | 
					
						
							| 
									
										
										
										
											2019-07-15 14:14:32 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.True(t, first) | 
					
						
							|  |  |  | 		require.True(t, third) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Re-init DB
 | 
					
						
							|  |  |  | 		ss = InitTestDB(t) | 
					
						
							|  |  |  | 		users := createFiveTestUsers(t, ss, func(i int) *models.CreateUserCommand { | 
					
						
							|  |  |  | 			return &models.CreateUserCommand{ | 
					
						
							|  |  |  | 				Email:      fmt.Sprint("user", i, "@test.com"), | 
					
						
							|  |  |  | 				Name:       fmt.Sprint("user", i), | 
					
						
							|  |  |  | 				Login:      fmt.Sprint("loginuser", i), | 
					
						
							|  |  |  | 				IsDisabled: false, | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2019-07-15 14:14:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		err = AddOrgUser(&models.AddOrgUserCommand{ | 
					
						
							|  |  |  | 			LoginOrEmail: users[1].Login, Role: models.ROLE_VIEWER, | 
					
						
							|  |  |  | 			OrgId: users[0].OrgId, UserId: users[1].Id, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							| 
									
										
										
										
											2019-07-15 14:14:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		err = testHelperUpdateDashboardAcl(t, ss, 1, models.DashboardAcl{ | 
					
						
							|  |  |  | 			DashboardID: 1, OrgID: users[0].OrgId, UserID: users[1].Id, | 
					
						
							|  |  |  | 			Permission: models.PERMISSION_EDIT, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							| 
									
										
										
										
											2019-07-15 14:14:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		err = SavePreferences(&models.SavePreferencesCommand{ | 
					
						
							|  |  |  | 			UserId: users[1].Id, OrgId: users[0].OrgId, HomeDashboardId: 1, Theme: "dark", | 
					
						
							| 
									
										
										
										
											2018-08-21 19:30:39 +08:00
										 |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		require.Nil(t, err) | 
					
						
							| 
									
										
										
										
											2018-08-21 19:30:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		// When the user is deleted
 | 
					
						
							|  |  |  | 		err = DeleteUser(&models.DeleteUserCommand{UserId: users[1].Id}) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							| 
									
										
										
										
											2020-04-15 17:11:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		query1 := &models.GetOrgUsersQuery{OrgId: users[0].OrgId} | 
					
						
							|  |  |  | 		err = GetOrgUsersForTest(query1) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							| 
									
										
										
										
											2020-04-15 17:11:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		require.Len(t, query1.Result, 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		permQuery := &models.GetDashboardAclInfoListQuery{DashboardID: 1, OrgID: users[0].OrgId} | 
					
						
							|  |  |  | 		err = GetDashboardAclInfoList(permQuery) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Len(t, permQuery.Result, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		prefsQuery := &models.GetPreferencesQuery{OrgId: users[0].OrgId, UserId: users[1].Id} | 
					
						
							|  |  |  | 		err = GetPreferences(prefsQuery) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.EqualValues(t, prefsQuery.Result.OrgId, 0) | 
					
						
							|  |  |  | 		require.EqualValues(t, prefsQuery.Result.UserId, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// A user is an org member and has been assigned permissions
 | 
					
						
							|  |  |  | 		// Re-init DB
 | 
					
						
							|  |  |  | 		ss = InitTestDB(t) | 
					
						
							|  |  |  | 		users = createFiveTestUsers(t, ss, func(i int) *models.CreateUserCommand { | 
					
						
							|  |  |  | 			return &models.CreateUserCommand{ | 
					
						
							|  |  |  | 				Email:      fmt.Sprint("user", i, "@test.com"), | 
					
						
							|  |  |  | 				Name:       fmt.Sprint("user", i), | 
					
						
							|  |  |  | 				Login:      fmt.Sprint("loginuser", i), | 
					
						
							|  |  |  | 				IsDisabled: false, | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		err = AddOrgUser(&models.AddOrgUserCommand{ | 
					
						
							|  |  |  | 			LoginOrEmail: users[1].Login, Role: models.ROLE_VIEWER, | 
					
						
							|  |  |  | 			OrgId: users[0].OrgId, UserId: users[1].Id, | 
					
						
							| 
									
										
										
										
											2020-04-15 17:11:45 +08:00
										 |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		require.Nil(t, err) | 
					
						
							| 
									
										
										
										
											2020-04-15 17:11:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		err = testHelperUpdateDashboardAcl(t, ss, 1, models.DashboardAcl{ | 
					
						
							|  |  |  | 			DashboardID: 1, OrgID: users[0].OrgId, UserID: users[1].Id, | 
					
						
							|  |  |  | 			Permission: models.PERMISSION_EDIT, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							| 
									
										
										
										
											2019-06-14 16:50:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		err = SavePreferences(&models.SavePreferencesCommand{ | 
					
						
							|  |  |  | 			UserId: users[1].Id, OrgId: users[0].OrgId, HomeDashboardId: 1, Theme: "dark", | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							| 
									
										
										
										
											2019-06-14 16:50:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		ss.CacheService.Flush() | 
					
						
							| 
									
										
										
										
											2019-06-14 16:50:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		query3 := &models.GetSignedInUserQuery{OrgId: users[1].OrgId, UserId: users[1].Id} | 
					
						
							| 
									
										
										
										
											2021-05-19 00:24:42 +08:00
										 |  |  | 		err = ss.GetSignedInUserWithCacheCtx(context.Background(), query3) | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 		require.NotNil(t, query3.Result) | 
					
						
							|  |  |  | 		require.Equal(t, query3.OrgId, users[1].OrgId) | 
					
						
							|  |  |  | 		err = SetUsingOrg(&models.SetUsingOrgCommand{UserId: users[1].Id, OrgId: users[0].OrgId}) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 		query4 := &models.GetSignedInUserQuery{OrgId: 0, UserId: users[1].Id} | 
					
						
							| 
									
										
										
										
											2021-05-19 00:24:42 +08:00
										 |  |  | 		err = ss.GetSignedInUserWithCacheCtx(context.Background(), query4) | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 		require.NotNil(t, query4.Result) | 
					
						
							|  |  |  | 		require.Equal(t, query4.Result.OrgId, users[0].OrgId) | 
					
						
							| 
									
										
										
										
											2019-06-14 16:50:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		cacheKey := newSignedInUserCacheKey(query4.Result.OrgId, query4.UserId) | 
					
						
							|  |  |  | 		_, found := ss.CacheService.Get(cacheKey) | 
					
						
							|  |  |  | 		require.True(t, found) | 
					
						
							| 
									
										
										
										
											2019-06-14 16:50:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		disableCmd := models.BatchDisableUsersCommand{ | 
					
						
							| 
									
										
										
										
											2021-04-21 16:22:46 +08:00
										 |  |  | 			UserIds:    []int64{users[0].Id, users[1].Id, users[2].Id, users[3].Id, users[4].Id}, | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 			IsDisabled: true, | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-07-15 14:14:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		err = BatchDisableUsers(&disableCmd) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		isDisabled = true | 
					
						
							|  |  |  | 		query5 := &models.SearchUsersQuery{IsDisabled: &isDisabled} | 
					
						
							|  |  |  | 		err = SearchUsers(query5) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 		require.EqualValues(t, query5.Result.TotalCount, 5) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// the user is deleted
 | 
					
						
							|  |  |  | 		err = DeleteUser(&models.DeleteUserCommand{UserId: users[1].Id}) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// delete connected org users and permissions
 | 
					
						
							|  |  |  | 		query2 := &models.GetOrgUsersQuery{OrgId: users[0].OrgId} | 
					
						
							|  |  |  | 		err = GetOrgUsersForTest(query2) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Len(t, query2.Result, 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		permQuery = &models.GetDashboardAclInfoListQuery{DashboardID: 1, OrgID: users[0].OrgId} | 
					
						
							|  |  |  | 		err = GetDashboardAclInfoList(permQuery) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Len(t, permQuery.Result, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		prefsQuery = &models.GetPreferencesQuery{OrgId: users[0].OrgId, UserId: users[1].Id} | 
					
						
							|  |  |  | 		err = GetPreferences(prefsQuery) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.EqualValues(t, prefsQuery.Result.OrgId, 0) | 
					
						
							|  |  |  | 		require.EqualValues(t, prefsQuery.Result.UserId, 0) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ss = InitTestDB(t) | 
					
						
							| 
									
										
										
										
											2020-06-03 21:28:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 	t.Run("Testing DB - enable all users", func(t *testing.T) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-21 16:22:46 +08:00
										 |  |  | 		users := createFiveTestUsers(t, ss, func(i int) *models.CreateUserCommand { | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 			return &models.CreateUserCommand{ | 
					
						
							|  |  |  | 				Email:      fmt.Sprint("user", i, "@test.com"), | 
					
						
							|  |  |  | 				Name:       fmt.Sprint("user", i), | 
					
						
							|  |  |  | 				Login:      fmt.Sprint("loginuser", i), | 
					
						
							|  |  |  | 				IsDisabled: true, | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-03-07 23:03:54 +08:00
										 |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2018-12-02 01:28:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		disableCmd := models.BatchDisableUsersCommand{ | 
					
						
							| 
									
										
										
										
											2021-04-21 16:22:46 +08:00
										 |  |  | 			UserIds:    []int64{users[0].Id, users[1].Id, users[2].Id, users[3].Id, users[4].Id}, | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 			IsDisabled: false, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		err := BatchDisableUsers(&disableCmd) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		isDisabled := false | 
					
						
							|  |  |  | 		query := &models.SearchUsersQuery{IsDisabled: &isDisabled} | 
					
						
							|  |  |  | 		err = SearchUsers(query) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 		require.EqualValues(t, query.Result.TotalCount, 5) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ss = InitTestDB(t) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("Testing DB - disable only specific users", func(t *testing.T) { | 
					
						
							|  |  |  | 		users := createFiveTestUsers(t, ss, func(i int) *models.CreateUserCommand { | 
					
						
							|  |  |  | 			return &models.CreateUserCommand{ | 
					
						
							|  |  |  | 				Email:      fmt.Sprint("user", i, "@test.com"), | 
					
						
							|  |  |  | 				Name:       fmt.Sprint("user", i), | 
					
						
							|  |  |  | 				Login:      fmt.Sprint("loginuser", i), | 
					
						
							|  |  |  | 				IsDisabled: false, | 
					
						
							| 
									
										
										
										
											2018-12-02 01:28:10 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2018-12-02 01:28:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		userIdsToDisable := []int64{} | 
					
						
							|  |  |  | 		for i := 0; i < 3; i++ { | 
					
						
							|  |  |  | 			userIdsToDisable = append(userIdsToDisable, users[i].Id) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		disableCmd := models.BatchDisableUsersCommand{ | 
					
						
							|  |  |  | 			UserIds:    userIdsToDisable, | 
					
						
							|  |  |  | 			IsDisabled: true, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		err := BatchDisableUsers(&disableCmd) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		query := models.SearchUsersQuery{} | 
					
						
							|  |  |  | 		err = SearchUsers(&query) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 		require.EqualValues(t, query.Result.TotalCount, 5) | 
					
						
							|  |  |  | 		for _, user := range query.Result.Users { | 
					
						
							|  |  |  | 			shouldBeDisabled := false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// Check if user id is in the userIdsToDisable list
 | 
					
						
							|  |  |  | 			for _, disabledUserId := range userIdsToDisable { | 
					
						
							|  |  |  | 				if user.Id == disabledUserId { | 
					
						
							|  |  |  | 					require.True(t, user.IsDisabled) | 
					
						
							|  |  |  | 					shouldBeDisabled = true | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-12-02 01:28:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 			// Otherwise user shouldn't be disabled
 | 
					
						
							|  |  |  | 			if !shouldBeDisabled { | 
					
						
							|  |  |  | 				require.False(t, user.IsDisabled) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2018-12-02 01:28:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 	ss = InitTestDB(t) | 
					
						
							| 
									
										
										
										
											2018-12-02 01:28:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 	t.Run("Testing DB - search users", func(t *testing.T) { | 
					
						
							|  |  |  | 		// Since previous tests were destructive
 | 
					
						
							|  |  |  | 		createFiveTestUsers(t, ss, func(i int) *models.CreateUserCommand { | 
					
						
							|  |  |  | 			return &models.CreateUserCommand{ | 
					
						
							|  |  |  | 				Email:      fmt.Sprint("user", i, "@test.com"), | 
					
						
							|  |  |  | 				Name:       fmt.Sprint("user", i), | 
					
						
							|  |  |  | 				Login:      fmt.Sprint("loginuser", i), | 
					
						
							|  |  |  | 				IsDisabled: false, | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-12-02 01:28:10 +08:00
										 |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("Testing DB - grafana admin users", func(t *testing.T) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		ss = InitTestDB(t) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		createUserCmd := models.CreateUserCommand{ | 
					
						
							|  |  |  | 			Email:   fmt.Sprint("admin", "@test.com"), | 
					
						
							|  |  |  | 			Name:    "admin", | 
					
						
							|  |  |  | 			Login:   "admin", | 
					
						
							|  |  |  | 			IsAdmin: true, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		user, err := ss.CreateUser(context.Background(), createUserCmd) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Cannot make themselves a non-admin
 | 
					
						
							| 
									
										
										
										
											2021-04-21 16:22:46 +08:00
										 |  |  | 		updatePermsError := ss.UpdateUserPermissions(user.Id, false) | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		require.Equal(t, updatePermsError, models.ErrLastGrafanaAdmin) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		query := models.GetUserByIdQuery{Id: user.Id} | 
					
						
							| 
									
										
										
										
											2021-06-21 13:51:33 +08:00
										 |  |  | 		getUserError := GetUserById(context.Background(), &query) | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		require.Nil(t, getUserError) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		require.True(t, query.Result.IsAdmin) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// One user
 | 
					
						
							|  |  |  | 		const email = "user@test.com" | 
					
						
							|  |  |  | 		const username = "user" | 
					
						
							|  |  |  | 		createUserCmd = models.CreateUserCommand{ | 
					
						
							|  |  |  | 			Email: email, | 
					
						
							|  |  |  | 			Name:  "user", | 
					
						
							|  |  |  | 			Login: username, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		_, err = ss.CreateUser(context.Background(), createUserCmd) | 
					
						
							|  |  |  | 		require.Nil(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// When trying to create a new user with the same email, an error is returned
 | 
					
						
							|  |  |  | 		createUserCmd = models.CreateUserCommand{ | 
					
						
							|  |  |  | 			Email:        email, | 
					
						
							|  |  |  | 			Name:         "user2", | 
					
						
							|  |  |  | 			Login:        "user2", | 
					
						
							|  |  |  | 			SkipOrgSetup: true, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		_, err = ss.CreateUser(context.Background(), createUserCmd) | 
					
						
							|  |  |  | 		require.Equal(t, err, models.ErrUserAlreadyExists) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// When trying to create a new user with the same login, an error is returned
 | 
					
						
							|  |  |  | 		createUserCmd = models.CreateUserCommand{ | 
					
						
							|  |  |  | 			Email:        "user2@test.com", | 
					
						
							|  |  |  | 			Name:         "user2", | 
					
						
							|  |  |  | 			Login:        username, | 
					
						
							|  |  |  | 			SkipOrgSetup: true, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		_, err = ss.CreateUser(context.Background(), createUserCmd) | 
					
						
							|  |  |  | 		require.Equal(t, err, models.ErrUserAlreadyExists) | 
					
						
							| 
									
										
										
										
											2017-02-08 21:20:07 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-06-15 05:45:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-14 16:50:38 +08:00
										 |  |  | func GetOrgUsersForTest(query *models.GetOrgUsersQuery) error { | 
					
						
							|  |  |  | 	query.Result = make([]*models.OrgUserDTO, 0) | 
					
						
							| 
									
										
										
										
											2017-06-15 05:45:30 +08:00
										 |  |  | 	sess := x.Table("org_user") | 
					
						
							| 
									
										
										
										
											2019-03-04 23:57:29 +08:00
										 |  |  | 	sess.Join("LEFT ", x.Dialect().Quote("user"), fmt.Sprintf("org_user.user_id=%s.id", x.Dialect().Quote("user"))) | 
					
						
							| 
									
										
										
										
											2017-06-15 05:45:30 +08:00
										 |  |  | 	sess.Where("org_user.org_id=?", query.OrgId) | 
					
						
							|  |  |  | 	sess.Cols("org_user.org_id", "org_user.user_id", "user.email", "user.login", "org_user.role") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err := sess.Find(&query.Result) | 
					
						
							|  |  |  | 	return err | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-07-15 14:14:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-17 23:06:10 +08:00
										 |  |  | func createFiveTestUsers(t *testing.T, sqlStore *SQLStore, fn func(i int) *models.CreateUserCommand) []models.User { | 
					
						
							|  |  |  | 	t.Helper() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-15 14:14:32 +08:00
										 |  |  | 	users := []models.User{} | 
					
						
							|  |  |  | 	for i := 0; i < 5; i++ { | 
					
						
							| 
									
										
										
										
											2021-03-17 23:06:10 +08:00
										 |  |  | 		cmd := fn(i) | 
					
						
							| 
									
										
										
										
											2019-07-15 14:14:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-17 23:06:10 +08:00
										 |  |  | 		user, err := sqlStore.CreateUser(context.Background(), *cmd) | 
					
						
							|  |  |  | 		users = append(users, *user) | 
					
						
							| 
									
										
										
										
											2019-07-15 14:14:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 19:28:35 +08:00
										 |  |  | 		require.Nil(t, err) | 
					
						
							| 
									
										
										
										
											2019-07-15 14:14:32 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return users | 
					
						
							|  |  |  | } |