diff --git a/pkg/services/sqlstore/org_test.go b/pkg/services/sqlstore/org_test.go index e7c718fc9a8..8b850ac47cd 100644 --- a/pkg/services/sqlstore/org_test.go +++ b/pkg/services/sqlstore/org_test.go @@ -154,6 +154,56 @@ func TestAccountDataAccess(t *testing.T) { So(err, ShouldEqual, m.ErrLastOrgAdmin) }) + Convey("Given an org user with dashboard permissions", func() { + ac3cmd := m.CreateUserCommand{Login: "ac3", Email: "ac3@test.com", Name: "ac3 name", IsAdmin: false} + err := CreateUser(&ac3cmd) + So(err, ShouldBeNil) + ac3 := ac3cmd.Result + + orgUserCmd := m.AddOrgUserCommand{ + OrgId: ac1.OrgId, + UserId: ac3.Id, + Role: m.ROLE_VIEWER, + } + + err = AddOrgUser(&orgUserCmd) + So(err, ShouldBeNil) + + query := m.GetOrgUsersQuery{OrgId: orgUserCmd.OrgId} + err = GetOrgUsers(&query) + So(err, ShouldBeNil) + So(len(query.Result), ShouldEqual, 3) + + err = AddOrUpdateDashboardPermission(&m.AddOrUpdateDashboardPermissionCommand{DashboardId: 1, OrgId: ac1.OrgId, UserId: ac3.Id, PermissionType: m.PERMISSION_EDIT}) + So(err, ShouldBeNil) + + err = AddOrUpdateDashboardPermission(&m.AddOrUpdateDashboardPermissionCommand{DashboardId: 2, OrgId: ac3.OrgId, UserId: ac3.Id, PermissionType: m.PERMISSION_EDIT}) + So(err, ShouldBeNil) + + Convey("When org user is deleted", func() { + cmdRemove := m.RemoveOrgUserCommand{OrgId: orgUserCmd.OrgId, UserId: ac3.Id} + err := RemoveOrgUser(&cmdRemove) + So(err, ShouldBeNil) + + Convey("Should remove dependent permissions for deleted org user", func() { + permQuery := &m.GetDashboardPermissionsQuery{DashboardId: 1} + err = GetDashboardPermissions(permQuery) + So(err, ShouldBeNil) + + So(len(permQuery.Result), ShouldEqual, 0) + }) + + Convey("Should not remove dashboard permissions for same user in another org", func() { + permQuery := &m.GetDashboardPermissionsQuery{DashboardId: 2} + err = GetDashboardPermissions(permQuery) + So(err, ShouldBeNil) + + So(permQuery.Result[0].OrgId, ShouldEqual, ac3.OrgId) + So(permQuery.Result[0].UserId, ShouldEqual, ac3.Id) + }) + + }) + }) }) }) }) diff --git a/pkg/services/sqlstore/org_users.go b/pkg/services/sqlstore/org_users.go index e1b9dcc1da7..56b1b3f0323 100644 --- a/pkg/services/sqlstore/org_users.go +++ b/pkg/services/sqlstore/org_users.go @@ -80,10 +80,17 @@ func GetOrgUsers(query *m.GetOrgUsersQuery) error { func RemoveOrgUser(cmd *m.RemoveOrgUserCommand) error { return inTransaction(func(sess *DBSession) error { - var rawSql = "DELETE FROM org_user WHERE org_id=? and user_id=?" - _, err := sess.Exec(rawSql, cmd.OrgId, cmd.UserId) - if err != nil { - return err + deletes := []string{ + "DELETE FROM org_user WHERE org_id=? and user_id=?", + "DELETE FROM dashboard_acl WHERE org_id=? and user_id = ?", + "DELETE FROM user_group_member WHERE org_id=? and user_id = ?", + } + + for _, sql := range deletes { + _, err := sess.Exec(sql, cmd.OrgId, cmd.UserId) + if err != nil { + return err + } } return validateOneAdminLeftInOrg(cmd.OrgId, sess) diff --git a/pkg/services/sqlstore/user.go b/pkg/services/sqlstore/user.go index af49e8dafe2..bdb1b56509a 100644 --- a/pkg/services/sqlstore/user.go +++ b/pkg/services/sqlstore/user.go @@ -399,6 +399,7 @@ func DeleteUser(cmd *m.DeleteUserCommand) error { "DELETE FROM org_user WHERE user_id = ?", "DELETE FROM dashboard_acl WHERE user_id = ?", "DELETE FROM preferences WHERE user_id = ?", + "DELETE FROM user_group_member WHERE user_id = ?", } for _, sql := range deletes {