Example #1
0
        private void CompleteTask([NotNull] Tasks task, [NotNull] TaskProcessingResult result)
        {
            var lowResults    = 0;
            var mediumResults = 0;
            var highResults   = 0;

            var vulnerabilities = result.Todo.Concat(result.Reopen).Select(x => x.VulnerabilityInfo);

            foreach (var vulnerabilityInfo in vulnerabilities)
            {
                var severity = _vulnerabilitySeverityResolver.Resolve(vulnerabilityInfo.Type);

                switch (severity)
                {
                case VulnerabilitySeverityType.Low:
                    lowResults++;
                    break;

                case VulnerabilitySeverityType.Medium:
                    mediumResults++;
                    break;

                case VulnerabilitySeverityType.High:
                    highResults++;
                    break;

                case VulnerabilitySeverityType.Unknown:

                    // TODO log severities of such type because they are new for us
                    lowResults++;
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                var typeShort = _vulnerabilityShortTypeResolver.Resolve(vulnerabilityInfo.Type);
                typeShort = typeShort.Substring(0, Math.Min(10, typeShort.Length));

                _taskResultRepository.Insert(
                    new TaskResults
                {
                    AdditionalExploitConditions = vulnerabilityInfo.AdditionalExploitConditions,
                    Description      = vulnerabilityInfo.Description,
                    ExploitGraph     = vulnerabilityInfo.Exploit,
                    File             = vulnerabilityInfo.File,
                    Function         = vulnerabilityInfo.Function,
                    LineNumber       = vulnerabilityInfo.NumberLine,
                    Message          = vulnerabilityInfo.Message,
                    Place            = vulnerabilityInfo.Place,
                    RawLine          = vulnerabilityInfo.RawLine,
                    SeverityTypeInfo = severity == VulnerabilitySeverityType.Unknown
                                                                                                ? VulnerabilitySeverityType.Low
                                                                                                : severity,
                    SourceFile   = vulnerabilityInfo.SourceFile,
                    TaskId       = task.Id,
                    Type         = vulnerabilityInfo.Type,
                    TypeShort    = typeShort,
                    LinePosition = vulnerabilityInfo.Position,
                    IssueNumber  = vulnerabilityInfo.IssueNumber,
                    IssueUrl     = vulnerabilityInfo.IssueUrl
                });
            }

            task.FinishPostProcessing(_timeService.GetUtc());

            task.LowSeverityVulns    = lowResults;
            task.MediumSeverityVulns = mediumResults;
            task.HighSeverityVulns   = highResults;

            task.FP     = result.FalsePositiveAnnotations.Length + result.FalsePositivePairs.Length;
            task.Todo   = result.Todo.Length;
            task.Reopen = result.Reopen.Length;
            task.Fixed  = result.Fixed.Length;

            var previousTask = _taskRepository.GetPrevious(task);

            if (previousTask == null)
            {
                return;
            }

            task.IncrementFP     = task.FP - previousTask.FP;
            task.IncrementFixed  = task.Fixed - previousTask.Fixed;
            task.IncrementReopen = task.Reopen - previousTask.Reopen;
            task.IncrementTodo   = task.Todo - previousTask.Todo;
        }
        protected override void ExecuteStage(PostProcessingBundle bundle)
        {
            var branches = bundle.VersionControlPlugin.GetBranches().ToList();

            var mainBranch = branches.First(x => x.Name == bundle.Task.Repository);

            var annotationGroups = bundle.Changes
                                   .Where(x => x.Type != FileChangeAnnotationType.None)
                                   .GroupBy(x => x.Annotation.LongName);

            foreach (var typeGroup in annotationGroups)
            {
                var branchName = _branchNameBuilder.Build(new BranchNameBuilderInfo {
                    Type = typeGroup.Key
                });

                var branch = branches.FirstOrDefault(
                    x => string.Equals(
                        x.Name,
                        branchName,
                        StringComparison.CurrentCultureIgnoreCase));

                if (branch == null)
                {
                    using (
                        var telemetryScope = _telemetryScopeProvider.Create <VcsPluginInfo>(TelemetryOperationNames.VcsPlugin.CreateBranch)
                        )
                    {
                        try
                        {
                            telemetryScope.SetEntity(
                                new VcsPluginInfo
                            {
                                Plugin            = bundle.Task.Projects.Plugins1,                              // VCS plugin =)
                                CreatedBranchName = branchName,
                                TaskId            = bundle.Task.Id
                            });

                            branch = bundle.VersionControlPlugin.CreateBranch(bundle.Task.FolderPath, branchName, mainBranch.Id);

                            telemetryScope.WriteSuccess();
                        }
                        catch (Exception ex)
                        {
                            telemetryScope.WriteException(ex);

                            throw;
                        }
                    }

                    branches.Add(branch);
                }

                foreach (var fileGroup in typeGroup.GroupBy(x => x.Annotation.File))
                {
                    var content = File.ReadAllText(Path.Combine(bundle.Task.FolderPath, fileGroup.Key));

                    var ending = content.GetLineSplitter();

                    var linesContent = content.Split(new[] { ending }, StringSplitOptions.None).ToList();

                    var rowShift = 0;

                    foreach (var fileUpdate in fileGroup.OrderBy(x => x.Annotation.LineStart))
                    {
                        var removeCount = 0;

                        if (fileUpdate.Type == FileChangeAnnotationType.Update)
                        {
                            removeCount = fileUpdate.Annotation.LineEnd - fileUpdate.Annotation.LineStart + 1;

                            for (var index = 0; index < removeCount; index++)
                            {
                                linesContent.RemoveAt(fileUpdate.Annotation.LineStart + rowShift - 1);
                            }
                        }

                        var serializedIssueAnnotation = _issueAnnotationSerializer.Serialize(fileUpdate.Annotation);

                        var annotation = _issueAnnotationFormatter.Format(serializedIssueAnnotation);

                        var lines = annotation.Split('\n');

                        var rawLine        = linesContent[fileUpdate.Annotation.LineStart + rowShift - 1];
                        var startLineShift = rawLine.Substring(0, rawLine.Length - rawLine.TrimStart(' ', '\t').Length);

                        for (var index = 0; index < lines.Length; index++)
                        {
                            linesContent.Insert(
                                fileUpdate.Annotation.LineStart + rowShift + index - 1,
                                startLineShift + lines[index].Trim());
                        }

                        rowShift = rowShift - removeCount + lines.Length;
                        if (fileUpdate.Vulnerability != null)
                        {
                            fileUpdate.Vulnerability.NumberLine = fileUpdate.Annotation.LineStart + rowShift;
                        }
                    }

                    var memoryStream = new MemoryStream();
                    var streamWriter = new StreamWriter(memoryStream);

                    streamWriter.Write(string.Join(ending, linesContent));

                    streamWriter.Flush();
                    streamWriter.Close();

                    var commitTemplate = _templateProvider.Get(TemplateNames.CommitName);

                    commitTemplate.Body.Add(
                        new Dictionary <string, object>
                    {
                        { "Group", _vulnerabilityShortTypeResolver.Resolve(typeGroup.Key) },
                        { "File", Path.GetFileName(fileGroup.Key) }
                    });

                    var bodyCommit = commitTemplate.Body.Render();

                    _log.Debug($"Commit to {branch.Id} {fileGroup.Key}");

                    var fileContent = memoryStream.ToArray();

                    using (var telemetryScope = _telemetryScopeProvider.Create <VcsPluginInfo>(TelemetryOperationNames.VcsPlugin.Commit))
                    {
                        try
                        {
                            telemetryScope.SetEntity(
                                new VcsPluginInfo
                            {
                                Plugin = bundle.Task.Projects.Plugins1,                                         // VCS plugin
                                CommittedSourcesSize = fileContent.Length,
                                TaskId = bundle.Task.Id
                            });

                            bundle.VersionControlPlugin.Commit(
                                bundle.Task.FolderPath,
                                branch.Id,
                                bodyCommit,
                                fileGroup.Key,
                                fileContent);

                            telemetryScope.WriteSuccess();
                        }
                        catch (Exception ex)
                        {
                            telemetryScope.WriteException(ex);

                            throw;
                        }
                    }
                }
            }

            bundle.VersionControlPlugin.CleanUp(bundle.Task.FolderPath);
        }
 public string ShouldResolveShortTypeName(string longName) => _target.Resolve(longName);