2020-07-15 13:32:36 -04:00
|
|
|
// Copyright (c) HashiCorp, Inc.
|
|
|
|
|
// SPDX-License-Identifier: BUSL-1.1
|
2023-02-02 17:15:17 -08:00
|
|
|
|
2020-07-15 13:32:36 -04:00
|
|
|
package iam
|
|
|
|
|
|
|
|
|
|
// query.go contains "raw sql" for the iam package that goes directly against
|
|
|
|
|
// the db via sql.DB vs the standard pattern of using the internal/db package to
|
|
|
|
|
// interact with the db.
|
|
|
|
|
const (
|
2020-08-10 15:17:15 -04:00
|
|
|
// whereUserAccount - given an auth account id, return the associated user.
|
|
|
|
|
whereUserAccount = `
|
2021-04-20 20:33:56 -04:00
|
|
|
select iam_user_acct_info.*
|
|
|
|
|
from iam_user_acct_info
|
2020-07-15 13:32:36 -04:00
|
|
|
inner join auth_account
|
2021-04-20 20:33:56 -04:00
|
|
|
on iam_user_acct_info.public_id = auth_account.iam_user_id
|
2020-07-15 13:32:36 -04:00
|
|
|
where
|
2021-04-20 20:33:56 -04:00
|
|
|
iam_user_acct_info.scope_id = auth_account.scope_id and
|
2021-09-30 08:47:34 -04:00
|
|
|
auth_account.public_id = ?`
|
2020-07-15 13:32:36 -04:00
|
|
|
|
|
|
|
|
// whereValidAuthMethod - determine if an auth method public_id within a scope_id
|
|
|
|
|
// is valid by returning a count of matching rows.
|
2021-09-30 08:47:34 -04:00
|
|
|
whereValidAuthMethod = `select count(*) from auth_method where public_id = $1 and scope_id = $2` // raw query
|
2020-07-15 13:32:36 -04:00
|
|
|
|
|
|
|
|
// insertAuthMethod - insert a row directly into auth_method (TODO - this
|
2020-09-25 13:35:32 -04:00
|
|
|
// should be replaced with calls to the auth method repo).
|
2021-09-30 08:47:34 -04:00
|
|
|
insertAuthMethod = `insert into auth_method (public_id, scope_id) values (?, ?)`
|
2020-09-25 13:35:32 -04:00
|
|
|
|
|
|
|
|
accountChangesQuery = `
|
|
|
|
|
with
|
|
|
|
|
final_accounts (account_id) as (
|
|
|
|
|
-- returns the SET list
|
|
|
|
|
select public_id
|
|
|
|
|
from auth_account
|
|
|
|
|
where public_id in (%s)
|
|
|
|
|
),
|
|
|
|
|
current_accounts (account_id) as (
|
|
|
|
|
-- returns the current list
|
|
|
|
|
select public_id
|
|
|
|
|
from auth_account
|
2021-09-30 08:47:34 -04:00
|
|
|
where iam_user_id = ?
|
2020-09-25 13:35:32 -04:00
|
|
|
),
|
|
|
|
|
keep_accounts (account_id) as (
|
|
|
|
|
-- returns the KEEP list
|
|
|
|
|
select account_id
|
|
|
|
|
from current_accounts
|
|
|
|
|
where account_id in (select * from final_accounts)
|
|
|
|
|
),
|
|
|
|
|
delete_accounts (account_id) as (
|
|
|
|
|
-- returns the DELETE list
|
|
|
|
|
select account_id
|
|
|
|
|
from current_accounts
|
|
|
|
|
where account_id not in (select * from final_accounts)
|
|
|
|
|
),
|
|
|
|
|
insert_accounts (account_id) as (
|
|
|
|
|
-- returns the ADD list
|
|
|
|
|
select account_id
|
|
|
|
|
from final_accounts
|
|
|
|
|
where account_id not in (select * from keep_accounts)
|
|
|
|
|
),
|
|
|
|
|
final (action, account_id) as (
|
|
|
|
|
select 'disassociate', account_id
|
|
|
|
|
from delete_accounts
|
|
|
|
|
union
|
|
|
|
|
select 'associate', account_id
|
|
|
|
|
from insert_accounts
|
|
|
|
|
)
|
|
|
|
|
select * from final
|
|
|
|
|
order by action, account_id;
|
|
|
|
|
`
|
2020-09-26 17:46:21 -04:00
|
|
|
|
|
|
|
|
grpMemberChangesQuery = `
|
|
|
|
|
with
|
|
|
|
|
final_members (member_id) as (
|
|
|
|
|
-- returns the SET list
|
|
|
|
|
select public_id
|
|
|
|
|
from iam_user
|
|
|
|
|
where
|
|
|
|
|
public_id in (%s)
|
|
|
|
|
),
|
|
|
|
|
current_members (member_id) as (
|
|
|
|
|
-- returns the current list
|
|
|
|
|
select member_id
|
|
|
|
|
from iam_group_member
|
2021-09-30 08:47:34 -04:00
|
|
|
where group_id = ?
|
2020-09-26 17:46:21 -04:00
|
|
|
),
|
|
|
|
|
keep_members (member_id) as (
|
|
|
|
|
-- returns the KEEP list
|
|
|
|
|
select member_id
|
|
|
|
|
from current_members
|
|
|
|
|
where member_id in (select * from final_members)
|
|
|
|
|
),
|
|
|
|
|
delete_members (member_id) as (
|
|
|
|
|
-- returns the DELETE list
|
|
|
|
|
select member_id
|
|
|
|
|
from current_members
|
|
|
|
|
where member_id not in (select * from final_members)
|
|
|
|
|
),
|
|
|
|
|
insert_members (member_id) as (
|
|
|
|
|
-- returns the ADD list
|
|
|
|
|
select member_id
|
|
|
|
|
from final_members
|
|
|
|
|
where member_id not in (select * from keep_members)
|
|
|
|
|
),
|
|
|
|
|
final (action, member_id) as (
|
|
|
|
|
select 'delete', member_id
|
|
|
|
|
from delete_members
|
|
|
|
|
union
|
|
|
|
|
select 'add', member_id
|
|
|
|
|
from insert_members
|
|
|
|
|
)
|
|
|
|
|
select * from final
|
|
|
|
|
order by action, member_id;
|
|
|
|
|
`
|
2023-11-29 16:29:36 -05:00
|
|
|
|
2024-01-23 14:33:09 -05:00
|
|
|
grantsForUserQuery = `
|
|
|
|
|
with
|
|
|
|
|
users (id) as (
|
|
|
|
|
select public_id
|
|
|
|
|
from iam_user
|
|
|
|
|
%s -- anonUser || authUser
|
|
|
|
|
),
|
|
|
|
|
user_groups (id) as (
|
|
|
|
|
select group_id
|
|
|
|
|
from iam_group_member_user
|
|
|
|
|
where member_id in (select id from users)
|
|
|
|
|
),
|
|
|
|
|
user_accounts (id) as (
|
|
|
|
|
select public_id
|
|
|
|
|
from auth_account
|
|
|
|
|
where iam_user_id in (select id from users)
|
|
|
|
|
),
|
2024-09-17 10:07:43 -04:00
|
|
|
user_oidc_managed_groups (id) as (
|
2024-01-23 14:33:09 -05:00
|
|
|
select managed_group_id
|
2024-09-17 10:07:43 -04:00
|
|
|
from auth_oidc_managed_group_member_account
|
|
|
|
|
where member_id in (select id from user_accounts)
|
|
|
|
|
),
|
|
|
|
|
user_ldap_managed_groups (id) as (
|
|
|
|
|
select managed_group_id
|
|
|
|
|
from auth_ldap_managed_group_member_account
|
2024-01-23 14:33:09 -05:00
|
|
|
where member_id in (select id from user_accounts)
|
|
|
|
|
),
|
|
|
|
|
managed_group_roles (role_id) as (
|
2024-09-17 10:07:43 -04:00
|
|
|
select distinct role_id
|
2024-01-23 14:33:09 -05:00
|
|
|
from iam_managed_group_role
|
2024-09-17 10:07:43 -04:00
|
|
|
where principal_id in (select id from user_oidc_managed_groups)
|
|
|
|
|
or principal_id in (select id from user_ldap_managed_groups)
|
2024-01-23 14:33:09 -05:00
|
|
|
),
|
|
|
|
|
group_roles (role_id) as (
|
|
|
|
|
select role_id
|
|
|
|
|
from iam_group_role
|
|
|
|
|
where principal_id in (select id from user_groups)
|
|
|
|
|
),
|
|
|
|
|
user_roles (role_id) as (
|
|
|
|
|
select role_id
|
|
|
|
|
from iam_user_role
|
|
|
|
|
where principal_id in (select id from users)
|
|
|
|
|
),
|
|
|
|
|
user_group_roles (role_id) as (
|
|
|
|
|
select role_id
|
|
|
|
|
from group_roles
|
|
|
|
|
union
|
|
|
|
|
select role_id
|
|
|
|
|
from user_roles
|
|
|
|
|
union
|
|
|
|
|
select role_id
|
|
|
|
|
from managed_group_roles
|
|
|
|
|
),
|
2024-09-17 10:07:43 -04:00
|
|
|
-- Now that we have the role IDs, expand the information to include scope
|
|
|
|
|
roles (role_id, role_scope_id, role_parent_scope_id) as (
|
2024-01-23 14:33:09 -05:00
|
|
|
select iam_role.public_id,
|
2024-09-17 10:07:43 -04:00
|
|
|
iam_role.scope_id,
|
|
|
|
|
iam_scope.parent_id
|
2024-01-23 14:33:09 -05:00
|
|
|
from iam_role
|
2024-09-17 10:07:43 -04:00
|
|
|
join iam_scope
|
|
|
|
|
on iam_scope.public_id = iam_role.scope_id
|
|
|
|
|
where iam_role.public_id in (select role_id from user_group_roles)
|
2024-01-23 14:33:09 -05:00
|
|
|
),
|
2024-09-17 10:07:43 -04:00
|
|
|
grant_scopes (role_id, grant_scope_ids) as (
|
2024-01-23 14:33:09 -05:00
|
|
|
select roles.role_id,
|
2024-09-17 10:07:43 -04:00
|
|
|
string_agg(iam_role_grant_scope.scope_id_or_special, '^') as grant_scope_ids
|
2024-01-23 14:33:09 -05:00
|
|
|
from roles
|
2024-09-17 10:07:43 -04:00
|
|
|
join iam_role_grant_scope
|
|
|
|
|
on iam_role_grant_scope.role_id = roles.role_id
|
|
|
|
|
group by roles.role_id
|
2024-01-23 14:33:09 -05:00
|
|
|
),
|
2024-09-17 10:07:43 -04:00
|
|
|
grants (role_id, grants) as (
|
|
|
|
|
select roles.role_id,
|
|
|
|
|
string_agg(iam_role_grant.canonical_grant, '^') as grants
|
|
|
|
|
from roles
|
|
|
|
|
join iam_role_grant
|
|
|
|
|
on iam_role_grant.role_id = roles.role_id
|
|
|
|
|
group by roles.role_id
|
2024-01-23 14:33:09 -05:00
|
|
|
)
|
2024-09-17 10:07:43 -04:00
|
|
|
-- Finally, take the resulting roles and pull grant scope IDs and canonical grants.
|
|
|
|
|
-- We will split these out in application logic to keep the result set size low.
|
|
|
|
|
select
|
|
|
|
|
roles.role_id as role_id,
|
|
|
|
|
roles.role_scope_id as role_scope_id,
|
|
|
|
|
roles.role_parent_scope_id as role_parent_scope_id,
|
|
|
|
|
grant_scopes.grant_scope_ids as grant_scope_ids,
|
|
|
|
|
grants.grants as grants
|
|
|
|
|
from roles
|
|
|
|
|
join grant_scopes
|
|
|
|
|
on grant_scopes.role_id = roles.role_id
|
|
|
|
|
join grants
|
|
|
|
|
on grants.role_id = roles.role_id;
|
2024-01-23 14:33:09 -05:00
|
|
|
`
|
2023-12-15 11:49:59 -08:00
|
|
|
|
|
|
|
|
estimateCountRoles = `
|
|
|
|
|
select reltuples::bigint as estimate from pg_class where oid in ('iam_role'::regclass)
|
|
|
|
|
`
|
2023-12-20 16:51:57 -08:00
|
|
|
|
|
|
|
|
estimateCountUsers = `
|
|
|
|
|
select reltuples::bigint as estimate from pg_class where oid in ('iam_user'::regclass)
|
|
|
|
|
`
|
2023-12-21 12:54:27 -08:00
|
|
|
|
|
|
|
|
estimateCountGroups = `
|
|
|
|
|
select reltuples::bigint as estimate from pg_class where oid in ('iam_group'::regclass)
|
|
|
|
|
`
|
2024-01-02 17:18:47 -08:00
|
|
|
|
|
|
|
|
estimateCountScopes = `
|
|
|
|
|
select reltuples::bigint as estimate from pg_class where oid in ('iam_scope'::regclass)
|
|
|
|
|
`
|
2020-07-15 13:32:36 -04:00
|
|
|
)
|