コード例 #1
0
        /// <summary>
        ///     Create a CheckRunUpdate based on a check run that needs to be deleted
        /// </summary>
        /// <param name="checkRun">The check run that needs to be deleted</param>
        /// <returns>The deleted check run</returns>
        private CheckRunUpdate CheckRunForDelete(CheckRun checkRun)
        {
            CheckRunUpdate updatedCheckRun = new CheckRunUpdate();

            updatedCheckRun.CompletedAt = checkRun.CompletedAt;
            updatedCheckRun.Status      = "completed";
            updatedCheckRun.Conclusion  = "skipped";
            return(updatedCheckRun);
        }
コード例 #2
0
        /// <summary>
        /// Identifies the <see cref="PullRequest.Number"/> a <see cref="CheckRun"/> originated from
        /// </summary>
        /// <param name="checkRun">The <see cref="CheckRun"/> to test</param>
        /// <returns>The associated <see cref="PullRequest.Number"/> on success, <see langword="null"/> on failure</returns>
        static int?GetPullRequestNumberFromCheckRun(CheckRun checkRun)
        {
            //nice thing about check runs we know they contain our pull request number in the title
            var prRegex = Regex.Match(checkRun.Name, "#([1-9][0-9]*)");

            if (prRegex.Success)
            {
                return(Convert.ToInt32(prRegex.Groups[1].Value, CultureInfo.InvariantCulture));
            }
            return(null);
        }
コード例 #3
0
 public void AddCheckRun(CheckRun data)
 {
     Connection.Execute(
         "INSERT INTO CheckRun(Id,CheckId,Status,RunTime,LastRunOn)" +
         "    VALUES(@Id, @CheckId, @Status, @RunTime,@LastRunOn)",
         param: new { Id        = Guid.NewGuid(), CheckId = data.CheckId,
                      Status    = data.Status, RunTime = data.RunTime,
                      LastRunOn = data.LastRunOn },
         transaction: Transaction
         );
 }
コード例 #4
0
        public async Task UploadFileWithFormData()
        {
            var name        = "dummyFileName.txt";
            var fileContent = "This is some dummy file contents";

            var fileDictionary = new Dictionary <string, string> {
                { name, fileContent }
            };

            var fileService = Substitute.For <ITempFileService>();
            var checkRunSubmissionService = Substitute.For <Web.Interfaces.ICheckRunSubmissionService>();

            var receivedFiles = new Dictionary <string, string>();

            fileService.CreateFromStreamAsync(Arg.Any <string>(), Arg.Any <Stream>())
            .Returns(ci =>
            {
                var fileName = (string)ci[0];
                var stream   = (Stream)ci[1];
                receivedFiles.Add(fileName, new StreamReader(stream, Encoding.UTF8).ReadToEnd());
                return($"temp/{fileName}");
            });
            fileService.Files.Returns(new[] { name });

            var checkRun = new CheckRun
            {
                Id  = Faker.Random.Long(),
                Url = Faker.Internet.Url()
            };

            checkRunSubmissionService.SubmitAsync(null, null, null, null, 0).ReturnsForAnyArgs(checkRun);

            var logUploadData = new LogUploadData
            {
                CommitSha         = "12345",
                PullRequestNumber = 345
            };

            var faker = new Faker();

            var repoOwner = faker.Person.FullName;
            var repoName  = faker.Hacker.Phrase();

            var claims = new[]
            {
                new Claim("urn:bcc:repositoryName", repoName),
                new Claim("urn:bcc:repositoryOwner", repoOwner),
                new Claim("urn:bcc:repositoryOwnerId", faker.Random.Long().ToString())
            };

            var checkRunController = new CheckRunControllerStub(TestLogger.Create <CheckRunController>(_testOutputHelper), fileService, checkRunSubmissionService, Substitute.For <ITelemetryService>())
            {
                ControllerContext  = await RequestWithFiles(fileDictionary, logUploadData, claims),
                MetadataProvider   = new EmptyModelMetadataProvider(),
                ModelBinderFactory = Substitute.For <IModelBinderFactory>(),
                ObjectValidator    = Substitute.For <IObjectModelValidator>()
            };

            var result = await checkRunController.Upload() as JsonResult;

            await fileService.Received(1).CreateFromStreamAsync(Arg.Is(name), Arg.Any <Stream>());

            await checkRunSubmissionService.Received(1).SubmitAsync(
                repoOwner,
                repoName,
                logUploadData.CommitSha,
                string.Empty,
                logUploadData.PullRequestNumber);

            receivedFiles.Should().BeEquivalentTo(fileDictionary);

            var resultFormData = result?.Value as CheckRun;

            resultFormData.Should().NotBeNull();
            resultFormData.Id.Should().Be(checkRun.Id);
            resultFormData.Url.Should().Be(checkRun.Url);
        }
コード例 #5
0
        private async Task StartExecution()
        {
            IReadOnlyList <Installation> installations = await this.gitHubAppClient.GitHubApps.GetAllInstallationsForCurrent().ConfigureAwait(false);

            try
            {
                if (!this.IsGitHubInstallationClientValid())
                {
                    throw new InvalidOperationException("Error: gitHubInstallationClient is invalid.");
                }

                if (IsPullRequest)
                {
                    ICheckSuitesClient checkSuiteClient = gitHubInstallationClient.Check.Suite;

                    CheckSuitesResponse x = await checkSuiteClient.GetAllForReference(CurrentRepository.Id, CommitSha).ConfigureAwait(false);

                    if (x.TotalCount > 0)
                    {
                        long checkSuiteId = x.CheckSuites.FirstOrDefault().Id;
                        bool res          = await checkSuiteClient.Rerequest(CurrentRepository.Id, checkSuiteId);
                    }
                    else
                    {
                        var newCheckSuite = new NewCheckSuite(CommitSha);
                        try
                        {
                            CheckSuite suite =
                                await checkSuiteClient.Create(
                                    CurrentRepository.Owner.Login,
                                    CurrentRepository.Name, newCheckSuite)
                                .ConfigureAwait(false);
                        }
                        catch (Exception ex)
                        {
                        }
                    }

                    return;
                }

                ICheckRunsClient checkRunClient = gitHubInstallationClient.Check.Run;

                // Create a new heckRun in GitHub
                var newCheckRun = new NewCheckRun("ScanX", CommitSha)
                {
                    Status = CheckStatus.Queued,
                };

                CheckRun checkRun =
                    await checkRunClient.Create(
                        CurrentRepository.Owner.Login,
                        CurrentRepository.Name,
                        newCheckRun)
                    .ConfigureAwait(false);

                // --- Downoad a ZIP ---
                byte[] buffer = await ScanHelper.DownloadRepoZip(gitHubInstallationClient, CurrentRepository.Id, CommitSha).ConfigureAwait(false);

                int size = buffer.Length;

                // Upload ZIP to a storage blob
                string blobName = $"{RequestId.ToString()}";
                string blobUri  = await ScanHelper.UploadBufferToStorage(buffer, blobName);

                // Update check's status to "in progress"
                CheckRunUpdate checkRunUpdate = new CheckRunUpdate
                {
                    Status = CheckStatus.InProgress,
                    Name   = checkRun.Name
                };
                checkRun = await checkRunClient.Update(CurrentRepository.Id, checkRun.Id, checkRunUpdate).ConfigureAwait(false);

                // --- Start a scan ---
                // Simulate sending of a message to a SB queue
                // Create worker notification message
                MalwareDeterminationRequest scanRequest = new MalwareDeterminationRequest();
                scanRequest.ClientId        = "GitHubScanX";
                scanRequest.FileName        = $"{RequestId.ToString()}.zip";
                scanRequest.FileSizeInBytes = 1000; //dummy
                scanRequest.RequestId       = RequestId;
                scanRequest.Uri             = new Uri(blobUri);

                // Notify worker (aka put the notification message to a queue)
                ScanXMock mock = new ScanXMock();
                await mock.SendScanRequest(scanRequest).ConfigureAwait(false);

                // --- Poll for a scan completion ---
                MalwareDeterminationResult scanResult;
                do
                {
                    await Task.Delay(500).ConfigureAwait(false);

                    if (await mock.TryGetResult(RequestId))
                    {
                        scanResult = await mock.GetResult(RequestId).ConfigureAwait(false);

                        break;
                    }
                }while (true); //!!!! for POC only

                checkRunUpdate.Status      = CheckStatus.Completed;
                checkRunUpdate.CompletedAt = DateTime.UtcNow;
                checkRunUpdate.Conclusion  = scanResult.WorkStatus == WorkStatus.Clean ? CheckConclusion.Success : CheckConclusion.Failure;

                if (checkRunUpdate.Conclusion == CheckConclusion.Failure)
                {
                    checkRunUpdate.Output = new NewCheckRunOutput(
                        "Scan Report",
                        $"GitScan detected {scanResult.ConfirmedMalwares.Count()} infected files. See details below.");

                    checkRunUpdate.Output.Text  = "| File Path| Malware Type| AV Engines|\n";
                    checkRunUpdate.Output.Text += "|:---|:---|:---|\n";

                    foreach (var entry in scanResult.ConfirmedMalwares)
                    {
                        checkRunUpdate.Output.Text += $"|{entry.FileName}|{entry.MalwareInfo}|{string.Join(",", entry.AvEngines.ToArray())}";
                    }
                }

                checkRun = await checkRunClient.Update(CurrentRepository.Id, checkRun.Id, checkRunUpdate).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception: {ex.Message}");
            }
        }
コード例 #6
0
        public async Task <CheckRun> SubmitCheckRun(InstallationToken token, string repo, CheckRun checkRun)
        {
            var url    = $"{Base}repos/{token.Account}/{repo}/check-runs";
            var output = await Execute <CheckRun>(HttpMethod.Post, url, token, JsonConvert.SerializeObject(checkRun));

            return(output);
        }