Skip to content

Commit f08674c

Browse files
hamir-suspectskipi
authored andcommitted
fix(rbac_ce): use subject type for role assignment
1 parent a5fb57a commit f08674c

File tree

2 files changed

+102
-3
lines changed

2 files changed

+102
-3
lines changed

rbac/ce/lib/rbac/grpc_servers/rbac_server.ex

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,11 @@ defmodule Rbac.GrpcServers.RbacServer do
5656
role_id = role_assignment.role_id
5757
project_id = role_assignment.project_id
5858
subject_id = role_assignment.subject.subject_id
59+
subject_type = role_assignment.subject.subject_type
5960

6061
cond do
6162
valid_uuid?(role_id) ->
62-
handle_role_assignment(org_id, subject_id, role_id)
63+
handle_role_assignment(org_id, subject_id, role_id, subject_type)
6364

6465
valid_uuid?(project_id) ->
6566
handle_project_assignment(subject_id, org_id, project_id)
@@ -467,14 +468,15 @@ defmodule Rbac.GrpcServers.RbacServer do
467468
end
468469
end
469470

470-
defp handle_role_assignment(org_id, subject_id, role_id) do
471+
defp handle_role_assignment(org_id, subject_id, role_id, subject_type) do
471472
role = Rbac.Roles.find_by_id(role_id)
472473

473474
if is_nil(role) do
474475
grpc_error!(:not_found, "Role with id #{role_id} not found")
475476
end
476477

477-
RoleAssignment.create_or_update(%{org_id: org_id, user_id: subject_id, role_id: role_id})
478+
subject_type_string = convert_subject_type_to_string(subject_type)
479+
RoleAssignment.create_or_update(%{org_id: org_id, user_id: subject_id, role_id: role_id, subject_type: subject_type_string})
478480
end
479481

480482
defp handle_delete_role_assignment(org_id, subject_id) do
@@ -521,4 +523,14 @@ defmodule Rbac.GrpcServers.RbacServer do
521523
validate_uuid!(role_assignment.org_id)
522524
validate_uuid!(role_assignment.subject.subject_id)
523525
end
526+
527+
defp convert_subject_type_to_string(subject_type) do
528+
case subject_type do
529+
:USER -> "user"
530+
:SERVICE_ACCOUNT -> "service_account"
531+
:GROUP -> "group"
532+
nil -> "user" # Default fallback
533+
_ -> "user" # Default fallback for unknown values
534+
end
535+
end
524536
end

rbac/ce/test/rbac/grpc_servers/rbac_server_test.exs

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,93 @@ defmodule Rbac.GrpcServers.RbacServerTest do
6666
setup_assign_and_retract(channel)
6767
end
6868

69+
@tag :subject_type_test
70+
test "Should assign a role to a USER subject and save correct subject_type", %{
71+
channel: channel,
72+
valid_requester: valid_requester,
73+
non_member_user: non_member_user,
74+
org_id: org_id
75+
} do
76+
request = %InternalApi.RBAC.AssignRoleRequest{
77+
requester_id: valid_requester.user_id,
78+
role_assignment: %InternalApi.RBAC.RoleAssignment{
79+
org_id: org_id,
80+
role_id: Rbac.Roles.Member.role().id,
81+
subject: %InternalApi.RBAC.Subject{
82+
subject_id: non_member_user.user_id,
83+
subject_type: :USER
84+
}
85+
}
86+
}
87+
88+
{:ok, response} = Stub.assign_role(channel, request)
89+
assert response == %InternalApi.RBAC.AssignRoleResponse{}
90+
91+
role_assignment =
92+
Rbac.Models.RoleAssignment.get_by_user_and_org_id(non_member_user.user_id, org_id)
93+
94+
assert role_assignment.role_id == Rbac.Roles.Member.role().id
95+
assert role_assignment.subject_type == "user"
96+
end
97+
98+
@tag :subject_type_test
99+
test "Should assign a role to a SERVICE_ACCOUNT subject and save correct subject_type", %{
100+
channel: channel,
101+
valid_requester: valid_requester,
102+
non_member_user: non_member_user,
103+
org_id: org_id
104+
} do
105+
request = %InternalApi.RBAC.AssignRoleRequest{
106+
requester_id: valid_requester.user_id,
107+
role_assignment: %InternalApi.RBAC.RoleAssignment{
108+
org_id: org_id,
109+
role_id: Rbac.Roles.Admin.role().id,
110+
subject: %InternalApi.RBAC.Subject{
111+
subject_id: non_member_user.user_id,
112+
subject_type: :SERVICE_ACCOUNT
113+
}
114+
}
115+
}
116+
117+
{:ok, response} = Stub.assign_role(channel, request)
118+
assert response == %InternalApi.RBAC.AssignRoleResponse{}
119+
120+
role_assignment =
121+
Rbac.Models.RoleAssignment.get_by_user_and_org_id(non_member_user.user_id, org_id)
122+
123+
assert role_assignment.role_id == Rbac.Roles.Admin.role().id
124+
assert role_assignment.subject_type == "service_account"
125+
end
126+
127+
@tag :subject_type_test
128+
test "Should default to 'user' subject_type when subject_type is not provided", %{
129+
channel: channel,
130+
valid_requester: valid_requester,
131+
non_member_user: non_member_user,
132+
org_id: org_id
133+
} do
134+
request = %InternalApi.RBAC.AssignRoleRequest{
135+
requester_id: valid_requester.user_id,
136+
role_assignment: %InternalApi.RBAC.RoleAssignment{
137+
org_id: org_id,
138+
role_id: Rbac.Roles.Owner.role().id,
139+
subject: %InternalApi.RBAC.Subject{
140+
subject_id: non_member_user.user_id
141+
# subject_type not provided
142+
}
143+
}
144+
}
145+
146+
{:ok, response} = Stub.assign_role(channel, request)
147+
assert response == %InternalApi.RBAC.AssignRoleResponse{}
148+
149+
role_assignment =
150+
Rbac.Models.RoleAssignment.get_by_user_and_org_id(non_member_user.user_id, org_id)
151+
152+
assert role_assignment.role_id == Rbac.Roles.Owner.role().id
153+
assert role_assignment.subject_type == "user"
154+
end
155+
69156
test "A valid requester user should assign a member role to a subject", %{
70157
channel: channel,
71158
valid_requester: valid_requester,

0 commit comments

Comments
 (0)