Skip to content

Commit e83d80e

Browse files
committed
feat: add new_filtered_adapter() to FileAdapter to make it act as a FilterAdapter.
fix: #304 add new_filtered_adapter() to FileAdapter to make it act as a FilterAdapter. And does not automatically load the policy when using the filter adapter.
1 parent 49f090e commit e83d80e

File tree

5 files changed

+21
-7
lines changed

5 files changed

+21
-7
lines changed

src/adapter/file_adapter.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,15 @@ where
5151
}
5252
}
5353

54+
pub fn new_filtered_adapter(p: P) -> FileAdapter<P> {
55+
FileAdapter {
56+
file_path: p,
57+
is_filtered: true,
58+
}
59+
}
60+
5461
async fn load_policy_file(
55-
&self,
62+
&mut self,
5663
m: &mut dyn Model,
5764
handler: LoadPolicyFileHandler,
5865
) -> Result<()> {
@@ -110,7 +117,8 @@ impl<P> Adapter for FileAdapter<P>
110117
where
111118
P: AsRef<Path> + Send + Sync,
112119
{
113-
async fn load_policy(&self, m: &mut dyn Model) -> Result<()> {
120+
async fn load_policy(&mut self, m: &mut dyn Model) -> Result<()> {
121+
self.is_filtered = false;
114122
self.load_policy_file(m, load_policy_line).await?;
115123
Ok(())
116124
}

src/adapter/memory_adapter.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ pub struct MemoryAdapter {
1515

1616
#[async_trait]
1717
impl Adapter for MemoryAdapter {
18-
async fn load_policy(&self, m: &mut dyn Model) -> Result<()> {
18+
async fn load_policy(&mut self, m: &mut dyn Model) -> Result<()> {
19+
self.is_filtered = false;
1920
for line in self.policy.iter() {
2021
let sec = &line[0];
2122
let ptype = &line[1];

src/adapter/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub struct Filter<'a> {
2020

2121
#[async_trait]
2222
pub trait Adapter: Send + Sync {
23-
async fn load_policy(&self, m: &mut dyn Model) -> Result<()>;
23+
async fn load_policy(&mut self, m: &mut dyn Model) -> Result<()>;
2424
async fn load_filtered_policy<'a>(
2525
&mut self,
2626
m: &mut dyn Model,

src/adapter/null_adapter.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ pub struct NullAdapter;
1010

1111
#[async_trait]
1212
impl Adapter for NullAdapter {
13-
async fn load_policy(&self, _m: &mut dyn Model) -> Result<()> {
13+
async fn load_policy(&mut self, _m: &mut dyn Model) -> Result<()> {
1414
Ok(())
1515
}
1616

src/enforcer.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,11 @@ impl CoreApi for Enforcer {
416416
a: A,
417417
) -> Result<Self> {
418418
let mut e = Self::new_raw(m, a).await?;
419-
e.load_policy().await?;
419+
420+
// Do not initialize the full policy when using a filtered adapter
421+
if !e.adapter.is_filtered() {
422+
e.load_policy().await?;
423+
}
420424
Ok(e)
421425
}
422426

@@ -1373,9 +1377,10 @@ mod tests {
13731377
tokio::test
13741378
)]
13751379
async fn test_filtered_file_adapter() {
1380+
let adapter = FileAdapter::new_filtered_adapter("examples/rbac_with_domains_policy.csv");
13761381
let mut e = Enforcer::new(
13771382
"examples/rbac_with_domains_model.conf",
1378-
"examples/rbac_with_domains_policy.csv",
1383+
adapter
13791384
)
13801385
.await
13811386
.unwrap();

0 commit comments

Comments
 (0)