Fixed cookie loading. Started implementing service expire handling
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using Microsoft.JSInterop;
|
using Microsoft.JSInterop;
|
||||||
|
using Moonlight.App.Helpers;
|
||||||
|
|
||||||
namespace Moonlight.App.Services.Interop;
|
namespace Moonlight.App.Services.Interop;
|
||||||
|
|
||||||
@@ -30,7 +31,9 @@ public class CookieService
|
|||||||
if(string.IsNullOrEmpty(cookiePart))
|
if(string.IsNullOrEmpty(cookiePart))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
var cookieKeyValue = cookiePart.Split("=");
|
var cookieKeyValue = cookiePart.Split("=")
|
||||||
|
.Select(x => x.Trim()) // There may be spaces e.g. with the "AspNetCore.Culture" key
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
if (cookieKeyValue.Length == 2)
|
if (cookieKeyValue.Length == 2)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -45,4 +45,17 @@ public class ServiceManageService
|
|||||||
// No match
|
// No match
|
||||||
return Task.FromResult(false);
|
return Task.FromResult(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Task<bool> NeedsRenewal(Service s)
|
||||||
|
{
|
||||||
|
// We fetch the service in a new scope wo ensure that we are not caching
|
||||||
|
using var scope = ServiceScopeFactory.CreateScope();
|
||||||
|
var serviceRepo = scope.ServiceProvider.GetRequiredService<Repository<Service>>();
|
||||||
|
|
||||||
|
var service = serviceRepo
|
||||||
|
.Get()
|
||||||
|
.First(x => x.Id == s.Id);
|
||||||
|
|
||||||
|
return Task.FromResult(DateTime.UtcNow > service.RenewAt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
using JWT.Algorithms;
|
using JWT.Algorithms;
|
||||||
using JWT.Builder;
|
using JWT.Builder;
|
||||||
|
using Moonlight.App.Helpers;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace Moonlight.App.Services.Utils;
|
namespace Moonlight.App.Services.Utils;
|
||||||
@@ -47,6 +48,7 @@ public class JwtService
|
|||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
Logger.Warn(e.Message);
|
||||||
return Task.FromResult(false);
|
return Task.FromResult(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
16
Moonlight/Shared/Components/Alerts/NeedsRenewalAlert.razor
Normal file
16
Moonlight/Shared/Components/Alerts/NeedsRenewalAlert.razor
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<div class="d-flex flex-column flex-center text-center p-10">
|
||||||
|
<div class="card card-flush w-lg-650px py-5">
|
||||||
|
<div class="card-body py-15 py-lg-20">
|
||||||
|
<div class="mb-5">
|
||||||
|
<img src="/svg/expired.svg" style="width: 10vh" alt="Expired illustration">
|
||||||
|
</div>
|
||||||
|
<h1 class="fw-bolder fs-2hx text-gray-900 mb-4">
|
||||||
|
This service has expired
|
||||||
|
</h1>
|
||||||
|
<div class="fw-semibold fs-6 text-gray-500 mb-7">
|
||||||
|
<span class="fs-5">This service has expired and has to be renewed in order to manage it</span>
|
||||||
|
</div>
|
||||||
|
<a href="/services" class="btn btn-primary">Go back to services</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -128,7 +128,13 @@ else
|
|||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h3 class="card-title align-items-start flex-column">
|
<h3 class="card-title align-items-start flex-column">
|
||||||
<span class="card-label fw-bold text-dark fs-3">@(Service.Nickname ?? $"Service {Service.Id}")</span>
|
<span class="card-label fw-bold text-dark fs-3">
|
||||||
|
@(Service.Nickname ?? $"Service {Service.Id}")
|
||||||
|
@if (NeedsRenewal)
|
||||||
|
{
|
||||||
|
<span class="ms-2 text-danger">(Expired)</span>
|
||||||
|
}
|
||||||
|
</span>
|
||||||
<span class="text-gray-400 mt-1 fw-semibold fs-6">@(Service.Product.Name)</span>
|
<span class="text-gray-400 mt-1 fw-semibold fs-6">@(Service.Product.Name)</span>
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
@@ -177,14 +183,28 @@ else
|
|||||||
[Parameter]
|
[Parameter]
|
||||||
public Func<Task> OnChange { get; set; }
|
public Func<Task> OnChange { get; set; }
|
||||||
|
|
||||||
|
// Renew access state
|
||||||
|
private bool NeedsRenewal = false;
|
||||||
|
|
||||||
|
// States
|
||||||
private bool ShowDeletionScreen = false;
|
private bool ShowDeletionScreen = false;
|
||||||
private bool ShowRenewScreen = false;
|
|
||||||
private ManageServiceShareModal ShareModal;
|
private ManageServiceShareModal ShareModal;
|
||||||
|
|
||||||
|
// Renewing
|
||||||
private int DurationMultiplier = 1;
|
private int DurationMultiplier = 1;
|
||||||
private bool CanBeRenewed = false;
|
private bool CanBeRenewed = false;
|
||||||
private bool IsValidating = false;
|
private bool IsValidating = false;
|
||||||
private string ErrorMessage = "";
|
private string ErrorMessage = "";
|
||||||
|
private bool ShowRenewScreen = false;
|
||||||
|
|
||||||
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||||
|
{
|
||||||
|
if (firstRender)
|
||||||
|
{
|
||||||
|
NeedsRenewal = await ServiceService.Manage.NeedsRenewal(Service);
|
||||||
|
await InvokeAsync(StateHasChanged);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Task Revalidate()
|
private Task Revalidate()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,6 +18,12 @@
|
|||||||
<NotFoundAlert />
|
<NotFoundAlert />
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if (NeedsRenewal)
|
||||||
|
{
|
||||||
|
<NeedsRenewalAlert />
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
<CascadingValue Name="Service" Value="Service">
|
<CascadingValue Name="Service" Value="Service">
|
||||||
<CascadingValue Name="Implementation" Value="Definition">
|
<CascadingValue Name="Implementation" Value="Definition">
|
||||||
@@ -29,6 +35,7 @@
|
|||||||
</CascadingValue>
|
</CascadingValue>
|
||||||
</CascadingValue>
|
</CascadingValue>
|
||||||
}
|
}
|
||||||
|
}
|
||||||
</LazyLoader>
|
</LazyLoader>
|
||||||
|
|
||||||
@code
|
@code
|
||||||
@@ -43,6 +50,8 @@
|
|||||||
private ServiceDefinition Definition;
|
private ServiceDefinition Definition;
|
||||||
private ServiceViewContext ViewContext;
|
private ServiceViewContext ViewContext;
|
||||||
|
|
||||||
|
private bool NeedsRenewal = false;
|
||||||
|
|
||||||
private async Task Load(LazyLoader lazyLoader)
|
private async Task Load(LazyLoader lazyLoader)
|
||||||
{
|
{
|
||||||
await lazyLoader.SetText("Requesting service");
|
await lazyLoader.SetText("Requesting service");
|
||||||
@@ -64,6 +73,11 @@
|
|||||||
if (Service == null)
|
if (Service == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
NeedsRenewal = await ServiceService.Manage.NeedsRenewal(Service);
|
||||||
|
|
||||||
|
if(NeedsRenewal) // Stop loading more data
|
||||||
|
return;
|
||||||
|
|
||||||
// Load implementation
|
// Load implementation
|
||||||
await lazyLoader.SetText("Loading implementation");
|
await lazyLoader.SetText("Loading implementation");
|
||||||
Definition = ServiceService.Definition.Get(Service.Product.Type);
|
Definition = ServiceService.Definition.Get(Service.Product.Type);
|
||||||
|
|||||||
@@ -19,11 +19,19 @@
|
|||||||
|
|
||||||
@foreach (var service in SharedServices)
|
@foreach (var service in SharedServices)
|
||||||
{
|
{
|
||||||
|
var needsRenewal = SharedRenewalStates[service];
|
||||||
|
|
||||||
<div class="col-md-3 col-12">
|
<div class="col-md-3 col-12">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h3 class="card-title align-items-start flex-column">
|
<h3 class="card-title align-items-start flex-column">
|
||||||
<span class="card-label fw-bold text-dark fs-3">@(service.Nickname ?? $"Service {service.Id}")</span>
|
<span class="card-label fw-bold text-dark fs-3">
|
||||||
|
@(service.Nickname ?? $"Service {service.Id}")
|
||||||
|
@if (needsRenewal)
|
||||||
|
{
|
||||||
|
<span class="ms-2 text-danger">(Expired)</span>
|
||||||
|
}
|
||||||
|
</span>
|
||||||
<span class="text-gray-400 mt-1 fw-semibold fs-6">@(service.Product.Name)</span>
|
<span class="text-gray-400 mt-1 fw-semibold fs-6">@(service.Product.Name)</span>
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
@@ -57,10 +65,19 @@
|
|||||||
|
|
||||||
private Service[] MyServices;
|
private Service[] MyServices;
|
||||||
private Service[] SharedServices;
|
private Service[] SharedServices;
|
||||||
|
private Dictionary<Service, bool> SharedRenewalStates = new();
|
||||||
|
|
||||||
private async Task Load(LazyLoader _)
|
private async Task Load(LazyLoader _)
|
||||||
{
|
{
|
||||||
|
// Load all services
|
||||||
MyServices = await ServiceService.Get(IdentityService.CurrentUser);
|
MyServices = await ServiceService.Get(IdentityService.CurrentUser);
|
||||||
SharedServices = await ServiceService.GetShared(IdentityService.CurrentUser);
|
SharedServices = await ServiceService.GetShared(IdentityService.CurrentUser);
|
||||||
|
|
||||||
|
// Load all services renewal states
|
||||||
|
foreach (var service in SharedServices)
|
||||||
|
{
|
||||||
|
if(!SharedRenewalStates.ContainsKey(service))
|
||||||
|
SharedRenewalStates.Add(service, await ServiceService.Manage.NeedsRenewal(service));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
1
Moonlight/wwwroot/svg/expired.svg
vendored
Normal file
1
Moonlight/wwwroot/svg/expired.svg
vendored
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 12 KiB |
Reference in New Issue
Block a user