Skip to content

Commit 386e494

Browse files
authored
Role requests UI (#222)
1 parent 3ca5cdf commit 386e494

File tree

14 files changed

+3169
-20
lines changed

14 files changed

+3169
-20
lines changed

api/operations/create_role_request.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,14 @@
1313
OktaGroup,
1414
OktaGroupTagMap,
1515
OktaUser,
16+
OktaUserGroupMember,
1617
RoleGroup,
1718
RoleRequest,
19+
Tag,
1820
)
1921
from api.models.app_group import get_access_owners, get_app_managers
2022
from api.models.okta_group import get_group_managers
23+
from api.models.tag import coalesce_constraints
2124
from api.operations.approve_role_request import ApproveRoleRequest
2225
from api.operations.reject_role_request import RejectRoleRequest
2326
from api.plugins import get_conditional_access_hook, get_notification_hook
@@ -46,12 +49,23 @@ def __init__(
4649
self.requester_role = (
4750
RoleGroup.query.filter(RoleGroup.deleted_at.is_(None)).filter(RoleGroup.id == requester_role).first()
4851
)
52+
# self.requester_role = (
53+
# db.session.query(RoleGroup)
54+
# .options(joinedload(OktaUserGroupMember.user))
55+
# .filter(RoleGroup.deleted_at.is_(None))
56+
# .filter(RoleGroup.id == requester_role)
57+
# .first()
58+
# )
4959
else:
5060
self.requester_role = requester_role
5161

5262
self.requested_group = (
5363
db.session.query(OktaGroup)
54-
.options(selectin_polymorphic(OktaGroup, [AppGroup]), joinedload(AppGroup.app))
64+
.options(
65+
selectin_polymorphic(OktaGroup, [AppGroup]),
66+
joinedload(AppGroup.app),
67+
selectinload(OktaGroup.active_group_tags).options(joinedload(OktaGroupTagMap.active_tag)),
68+
)
5569
.filter(OktaGroup.deleted_at.is_(None))
5670
.filter(OktaGroup.id == (requested_group if isinstance(requested_group, str) else requested_group.id))
5771
.first()
@@ -90,6 +104,39 @@ def execute(self) -> Optional[RoleRequest]:
90104
# Fetch the users to notify
91105
approvers = get_group_managers(self.requested_group.id)
92106

107+
requested_group_tags = [tm.active_tag for tm in self.requested_group.active_group_tags]
108+
109+
role_memberships = [
110+
u.user_id
111+
for u in (
112+
OktaUserGroupMember.query.filter(OktaUserGroupMember.group_id == self.requester_role.id)
113+
.filter(OktaUserGroupMember.is_owner.is_(False))
114+
.filter(
115+
db.or_(
116+
OktaUserGroupMember.ended_at.is_(None),
117+
OktaUserGroupMember.ended_at > db.func.now(),
118+
)
119+
)
120+
.all()
121+
)
122+
]
123+
124+
# If group tagged with disallow self add constraint, filter out approvers who are also members of the role
125+
if self.request_ownership:
126+
disallow_self_add_owner = coalesce_constraints(
127+
constraint_key=Tag.DISALLOW_SELF_ADD_OWNERSHIP_CONSTRAINT_KEY,
128+
tags=requested_group_tags,
129+
)
130+
if disallow_self_add_owner:
131+
approvers = [a for a in approvers if a.id not in role_memberships]
132+
else:
133+
disallow_self_add_member = coalesce_constraints(
134+
constraint_key=Tag.DISALLOW_SELF_ADD_MEMBERSHIP_CONSTRAINT_KEY,
135+
tags=requested_group_tags,
136+
)
137+
if disallow_self_add_member:
138+
approvers = [a for a in approvers if a.id not in role_memberships]
139+
93140
# If there are no approvers, try to get the app managers
94141
# or if the only approver is the requester, try to get the app managers
95142
if (

0 commit comments

Comments
 (0)