Skip to content

Commit

Permalink
fix: Change to persist policy
Browse files Browse the repository at this point in the history
Signed-off-by: sagilio <sagilio@outlook.com>
  • Loading branch information
sagilio committed Nov 20, 2022
1 parent 0c1ce7f commit 36cff41
Show file tree
Hide file tree
Showing 13 changed files with 321 additions and 199 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
using Casbin.Model;
namespace Casbin.Persist;

namespace Casbin.Persist;

public interface IPersistantPolicy
public interface IPersistPolicy
{
public string Section { get; set; }
public string Type { get; set; }
public string Value1 { get; set; }
public string Value2 { get; set; }
Expand All @@ -17,6 +16,7 @@ public interface IPersistantPolicy
public string Value10 { get; set; }
public string Value11 { get; set; }
public string Value12 { get; set; }
public IPolicyValues Values { get; }
}



9 changes: 4 additions & 5 deletions Casbin/Abstractions/Persist/IPolicyFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@

namespace Casbin.Persist;

public interface IPolicyFilter : IPolicyFilter<IPersistantPolicy>
public interface IPolicyFilter
{
public IQueryable<T> Apply<T>(IQueryable<T> policies) where T : IPersistPolicy;
}

public interface IPolicyFilter<T> where T : IPersistantPolicy
{
public IQueryable<T> ApplyFilter(IQueryable<T> policies);
}



21 changes: 21 additions & 0 deletions Casbin/Abstractions/Persist/IReadOnlyPersistPolicy.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
namespace Casbin.Persist;

public interface IReadOnlyPersistPolicy
{
public string Section { get; }
public string Type { get; }
public string Value1 { get; }
public string Value2 { get; }
public string Value3 { get; }
public string Value4 { get; }
public string Value5 { get; }
public string Value6 { get; }
public string Value7 { get; }
public string Value8 { get; }
public string Value9 { get; }
public string Value10 { get; }
public string Value11 { get; }
public string Value12 { get; }
}


17 changes: 10 additions & 7 deletions Casbin/Adapter/File/FileFilteredAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,13 @@ public Task LoadFilteredPolicyAsync(IPolicyStore store, Filter filter)

private void LoadFilteredPolicyFile(IPolicyStore store, IPolicyFilter filter)
{
IEnumerable<IPersistantPolicy> policies = ReadPersistantPolicy(FilePath);
policies = filter.ApplyFilter(policies.AsQueryable());
foreach (IPersistantPolicy policy in policies)
IEnumerable<IPersistPolicy> policies = ReadPersistPolicy(FilePath);
policies = filter.Apply(policies.AsQueryable());
foreach (IPersistPolicy policy in policies)
{
string section = policy.Type.Substring(0, 1);
store.AddPolicy(section, policy.Type, policy.Values);
string section = policy.Section;
IPolicyValues values = Policy.ValuesFrom(policy);
store.AddPolicy(section, policy.Type, values);
}

IsFiltered = true;
Expand All @@ -86,7 +87,7 @@ private Task LoadFilteredPolicyFileAsync(IPolicyStore store, IPolicyFilter filte
#endif
}

private static IEnumerable<IPersistantPolicy> ReadPersistantPolicy(string filePath)
private static IEnumerable<IPersistPolicy> ReadPersistPolicy(string filePath)
{
using StreamReader reader = new(new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
while (reader.EndOfStream is false)
Expand All @@ -105,8 +106,10 @@ private static IEnumerable<IPersistantPolicy> ReadPersistantPolicy(string filePa
string[] tokens = line.Split(PermConstants.PolicySeparatorChar).Select(x => x.Trim()).ToArray();
string type = tokens[0];
IPolicyValues values = Policy.ValuesFrom(tokens.Skip(1));
yield return new PersistantPolicy(type, values);
yield return PersistPolicy.Create<PersistPolicy>(type, values);
}
}
}



17 changes: 10 additions & 7 deletions Casbin/Adapter/Stream/StreamFilteredAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,13 @@ public Task LoadFilteredPolicyAsync(IPolicyStore store, IPolicyFilter filter)

private void LoadFilteredPolicyFile(IPolicyStore store, IPolicyFilter filter)
{
IEnumerable<IPersistantPolicy> policies = ReadPersistantPolicy(InputStream);
policies = filter.ApplyFilter(policies.AsQueryable());
foreach (IPersistantPolicy policy in policies)
IEnumerable<IPersistPolicy> policies = ReadPersistantPolicy(InputStream);
policies = filter.Apply(policies.AsQueryable());
foreach (IPersistPolicy policy in policies)
{
string section = policy.Type.Substring(0, 1);
store.AddPolicy(section, policy.Type, policy.Values);
string section = policy.Section;
IPolicyValues values = Policy.ValuesFrom(policy);
store.AddPolicy(section, policy.Type, values);
}

IsFiltered = true;
Expand All @@ -60,7 +61,7 @@ private Task LoadFilteredPolicyFileAsync(IPolicyStore store, IPolicyFilter filte
#endif
}

private static IEnumerable<IPersistantPolicy> ReadPersistantPolicy(System.IO.Stream inputStream)
private static IEnumerable<IPersistPolicy> ReadPersistantPolicy(System.IO.Stream inputStream)
{
using StreamReader reader = new(inputStream);
while (reader.EndOfStream is false)
Expand All @@ -79,8 +80,10 @@ private static IEnumerable<IPersistantPolicy> ReadPersistantPolicy(System.IO.Str
string[] tokens = line.Split(PermConstants.PolicySeparatorChar).Select(x => x.Trim()).ToArray();
string type = tokens[0];
IPolicyValues values = Policy.ValuesFrom(tokens.Skip(1));
yield return new PersistantPolicy(type, values);
yield return PersistPolicy.Create<PersistPolicy>(type, values);
}
}
}



2 changes: 1 addition & 1 deletion Casbin/Casbin.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<PropertyGroup>
<TargetFrameworks>net7.0;net6.0;net5.0;netcoreapp3.1;netstandard2.1;netstandard2.0;net462;net461;net452;</TargetFrameworks>
<NoWarn>$(NoWarn);CS1591;CS0618</NoWarn>
<LangVersion>preview</LangVersion>
<LangVersion>11</LangVersion>
</PropertyGroup>

<PropertyGroup>
Expand Down
3 changes: 2 additions & 1 deletion Casbin/Enforcer.Internal.cs
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ private bool InternalEnforce<TRequest, TPolicy>(in EnforceContext context, in TR
}
else
{
StringPolicyValues policyValues = StringPolicyValues.Empty;
DummyPolicyValues policyValues = DummyPolicyValues.Empty;
HandleBeforeExpression(in context, ref session, in effectChain, in requestValues, policyValues);
session.ExpressionResult = expressionHandler.Invoke(in context, session.ExpressionString,
in requestValues, in policyValues);
Expand Down Expand Up @@ -335,3 +335,4 @@ private static string RewriteInOperator(in EnforceContext context, string expres
}



15 changes: 0 additions & 15 deletions Casbin/Extensions/Persist/PolicyFilterExtension.cs

This file was deleted.

91 changes: 89 additions & 2 deletions Casbin/Model/Policy.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using Casbin.Persist;

namespace Casbin.Model;

Expand Down Expand Up @@ -130,16 +132,101 @@ public static IPolicyValues ValuesFrom(IReadOnlyList<string> values)
12 => CreateValues(values[0], values[1], values[2], values[3],
values[4], values[5], values[6], values[7], values[8],
values[9], values[10], values[11]),
_ => new StringListPolicy(values)
_ => new StringListPolicyValues(values)
};
}

public static IPolicyValues ValuesFrom(IEnumerable<string> values) =>
ValuesFrom(values as IReadOnlyList<string> ?? values.ToArray());

public static IPolicyValues ValuesFrom(IPersistPolicy values)
{
// Find the latest not empty value as the count.
int count;
if (string.IsNullOrWhiteSpace(values.Value12) is false)
{
count = 12;
}
else if (string.IsNullOrWhiteSpace(values.Value11) is false)
{
count = 11;
}
else if (string.IsNullOrWhiteSpace(values.Value10) is false)
{
count = 10;
}
else if (string.IsNullOrWhiteSpace(values.Value9) is false)
{
count = 9;
}
else if (string.IsNullOrWhiteSpace(values.Value8) is false)
{
count = 8;
}
else if (string.IsNullOrWhiteSpace(values.Value7) is false)
{
count = 7;
}
else if (string.IsNullOrWhiteSpace(values.Value6) is false)
{
count = 6;
}
else if (string.IsNullOrWhiteSpace(values.Value5) is false)
{
count = 5;
}
else if (string.IsNullOrWhiteSpace(values.Value4) is false)
{
count = 4;
}
else if (string.IsNullOrWhiteSpace(values.Value3) is false)
{
count = 3;
}
else if (string.IsNullOrWhiteSpace(values.Value2) is false)
{
count = 2;
}
else if (string.IsNullOrWhiteSpace(values.Value1) is false)
{
count = 1;
}
else
{
count = 0;
}

return count switch
{
1 => CreateValues(values.Value1),
2 => CreateValues(values.Value1, values.Value2),
3 => CreateValues(values.Value1, values.Value2, values.Value3),
4 => CreateValues(values.Value1, values.Value2, values.Value3, values.Value4),
5 => CreateValues(values.Value1, values.Value2, values.Value3, values.Value4, values.Value5),
6 => CreateValues(values.Value1, values.Value2, values.Value3, values.Value4, values.Value5,
values.Value6),
7 => CreateValues(values.Value1, values.Value2, values.Value3, values.Value4, values.Value5,
values.Value6, values.Value7),
8 => CreateValues(values.Value1, values.Value2, values.Value3, values.Value4, values.Value5,
values.Value6, values.Value7, values.Value8),
9 => CreateValues(values.Value1, values.Value2, values.Value3, values.Value4, values.Value5,
values.Value6, values.Value7, values.Value8, values.Value9),
10 => CreateValues(values.Value1, values.Value2, values.Value3, values.Value4, values.Value5,
values.Value6, values.Value7, values.Value8, values.Value9, values.Value10),
11 => CreateValues(values.Value1, values.Value2, values.Value3, values.Value4, values.Value5,
values.Value6, values.Value7, values.Value8, values.Value9, values.Value10, values.Value11),
12 => CreateValues(values.Value1, values.Value2, values.Value3, values.Value4, values.Value5,
values.Value6, values.Value7, values.Value8, values.Value9, values.Value10, values.Value11,
values.Value12),
_ => throw new ArgumentOutOfRangeException(nameof(count), count, null)
};
}

public static IReadOnlyList<IPolicyValues> ValuesListFrom(IEnumerable<IEnumerable<string>> rules)
{
IEnumerable<IPolicyValues> policies = rules.Select(ValuesFrom);
return policies as IReadOnlyList<IPolicyValues> ?? policies.ToArray();
}
}


16 changes: 9 additions & 7 deletions Casbin/Model/PolicyValues.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public record PolicyValues : IPolicyValues
public virtual string this[int index] => throw new ArgumentOutOfRangeException(nameof(index));
public virtual IEnumerator<string> GetEnumerator() => new PolicyEnumerator<PolicyValues>(this);
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
public string ToText() => Text ??= ToText(this);
public string ToText() => Text ??= ToText((IEnumerable<string>)this);
public bool Equals(IPolicyValues other) => Equals(this, other);

internal static string ToText<T>(T values) where T : IPolicyValues
Expand Down Expand Up @@ -360,12 +360,12 @@ public override IEnumerator<string> GetEnumerator() =>
new PolicyEnumerator<PolicyValues<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>>(this);
}

public record StringPolicyValues(string Value1 = "", string Value2 = "", string Value3 = "",
internal record DummyPolicyValues(string Value1 = "", string Value2 = "", string Value3 = "",
string Value4 = "", string Value5 = "", string Value6 = "",
string Value7 = "", string Value8 = "", string Value9 = "",
string Value10 = "", string Value11 = "", string Value12 = "") : PolicyValues
{
public static new readonly StringPolicyValues Empty = new();
public static new readonly DummyPolicyValues Empty = new();
public override int Count => 12;

public override string this[int index] => index switch
Expand All @@ -382,18 +382,18 @@ public record StringPolicyValues(string Value1 = "", string Value2 = "", string
9 => Value10,
10 => Value11,
11 => Value12,
_ => throw new ArgumentOutOfRangeException(nameof(index))
_ => ""
};

public override IEnumerator<string> GetEnumerator() =>
new PolicyEnumerator<StringPolicyValues>(this);
new PolicyEnumerator<DummyPolicyValues>(this);
}

internal record StringListPolicy : PolicyValues
internal record StringListPolicyValues : PolicyValues
{
private readonly IReadOnlyList<string> _values;

public StringListPolicy(IReadOnlyList<string> values) => _values = values;
public StringListPolicyValues(IReadOnlyList<string> values) => _values = values;

public override int Count => _values.Count;
public override string this[int index] => _values[index];
Expand Down Expand Up @@ -421,3 +421,5 @@ public void Dispose()
public bool MoveNext() => ++_index < _value.Count;
public void Reset() => _index = -1;
}


Loading

0 comments on commit 36cff41

Please sign in to comment.