internal Result CreateResult(ResultVersionOne v1Result)
        {
            Result result = null;

            if (v1Result != null)
            {
                result = new Result
                {
                    BaselineState     = Utilities.CreateBaselineState(v1Result.BaselineState),
                    CodeFlows         = v1Result.CodeFlows?.Select(CreateCodeFlow).ToList(),
                    Fixes             = v1Result.Fixes?.Select(CreateFix).ToList(),
                    InstanceGuid      = v1Result.Id,
                    Level             = Utilities.CreateFailureLevel(v1Result.Level),
                    Kind              = Utilities.CreateResultKind(v1Result.Level),
                    Locations         = v1Result.Locations?.Select(CreateLocation).ToList(),
                    Message           = CreateMessage(v1Result.Message),
                    Properties        = v1Result.Properties,
                    RelatedLocations  = v1Result.RelatedLocations?.Select(CreateLocation).ToList(),
                    Stacks            = v1Result.Stacks?.Select(CreateStack).ToList(),
                    SuppressionStates = Utilities.CreateSuppressionStates(v1Result.SuppressionStates)
                };

                // The v2 spec says that analysisTarget is required only if it differs from the result location.
                // On the other hand, the v1 spec says that if the result is found in the file that the tool
                // was instructed to scan, then analysisTarget should be present and resultFile should be
                // absent -- so we should _not_ populate the v2 analysisTarget in this case.
                LocationVersionOne v1Location = v1Result.Locations?[0];
                if (v1Location?.ResultFile != null && v1Location.AnalysisTarget?.Uri != v1Location.ResultFile.Uri)
                {
                    result.AnalysisTarget = CreateFileLocation(v1Result.Locations[0].AnalysisTarget);
                }

                result.RuleId = v1Result.RuleId;

                string ruleKey = v1Result.RuleKey ?? v1Result.RuleId;
                result.RuleIndex = GetRuleIndexForRuleKey(ruleKey, _v1RuleKeyToV2IndexMap);

                if (v1Result.FormattedRuleMessage != null)
                {
                    if (result.Message == null)
                    {
                        result.Message = new Message()
                        {
                            MessageId = v1Result.FormattedRuleMessage.FormatId
                        };
                    }

                    result.Message.Arguments = v1Result.FormattedRuleMessage.Arguments;
                }

                if (!string.IsNullOrWhiteSpace(v1Result.ToolFingerprintContribution))
                {
                    result.PartialFingerprints = new Dictionary <string, string>
                    {
                        { "Fingerprint", v1Result.ToolFingerprintContribution }
                    };
                }

                if (!string.IsNullOrWhiteSpace(v1Result.Snippet))
                {
                    if (result.Locations == null)
                    {
                        result.Locations = new List <Location>();
                    }

                    if (result.Locations.Count == 0)
                    {
                        result.Locations.Add(new Location());
                    }

                    if (result.Locations[0].PhysicalLocation == null)
                    {
                        result.Locations[0].PhysicalLocation = new PhysicalLocation();
                    }

                    if (result.Locations[0].PhysicalLocation.Region == null)
                    {
                        result.Locations[0].PhysicalLocation.Region = new Region();
                    }

                    result.Locations[0].PhysicalLocation.Region.Snippet = new ArtifactContent
                    {
                        Text = v1Result.Snippet
                    };
                }
            }

            return(result);
        }
        internal ResultVersionOne CreateResultVersionOne(Result v2Result)
        {
            ResultVersionOne result = null;

            if (v2Result != null)
            {
                result = new ResultVersionOne
                {
                    BaselineState     = Utilities.CreateBaselineStateVersionOne(v2Result.BaselineState),
                    Fixes             = v2Result.Fixes?.Select(CreateFixVersionOne).ToList(),
                    Id                = v2Result.InstanceGuid,
                    Level             = Utilities.CreateResultLevelVersionOne(v2Result.Level, v2Result.Kind),
                    Locations         = v2Result.Locations?.Select(CreateLocationVersionOne).ToList(),
                    Message           = v2Result.Message?.Text,
                    Properties        = v2Result.Properties,
                    RelatedLocations  = v2Result.RelatedLocations?.Select(CreateAnnotatedCodeLocationVersionOne).ToList(),
                    Snippet           = v2Result.Locations?[0]?.PhysicalLocation?.Region?.Snippet?.Text,
                    Stacks            = v2Result.Stacks?.Select(CreateStackVersionOne).ToList(),
                    SuppressionStates = Utilities.CreateSuppressionStatesVersionOne(v2Result.SuppressionStates)
                };

                if (result.Fixes != null)
                {
                    // Null Fixes will be present in the case of unsupported encoding
                    (result.Fixes as List <FixVersionOne>).RemoveAll(f => f == null);

                    if (result.Fixes.Count == 0)
                    {
                        result.Fixes = null;
                    }
                }

                if (v2Result.AnalysisTarget != null)
                {
                    foreach (LocationVersionOne location in result.Locations)
                    {
                        location.AnalysisTarget = CreatePhysicalLocationVersionOne(v2Result.AnalysisTarget);
                    }
                }

                result.RuleId = v2Result.RuleId;
                string ruleKey = GetV1RuleKeyFromV2Index(v2Result.RuleIndex, _v2RuleIndexToV1KeyMap);

                // If the rules dictionary key is the same as the rule id, don't set result.RuleKey;
                // leave it null. This way, we don't unnecessarily persist ruleKey in the v1 SARIF file.
                // That is, we persist
                //
                //   "ruleId": "TST0001"
                //
                // instead of
                //
                //   "ruleId": "TST0001",
                //   "ruleKey": "TST0001"
                //
                if (ruleKey != result.RuleId)
                {
                    result.RuleKey = ruleKey;
                }

                if (!string.IsNullOrWhiteSpace(v2Result.Message?.MessageId))
                {
                    result.FormattedRuleMessage = new FormattedRuleMessageVersionOne
                    {
                        Arguments = v2Result.Message?.Arguments,
                        FormatId  = v2Result.Message.MessageId
                    };
                }
            }

            return(result);
        }
        internal Result CreateResult(ResultVersionOne v1Result)
        {
            Result result = null;

            if (v1Result != null)
            {
                result = new Result
                {
                    BaselineState     = Utilities.CreateBaselineState(v1Result.BaselineState),
                    CodeFlows         = v1Result.CodeFlows?.Select(CreateCodeFlow).ToList(),
                    Fixes             = v1Result.Fixes?.Select(CreateFix).ToList(),
                    InstanceGuid      = v1Result.Id,
                    Level             = Utilities.CreateResultLevel(v1Result.Level),
                    Locations         = v1Result.Locations?.Select(CreateLocation).ToList(),
                    Message           = CreateMessage(v1Result.Message),
                    Properties        = v1Result.Properties,
                    RelatedLocations  = v1Result.RelatedLocations?.Select(CreateLocation).ToList(),
                    Stacks            = v1Result.Stacks?.Select(CreateStack).ToList(),
                    SuppressionStates = Utilities.CreateSuppressionStates(v1Result.SuppressionStates)
                };

                // The spec says that analysisTarget is required only if it differs from the result file.
                if (v1Result.Locations?[0]?.AnalysisTarget?.Uri != v1Result.Locations?[0]?.ResultFile?.Uri)
                {
                    result.AnalysisTarget = CreateFileLocation(v1Result.Locations[0].AnalysisTarget);
                }

                if (v1Result.RuleKey == null)
                {
                    result.RuleId = v1Result.RuleId;
                }
                else
                {
                    if (v1Result.RuleId == null)
                    {
                        result.RuleId = v1Result.RuleKey;
                    }
                    else
                    {
                        if (v1Result.RuleId == v1Result.RuleKey)
                        {
                            result.RuleId = v1Result.RuleId;
                        }
                        else
                        {
                            result.RuleId = v1Result.RuleKey;

                            if (_currentRun.Resources == null)
                            {
                                _currentRun.Resources = new Resources();
                            }

                            if (_currentRun.Resources.Rules == null)
                            {
                                _currentRun.Resources.Rules = new Dictionary <string, Rule>();
                            }

                            IDictionary <string, Rule> rules = _currentRun.Resources.Rules;

                            if (!rules.ContainsKey(v1Result.RuleKey))
                            {
                                rules.Add(v1Result.RuleKey, new Rule());
                            }

                            rules[v1Result.RuleKey].Id = v1Result.RuleId;
                        }
                    }
                }

                if (v1Result.FormattedRuleMessage != null)
                {
                    result.RuleMessageId = v1Result.FormattedRuleMessage.FormatId;

                    if (result.Message == null)
                    {
                        result.Message = new Message();
                    }

                    result.Message.Arguments = v1Result.FormattedRuleMessage.Arguments;
                }

                if (!string.IsNullOrWhiteSpace(v1Result.ToolFingerprintContribution))
                {
                    result.PartialFingerprints = new Dictionary <string, string>
                    {
                        { "Fingerprint", v1Result.ToolFingerprintContribution }
                    };
                }

                if (!string.IsNullOrWhiteSpace(v1Result.Snippet))
                {
                    if (result.Locations == null)
                    {
                        result.Locations = new List <Location>();
                    }

                    if (result.Locations.Count == 0)
                    {
                        result.Locations.Add(new Location());
                    }

                    if (result.Locations[0].PhysicalLocation == null)
                    {
                        result.Locations[0].PhysicalLocation = new PhysicalLocation();
                    }

                    if (result.Locations[0].PhysicalLocation.Region == null)
                    {
                        result.Locations[0].PhysicalLocation.Region = new Region();
                    }

                    result.Locations[0].PhysicalLocation.Region.Snippet = new FileContent
                    {
                        Text = v1Result.Snippet
                    };
                }
            }

            return(result);
        }
Example #4
0
        internal ResultVersionOne CreateResult(Result v2Result)
        {
            ResultVersionOne result = null;

            if (v2Result != null)
            {
                result = new ResultVersionOne
                {
                    BaselineState     = Utilities.CreateBaselineStateVersionOne(v2Result.BaselineState),
                    Fixes             = v2Result.Fixes?.Select(CreateFix).ToList(),
                    Id                = v2Result.InstanceGuid,
                    Level             = Utilities.CreateResultLevelVersionOne(v2Result.Level),
                    Locations         = v2Result.Locations?.Select(CreateLocation).ToList(),
                    Message           = v2Result.Message?.Text,
                    Properties        = v2Result.Properties,
                    RelatedLocations  = v2Result.RelatedLocations?.Select(CreateAnnotatedCodeLocation).ToList(),
                    Snippet           = v2Result.Locations?[0]?.PhysicalLocation?.Region?.Snippet?.Text,
                    Stacks            = v2Result.Stacks?.Select(CreateStack).ToList(),
                    SuppressionStates = Utilities.CreateSuppressionStatesVersionOne(v2Result.SuppressionStates)
                };

                if (result.Fixes != null)
                {
                    // Null Fixes will be present in the case of unsupported encoding
                    (result.Fixes as List <FixVersionOne>).RemoveAll(f => f == null);

                    if (result.Fixes.Count == 0)
                    {
                        result.Fixes = null;
                    }
                }

                if (v2Result.AnalysisTarget != null)
                {
                    foreach (LocationVersionOne location in result.Locations)
                    {
                        location.AnalysisTarget = CreatePhysicalLocation(v2Result.AnalysisTarget);
                    }
                }

                if (_currentV2Run.Resources?.Rules != null)
                {
                    IDictionary <string, Rule> rules = _currentV2Run.Resources.Rules;
                    Rule v2Rule;

                    if (v2Result.RuleId != null &&
                        rules.TryGetValue(v2Result.RuleId, out v2Rule) &&
                        v2Rule.Id != v2Result.RuleId)
                    {
                        result.RuleId  = v2Rule.Id;
                        result.RuleKey = v2Result.RuleId;
                    }
                    else
                    {
                        result.RuleId = v2Result.RuleId;
                    }
                }
                else
                {
                    result.RuleId = v2Result.RuleId;
                }

                if (!string.IsNullOrWhiteSpace(v2Result.Message?.MessageId))
                {
                    result.FormattedRuleMessage = new FormattedRuleMessageVersionOne
                    {
                        Arguments = v2Result.Message?.Arguments,
                        FormatId  = v2Result.Message.MessageId
                    };
                }
            }

            return(result);
        }