コード例 #1
0
        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);
        }
コード例 #2
0
        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));
            }
        }
コード例 #3
0
        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));
            }
        }