diff --git a/src/Services/Webhooks/Webhooks.API/Services/GrantUrlTesterService.cs b/src/Services/Webhooks/Webhooks.API/Services/GrantUrlTesterService.cs index c2e3315fd..cde669865 100644 --- a/src/Services/Webhooks/Webhooks.API/Services/GrantUrlTesterService.cs +++ b/src/Services/Webhooks/Webhooks.API/Services/GrantUrlTesterService.cs @@ -22,12 +22,14 @@ namespace Webhooks.API.Services var client = _clientFactory.CreateClient("GrantClient"); var msg = new HttpRequestMessage(HttpMethod.Options, url); msg.Headers.Add("X-eshop-whtoken", token); - _logger.LogTrace($"Sending the OPTIONS message to {url} with token {token ?? string.Empty}"); + _logger.LogInformation($"Sending the OPTIONS message to {url} with token {token ?? string.Empty}"); try { var response = await client.SendAsync(msg); - _logger.LogInformation($"Response code is {response.StatusCode} for url {url}"); - return response.IsSuccessStatusCode; + var tokenReceived = response.Headers.TryGetValues("X-eshop-whtoken", out var tokenValues) ? tokenValues.FirstOrDefault() : null; + var tokenExpected = string.IsNullOrWhiteSpace(token) ? null : token; + _logger.LogInformation($"Response code is {response.StatusCode} for url {url} and token in header was {tokenReceived} (expected token was {tokenExpected})"); + return response.IsSuccessStatusCode && tokenReceived == tokenExpected; } catch (Exception ex) { diff --git a/src/Web/WebhookClient/Controllers/WebhooksReceivedController.cs b/src/Web/WebhookClient/Controllers/WebhooksReceivedController.cs index 880bc0ade..5f1f793c8 100644 --- a/src/Web/WebhookClient/Controllers/WebhooksReceivedController.cs +++ b/src/Web/WebhookClient/Controllers/WebhooksReceivedController.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using WebhookClient.Models; +using WebhookClient.Services; namespace WebhookClient.Controllers { @@ -17,15 +18,17 @@ namespace WebhookClient.Controllers private readonly Settings _settings; private readonly ILogger _logger; + private readonly IHooksRepository _hooksRepository; - public WebhooksReceivedController(IOptions settings, ILogger logger) + public WebhooksReceivedController(IOptions settings, ILogger logger, IHooksRepository hooksRepository) { _settings = settings.Value; _logger = logger; + _hooksRepository = hooksRepository; } [HttpPost] - public IActionResult NewWebhook(WebhookData hook) + public async Task NewWebhook(WebhookData hook) { var header = Request.Headers[HeaderNames.WebHookCheckHeader]; var token = header.FirstOrDefault(); @@ -34,16 +37,15 @@ namespace WebhookClient.Controllers if (!_settings.ValidateToken || _settings.Token == token) { - _logger.LogInformation($"Received hook is processed"); - var received = HttpContext.Session.Get>(SessionKeys.HooksKey)?.ToList() ?? new List(); + _logger.LogInformation($"Received hook is going to be processed"); var newHook = new WebHookReceived() { Data = hook.Payload, When = hook.When, Token = token }; - received.Add(newHook); - HttpContext.Session.Set>(SessionKeys.HooksKey, received); + await _hooksRepository.AddNew(newHook); + _logger.LogInformation($"Received hook was processed."); return Ok(newHook); } diff --git a/src/Web/WebhookClient/Extensions/ISessionExtensions.cs b/src/Web/WebhookClient/Extensions/ISessionExtensions.cs deleted file mode 100644 index 9f9576ede..000000000 --- a/src/Web/WebhookClient/Extensions/ISessionExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace Microsoft.AspNetCore.Http -{ - static class ISessionExtensions - { - public static void Set(this ISession session, string key, T value) - { - session.SetString(key, JsonConvert.SerializeObject(value)); - } - - public static T Get(this ISession session, string key) - { - var value = session.GetString(key); - - return value == null ? default(T) : - JsonConvert.DeserializeObject(value); - } - } -} diff --git a/src/Web/WebhookClient/Pages/Index.cshtml b/src/Web/WebhookClient/Pages/Index.cshtml index 0118e949b..26338b19f 100644 --- a/src/Web/WebhookClient/Pages/Index.cshtml +++ b/src/Web/WebhookClient/Pages/Index.cshtml @@ -14,20 +14,18 @@ } -@if (User.Identity.IsAuthenticated) -{ -
-

Current webhooks received

-

(Data since last time web started up)

- - @foreach (var webhook in Model.WebHooksReceived) - { - - - - - - } -
@webhook.When
@webhook.Data
@(webhook.Token ?? "--None--")
-

-} +
+

Current webhooks received

+

(Data since last time web started up)

+ + @foreach (var webhook in Model.WebHooksReceived) + { + + + + + + } +
@webhook.When
@webhook.Data
@(webhook.Token ?? "--None--")
+

+ diff --git a/src/Web/WebhookClient/Pages/Index.cshtml.cs b/src/Web/WebhookClient/Pages/Index.cshtml.cs index 08520dd64..0e3169f08 100644 --- a/src/Web/WebhookClient/Pages/Index.cshtml.cs +++ b/src/Web/WebhookClient/Pages/Index.cshtml.cs @@ -6,18 +6,25 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Http; using WebhookClient.Models; +using WebhookClient.Services; namespace WebhookClient.Pages { public class IndexModel : PageModel { + private readonly IHooksRepository _hooksRepository; + + public IndexModel(IHooksRepository hooksRepository) + { + _hooksRepository = hooksRepository; + } public IEnumerable WebHooksReceived { get; private set; } - public void OnGet() + public async Task OnGet() { - WebHooksReceived = HttpContext.Session.Get>(SessionKeys.HooksKey) ?? Enumerable.Empty(); + WebHooksReceived = await _hooksRepository.GetAll(); } } } diff --git a/src/Web/WebhookClient/Pages/RegisterWebhook.cshtml.cs b/src/Web/WebhookClient/Pages/RegisterWebhook.cshtml.cs index cd8a7a49a..f97693449 100644 --- a/src/Web/WebhookClient/Pages/RegisterWebhook.cshtml.cs +++ b/src/Web/WebhookClient/Pages/RegisterWebhook.cshtml.cs @@ -5,6 +5,7 @@ using System.Net; using System.Net.Http; using System.Net.Http.Formatting; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; @@ -13,6 +14,7 @@ using WebhookClient.Models; namespace WebhookClient.Pages { + [Authorize] public class RegisterWebhookModel : PageModel { diff --git a/src/Web/WebhookClient/Services/IHooksRepository.cs b/src/Web/WebhookClient/Services/IHooksRepository.cs new file mode 100644 index 000000000..35d6d73e7 --- /dev/null +++ b/src/Web/WebhookClient/Services/IHooksRepository.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using WebhookClient.Models; + +namespace WebhookClient.Services +{ + public interface IHooksRepository + { + Task> GetAll(); + Task AddNew(WebHookReceived hook); + } +} diff --git a/src/Web/WebhookClient/Services/InMemoryHooksRepository.cs b/src/Web/WebhookClient/Services/InMemoryHooksRepository.cs new file mode 100644 index 000000000..557aa707b --- /dev/null +++ b/src/Web/WebhookClient/Services/InMemoryHooksRepository.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using WebhookClient.Models; + +namespace WebhookClient.Services +{ + public class InMemoryHooksRepository : IHooksRepository + { + private readonly List _data; + + public InMemoryHooksRepository() => _data = new List(); + + public Task AddNew(WebHookReceived hook) + { + _data.Add(hook); + return Task.CompletedTask; + } + + public Task> GetAll() + { + return Task.FromResult(_data.AsEnumerable()); + } + } +} diff --git a/src/Web/WebhookClient/SessionKeys.cs b/src/Web/WebhookClient/SessionKeys.cs deleted file mode 100644 index 741eb5219..000000000 --- a/src/Web/WebhookClient/SessionKeys.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace WebhookClient -{ - static class SessionKeys - { - public const string HooksKey = "webhooks.received"; - } -} diff --git a/src/Web/WebhookClient/Startup.cs b/src/Web/WebhookClient/Startup.cs index ba8b2a954..13ff70362 100644 --- a/src/Web/WebhookClient/Startup.cs +++ b/src/Web/WebhookClient/Startup.cs @@ -35,6 +35,7 @@ namespace WebhookClient .AddHttpClientServices(Configuration) .AddCustomAuthentication(Configuration) .AddTransient() + .AddSingleton() .AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); } @@ -67,8 +68,13 @@ namespace WebhookClient var validateToken = bool.TrueString.Equals(Configuration["ValidateToken"], StringComparison.InvariantCultureIgnoreCase); var header = context.Request.Headers[HeaderNames.WebHookCheckHeader]; var value = header.FirstOrDefault(); - if (!validateToken || value == Configuration["Token"]) + var tokenToValidate = Configuration["Token"]; + if (!validateToken || value == tokenToValidate) { + if (!string.IsNullOrWhiteSpace(tokenToValidate)) + { + context.Response.Headers.Add(HeaderNames.WebHookCheckHeader, tokenToValidate); + } context.Response.StatusCode = (int)HttpStatusCode.OK; } else