134 lines
5.8 KiB
Plaintext
134 lines
5.8 KiB
Plaintext
@page "/admin/security/malware"
|
|
|
|
@using Moonlight.Shared.Components.Navigations
|
|
@using Moonlight.App.Services.Background
|
|
@using Moonlight.App.Services
|
|
@using BlazorTable
|
|
@using Moonlight.App.Database.Entities
|
|
@using Moonlight.App.Events
|
|
@using Moonlight.App.Models.Misc
|
|
|
|
@inject MalwareScanService MalwareScanService
|
|
@inject SmartTranslateService SmartTranslateService
|
|
@inject EventSystem Event
|
|
|
|
@implements IDisposable
|
|
|
|
@attribute [PermissionRequired(nameof(Permissions.AdminSecurityMalware))]
|
|
|
|
<AdminSecurityNavigation Index="1"/>
|
|
|
|
<div class="row">
|
|
<div class="col-12 col-lg-6">
|
|
<div class="card">
|
|
<div class="card-body">
|
|
@if (MalwareScanService.IsRunning)
|
|
{
|
|
<span class="fs-3 spinner-border align-middle me-3"></span>
|
|
}
|
|
|
|
<span class="fs-3">@(MalwareScanService.Status)</span>
|
|
</div>
|
|
<div class="card-footer">
|
|
@if (MalwareScanService.IsRunning)
|
|
{
|
|
<button class="btn btn-success disabled">
|
|
<TL>Scan in progress</TL>
|
|
</button>
|
|
}
|
|
else
|
|
{
|
|
<WButton Text="@(SmartTranslateService.Translate("Start scan"))"
|
|
CssClasses="btn-success"
|
|
OnClick="MalwareScanService.Start">
|
|
</WButton>
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-12 col-lg-6">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<span class="card-title">
|
|
<TL>Results</TL>
|
|
</span>
|
|
</div>
|
|
<div class="card-body">
|
|
<LazyLoader @ref="LazyLoaderResults" Load="LoadResults">
|
|
<div class="table-responsive">
|
|
<Table TableItem="Server" Items="ScanResults.Keys" PageSize="25" TableClass="table table-row-bordered table-row-gray-100 align-middle gs-0 gy-3" TableHeadClass="fw-bold text-muted">
|
|
<Column TableItem="Server" Title="@(SmartTranslateService.Translate("Server"))" Field="@(x => x.Id)" Sortable="false" Filterable="false">
|
|
<Template>
|
|
<a href="/server/@(context.Uuid)">@(context.Name)</a>
|
|
</Template>
|
|
</Column>
|
|
<Column TableItem="Server" Title="@(SmartTranslateService.Translate("Results"))" Field="@(x => x.Id)" Sortable="false" Filterable="false">
|
|
<Template>
|
|
<div class="row">
|
|
@foreach (var result in ScanResults[context])
|
|
{
|
|
<div class="col-12 col-md-6 p-3">
|
|
<div class="accordion" id="scanResult@(result.GetHashCode())">
|
|
<div class="accordion-item">
|
|
<h2 class="accordion-header" id="scanResult-header@(result.GetHashCode())">
|
|
<button class="accordion-button fs-4 fw-semibold collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#scanResult-body@(result.GetHashCode())" aria-expanded="false" aria-controls="scanResult-body@(result.GetHashCode())">
|
|
<span>@(result.Title)</span>
|
|
</button>
|
|
</h2>
|
|
<div id="scanResult-body@(result.GetHashCode())" class="accordion-collapse collapse" aria-labelledby="scanResult-header@(result.GetHashCode())" data-bs-parent="#scanResult">
|
|
<div class="accordion-body">
|
|
<p>
|
|
@(result.Description)
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
}
|
|
</div>
|
|
</Template>
|
|
</Column>
|
|
<Pager ShowPageNumber="true" ShowTotalCount="true"/>
|
|
</Table>
|
|
</div>
|
|
</LazyLoader>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
@code
|
|
{
|
|
private readonly Dictionary<Server, MalwareScanResult[]> ScanResults = new();
|
|
|
|
private LazyLoader LazyLoaderResults;
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
await Event.On<Object>("malwareScan.status", this, async o => { await InvokeAsync(StateHasChanged); });
|
|
|
|
await Event.On<Object>("malwareScan.result", this, async o => { await LazyLoaderResults.Reload(); });
|
|
}
|
|
|
|
private Task LoadResults(LazyLoader arg)
|
|
{
|
|
ScanResults.Clear();
|
|
|
|
lock (MalwareScanService.ScanResults)
|
|
{
|
|
foreach (var result in MalwareScanService.ScanResults)
|
|
{
|
|
ScanResults.Add(result.Key, result.Value);
|
|
}
|
|
}
|
|
|
|
return Task.CompletedTask;
|
|
}
|
|
|
|
public async void Dispose()
|
|
{
|
|
await Event.Off("malwareScan.status", this);
|
|
await Event.Off("malwareScan.result", this);
|
|
}
|
|
} |