| use crate::{CoreApi, Enforcer}; |
| use std::collections::HashMap; |
| |
| pub fn casbin_js_get_permission_for_user( |
| e: &Enforcer, |
| _user: &str, |
| ) -> Result<String, Box<dyn std::error::Error>> { |
| let model = e.get_model(); |
| let mut m = HashMap::new(); |
| |
| m.insert("m", serde_json::Value::from(model.to_text())); |
| |
| let mut p_rules = Vec::new(); |
| if let Some(assertions) = model.get_model().get("p") { |
| for (ptype, _assertion) in assertions { |
| let policies = model.get_policy("p", ptype); |
| for rules in policies { |
| let mut rule = vec![ptype.to_string()]; |
| rule.extend(rules); |
| p_rules.push(rule); |
| } |
| } |
| } |
| m.insert("p", serde_json::Value::from(p_rules)); |
| |
| let mut g_rules = Vec::new(); |
| if let Some(assertions) = model.get_model().get("g") { |
| for (ptype, _assertion) in assertions { |
| let policies = model.get_policy("g", ptype); |
| for rules in policies { |
| let mut rule = vec![ptype.to_string()]; |
| rule.extend(rules); |
| g_rules.push(rule); |
| } |
| } |
| } |
| m.insert("g", serde_json::Value::from(g_rules)); |
| |
| let result = serde_json::to_string(&m)?; |
| Ok(result) |
| } |
| |
| #[cfg(test)] |
| mod tests { |
| use crate::frontend::casbin_js_get_permission_for_user; |
| use crate::prelude::*; |
| |
| #[cfg(not(target_arch = "wasm32"))] |
| #[cfg_attr( |
| all(feature = "runtime-async-std", not(target_arch = "wasm32")), |
| async_std::test |
| )] |
| #[cfg_attr( |
| all(feature = "runtime-tokio", not(target_arch = "wasm32")), |
| tokio::test |
| )] |
| async fn test_casbin_js_get_permission_for_user() { |
| use serde_json::Value; |
| use std::fs; |
| use std::io::Read; |
| |
| let model_path = "examples/rbac_model.conf"; |
| let policy_path = "examples/rbac_with_hierarchy_policy.csv"; |
| let e = Enforcer::new(model_path, policy_path).await.unwrap(); |
| |
| let received_string = |
| casbin_js_get_permission_for_user(&e, "alice").unwrap(); |
| let received: Value = serde_json::from_str(&received_string).unwrap(); |
| |
| let mut expected_model = String::new(); |
| fs::File::open(model_path) |
| .unwrap() |
| .read_to_string(&mut expected_model) |
| .unwrap(); |
| let expected_model_str = |
| expected_model.replace("\r\n", "\n").replace("\n\n", "\n"); |
| |
| assert_eq!( |
| received["m"].as_str().unwrap().trim(), |
| expected_model_str.trim() |
| ); |
| |
| let mut expected_policies = String::new(); |
| fs::File::open(policy_path) |
| .unwrap() |
| .read_to_string(&mut expected_policies) |
| .unwrap(); |
| let expected_policies_items: Vec<&str> = |
| expected_policies.split(&[',', '\n'][..]).collect(); |
| |
| let mut i = 0; |
| for s_arr in received["p"].as_array().unwrap() { |
| for s in s_arr.as_array().unwrap() { |
| assert_eq!( |
| s.as_str().unwrap().trim(), |
| expected_policies_items[i].trim() |
| ); |
| i += 1; |
| } |
| } |
| } |
| } |