Skip to content

Commit

Permalink
Merge pull request #203 from sagilio/fix#200
Browse files Browse the repository at this point in the history
feat:  Compatible with IEffector of golang casbin and refactor intern…
  • Loading branch information
sagilio authored Aug 7, 2021
2 parents 78cedb6 + 1c4ade3 commit 0e26050
Show file tree
Hide file tree
Showing 6 changed files with 218 additions and 181 deletions.
1 change: 0 additions & 1 deletion Casbin.NET.sln
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
.releaserc.json = .releaserc.json
azure-pipelines.yml = azure-pipelines.yml
.github\workflows\build.yml = .github\workflows\build.yml
NetCasbin\Model\IReadOnlyAssertion.cs = NetCasbin\Model\IReadOnlyAssertion.cs
LICENSE = LICENSE
README.md = README.md
.github\workflows\release.yml = .github\workflows\release.yml
Expand Down
2 changes: 1 addition & 1 deletion NetCasbin/Abstractions/Effect/IChainEffector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public interface IChainEffector

public string EffectExpression { get; }

public EffectExpressionType PolicyEffectType { get; }
public EffectExpressionType EffectExpressionType { get; }

public void StartChain(string policyEffect);

Expand Down
8 changes: 5 additions & 3 deletions NetCasbin/Abstractions/Effect/IEffector.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace Casbin.Effect
using System.Collections.Generic;

namespace Casbin.Effect
{
/// <summary>
/// Effector is the interface for Casbin effectors.
Expand All @@ -8,11 +10,11 @@ public interface IEffector
/// <summary>
/// Merges all matching results collected by the enforcer into a single decision.
/// </summary>
/// <param name="policyEffect">The expression of [policy_effect].</param>
/// <param name="effectExpression">The expression of [policy_effect].</param>
/// <param name="effects">The effects of all matched rules.</param>
/// <param name="results">The matcher results of all matched rules.</param>
/// <param name="hitPolicyIndex"></param>
/// <returns>The final effect.</returns>
bool MergeEffects(string policyEffect, PolicyEffect[] effects, float[] results, out int hitPolicyIndex);
PolicyEffect MergeEffects(string effectExpression, IReadOnlyList<PolicyEffect> effects, IReadOnlyList<float> results, int policyIndex, int policyCount, out int hitPolicyIndex);
}
}
50 changes: 23 additions & 27 deletions NetCasbin/Effect/DefaultEffector.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
using Casbin.Evaluation;
using Casbin.Extensions;

namespace Casbin.Effect
{
Expand All @@ -13,42 +15,32 @@ public class DefaultEffector : IEffector, IChainEffector
/// </summary>
/// <param name="effectExpression"></param>
/// <param name="effects"></param>
/// <param name="results"></param>
/// <param name="matches"></param>
/// <param name="hitPolicyIndex"></param>
/// <returns></returns>
public bool MergeEffects(string effectExpression, PolicyEffect[] effects, float[] results, out int hitPolicyIndex)
public PolicyEffect MergeEffects(string effectExpression, IReadOnlyList<PolicyEffect> effects, IReadOnlyList<float> matches, int policyIndex, int policyCount, out int hitPolicyIndex)
{
return MergeEffects(effectExpression, effects.AsSpan(), results.AsSpan(), out hitPolicyIndex);
}


/// <summary>
/// Merges all matching results collected by the enforcer into a single decision.
/// </summary>
/// <param name="effectExpression"></param>
/// <param name="effects"></param>
/// <param name="results"></param>
/// <param name="hitPolicyIndex"></param>
/// <returns></returns>
private bool MergeEffects(string effectExpression, Span<PolicyEffect> effects, Span<float> results, out int hitPolicyIndex)
{
PolicyEffectType = ParseEffectExpressionType(effectExpression);
return MergeEffects(PolicyEffectType, effects, results, out hitPolicyIndex);
EffectExpressionType effectExpressionType = ParseEffectExpressionType(effectExpression);
bool? result = MergeEffects(effectExpressionType, effects, matches, policyIndex, policyCount, out hitPolicyIndex);
return result.ToPolicyEffect();
}

/// <summary>
/// Merges all matching results collected by the enforcer into a single decision.
/// </summary>
/// <param name="effectExpressionType"></param>
/// <param name="effects"></param>
/// <param name="results"></param>
/// <param name="matches"></param>
/// <param name="hitPolicyIndex"></param>
/// <returns></returns>
private bool MergeEffects(EffectExpressionType effectExpressionType, Span<PolicyEffect> effects, Span<float> results, out int hitPolicyIndex)
private static bool? MergeEffects(EffectExpressionType effectExpressionType, IReadOnlyList<PolicyEffect> effects,
IReadOnlyList<float> matches, int policyIndex, int policyCount, out int hitPolicyIndex)
{
bool finalResult = false;
hitPolicyIndex = -1;
for (int index = 0; index < effects.Length; index++)
int effectCount = policyIndex + 1;
bool finalResult = false;

for (int index = 0; index < effectCount; index++)
{
if (EffectEvaluator.TryEvaluate(effects[index] , effectExpressionType,
ref finalResult, out bool hitPolicy))
Expand All @@ -61,7 +53,11 @@ private bool MergeEffects(EffectExpressionType effectExpressionType, Span<Policy
}
}

return finalResult;
if (effectCount == policyCount)
{
return finalResult;
}
return null;
}

public static EffectExpressionType ParseEffectExpressionType(string effectExpression) => effectExpression switch
Expand All @@ -83,12 +79,12 @@ private bool MergeEffects(EffectExpressionType effectExpressionType, Span<Policy

public string EffectExpression { get; private set; }

public EffectExpressionType PolicyEffectType { get; private set; }
public EffectExpressionType EffectExpressionType { get; private set; }

public void StartChain(string effectExpression)
{
EffectExpression = effectExpression ?? throw new ArgumentNullException(nameof(effectExpression));
PolicyEffectType = ParseEffectExpressionType(EffectExpression);
EffectExpressionType = ParseEffectExpressionType(EffectExpression);
CanChain = true;
Result = false;
}
Expand All @@ -102,7 +98,7 @@ public bool Chain(PolicyEffect effect)

bool result = Result;

if (EffectEvaluator.TryEvaluate(effect, PolicyEffectType,
if (EffectEvaluator.TryEvaluate(effect, EffectExpressionType,
ref result, out bool hitPolicy))
{
CanChain = false;
Expand All @@ -125,7 +121,7 @@ public bool TryChain(PolicyEffect effect)
}

bool result = Result;
if (EffectEvaluator.TryEvaluate(effect, PolicyEffectType,
if (EffectEvaluator.TryEvaluate(effect, EffectExpressionType,
ref result, out bool hitPolicy))
{
CanChain = false;
Expand Down
Loading

0 comments on commit 0e26050

Please sign in to comment.