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}