Browse Source

webhooks finished

pull/937/head
eiximenis 6 years ago
parent
commit
71e3839056
10 changed files with 86 additions and 65 deletions
  1. +5
    -3
      src/Services/Webhooks/Webhooks.API/Services/GrantUrlTesterService.cs
  2. +8
    -6
      src/Web/WebhookClient/Controllers/WebhooksReceivedController.cs
  3. +0
    -24
      src/Web/WebhookClient/Extensions/ISessionExtensions.cs
  4. +15
    -17
      src/Web/WebhookClient/Pages/Index.cshtml
  5. +9
    -2
      src/Web/WebhookClient/Pages/Index.cshtml.cs
  6. +2
    -0
      src/Web/WebhookClient/Pages/RegisterWebhook.cshtml.cs
  7. +14
    -0
      src/Web/WebhookClient/Services/IHooksRepository.cs
  8. +26
    -0
      src/Web/WebhookClient/Services/InMemoryHooksRepository.cs
  9. +0
    -12
      src/Web/WebhookClient/SessionKeys.cs
  10. +7
    -1
      src/Web/WebhookClient/Startup.cs

+ 5
- 3
src/Services/Webhooks/Webhooks.API/Services/GrantUrlTesterService.cs View File

@ -22,12 +22,14 @@ namespace Webhooks.API.Services
var client = _clientFactory.CreateClient("GrantClient"); var client = _clientFactory.CreateClient("GrantClient");
var msg = new HttpRequestMessage(HttpMethod.Options, url); var msg = new HttpRequestMessage(HttpMethod.Options, url);
msg.Headers.Add("X-eshop-whtoken", token); 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 try
{ {
var response = await client.SendAsync(msg); 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) catch (Exception ex)
{ {


+ 8
- 6
src/Web/WebhookClient/Controllers/WebhooksReceivedController.cs View File

@ -7,6 +7,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using WebhookClient.Models; using WebhookClient.Models;
using WebhookClient.Services;
namespace WebhookClient.Controllers namespace WebhookClient.Controllers
{ {
@ -17,15 +18,17 @@ namespace WebhookClient.Controllers
private readonly Settings _settings; private readonly Settings _settings;
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly IHooksRepository _hooksRepository;
public WebhooksReceivedController(IOptions<Settings> settings, ILogger<WebhooksReceivedController> logger)
public WebhooksReceivedController(IOptions<Settings> settings, ILogger<WebhooksReceivedController> logger, IHooksRepository hooksRepository)
{ {
_settings = settings.Value; _settings = settings.Value;
_logger = logger; _logger = logger;
_hooksRepository = hooksRepository;
} }
[HttpPost] [HttpPost]
public IActionResult NewWebhook(WebhookData hook)
public async Task<IActionResult> NewWebhook(WebhookData hook)
{ {
var header = Request.Headers[HeaderNames.WebHookCheckHeader]; var header = Request.Headers[HeaderNames.WebHookCheckHeader];
var token = header.FirstOrDefault(); var token = header.FirstOrDefault();
@ -34,16 +37,15 @@ namespace WebhookClient.Controllers
if (!_settings.ValidateToken || _settings.Token == token) if (!_settings.ValidateToken || _settings.Token == token)
{ {
_logger.LogInformation($"Received hook is processed");
var received = HttpContext.Session.Get<IEnumerable<WebHookReceived>>(SessionKeys.HooksKey)?.ToList() ?? new List<WebHookReceived>();
_logger.LogInformation($"Received hook is going to be processed");
var newHook = new WebHookReceived() var newHook = new WebHookReceived()
{ {
Data = hook.Payload, Data = hook.Payload,
When = hook.When, When = hook.When,
Token = token Token = token
}; };
received.Add(newHook);
HttpContext.Session.Set<IEnumerable<WebHookReceived>>(SessionKeys.HooksKey, received);
await _hooksRepository.AddNew(newHook);
_logger.LogInformation($"Received hook was processed.");
return Ok(newHook); return Ok(newHook);
} }


+ 0
- 24
src/Web/WebhookClient/Extensions/ISessionExtensions.cs View File

@ -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<T>(this ISession session, string key, T value)
{
session.SetString(key, JsonConvert.SerializeObject(value));
}
public static T Get<T>(this ISession session, string key)
{
var value = session.GetString(key);
return value == null ? default(T) :
JsonConvert.DeserializeObject<T>(value);
}
}
}

+ 15
- 17
src/Web/WebhookClient/Pages/Index.cshtml View File

@ -14,20 +14,18 @@
} }
</div> </div>
@if (User.Identity.IsAuthenticated)
{
<div class="table">
<h3>Current webhooks received</h3>
<p>(Data since last time web started up)<p>
<table class="table">
@foreach (var webhook in Model.WebHooksReceived)
{
<tr>
<td>@webhook.When</td>
<td><pre>@webhook.Data</pre></td>
<td>@(webhook.Token ?? "--None--")</td>
</tr>
}
</table>
</div>
}
<div class="table">
<h3>Current webhooks received</h3>
<p>(Data since last time web started up)<p>
<table class="table">
@foreach (var webhook in Model.WebHooksReceived)
{
<tr>
<td>@webhook.When</td>
<td><pre>@webhook.Data</pre></td>
<td>@(webhook.Token ?? "--None--")</td>
</tr>
}
</table>
</div>

+ 9
- 2
src/Web/WebhookClient/Pages/Index.cshtml.cs View File

@ -6,18 +6,25 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using WebhookClient.Models; using WebhookClient.Models;
using WebhookClient.Services;
namespace WebhookClient.Pages namespace WebhookClient.Pages
{ {
public class IndexModel : PageModel public class IndexModel : PageModel
{ {
private readonly IHooksRepository _hooksRepository;
public IndexModel(IHooksRepository hooksRepository)
{
_hooksRepository = hooksRepository;
}
public IEnumerable<WebHookReceived> WebHooksReceived { get; private set; } public IEnumerable<WebHookReceived> WebHooksReceived { get; private set; }
public void OnGet()
public async Task OnGet()
{ {
WebHooksReceived = HttpContext.Session.Get<IEnumerable<WebHookReceived>>(SessionKeys.HooksKey) ?? Enumerable.Empty<WebHookReceived>();
WebHooksReceived = await _hooksRepository.GetAll();
} }
} }
} }

+ 2
- 0
src/Web/WebhookClient/Pages/RegisterWebhook.cshtml.cs View File

@ -5,6 +5,7 @@ using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Net.Http.Formatting; using System.Net.Http.Formatting;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
@ -13,6 +14,7 @@ using WebhookClient.Models;
namespace WebhookClient.Pages namespace WebhookClient.Pages
{ {
[Authorize]
public class RegisterWebhookModel : PageModel public class RegisterWebhookModel : PageModel
{ {


+ 14
- 0
src/Web/WebhookClient/Services/IHooksRepository.cs View File

@ -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<IEnumerable<WebHookReceived>> GetAll();
Task AddNew(WebHookReceived hook);
}
}

+ 26
- 0
src/Web/WebhookClient/Services/InMemoryHooksRepository.cs View File

@ -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<WebHookReceived> _data;
public InMemoryHooksRepository() => _data = new List<WebHookReceived>();
public Task AddNew(WebHookReceived hook)
{
_data.Add(hook);
return Task.CompletedTask;
}
public Task<IEnumerable<WebHookReceived>> GetAll()
{
return Task.FromResult(_data.AsEnumerable());
}
}
}

+ 0
- 12
src/Web/WebhookClient/SessionKeys.cs View File

@ -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";
}
}

+ 7
- 1
src/Web/WebhookClient/Startup.cs View File

@ -35,6 +35,7 @@ namespace WebhookClient
.AddHttpClientServices(Configuration) .AddHttpClientServices(Configuration)
.AddCustomAuthentication(Configuration) .AddCustomAuthentication(Configuration)
.AddTransient<IWebhooksClient, WebhooksClient>() .AddTransient<IWebhooksClient, WebhooksClient>()
.AddSingleton<IHooksRepository, InMemoryHooksRepository>()
.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); .AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
} }
@ -67,8 +68,13 @@ namespace WebhookClient
var validateToken = bool.TrueString.Equals(Configuration["ValidateToken"], StringComparison.InvariantCultureIgnoreCase); var validateToken = bool.TrueString.Equals(Configuration["ValidateToken"], StringComparison.InvariantCultureIgnoreCase);
var header = context.Request.Headers[HeaderNames.WebHookCheckHeader]; var header = context.Request.Headers[HeaderNames.WebHookCheckHeader];
var value = header.FirstOrDefault(); 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; context.Response.StatusCode = (int)HttpStatusCode.OK;
} }
else else


Loading…
Cancel
Save