Skip to content

Commit 4cc7c0c

Browse files
committed
feat: restrict service account to only beamline claim
1 parent 23a3b72 commit 4cc7c0c

2 files changed

Lines changed: 43 additions & 76 deletions

File tree

policy/diamond/policy/tiled/tiled.rego

Lines changed: 23 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -32,57 +32,39 @@ user_session := to_number(_session) if {
3232
_session
3333
}
3434

35+
# service account check
3536
user_session := to_number(_session) if {
36-
input.proposal in token.claims.subject.proposals
37-
}
38-
39-
user_session := to_number(_session) if {
40-
_session in token.claims.subject.sessions
41-
}
42-
43-
user_session := to_number(_session) if {
44-
input.beamline in beamlines
37+
input.beamline == token.claims.beamline
4538
input.beamline == session.beamline_for(input.proposal, input.visit)
4639
_session in data.diamond.data.beamlines[input.beamline].sessions
4740
}
4841

49-
default fedid := ""
50-
51-
fedid := token.claims.fedid
52-
5342
# Validates if the subject has permission to modify
5443
# the specific session in the input.
5544
default modify_session := false
5645

5746
modify_session if session.access_session(
58-
fedid,
47+
token.claims.fedid,
5948
data.diamond.data.sessions[input.session].proposal_number,
6049
data.diamond.data.sessions[input.session].visit_number,
6150
)
6251

52+
# service account check
6353
modify_session if {
64-
data.diamond.data.sessions[input.session].proposal_number in token.claims.subject.proposals
65-
}
66-
67-
modify_session if {
68-
to_number(input.session) in token.claims.subject.sessions
69-
}
70-
71-
modify_session if {
54+
not token.claims.fedid
7255
session.beamline_for(
7356
data.diamond.data.sessions[input.session].proposal_number,
7457
data.diamond.data.sessions[input.session].visit_number,
75-
) in beamlines
58+
) == token.claims.beamline
7659
}
7760

78-
subject := data.diamond.data.subjects[token.claims.fedid] if token.claims.fedid
79-
80-
else := token.claims.subject if token.claims.subject
61+
subject := data.diamond.data.subjects[token.claims.fedid]
8162

8263
# Identifies all beamlines the subject is authorized to access
8364
# based on their assigned permissions.
8465
beamlines contains beamline if {
85-
not admin.is_admin(fedid)
66+
token.claims.fedid
67+
not admin.is_admin(token.claims.fedid)
8668
some p in subject.permissions
8769
some beamline in object.get(data.diamond.data.admin, p, [])
8870
}
@@ -95,23 +77,33 @@ beamlines contains beamline if {
9577
# 2. Access via beamline-level permissions
9678
# 3. Access via proposal-level permissions
9779
user_sessions contains "*" if {
98-
admin.is_admin(fedid)
80+
subject
81+
admin.is_admin(token.claims.fedid)
9982
}
10083

10184
user_sessions contains to_number(session) if {
102-
not admin.is_admin(fedid)
85+
subject
86+
not admin.is_admin(token.claims.fedid)
10387
some session in subject.sessions
10488
}
10589

10690
user_sessions contains to_number(session) if {
107-
not admin.is_admin(fedid)
91+
subject
92+
not admin.is_admin(token.claims.fedid)
10893
some beamline in beamlines
10994
some session in data.diamond.data.beamlines[beamline].sessions
11095
}
11196

11297
user_sessions contains to_number(session) if {
113-
not admin.is_admin(fedid)
98+
subject
99+
not admin.is_admin(token.claims.fedid)
114100
some p in subject.proposals
115101
some i in data.diamond.data.proposals[format_int(p, 10)]
116102
some session in i
117103
}
104+
105+
# service account check
106+
user_sessions contains to_number(session) if {
107+
not subject
108+
some session in data.diamond.data.beamlines[token.claims.beamline].sessions
109+
}

policy/diamond/policy/tiled/tiled_test.rego

Lines changed: 20 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -131,72 +131,47 @@ test_modify_session if {
131131

132132
# Service account tests
133133

134-
test_user_session_allow_service_account_on_proposal if {
134+
test_user_session_allow_service_account_on_beamline if {
135135
tiled.user_session == 11 with data.diamond.data as diamond_data
136136
with input as {"beamline": "i03", "proposal": 1, "visit": 1}
137-
with data.diamond.policy.token.claims as {"subject": {"proposals": [1], "sessions": [], "permissions": []}}
138-
}
139-
140-
test_user_session_allow_service_account_on_session if {
141-
tiled.user_session == 11 with data.diamond.data as diamond_data
142-
with input as {"beamline": "i03", "proposal": 1, "visit": 1}
143-
with data.diamond.policy.token.claims as {"subject": {"proposals": [], "sessions": [11], "permissions": []}}
137+
with data.diamond.policy.token.claims as {"beamline": "i03"}
144138
}
145139

146140
test_user_session_not_allow_service_account_wrong_beamline if {
147141
not tiled.user_session with data.diamond.data as diamond_data
148142
with input as {"beamline": "i03", "proposal": 1, "visit": 2}
149-
with data.diamond.policy.token.claims as {"subject": {"proposals": [], "sessions": [], "permissions": ["b07_admin"]}}
143+
with data.diamond.policy.token.claims as {"beamline": "b07"}
150144
}
151145

152-
test_user_session_allow_service_account_with_beamline if {
153-
tiled.user_session with data.diamond.data as diamond_data
154-
with input as {"beamline": "b07", "proposal": 1, "visit": 2}
155-
with data.diamond.policy.token.claims as {
156-
"subject": {"proposals": [], "sessions": [], "permissions": ["b07_admin"]},
157-
"fedid": "",
158-
}
146+
test_user_session_not_allow_service_account_on_none_existent_beamline_beamline if {
147+
not tiled.user_session with data.diamond.data as diamond_data
148+
with input as {"beamline": "i03", "proposal": 1, "visit": 2}
149+
with data.diamond.policy.token.claims as {"beamline": "b007"}
159150
}
160151

161-
test_modify_session_on_proposal if {
152+
test_modify_session_on_beamline if {
162153
tiled.modify_session with data.diamond.data as diamond_data
163154
with input as {"session": "11"}
164-
with data.diamond.policy.token.claims as {"subject": {"proposals": [1], "sessions": [], "permissions": []}}
155+
with data.diamond.policy.token.claims as {"beamline": "i03"}
165156
}
166157

167-
test_modify_session_on_session if {
168-
tiled.modify_session with data.diamond.data as diamond_data
158+
test_modify_session_on_wrong_beamline if {
159+
not tiled.modify_session with data.diamond.data as diamond_data
169160
with input as {"session": "11"}
170-
with data.diamond.policy.token.claims as {"subject": {"proposals": [], "sessions": [11], "permissions": []}}
161+
with data.diamond.policy.token.claims as {"beamline": "b07"}
171162
}
172163

173-
test_modify_session_on_permission if {
174-
tiled.modify_session with data.diamond.data as diamond_data
175-
with input as {"session": "12"}
176-
with data.diamond.policy.token.claims as {"subject": {
177-
"proposals": [],
178-
"sessions": [],
179-
"permissions": ["b07_admin"],
180-
}}
164+
test_modify_session_on_none_existent_beamline if {
165+
not tiled.modify_session with data.diamond.data as diamond_data
166+
with input as {"session": "11"}
167+
with data.diamond.policy.token.claims as {"beamline": "b007"}
181168
}
182169

183170
test_user_session_tags_service_account if {
184171
tiled.user_sessions == {11} with data.diamond.data as diamond_data
185-
with data.diamond.policy.token.claims as {"subject": {
186-
"proposals": [],
187-
"sessions": [11],
188-
"permissions": [],
189-
}}
190-
tiled.user_sessions == {11, 12} with data.diamond.data as diamond_data
191-
with data.diamond.policy.token.claims as {"subject": {
192-
"proposals": [1],
193-
"sessions": [],
194-
"permissions": [],
195-
}}
172+
with data.diamond.policy.token.claims as {"beamline": "i03"}
196173
tiled.user_sessions == {12, 13, 14} with data.diamond.data as diamond_data
197-
with data.diamond.policy.token.claims as {"subject": {
198-
"proposals": [],
199-
"sessions": [],
200-
"permissions": ["b07_admin"],
201-
}}
174+
with data.diamond.policy.token.claims as {"beamline": "b07"}
175+
tiled.user_sessions == set() with data.diamond.data as diamond_data
176+
with data.diamond.policy.token.claims as {"beamline": "b007"}
202177
}

0 commit comments

Comments
 (0)