public void LoadRuleSet(RuleSet ruleSet) { foreach (Rule rule in ruleSet) { CompiledRuleset.AddRule(rule); } }
public void LoadFile(string file) { try { CompiledRuleset.AddFile(file, null); } catch (Exception e) { Debug.Write(e.Message);//Ensure console message indicates problem for Build process WriteOnce.SafeLog(e.Message, NLog.LogLevel.Error); throw new OpException(MsgHelp.FormatString(MsgHelp.ID.VERIFY_RULE_LOADFILE_FAILED, file)); } }
private void CheckIntegrity() { IsVerified = true; foreach (Rule rule in CompiledRuleset.AsEnumerable() ?? Array.Empty <Rule>()) { bool ruleVerified = CheckIntegrity(rule); _ruleStatuses?.Add(new RuleStatus() { RulesId = rule.Id, RulesName = rule.Name, Verified = ruleVerified }); IsVerified = ruleVerified && IsVerified; if (_failFast && !ruleVerified) { return; } } }
public bool CheckIntegrity(Rule rule) { bool isValid = true; // Check for null Id if (rule.Id == null) { _logger?.Error(MsgHelp.FormatString(MsgHelp.ID.VERIFY_RULES_NULLID_FAIL, rule.Name)); isValid = false; } else { // Check for same ID if (CompiledRuleset.Count(x => x.Id == rule.Id) > 1) { _logger?.Error(MsgHelp.FormatString(MsgHelp.ID.VERIFY_RULES_DUPLICATEID_FAIL, rule.Id)); isValid = false; } } //applicability if (rule.AppliesTo != null) { string[] languages = Language.GetNames(); // Check for unknown language foreach (string lang in rule.AppliesTo) { if (!string.IsNullOrEmpty(lang)) { if (!languages.Any(x => x.Equals(lang, StringComparison.CurrentCultureIgnoreCase))) { _logger?.Error(MsgHelp.FormatString(MsgHelp.ID.VERIFY_RULES_LANGUAGE_FAIL, rule.Id ?? "")); return(false); } } } } foreach (var pattern in rule.FileRegexes ?? Array.Empty <string>()) { try { _ = new Regex(pattern, RegexOptions.Compiled); } catch (Exception e) { _logger?.Error(MsgHelp.FormatString(MsgHelp.ID.VERIFY_RULES_REGEX_FAIL, rule.Id ?? "", pattern ?? "", e.Message)); return(false); } } //valid search pattern foreach (SearchPattern searchPattern in rule.Patterns ?? Array.Empty <SearchPattern>()) { if (searchPattern.PatternType == PatternType.RegexWord || searchPattern.PatternType == PatternType.Regex) { try { if (string.IsNullOrEmpty(searchPattern.Pattern)) { throw new ArgumentException(); } _ = new Regex(searchPattern.Pattern); } catch (Exception e) { _logger?.Error(MsgHelp.FormatString(MsgHelp.ID.VERIFY_RULES_REGEX_FAIL, rule.Id ?? "", searchPattern.Pattern ?? "", e.Message)); return(false); } } } foreach (var condition in rule.Conditions ?? Array.Empty <SearchCondition>()) { if (condition.SearchIn is null) { _logger?.Error("SearchIn is null in {0}", rule.Id); return(false); } if (condition.SearchIn.StartsWith("finding-region")) { var parSplits = condition.SearchIn.Split(new char[] { ')', '(' }); if (parSplits.Length == 3) { var splits = parSplits[1].Split(','); if (splits.Length == 2) { if (int.TryParse(splits[0], out int int1) && int.TryParse(splits[1], out int int2)) { if (int1 > 0 && int2 < 0) { _logger?.Error("The finding region must have a negative number or 0 for the lines before and a positive number or 0 for lines after. {0}", rule.Id); return(false); } } } else { _logger?.Error("Improperly specified finding region. {0}", rule.Id); return(false); } } else { _logger?.Error("Improperly specified finding region. {0}", rule.Id); return(false); } } } if (rule.Tags?.Length == 0) { isValid = false; } return(isValid); }