IAM: Create and delete user from the legacy store (#107694)

* Add Create for User + DualWriter setup

* Add delete User

* Fix delete + access check

* Add tests for delete user

* Add tests for create user

* Fixes

* Use sqlx session to fix database locked issues

* wip authz checks

* legacyAccessClient

* Update legacyAccessClient, add tests for create user

* Close rows before running other queries

* Use ExecWithReturningId

* Verify deletion in the tests

* Add Validate and Mutate

* Other changes

* Address feedback

* Update tests

---------

Co-authored-by: Gabriel Mabille <gabriel.mabille@grafana.com>
This commit is contained in:
Misi
2025-07-17 11:50:40 +02:00
committed by GitHub
co-authored by Gabriel Mabille
parent 3e29ca786d
commit c6a6b9fdd2
45 changed files with 1683 additions and 102 deletions
+118
View File
@@ -3,6 +3,7 @@ package legacy
import (
"testing"
"text/template"
"time"
"github.com/grafana/grafana/pkg/registry/apis/iam/common"
"github.com/grafana/grafana/pkg/storage/legacysql"
@@ -30,6 +31,33 @@ func TestIdentityQueries(t *testing.T) {
return &v
}
deleteUser := func(q *DeleteUserQuery) sqltemplate.SQLTemplate {
v := newDeleteUser(nodb, q)
v.SQLTemplate = mocks.NewTestingSQLTemplate()
return &v
}
deleteOrgUser := func(userID int64) sqltemplate.SQLTemplate {
v := deleteOrgUserQuery{
SQLTemplate: mocks.NewTestingSQLTemplate(),
OrgUserTable: nodb.Table("org_user"),
UserID: userID,
}
return &v
}
createOrgUser := func(cmd *CreateOrgUserCommand) sqltemplate.SQLTemplate {
v := newCreateOrgUser(nodb, cmd)
v.SQLTemplate = mocks.NewTestingSQLTemplate()
return &v
}
createUser := func(cmd *CreateUserCommand) sqltemplate.SQLTemplate {
v := newCreateUser(nodb, cmd)
v.SQLTemplate = mocks.NewTestingSQLTemplate()
return &v
}
listTeams := func(q *ListTeamQuery) sqltemplate.SQLTemplate {
v := newListTeams(nodb, q)
v.SQLTemplate = mocks.NewTestingSQLTemplate()
@@ -300,6 +328,96 @@ func TestIdentityQueries(t *testing.T) {
}),
},
},
sqlDeleteUserTemplate: {
{
Name: "delete_user_basic",
Data: deleteUser(&DeleteUserQuery{
OrgID: 1,
UID: "user-1",
}),
},
{
Name: "delete_user_different_org",
Data: deleteUser(&DeleteUserQuery{
OrgID: 2,
UID: "user-abc",
}),
},
},
sqlDeleteOrgUserTemplate: {
{
Name: "delete_org_user_basic",
Data: deleteOrgUser(123),
},
{
Name: "delete_org_user_different_id",
Data: deleteOrgUser(456),
},
},
sqlCreateOrgUserTemplate: {
{
Name: "create_org_user_basic",
Data: createOrgUser(&CreateOrgUserCommand{
OrgID: 1,
UserID: 123,
Role: "Viewer",
Created: time.Date(2023, 1, 1, 12, 0, 0, 0, time.UTC),
Updated: time.Date(2023, 1, 1, 12, 0, 0, 0, time.UTC),
}),
},
{
Name: "create_org_user_admin",
Data: createOrgUser(&CreateOrgUserCommand{
OrgID: 2,
UserID: 456,
Role: "Admin",
Created: time.Date(2023, 2, 1, 10, 30, 0, 0, time.UTC),
Updated: time.Date(2023, 2, 1, 10, 30, 0, 0, time.UTC),
}),
},
},
sqlCreateUserTemplate: {
{
Name: "create_user_basic",
Data: createUser(&CreateUserCommand{
UID: "user-1",
Email: "user1@example.com",
Login: "user1",
Name: "User One",
OrgID: 1,
IsAdmin: false,
IsDisabled: false,
EmailVerified: true,
IsProvisioned: false,
Salt: "randomsalt",
Rands: "randomrands",
Created: time.Date(2023, 1, 1, 12, 0, 0, 0, time.UTC),
Updated: time.Date(2023, 1, 1, 12, 0, 0, 0, time.UTC),
LastSeenAt: time.Date(2013, 1, 1, 12, 0, 0, 0, time.UTC),
Role: "Viewer",
}),
},
{
Name: "create_user_admin",
Data: createUser(&CreateUserCommand{
UID: "admin-1",
Email: "admin@example.com",
Login: "admin",
Name: "Admin User",
OrgID: 2,
IsAdmin: true,
IsDisabled: false,
EmailVerified: true,
IsProvisioned: true,
Salt: "adminsalt",
Rands: "adminrands",
Created: time.Date(2023, 2, 1, 10, 30, 0, 0, time.UTC),
Updated: time.Date(2023, 2, 1, 10, 30, 0, 0, time.UTC),
LastSeenAt: time.Date(2013, 2, 1, 10, 30, 0, 0, time.UTC),
Role: "Admin",
}),
},
},
},
})
}