Beispiel #1
0
        private GithubHook GetHook()
        {
            string     hookJson = File.ReadAllText("../../Data/hook1.json");
            GithubHook hook     = hookParser.GetHookFromJsonPublic(hookJson);

            return(hook);
        }
Beispiel #2
0
        public IEnumerable <GithubFileEntry> GetFileEntriesFromHook(string hookJson)
        {
            GithubHook hook = GetHookFromJson(hookJson);

            if (hook == null)
            {
                return(new GithubFileEntry[0]);
            }

            var fileEntries = GetFileUrls(hook);

            return(fileEntries);
        }
Beispiel #3
0
        // hook is not null
        protected virtual IEnumerable <GithubFileEntry> GetFileUrls(GithubHook hook)
        {
            Dictionary <string, GithubFileEntry> fileEntries = new Dictionary <string, GithubFileEntry>();

            foreach (var commit in hook.Commits)
            {
                ProcessCommitFilesWithState(fileEntries, commit.Added, FileState.Added, commit.Timestamp, hook.Repository);
                ProcessCommitFilesWithState(fileEntries, commit.Modified, FileState.Modified, commit.Timestamp, hook.Repository);
                ProcessCommitFilesWithState(fileEntries, commit.Removed, FileState.Removed, commit.Timestamp, hook.Repository);
            }

            return(fileEntries.Where(entry => entry.Value.State != FileState.Removed).Select(entry => entry.Value));
        }
Beispiel #4
0
        public void GetFileUrlsFromHook_ReturnCorrectUrls()
        {
            GithubHook hook = GetHook();

            var fileUrls = hookParser.GetFileUrlsFromHook(hook).OrderBy(f => f.Url).ToArray();

            string baseUrl = "https://api.github.com/repos/NAlex2004/SalesData/contents/";

            Assert.AreEqual(4, fileUrls.Length);
            Assert.AreEqual(baseUrl + "Manager_2/AlNaz_04032019.json", fileUrls[0].Url);
            Assert.AreEqual(baseUrl + "Manager_2/ErErr_04032019.json", fileUrls[1].Url);
            Assert.AreEqual(baseUrl + "Manager_2/ErNot_04032019.json", fileUrls[2].Url);
            Assert.AreEqual(baseUrl + "Manager_2/VaAli_03032019.json", fileUrls[3].Url);
        }
Beispiel #5
0
        public void GetHookFromJson_ReturnsCorrectResult()
        {
            GithubHook hook = GetHook();

            Assert.AreEqual("NAlex2004/SalesData", hook.Repository.Full_Name);
            Assert.AreEqual(4, hook.Commits.Count);
            Assert.AreEqual(5, hook.Commits[0].Added.Count);
            Assert.AreEqual(0, hook.Commits[0].Modified.Count);
            Assert.AreEqual(1, hook.Commits[1].Removed.Count);
            Assert.AreEqual(1, hook.Commits[1].Added.Count);
            Assert.AreEqual(0, hook.Commits[1].Modified.Count);
            Assert.AreEqual(1, hook.Commits[2].Added.Count);
            Assert.AreEqual(1, hook.Commits[3].Removed.Count);
            Assert.AreEqual(9, hook.Commits.Sum(c => c.Added.Count + c.Modified.Count + c.Removed.Count));
        }
Beispiel #6
0
        public void GetHookFromJson_ReturnsNull_OnIncorrectJson()
        {
            string badHookJson1  = File.ReadAllText("../../Data/bad_hook1.json");
            string badHookJson2  = File.ReadAllText("../../Data/bad_hook2.json");
            string noCommitsHook = File.ReadAllText("../../Data/no_commits.json");

            GithubHook nullHook           = hookParser.GetHookFromJsonPublic(null);
            GithubHook badHook1           = hookParser.GetHookFromJsonPublic("aaa");
            GithubHook badHookJson1_hook  = hookParser.GetHookFromJsonPublic(badHookJson1);
            GithubHook badHookJson2_hook  = hookParser.GetHookFromJsonPublic(badHookJson2);
            GithubHook noCommitsHook_hook = hookParser.GetHookFromJsonPublic(noCommitsHook);

            Assert.IsNull(nullHook);
            Assert.IsNull(badHook1);
            Assert.IsNull(badHookJson1_hook);
            Assert.IsNull(badHookJson2_hook);
            Assert.IsNull(noCommitsHook_hook);
        }
Beispiel #7
0
        protected GithubHook GetHookFromJson(string hookJson)
        {
            GithubHook hook = null;

            try
            {
                hook = JsonConvert.DeserializeObject <GithubHook>(hookJson);
            }
            catch (Exception)
            {
                return(null);
            }

            if (hook.Commits == null || hook.Commits.Count == 0 ||
                hook.Repository == null || string.IsNullOrEmpty(hook.Repository.Full_Name))
            {
                return(null);
            }

            return(hook);
        }
Beispiel #8
0
        public async Task <IActionResult> Receive()
        {
            var stuffToLog = new List <string>();

            try
            {
                string payloadText;

                //Generate GithubHook Object
                //Generate DiscourseHook object for easier reading

                stuffToLog.Add($"Github Hook received: {DateTime.Now}");

                Request.Headers.TryGetValue("X-GitHub-Event", out var strEvent);
                Request.Headers.TryGetValue("X-Hub-Signature", out var signature);
                Request.Headers.TryGetValue("X-GitHub-Delivery", out var delivery);
                Request.Headers.TryGetValue("Content-type", out var content);

                stuffToLog.Add($"Hook Id: {delivery}");
                stuffToLog.Add($"X-Github-Event: {strEvent}");

                if (content != "application/json")
                {
                    const string error = "Invalid content type. Expected application/json";
                    stuffToLog.Add(error);
                    Util.LogList(stuffToLog);
                    return(StatusCode(400, error));
                }

                using (var reader = new StreamReader(Request.Body, Encoding.UTF8))
                {
                    payloadText = await reader.ReadToEndAsync().ConfigureAwait(false);
                }

                if (_config.DebugSavePayloads)
                {
                    System.IO.File.WriteAllText($"/config/payloads/{delivery}", $"Signature: {signature}\n");
                    System.IO.File.AppendAllText($"/config/payloads/{delivery}", $"Event: {strEvent}\nPayload:\n");
                    System.IO.File.AppendAllText($"/config/payloads/{delivery}", payloadText);
                }


                var calcSig = Util.CalculateSignature(payloadText, signature, _config.Secret, "sha1=");


                if (signature == calcSig)
                {
                    var githubHook = new GithubHook(strEvent, signature, delivery, payloadText);

                    HttpResponseMessage response = null;
                    MattermostMessage   message  = null;
                    switch (githubHook.Event)
                    {
                    case "pull_request":
                        message  = GetMessagePullRequest((PullRequestEvent)githubHook.Payload);
                        response = await _matterHook.PostAsync(message);

                        break;

                    case "issues":
                        message  = GetMessageIssues((IssuesEvent)githubHook.Payload);
                        response = await _matterHook.PostAsync(message);

                        break;

                    case "issue_comment":
                        message  = GetMessageIssueComment((IssueCommentEvent)githubHook.Payload);
                        response = await _matterHook.PostAsync(message);

                        break;

                    case "repository":
                        message  = GetMessageRepository((RepositoryEvent)githubHook.Payload);
                        response = await _matterHook.PostAsync(message);

                        break;

                    case "create":
                        message  = GetMessageCreate((CreateEvent)githubHook.Payload);
                        response = await _matterHook.PostAsync(message);

                        break;

                    case "delete":
                        message  = GetMessageDelete((DeleteEvent)githubHook.Payload);
                        response = await _matterHook.PostAsync(message);

                        break;

                    case "pull_request_review":
                        message  = GetMessagePullRequestReview((PullRequestReviewEvent)githubHook.Payload);
                        response = await _matterHook.PostAsync(message);

                        break;

                    case "pull_request_review_comment":
                        message = GetMessagePullRequestReviewComment(
                            (PullRequestReviewCommentEvent)githubHook.Payload);
                        response = await _matterHook.PostAsync(message);

                        break;

                    case "push":
                        message  = GetMessagePush((PushEvent)githubHook.Payload);
                        response = await _matterHook.PostAsync(message);

                        break;

                    case "commit_comment":
                        message  = GetMessageCommitComment((CommitCommentEvent)githubHook.Payload);
                        response = await _matterHook.PostAsync(message);

                        break;

                    case "status":
                        message  = GetMessageStatus((StatusEvent)githubHook.Payload);
                        response = await _matterHook.PostAsync(message);

                        break;
                    }

                    if (response == null || response.StatusCode != HttpStatusCode.OK)
                    {
                        stuffToLog.Add(response != null
                            ? $"Unable to post to Mattermost {response.StatusCode}"
                            : "Unable to post to Mattermost");

                        return(StatusCode(500, response != null
                            ? $"Unable to post to Mattermost: {response.StatusCode}"
                            : "Unable to post to Mattermost"));
                    }

                    if (!_config.LogOnlyErrors)
                    {
                        if (message != null)
                        {
                            stuffToLog.Add(message.Text);
                        }
                        stuffToLog.Add("Succesfully posted to Mattermost");
                        Util.LogList(stuffToLog);
                    }

                    return(StatusCode(200, "Succesfully posted to Mattermost"));
                }
                stuffToLog.Add("Invalid Signature!");
                stuffToLog.Add($"Expected: {signature}");
                stuffToLog.Add($"Calculated: {calcSig}");
                Util.LogList(stuffToLog);
                return(StatusCode(401, "Invalid signature. Please check your secret values in the config and on Github."));
            }
            catch (Exception e)
            {
                stuffToLog.Add(e.Message);
                Util.LogList(stuffToLog);
                return(StatusCode(e is NotImplementedException ? 501 : e is WarningException ? 202 : 500, e.Message));
            }
        }
Beispiel #9
0
 public IEnumerable <GithubFileEntry> GetFileUrlsFromHook(GithubHook hook)
 {
     return(GetFileUrls(hook));
 }
Beispiel #10
0
 protected override IEnumerable <GithubFileEntry> GetFileUrls(GithubHook hook)
 {
     return(base.GetFileUrls(hook));
 }