Skip to content

Commit 9550deb

Browse files
authored
feat: fix bug in remove_filtered_policy() and add test cases (#90)
* fix: normalize_casbin_rule_option to work with sql's coalesce * fix: check for valid arguments in remove_filtered_policy * test: add tests for remove_filtered_policy
1 parent fa59fc8 commit 9550deb

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

src/actions.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1075,7 +1075,10 @@ fn normalize_casbin_rule(mut rule: Vec<String>) -> Vec<String> {
10751075
fn normalize_casbin_rule_option(rule: Vec<String>) -> Vec<Option<String>> {
10761076
let mut rule_with_option = rule
10771077
.iter()
1078-
.map(|x| Some(x.clone()))
1078+
.map(|x| match x.is_empty() {
1079+
true => None,
1080+
false => Some(x.clone()),
1081+
})
10791082
.collect::<Vec<Option<String>>>();
10801083
rule_with_option.resize(6, None);
10811084
rule_with_option

src/adapter.rs

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ impl Adapter for SqlxAdapter {
251251
field_index: usize,
252252
field_values: Vec<String>,
253253
) -> Result<bool> {
254-
if field_index <= 5 && !field_values.is_empty() && field_values.len() > field_index {
254+
if field_index <= 5 && !field_values.is_empty() && field_values.len() + field_index <= 6 {
255255
adapter::remove_filtered_policy(&self.pool, pt, field_index, field_values).await
256256
} else {
257257
Ok(false)
@@ -566,6 +566,56 @@ mod tests {
566566
.unwrap());
567567
assert_eq!(vec![String::new(); 0], e.get_roles_for_user("carol", None));
568568

569+
// GitHub issue: https://github.com/casbin-rs/sqlx-adapter/pull/90
570+
// add policies:
571+
// p, alice_rfp, book_rfp, read_rfp
572+
// p, bob_rfp, book_rfp, read_rfp
573+
// p, bob_rfp, book_rfp, write_rfp
574+
// p, alice_rfp, pen_rfp, get_rfp
575+
// p, bob_rfp, pen_rfp, get_rfp
576+
// p, alice_rfp, pencil_rfp, get_rfp
577+
assert!(adapter
578+
.add_policy("", "p", to_owned(vec!["alice_rfp", "book_rfp", "read_rfp"]),)
579+
.await
580+
.is_ok());
581+
assert!(adapter
582+
.add_policy("", "p", to_owned(vec!["bob_rfp", "book_rfp", "read_rfp"]),)
583+
.await
584+
.is_ok());
585+
assert!(adapter
586+
.add_policy("", "p", to_owned(vec!["bob_rfp", "book_rfp", "write_rfp"]),)
587+
.await
588+
.is_ok());
589+
assert!(adapter
590+
.add_policy("", "p", to_owned(vec!["alice_rfp", "pen_rfp", "get_rfp"]),)
591+
.await
592+
.is_ok());
593+
assert!(adapter
594+
.add_policy("", "p", to_owned(vec!["bob_rfp", "pen_rfp", "get_rfp"]),)
595+
.await
596+
.is_ok());
597+
assert!(adapter
598+
.add_policy(
599+
"",
600+
"p",
601+
to_owned(vec!["alice_rfp", "pencil_rfp", "get_rfp"]),
602+
)
603+
.await
604+
.is_ok());
605+
606+
// should remove (return true) all policies where "book_rfp" is in the second position
607+
assert!(adapter
608+
.remove_filtered_policy("", "p", 1, to_owned(vec!["book_rfp"]),)
609+
.await
610+
.unwrap());
611+
612+
// should remove (return true) all policies which match "alice_rfp" on first position
613+
// and "get_rfp" on third position
614+
assert!(adapter
615+
.remove_filtered_policy("", "p", 0, to_owned(vec!["alice_rfp", "", "get_rfp"]),)
616+
.await
617+
.unwrap());
618+
569619
// shadow the previous enforcer
570620
let mut e = Enforcer::new(
571621
"examples/rbac_with_domains_model.conf",

0 commit comments

Comments
 (0)