1use crate::{
2 node::ContextData,
3 proto::{CollectionId, NodeId, ID},
4};
5use ankql::ast::Predicate;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9pub enum AccessResult {
10 Allow,
12 Deny,
14}
15
16impl AccessResult {
17 pub fn is_allowed(&self) -> bool { matches!(self, AccessResult::Allow) }
19}
20
21pub trait PolicyAgent: Clone + Send + Sync + 'static {
24 type ContextData: ContextData;
27
28 fn can_access_collection(&self, data: &Self::ContextData, collection: &CollectionId) -> AccessResult;
30
31 fn can_read_entity(&self, data: &Self::ContextData, collection: &CollectionId, id: &ID) -> AccessResult;
33
34 fn can_modify_entity(&self, data: &Self::ContextData, collection: &CollectionId, id: &ID) -> AccessResult;
36
37 fn can_create_in_collection(&self, data: &Self::ContextData, collection: &CollectionId) -> AccessResult;
39
40 fn can_subscribe(&self, data: &Self::ContextData, collection: &CollectionId, predicate: &Predicate) -> AccessResult;
42
43 fn can_communicate_with_node(&self, data: &Self::ContextData, node_id: &NodeId) -> AccessResult;
45}
46
47#[derive(Clone)]
49pub struct PermissiveAgent {}
50
51impl PermissiveAgent {
52 pub fn new() -> Self { Self {} }
53}
54
55impl PolicyAgent for PermissiveAgent {
56 type ContextData = &'static DefaultContext;
57
58 fn can_access_collection(&self, _context: &Self::ContextData, _collection: &CollectionId) -> AccessResult { AccessResult::Allow }
59
60 fn can_read_entity(&self, _context: &Self::ContextData, _collection: &CollectionId, _id: &ID) -> AccessResult { AccessResult::Allow }
61
62 fn can_modify_entity(&self, _context: &Self::ContextData, _collection: &CollectionId, _id: &ID) -> AccessResult { AccessResult::Allow }
63
64 fn can_create_in_collection(&self, _context: &Self::ContextData, _collection: &CollectionId) -> AccessResult { AccessResult::Allow }
65
66 fn can_subscribe(&self, _context: &Self::ContextData, _collection: &CollectionId, _predicate: &Predicate) -> AccessResult {
67 AccessResult::Allow
68 }
69
70 fn can_communicate_with_node(&self, _context: &Self::ContextData, _node_id: &NodeId) -> AccessResult { AccessResult::Allow }
71}
72
73pub struct DefaultContext {}
76pub static DEFAULT_CONTEXT: &'static DefaultContext = &DefaultContext {};
77
78impl DefaultContext {
79 pub fn new() -> Self { Self {} }
80}
81
82impl ContextData for &'static DefaultContext {}