casbin/
frontend.rs

1use crate::{CoreApi, Enforcer};
2use std::collections::HashMap;
3
4pub fn casbin_js_get_permission_for_user(
5    e: &Enforcer,
6    _user: &str,
7) -> Result<String, Box<dyn std::error::Error>> {
8    let model = e.get_model();
9    let mut m = HashMap::new();
10
11    m.insert("m", serde_json::Value::from(model.to_text()));
12
13    let mut p_rules = Vec::new();
14    if let Some(assertions) = model.get_model().get("p") {
15        for (ptype, _assertion) in assertions {
16            let policies = model.get_policy("p", ptype);
17            for rules in policies {
18                let mut rule = vec![ptype.to_string()];
19                rule.extend(rules);
20                p_rules.push(rule);
21            }
22        }
23    }
24    m.insert("p", serde_json::Value::from(p_rules));
25
26    let mut g_rules = Vec::new();
27    if let Some(assertions) = model.get_model().get("g") {
28        for (ptype, _assertion) in assertions {
29            let policies = model.get_policy("g", ptype);
30            for rules in policies {
31                let mut rule = vec![ptype.to_string()];
32                rule.extend(rules);
33                g_rules.push(rule);
34            }
35        }
36    }
37    m.insert("g", serde_json::Value::from(g_rules));
38
39    let result = serde_json::to_string(&m)?;
40    Ok(result)
41}
42
43#[cfg(test)]
44mod tests {
45    use crate::frontend::casbin_js_get_permission_for_user;
46    use crate::prelude::*;
47
48    #[cfg(not(target_arch = "wasm32"))]
49    #[cfg_attr(
50        all(feature = "runtime-async-std", not(target_arch = "wasm32")),
51        async_std::test
52    )]
53    #[cfg_attr(
54        all(feature = "runtime-tokio", not(target_arch = "wasm32")),
55        tokio::test
56    )]
57    async fn test_casbin_js_get_permission_for_user() {
58        use serde_json::Value;
59        use std::fs;
60        use std::io::Read;
61
62        let model_path = "examples/rbac_model.conf";
63        let policy_path = "examples/rbac_with_hierarchy_policy.csv";
64        let e = Enforcer::new(model_path, policy_path).await.unwrap();
65
66        let received_string =
67            casbin_js_get_permission_for_user(&e, "alice").unwrap();
68        let received: Value = serde_json::from_str(&received_string).unwrap();
69
70        let mut expected_model = String::new();
71        fs::File::open(model_path)
72            .unwrap()
73            .read_to_string(&mut expected_model)
74            .unwrap();
75        let expected_model_str =
76            expected_model.replace("\r\n", "\n").replace("\n\n", "\n");
77
78        assert_eq!(
79            received["m"].as_str().unwrap().trim(),
80            expected_model_str.trim()
81        );
82
83        let mut expected_policies = String::new();
84        fs::File::open(policy_path)
85            .unwrap()
86            .read_to_string(&mut expected_policies)
87            .unwrap();
88        let expected_policies_items: Vec<&str> =
89            expected_policies.split(&[',', '\n'][..]).collect();
90
91        let mut i = 0;
92        for s_arr in received["p"].as_array().unwrap() {
93            for s in s_arr.as_array().unwrap() {
94                assert_eq!(
95                    s.as_str().unwrap().trim(),
96                    expected_policies_items[i].trim()
97                );
98                i += 1;
99            }
100        }
101    }
102}