Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions policy/diamond/policy/subject_session/subject_session.rego
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package diamond.policy.subject_session

import data.diamond.policy.admin
import data.diamond.policy.token
import rego.v1

beamlines contains beamline if {
some p in data.diamond.data.subjects[token.claims.fedid].permissions
some beamline in object.get(data.diamond.data.admin, p, [])
}

tags contains to_number(tag) if {
"super_admin" in data.diamond.data.subjects[token.claims.fedid].permissions
some tag in object.keys(data.diamond.data.sessions)
}

tags contains to_number(tag) if {
some tag in data.diamond.data.subjects[token.claims.fedid].sessions
}

tags contains to_number(tag) if {
some beamline in beamlines
some tag in data.diamond.data.beamlines[beamline].sessions
}

read_scopes := {
"read:metadata",
"read:data",
}

all_scopes := {
"read:metadata",
"read:data",
"write:metadata",
"write:data",
"delete:revision",
"delete:node",
"create",
"register",
}

scopes contains scope if {
"blueapi" in token.claims.aud
some scope in all_scopes
}

scopes contains scope if {
some scope in read_scopes
}

default allow := false

# Allow to modify and create tiled node if the sessions are accessible to the user
allow if {
every tag in input.access_blob.tags {
to_number(tag) in tags
}
}
80 changes: 80 additions & 0 deletions policy/diamond/policy/subject_session/subject_session_test.rego
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package diamond.policy.subject_session_test

import data.diamond.policy.subject_session

import rego.v1

diamond_data := {
"subjects": {
"alice": {
"permissions": [],
"proposals": [1],
"sessions": [1, 2],
},
"carol": {
"permissions": ["super_admin"],
"proposals": [],
"sessions": [],
},
"oscar": {
"permissions": ["b07_admin"],
"proposals": [],
"sessions": [],
},
},
"sessions": {
"11": {
"beamline": "i03",
"proposal_number": 1,
"visit_number": 1,
},
"12": {
"beamline": "b07",
"proposal_number": 1,
"visit_number": 2,
},
},
"proposals": {"1": {"sessions": {
"1": 11,
"2": 12,
}}},
"beamlines": {"i03": {"sessions": [11]}, "b07": {"sessions": [12]}},
"admin": {"b07_admin": ["b07"]},
}

test_tags_for_super_admin if {
subject_session.tags == {11, 12} with data.diamond.data as diamond_data
with data.diamond.policy.token.claims as {"fedid": "carol"}
}

test_tags_form_subject_sessions if {
subject_session.tags == {1, 2} with data.diamond.data as diamond_data
with data.diamond.policy.token.claims as {"fedid": "alice"}
}

test_tags_from_subject_beamline_permissions if {
subject_session.tags == {12} with data.diamond.data as diamond_data
with data.diamond.policy.token.claims as {"fedid": "oscar"}
}

test_scopes_for_subject if {
subject_session.scopes == subject_session.read_scopes with data.diamond.data as diamond_data
with data.diamond.policy.token.claims as {"fedid": "oscar"}
}

test_scopes_for_subject_all_scopes_if_blueapi if {
subject_session.scopes == subject_session.all_scopes with data.diamond.data as diamond_data
with data.diamond.policy.token.claims as {"fedid": "oscar", "aud": ["blueapi"]}
}

test_allow if {
subject_session.allow with data.diamond.data as diamond_data
with data.diamond.policy.token.claims as {"fedid": "carol"}
with input as {"access_blob": {"tags": ["11", "12"]}}
}

test_allow_denied if {
not subject_session.allow with data.diamond.data as diamond_data
with data.diamond.policy.token.claims as {"fedid": "carol"}
with input as {"access_blob": {"tags": ["1"]}}
}
Loading