private static MattermostMessage BaseMessageForRepo(string repoName) { var mmc = Util.GetMattermostDetails(_config.DefaultMattermostConfig, _config.RepoList, repoName); //set matterHook Client to correct webhook. _matterHook = new MatterhookClient.MatterhookClient(mmc.WebhookUrl); var retVal = new MattermostMessage { Channel = mmc.Channel, Username = mmc.Username, IconUrl = mmc.IconUrl != null ? new Uri(mmc.IconUrl) : null }; return(retVal); }
public async Task <IActionResult> Receive() { var stuffToLog = new List <string>(); try { string payloadText; //Generate DiscourseHook object for easier reading stuffToLog.Add($"Discourse Hook received: {DateTime.Now}"); Request.Headers.TryGetValue("X-Discourse-Event-Id", out StringValues eventId); Request.Headers.TryGetValue("X-Discourse-Event-Type", out StringValues eventType); Request.Headers.TryGetValue("X-Discourse-Event", out StringValues eventName); Request.Headers.TryGetValue("X-Discourse-Event-Signature", out StringValues signature); Request.Headers.TryGetValue("X-Discourse-Instance", out StringValues discourseUrl); Request.Headers.TryGetValue("Content-type", out var content); _discourseUrl = discourseUrl; stuffToLog.Add($"Hook Id: {eventId}"); 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); } var calcSig = Util.CalculateSignature(payloadText, signature, _config.Secret, "sha256="); if (signature == calcSig) { var discourseHook = new DiscourseHook(eventId, eventType, eventName, signature, payloadText); var matterHook = new MatterhookClient.MatterhookClient(_config.MattermostConfig.WebhookUrl); HttpResponseMessage response = null; MattermostMessage message = null; if (discourseHook.EventName == "post_created") { message = PostCreated((PostPayload)discourseHook.Payload); response = await matterHook.PostAsync(message); } 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 Discourse")); } catch (Exception e) { stuffToLog.Add(e.Message); Util.LogList(stuffToLog); return(StatusCode(e is NotImplementedException ? 501 : e is WarningException? 202: 500, e.Message)); } }
public async Task <IActionResult> Receive() { var stuffToLog = new List <string>(); try { string payloadText; //Generate DiscourseHook object for easier reading stuffToLog.Add($"DockerHub Hook received: {DateTime.Now}"); Request.Headers.TryGetValue("X-Request-Id", out StringValues requestId); stuffToLog.Add($"Hook Id: {requestId}"); using (var reader = new StreamReader(Request.Body, Encoding.UTF8)) { payloadText = await reader.ReadToEndAsync().ConfigureAwait(false); } //No fancy checksumming on this hook. I'll keep an eye on it in future... var dockerhubHook = new DockerHubHook(payloadText); var mm = Util.GetMattermostDetails(_config.DefaultMattermostConfig, _config.RepoList, dockerhubHook.payload.Repository.RepoName); var matterHook = new MatterhookClient.MatterhookClient(mm.WebhookUrl); var reponame = dockerhubHook.payload.Repository.RepoName; var repoMd = $"[{reponame}]({dockerhubHook.payload.Repository.RepoUrl})"; var msg = new MattermostMessage { Channel = mm.Channel, Username = mm.Username, IconUrl = mm.IconUrl != null ? new Uri(mm.IconUrl) : null, Text = $"New image built and pushed to {repoMd} with tag `{dockerhubHook.payload.PushData.Tag}`" }; stuffToLog.Add(msg.Text); var response = await matterHook.PostAsync(msg); 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) { stuffToLog.Add(msg.Text); stuffToLog.Add("Succesfully posted to Mattermost"); Util.LogList(stuffToLog); } return(StatusCode(200, "Succesfully posted to Mattermost")); } catch (Exception e) { stuffToLog.Add(e.Message); Util.LogList(stuffToLog); return(StatusCode(500, e.Message)); } }