private GithubHook GetHook() { string hookJson = File.ReadAllText("../../Data/hook1.json"); GithubHook hook = hookParser.GetHookFromJsonPublic(hookJson); return(hook); }
public IEnumerable <GithubFileEntry> GetFileEntriesFromHook(string hookJson) { GithubHook hook = GetHookFromJson(hookJson); if (hook == null) { return(new GithubFileEntry[0]); } var fileEntries = GetFileUrls(hook); return(fileEntries); }
// 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)); }
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); }
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)); }
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); }
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); }
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)); } }
public IEnumerable <GithubFileEntry> GetFileUrlsFromHook(GithubHook hook) { return(GetFileUrls(hook)); }
protected override IEnumerable <GithubFileEntry> GetFileUrls(GithubHook hook) { return(base.GetFileUrls(hook)); }