Skip to main content

piam_types/
policy.rs

1use std::{collections::HashMap, sync::Mutex};
2
3use crate::{
4    condition::{Condition, Conditions},
5    effect::Effect,
6    principal::{Group, Role, User, UserKind},
7};
8
9type PolicyByUser<T> = HashMap<User, Policy<T>>;
10type PolicyByGroup<T> = HashMap<Group, Policy<T>>;
11type PolicyByRole<T> = HashMap<Role, Policy<T>>;
12type GroupByUser = HashMap<User, Group>;
13
14pub struct PolicyContainer<T> {
15    pub policy_by_user: PolicyByUser<T>,
16    pub policy_by_group: PolicyByGroup<T>,
17    pub policy_by_role: PolicyByRole<T>,
18    pub groups: GroupByUser,
19}
20
21impl<T> PolicyContainer<T> {
22    pub fn init() -> Self {
23        Self {
24            policy_by_user: PolicyByUser::new(),
25            policy_by_group: PolicyByGroup::new(),
26            policy_by_role: PolicyByRole::new(),
27            groups: GroupByUser::new(),
28        }
29    }
30
31    pub fn find_policy(&self, user: &User) -> Option<&T> {
32        self.groups
33            .get(user)
34            .and_then(|group| self.policy_by_group.get(group))
35            .map(|policy| &policy.type_)
36    }
37}
38
39pub fn do_a_call() {
40    // let user = User::default();
41    // let group = Group::default();
42    // GROUPS.lock().unwrap().insert(user, group);
43    // let mut user1 = User::default();
44    // dbg!(&GROUPS.lock().unwrap().get(&user1));
45}
46
47pub struct Policy<T> {
48    pub version: i32,
49    /// if condition specified, only takes effect when condition is met
50    pub conditions: Vec<Conditions>,
51    // TODO: put input output type together
52    // TODO: use generic
53    pub type_: T,
54    pub effects: Vec<Effect>,
55}
56
57#[cfg(feature = "s3-policy")]
58pub mod s3_policy {
59    #[derive(Default)]
60    pub struct S3Policy {
61        pub input: S3InputPolicy,
62        pub output: Option<String>,
63    }
64
65    #[derive(Default)]
66    pub struct S3InputPolicy {
67        bucket: Bucket,
68        control: Option<Control>,
69        outpost: Option<Outpost>,
70    }
71
72    impl S3InputPolicy {
73        // pub fn find_by_user(user: &User) -> Option<&Policy> {
74        //     let guard = GROUPS.lock().unwrap();
75        //     let group = match guard.get(user) {
76        //         None => return None,
77        //         Some(group) => group,
78        //     };
79        //     POLICY_BY_GROUP.lock().unwrap().get(group)
80        // }
81    }
82
83    #[derive(Default)]
84    pub struct Bucket {
85        name: Name,
86        tag: Option<Tag>,
87    }
88
89    #[derive(Default)]
90    pub struct Outpost;
91
92    #[derive(Default)]
93    pub struct Control;
94
95    #[derive(Default)]
96    pub struct Name {
97        eq: Option<Vec<String>>,
98        start_with: Option<Vec<String>>,
99        in_: Option<Vec<String>>,
100    }
101
102    #[derive(Default)]
103    pub struct Tag;
104}