Fix override behavior (#538)
This commit is contained in:
Родитель
f591a0acb7
Коммит
49e51a974d
|
@ -424,21 +424,29 @@ public class RuleProcessor
|
||||||
|
|
||||||
List<MatchRecord> removes = new();
|
List<MatchRecord> removes = new();
|
||||||
|
|
||||||
foreach (var m in resultsList.Where(x => x.Rule?.Overrides?.Count > 0))
|
foreach (var matchRecord in resultsList.Where(x => x.Rule?.Overrides?.Count > 0))
|
||||||
{
|
{
|
||||||
if (cancellationToken?.IsCancellationRequested is true)
|
if (cancellationToken?.IsCancellationRequested is true)
|
||||||
{
|
{
|
||||||
return resultsList;
|
return resultsList;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var ovrd in (IList<string>?)m.Rule?.Overrides ?? Array.Empty<string>())
|
foreach (var idToOverride in matchRecord.Rule?.Overrides ?? Array.Empty<string>())
|
||||||
|
{
|
||||||
// Find all overriden rules and mark them for removal from issues list
|
// Find all overriden rules and mark them for removal from issues list
|
||||||
foreach (var om in resultsList.FindAll(x => x.Rule?.Id == ovrd))
|
foreach (var potentialOverriddenMatch in resultsList.FindAll(x => x.Rule?.Id == idToOverride))
|
||||||
if (om.Boundary.Index >= m.Boundary.Index &&
|
|
||||||
om.Boundary.Index <= m.Boundary.Index + m.Boundary.Length)
|
|
||||||
{
|
{
|
||||||
removes.Add(om);
|
// Start after or matching start
|
||||||
|
if (potentialOverriddenMatch.Boundary.Index >= matchRecord.Boundary.Index &&
|
||||||
|
// End before or matching end
|
||||||
|
(potentialOverriddenMatch.Boundary.Index + potentialOverriddenMatch.Boundary.Length)
|
||||||
|
<= (matchRecord.Boundary.Index + matchRecord.Boundary.Length))
|
||||||
|
{
|
||||||
|
removes.Add(potentialOverriddenMatch);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove overriden rules
|
// Remove overriden rules
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using Microsoft.ApplicationInspector.RulesEngine;
|
using Microsoft.ApplicationInspector.RulesEngine;
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
|
using static Microsoft.CST.RecursiveExtractor.FileEntry;
|
||||||
|
|
||||||
namespace AppInspector.Tests.RuleProcessor;
|
namespace AppInspector.Tests.RuleProcessor;
|
||||||
|
|
||||||
|
@ -65,4 +69,87 @@ public class RuleTests
|
||||||
rule.Disabled = true;
|
rule.Disabled = true;
|
||||||
Assert.AreEqual(true, rule.Disabled);
|
Assert.AreEqual(true, rule.Disabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private const string overrideRules = @"[
|
||||||
|
{
|
||||||
|
""id"": ""SA000005"",
|
||||||
|
""name"": ""Testing.Rules.Overridee"",
|
||||||
|
""tags"": [
|
||||||
|
""Testing.Rules.Overridee""
|
||||||
|
],
|
||||||
|
""severity"": ""Critical"",
|
||||||
|
""description"": ""This rule finds car"",
|
||||||
|
""patterns"": [
|
||||||
|
{
|
||||||
|
""pattern"": ""car"",
|
||||||
|
""type"": ""regex"",
|
||||||
|
""confidence"": ""High"",
|
||||||
|
""scopes"": [
|
||||||
|
""code""
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
""_comment"": """"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
""id"": ""SA000006"",
|
||||||
|
""name"": ""Testing.Rules.Overridee"",
|
||||||
|
""tags"": [
|
||||||
|
""Testing.Rules.Overridee""
|
||||||
|
],
|
||||||
|
""overrides"": [""SA000005""],
|
||||||
|
""severity"": ""Critical"",
|
||||||
|
""description"": ""This rule finds racecar"",
|
||||||
|
""patterns"": [
|
||||||
|
{
|
||||||
|
""pattern"": ""racecar"",
|
||||||
|
""type"": ""regex"",
|
||||||
|
""confidence"": ""High"",
|
||||||
|
""scopes"": [
|
||||||
|
""code""
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
""_comment"": """"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
""id"": ""SA000007"",
|
||||||
|
""name"": ""Testing.Rules.Overridee"",
|
||||||
|
""tags"": [
|
||||||
|
""Testing.Rules.Overridee""
|
||||||
|
],
|
||||||
|
""overrides"": [""SA000005""],
|
||||||
|
""severity"": ""Critical"",
|
||||||
|
""description"": ""This rule finds ar"",
|
||||||
|
""patterns"": [
|
||||||
|
{
|
||||||
|
""pattern"": ""ar"",
|
||||||
|
""type"": ""regex"",
|
||||||
|
""confidence"": ""High"",
|
||||||
|
""scopes"": [
|
||||||
|
""code""
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
""_comment"": """"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
";
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public async Task Overrides()
|
||||||
|
{
|
||||||
|
RuleSet rules = new();
|
||||||
|
var originalSource = "TestRules";
|
||||||
|
rules.AddString(overrideRules, originalSource);
|
||||||
|
Microsoft.ApplicationInspector.RulesEngine.RuleProcessor processor = new(rules, new RuleProcessorOptions());
|
||||||
|
var entry = await FromStreamAsync("dummy", new MemoryStream(Encoding.UTF8.GetBytes("racecar car")));
|
||||||
|
var langs = new Microsoft.ApplicationInspector.RulesEngine.Languages();
|
||||||
|
langs.FromFileNameOut("dummy.cs", out LanguageInfo info);
|
||||||
|
var results = processor.AnalyzeFile(entry, info);
|
||||||
|
Assert.AreEqual(4, results.Count);
|
||||||
|
Assert.AreEqual(1, results.Count(x=> x.Rule.Id == "SA000006"));
|
||||||
|
Assert.AreEqual(1, results.Count(x=> x.Rule.Id == "SA000005"));
|
||||||
|
Assert.AreEqual(2, results.Count(x=> x.Rule.Id == "SA000007"));
|
||||||
|
}
|
||||||
}
|
}
|
Загрузка…
Ссылка в новой задаче