-
-
Notifications
You must be signed in to change notification settings - Fork 76
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: add casbin_js_get_permission_for_user (#339)
* feat: add casbin_js_get_permission_for_user * fix: cargo fmt * fix: pass test * fix: pass test under linux
- Loading branch information
Showing
5 changed files
with
165 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
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; | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters