Compare commits
52
Commits
28c5918a83
...
Analyzer
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b1ddbd0f99 | ||
|
|
291c65ac02 | ||
|
|
ebf5c11fdf | ||
|
|
c7fcc3297f | ||
|
|
b0318b7759 | ||
|
|
c70b42c9d7 | ||
|
|
8d659d4261 | ||
|
|
45b6d8ecab | ||
|
|
83897c72cf | ||
|
|
680b295f9e | ||
|
|
03e7ebe421 | ||
|
|
41dfb5809a | ||
|
|
7abe904997 | ||
|
|
8256d6a681 | ||
|
|
a6804be9f1 | ||
|
|
0cfbcea252 | ||
|
|
3f647a3e68 | ||
|
|
53289db102 | ||
|
|
f4d94a3336 | ||
|
|
e9fd738f1f | ||
|
|
e581d947f8 | ||
|
|
580d687f62 | ||
|
|
af7b385641 | ||
|
|
7562bbf7d1 | ||
|
|
ac645b01b9 | ||
|
|
97321492ba | ||
|
|
8628d31bec | ||
|
|
23d0a8b978 | ||
|
|
8b55cf7bb6 | ||
|
|
3822339dd9 | ||
|
|
1c74ae9de5 | ||
|
|
bab8fa6c25 | ||
|
|
cd49d32dd7 | ||
|
|
5fe35192c6 | ||
|
|
a1f5b08ac3 | ||
|
|
2cff817044 | ||
|
|
407bbc1556 | ||
|
|
f2ace6f571 | ||
|
|
3034e66126 | ||
|
|
701ffff27e | ||
|
|
ec9cca59da | ||
|
|
90d1d6b429 | ||
|
|
3d8f903d30 | ||
|
|
eedca27a11 | ||
|
|
69a22fb3eb | ||
|
|
d3270d3117 | ||
|
|
f02203c14c | ||
|
|
7ad691c439 | ||
|
|
4eaaf0f244 | ||
|
|
a160992c08 | ||
|
|
1a361a9524 | ||
|
|
be07cdb13e |
@@ -7,6 +7,7 @@
|
|||||||
**/**/bin/*
|
**/**/bin/*
|
||||||
**/obj/*
|
**/obj/*
|
||||||
**/**/obj/*
|
**/**/obj/*
|
||||||
|
*.gz
|
||||||
|
|
||||||
# User-specific stuff
|
# User-specific stuff
|
||||||
.idea/**/workspace.xml
|
.idea/**/workspace.xml
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net9.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="CompressedDatabases\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
// See https://aka.ms/new-console-template for more information
|
||||||
|
|
||||||
|
Console.WriteLine("Hello, World!");
|
||||||
+3
-15
@@ -2,27 +2,15 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net9.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
|
<PublishAot>false</PublishAot>
|
||||||
<Platform>x64</Platform>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<Optimize>true</Optimize>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Models\Models.csproj" />
|
<ProjectReference Include="..\Models\Models.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="FuzzySharp" Version="2.0.2" />
|
|
||||||
<PackageReference Include="MessagePack" Version="3.0.238-rc.1" />
|
|
||||||
<PackageReference Include="MessagePack.Annotations" Version="3.0.238-rc.1" />
|
|
||||||
<PackageReference Include="MessagePackAnalyzer" Version="3.0.238-rc.1">
|
|
||||||
<PrivateAssets>all</PrivateAssets>
|
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
||||||
</PackageReference>
|
|
||||||
<PackageReference Include="NetMQ" Version="4.0.1.13" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
VACUUM;
|
|
||||||
|
|
||||||
DROP TABLE Filtered;
|
|
||||||
|
|
||||||
CREATE TABLE "Filtered" (
|
|
||||||
"Id" INTEGER NOT NULL,
|
|
||||||
"Ip" TEXT NOT NULL,
|
|
||||||
"Port1" INTEGER NOT NULL,
|
|
||||||
"Port2" INTEGER NOT NULL,
|
|
||||||
"Title1" TEXT NOT NULL,
|
|
||||||
"Title2" TEXT NOT NULL,
|
|
||||||
"Description1" TEXT NOT NULL,
|
|
||||||
"Description2" TEXT NOT NULL,
|
|
||||||
"Url1" TEXT NOT NULL,
|
|
||||||
"Url2" TEXT NOT NULL,
|
|
||||||
"ServerType1" TEXT NOT NULL,
|
|
||||||
"ServerType2" TEXT NOT NULL,
|
|
||||||
"RobotsTXT1" TEXT NOT NULL,
|
|
||||||
"RobotsTXT2" TEXT NOT NULL,
|
|
||||||
"HttpVersion1" TEXT NOT NULL,
|
|
||||||
"HttpVersion2" TEXT NOT NULL,
|
|
||||||
"CertificateIssuerCountry" TEXT NOT NULL,
|
|
||||||
"CertificateOrganizationName" TEXT NOT NULL,
|
|
||||||
"IpV6" TEXT NOT NULL,
|
|
||||||
"TlsVersion" TEXT NOT NULL,
|
|
||||||
"CipherSuite" TEXT NOT NULL,
|
|
||||||
"KeyExchangeAlgorithm" TEXT NOT NULL,
|
|
||||||
"PublicKeyType1" TEXT NOT NULL,
|
|
||||||
"PublicKeyType2" TEXT NOT NULL,
|
|
||||||
"PublicKeyType3" TEXT NOT NULL,
|
|
||||||
"AcceptEncoding1" TEXT NOT NULL,
|
|
||||||
"AcceptEncoding2" TEXT NOT NULL,
|
|
||||||
"ALPN" TEXT NOT NULL,
|
|
||||||
"Connection1" TEXT NOT NULL,
|
|
||||||
"Connection2" TEXT NOT NULL,
|
|
||||||
PRIMARY KEY("Id" AUTOINCREMENT)
|
|
||||||
)
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
DROP TABLE Unfiltered;
|
|
||||||
DROP TABLE Runtimes;
|
|
||||||
|
|
||||||
CREATE TABLE "Unfiltered" (
|
|
||||||
"Id" INTEGER NOT NULL,
|
|
||||||
"Ip" TEXT NOT NULL,
|
|
||||||
"ResponseCode" INTEGER NOT NULL,
|
|
||||||
"Port1" INTEGER NOT NULL,
|
|
||||||
"Port2" INTEGER NOT NULL,
|
|
||||||
"Filtered" INTEGER NOT NULL,
|
|
||||||
CONSTRAINT "PK_Unfiltered" PRIMARY KEY("Id" AUTOINCREMENT)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "Runtimes" (
|
|
||||||
"Id" INTEGER NOT NULL CONSTRAINT "PK_Runtimes" PRIMARY KEY AUTOINCREMENT,
|
|
||||||
"StartTime" TEXT NOT NULL,
|
|
||||||
"EndTime" TEXT NOT NULL,
|
|
||||||
"ThreadNumber" INTEGER NOT NULL
|
|
||||||
);
|
|
||||||
@@ -1,154 +0,0 @@
|
|||||||
using System.Diagnostics.CodeAnalysis;
|
|
||||||
using System.Text.Json;
|
|
||||||
using Backend.Helper;
|
|
||||||
using MessagePack;
|
|
||||||
using Models.Handler;
|
|
||||||
using Models.Model.Backend;
|
|
||||||
using Models.Model.External;
|
|
||||||
using NetMQ;
|
|
||||||
using NetMQ.Sockets;
|
|
||||||
|
|
||||||
namespace Backend.Handler;
|
|
||||||
|
|
||||||
public class Communication
|
|
||||||
{
|
|
||||||
private readonly DbHandler _dbHandler;
|
|
||||||
private readonly ThreadHandler _threadHandler;
|
|
||||||
private bool _isRunning = true;
|
|
||||||
|
|
||||||
public Communication(DbHandler dbHandler, ThreadHandler threadHandler)
|
|
||||||
{
|
|
||||||
_dbHandler = dbHandler;
|
|
||||||
_threadHandler = threadHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
public WaitHandle[] Start()
|
|
||||||
{
|
|
||||||
WaitHandle[] waitHandles = new WaitHandle[1];
|
|
||||||
EventWaitHandle handle = new(false, EventResetMode.ManualReset);
|
|
||||||
waitHandles[0] = handle;
|
|
||||||
|
|
||||||
Thread thread = new(Server!);
|
|
||||||
thread.Start(handle);
|
|
||||||
|
|
||||||
return waitHandles;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Server(object obj)
|
|
||||||
{
|
|
||||||
using ResponseSocket rep = new();
|
|
||||||
|
|
||||||
rep.Bind("tcp://127.0.0.1:5556");
|
|
||||||
|
|
||||||
while (_isRunning)
|
|
||||||
{
|
|
||||||
byte[] message = rep.ReceiveFrameBytes();
|
|
||||||
|
|
||||||
CommunicationObject communicationObject = MessagePackSerializer.Deserialize<CommunicationObject>(message);
|
|
||||||
|
|
||||||
OnServerOnReceiveReady(communicationObject, rep);
|
|
||||||
}
|
|
||||||
|
|
||||||
((EventWaitHandle) obj).Set();
|
|
||||||
}
|
|
||||||
|
|
||||||
[RequiresDynamicCode("Calls System.Text.Json.JsonSerializer.Serialize<TValue>(TValue, JsonSerializerOptions)")]
|
|
||||||
[RequiresUnreferencedCode("Calls System.Text.Json.JsonSerializer.Serialize<TValue>(TValue, JsonSerializerOptions)")]
|
|
||||||
private void OnServerOnReceiveReady(CommunicationObject communicationObject, ResponseSocket rep)
|
|
||||||
{
|
|
||||||
switch (communicationObject.Command)
|
|
||||||
{
|
|
||||||
case CommunicationCommand.GetScanningProgress:
|
|
||||||
{
|
|
||||||
DatabaseSizes databaseSizes = FilesystemHelper.GetDatabaseSizes();
|
|
||||||
|
|
||||||
long discardedIndexes = _dbHandler.GetDiscardedIndexes();
|
|
||||||
|
|
||||||
ScanningStatus status = new();
|
|
||||||
// 4294967296 is all Ipv4 addresses.
|
|
||||||
|
|
||||||
if (discardedIndexes != 0)
|
|
||||||
{
|
|
||||||
status.PercentageOfIpv4Scanned = (float)discardedIndexes / 4294967296 * 100;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
status.PercentageOfIpv4Scanned = 0.0000000001f;
|
|
||||||
}
|
|
||||||
|
|
||||||
status.AmountOfIpv4Left = 4294967296 - discardedIndexes;
|
|
||||||
status.TotalFiltered = DbHandler.GetFilteredIndexes();
|
|
||||||
status.TotalDiscarded = discardedIndexes;
|
|
||||||
status.MyDbSize = databaseSizes.MyDbSize;
|
|
||||||
status.FilteredDbSize = databaseSizes.FilteredDbSize;
|
|
||||||
status.DiscardedDbSize = databaseSizes.DiscardedDbSize;
|
|
||||||
|
|
||||||
byte[] serializedResult = MessagePackSerializer.Serialize(status, MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray));
|
|
||||||
|
|
||||||
rep.SendFrame(serializedResult);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case CommunicationCommand.DbReindex:
|
|
||||||
{
|
|
||||||
_dbHandler.ReIndex();
|
|
||||||
|
|
||||||
SendStringResponse(rep, "All Dbs have been reindexed.");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case CommunicationCommand.DbVacuum:
|
|
||||||
{
|
|
||||||
_dbHandler.Vacuum();
|
|
||||||
|
|
||||||
SendStringResponse(rep, "All Dbs have been vacuumed.");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case CommunicationCommand.GetSearches:
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrWhiteSpace(communicationObject.SearchTerm))
|
|
||||||
{
|
|
||||||
SendSearchResponse(rep, communicationObject.SearchTerm);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case CommunicationCommand.StopScanning:
|
|
||||||
{
|
|
||||||
_isRunning = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void SendStringResponse(ResponseSocket rep, string response)
|
|
||||||
{
|
|
||||||
MessagePackSerializerOptions withCompression = MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray);
|
|
||||||
byte[] serializedResult = MessagePackSerializer.Serialize(response, withCompression);
|
|
||||||
|
|
||||||
rep.SendFrame(serializedResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void SendSearchResponse(ResponseSocket rep, string searchTerm)
|
|
||||||
{
|
|
||||||
//SearchResults result = SearchHelper.Search(communicationObject.SearchTerm!, _dbHandler);
|
|
||||||
SearchResults result = new()
|
|
||||||
{
|
|
||||||
Results = []
|
|
||||||
};
|
|
||||||
SearchResult lol = new()
|
|
||||||
{
|
|
||||||
Url = "Remember to use an actual search tearm. Like 'dotnet 9.0'",
|
|
||||||
Title = "Remember to use an actual search tearm. Like 'dotnet 9.0'",
|
|
||||||
};
|
|
||||||
|
|
||||||
result.Results.Add(lol);
|
|
||||||
|
|
||||||
string serializedResult = JsonSerializer.Serialize(result);
|
|
||||||
|
|
||||||
rep.SendFrame(serializedResult);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,24 +1,55 @@
|
|||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Text;
|
|
||||||
using Backend.Helper;
|
using Backend.Helper;
|
||||||
using Models.Handler;
|
using Models.Handler;
|
||||||
using Models.Model.Backend;
|
using Models.Model.Backend;
|
||||||
|
|
||||||
namespace Backend.Handler;
|
namespace Backend.Handler;
|
||||||
|
|
||||||
|
public class Content
|
||||||
|
{
|
||||||
|
public int Port1 { get; set; }
|
||||||
|
public int Port2 { get; set; }
|
||||||
|
public Ip Ip { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ContentThread
|
||||||
|
{
|
||||||
|
public int ThreadId { get; set; }
|
||||||
|
public EventWaitHandle? EventWaitHandle { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public class ContentFilter
|
public class ContentFilter
|
||||||
{
|
{
|
||||||
private readonly ConcurrentQueue<QueueItem> _queue;
|
private readonly ConcurrentQueue<Filtered> _queue;
|
||||||
|
private readonly ConcurrentQueue<UnfilteredQueueItem> _unfilteredQueue;
|
||||||
|
private readonly ConcurrentQueue<Content?> _contentQueue = new();
|
||||||
private readonly DbHandler _dbHandler;
|
private readonly DbHandler _dbHandler;
|
||||||
private const string GetDomainPort80 = "/home/skingging/Documents/Projects/CSharp/RSE/Backend/Scripts/GetDomainNamePort80.sh";
|
private readonly ThreadHandler _threadHandler;
|
||||||
private const string GetDomainPort443 = "/home/skingging/Documents/Projects/CSharp/RSE/Backend/Scripts/GetDomainNamePort443.sh";
|
private readonly string _getDomainPort80;
|
||||||
|
private readonly string _getDomainPort443;
|
||||||
private bool _stop;
|
private bool _stop;
|
||||||
|
private int _timeOut;
|
||||||
public ContentFilter(ConcurrentQueue<QueueItem> queue, DbHandler dbHandler)
|
private readonly string _basePath;
|
||||||
|
|
||||||
|
public ContentFilter(ConcurrentQueue<Filtered> queue, ConcurrentQueue<UnfilteredQueueItem> unfilteredQueue, DbHandler dbHandler, string basePath, ThreadHandler threadHandler)
|
||||||
{
|
{
|
||||||
_queue = queue;
|
_queue = queue;
|
||||||
_dbHandler = dbHandler;
|
_dbHandler = dbHandler;
|
||||||
|
_basePath = basePath;
|
||||||
|
_threadHandler = threadHandler;
|
||||||
|
_unfilteredQueue = unfilteredQueue;
|
||||||
|
|
||||||
|
_getDomainPort80 = $"{basePath}/Backend/Scripts/GetDomainNamePort80.sh";
|
||||||
|
_getDomainPort443 = $"{basePath}/Backend/Scripts/GetDomainNamePort443.sh";
|
||||||
|
|
||||||
|
|
||||||
|
SetTimeout(3000);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTimeout(int timeOut)
|
||||||
|
{
|
||||||
|
_timeOut = timeOut;
|
||||||
}
|
}
|
||||||
|
|
||||||
public WaitHandle[] Start()
|
public WaitHandle[] Start()
|
||||||
@@ -26,6 +57,7 @@ public class ContentFilter
|
|||||||
WaitHandle[] waitHandles = new WaitHandle[1];
|
WaitHandle[] waitHandles = new WaitHandle[1];
|
||||||
EventWaitHandle handle = new(false, EventResetMode.ManualReset);
|
EventWaitHandle handle = new(false, EventResetMode.ManualReset);
|
||||||
waitHandles[0] = handle;
|
waitHandles[0] = handle;
|
||||||
|
|
||||||
Thread f = new (Filter!);
|
Thread f = new (Filter!);
|
||||||
f.Start(handle);
|
f.Start(handle);
|
||||||
|
|
||||||
@@ -34,59 +66,119 @@ public class ContentFilter
|
|||||||
|
|
||||||
private void Filter(object obj)
|
private void Filter(object obj)
|
||||||
{
|
{
|
||||||
long indexes = DbHandler.GetUnfilteredIndexes();
|
while (!_stop)
|
||||||
|
|
||||||
for (long i = 0; i < indexes; i++)
|
|
||||||
{
|
{
|
||||||
if (_stop) break;
|
List<long> indexes = _dbHandler.GetUnfilteredIndexes();
|
||||||
|
|
||||||
Unfiltered? unfiltered = DbHandler.ReadUnfilteredWithId(i);
|
if (indexes.Count == 0)
|
||||||
|
|
||||||
if (unfiltered is null || unfiltered.Filtered == 1) continue;
|
|
||||||
|
|
||||||
unfiltered.Filtered = 1;
|
|
||||||
|
|
||||||
QueueItem superUnfilteredObject = new()
|
|
||||||
{
|
{
|
||||||
Unfiltered = unfiltered,
|
_stop = true;
|
||||||
Operations = Operations.Update
|
_threadHandler.Stop();
|
||||||
};
|
break;
|
||||||
|
|
||||||
_queue.Enqueue(superUnfilteredObject);
|
|
||||||
|
|
||||||
if (_dbHandler.GetFilteredIp(unfiltered.Ip))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Filtered filtered = GetSiteData(unfiltered.Ip);
|
for (int i = 0; i < indexes.Count; i++)
|
||||||
|
|
||||||
filtered.Port1 = unfiltered.Port1;
|
|
||||||
filtered.Port2 = unfiltered.Port2;
|
|
||||||
|
|
||||||
QueueItem superFilteredObject = new()
|
|
||||||
{
|
{
|
||||||
Filtered = filtered,
|
if (_stop) break;
|
||||||
Operations = Operations.Insert
|
|
||||||
};
|
if (_contentQueue.Count >= 500)
|
||||||
|
{
|
||||||
|
Thread.Sleep(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
Unfiltered unfiltered = _dbHandler.ReadUnfilteredWithId(indexes[i]);
|
||||||
|
|
||||||
|
if (unfiltered.Filtered) continue;
|
||||||
|
|
||||||
|
Ip ip = unfiltered.Ip;
|
||||||
|
|
||||||
|
unfiltered.Filtered = true;
|
||||||
|
|
||||||
|
UnfilteredQueueItem superUnfilteredObject = new()
|
||||||
|
{
|
||||||
|
Unfiltered = unfiltered,
|
||||||
|
Operations = Operations.Update
|
||||||
|
};
|
||||||
|
|
||||||
|
_unfilteredQueue.Enqueue(superUnfilteredObject);
|
||||||
|
|
||||||
|
if (_dbHandler.FilteredIpExists(unfiltered.Ip))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Content content = new();
|
||||||
|
content.Ip = ip;
|
||||||
|
content.Port1 = unfiltered.Port1;
|
||||||
|
content.Port2 = unfiltered.Port2;
|
||||||
|
|
||||||
|
_contentQueue.Enqueue(content);
|
||||||
|
}
|
||||||
|
|
||||||
_queue.Enqueue(superFilteredObject);
|
Thread.Sleep(_timeOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
((EventWaitHandle) obj).Set();
|
((EventWaitHandle) obj).Set();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Filtered GetSiteData(string ip)
|
public WaitHandle[] StartFilterThread(int threads)
|
||||||
{
|
{
|
||||||
StartProcess(ip, 80);
|
WaitHandle[] waitHandle = new WaitHandle[threads];
|
||||||
StartProcess(ip, 443);
|
|
||||||
|
for (int i = 0; i < threads; i++)
|
||||||
|
{
|
||||||
|
EventWaitHandle handle = new(false, EventResetMode.ManualReset);
|
||||||
|
ContentThread contentThread = new();
|
||||||
|
contentThread.ThreadId = i;
|
||||||
|
contentThread.EventWaitHandle = handle;
|
||||||
|
waitHandle[i] = handle;
|
||||||
|
|
||||||
|
Thread thread = new(FilterThread!);
|
||||||
|
thread.Start(contentThread);
|
||||||
|
|
||||||
|
Thread.Sleep(8);
|
||||||
|
}
|
||||||
|
|
||||||
|
return waitHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void FilterThread(object obj)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Filter Thread started.");
|
||||||
|
ContentThread thread = (ContentThread) obj;
|
||||||
|
|
||||||
|
while (!_stop)
|
||||||
|
{
|
||||||
|
if (_contentQueue.IsEmpty)
|
||||||
|
{
|
||||||
|
Thread.Sleep(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
_contentQueue.TryDequeue(out Content? content);
|
||||||
|
|
||||||
|
if (content is null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Filtered filtered = GetSiteData(content.Ip, thread.ThreadId);
|
||||||
|
|
||||||
|
filtered.Port1 = content.Port1;
|
||||||
|
filtered.Port2 = content.Port2;
|
||||||
|
|
||||||
|
_queue.Enqueue(filtered);
|
||||||
|
}
|
||||||
|
|
||||||
|
thread.EventWaitHandle!.Set();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Filtered GetSiteData(Ip ip, int threadId)
|
||||||
|
{
|
||||||
|
StartProcess(ip, 80, threadId);
|
||||||
|
StartProcess(ip, 443, threadId);
|
||||||
|
|
||||||
string url1 = "";
|
string url1 = "";
|
||||||
string url2 = "";
|
string url2 = "";
|
||||||
string title1 = "";
|
|
||||||
string title2 = "";
|
|
||||||
string description1 = "";
|
|
||||||
string description2 = "";
|
|
||||||
bool robotsTxt1 = false;
|
bool robotsTxt1 = false;
|
||||||
bool robotsTxt2 = false;
|
bool robotsTxt2 = false;
|
||||||
string serverType1 = "";
|
string serverType1 = "";
|
||||||
@@ -112,7 +204,7 @@ public class ContentFilter
|
|||||||
|
|
||||||
for (int i = 0; i < ports.Length; i++)
|
for (int i = 0; i < ports.Length; i++)
|
||||||
{
|
{
|
||||||
using StreamReader streamReader = new($"{ports[i]}Header.txt");
|
using StreamReader streamReader = new($"{_basePath}/Backend/Scripts/{ports[i]}Header{threadId}.txt");
|
||||||
|
|
||||||
while (streamReader.Peek() != -1)
|
while (streamReader.Peek() != -1)
|
||||||
{
|
{
|
||||||
@@ -145,29 +237,8 @@ public class ContentFilter
|
|||||||
|
|
||||||
for (int i = 0; i < ports.Length; i++)
|
for (int i = 0; i < ports.Length; i++)
|
||||||
{
|
{
|
||||||
string? html;
|
if (ports[i] == 80 && !robotsTxt1) { robotsTxt1 = HttpClientHelper.HasRobotsTxt(url1, 80).GetAwaiter().GetResult(); }
|
||||||
|
if (ports[i] == 443 && !robotsTxt2) { robotsTxt2 = HttpClientHelper.HasRobotsTxt(url2, 443).GetAwaiter().GetResult(); }
|
||||||
if (ports[i] == 80)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrWhiteSpace(url1)) continue;
|
|
||||||
|
|
||||||
html = Task.Run(() => HttpClientHelper.GetHtml(url1, 80).Result).Result;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (string.IsNullOrWhiteSpace(url2)) continue;
|
|
||||||
|
|
||||||
html = Task.Run(() => HttpClientHelper.GetHtml(url2, 443).Result).Result;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(html)) continue;
|
|
||||||
|
|
||||||
if (ports[i] == 80 && string.IsNullOrWhiteSpace(title1)) { FilterHelper.GetTitle(html, out title1); }
|
|
||||||
if (ports[i] == 443 && string.IsNullOrWhiteSpace(title2)) { FilterHelper.GetTitle(html ,out title2); }
|
|
||||||
if (ports[i] == 80 && string.IsNullOrWhiteSpace(description1)) { FilterHelper.GetDescription(html, out description1); }
|
|
||||||
if (ports[i] == 443 && string.IsNullOrWhiteSpace(description2)) { FilterHelper.GetDescription(html, out description2); }
|
|
||||||
if (ports[i] == 80 && !robotsTxt1) { robotsTxt1 = Task.Run(() => HttpClientHelper.HasRobotsTxt(url1, 80).Result).Result; }
|
|
||||||
if (ports[i] == 443 && !robotsTxt2) { robotsTxt2 = Task.Run(() => HttpClientHelper.HasRobotsTxt(url2, 443).Result).Result; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Filtered siteData = new()
|
Filtered siteData = new()
|
||||||
@@ -175,10 +246,6 @@ public class ContentFilter
|
|||||||
Ip = ip,
|
Ip = ip,
|
||||||
Url1 = url1,
|
Url1 = url1,
|
||||||
Url2 = url2,
|
Url2 = url2,
|
||||||
Title1 = title1,
|
|
||||||
Title2 = title2,
|
|
||||||
Description1 = description1,
|
|
||||||
Description2 = description2,
|
|
||||||
ServerType1 = serverType1,
|
ServerType1 = serverType1,
|
||||||
ServerType2 = serverType2,
|
ServerType2 = serverType2,
|
||||||
RobotsTXT1 = robotsTxt1,
|
RobotsTXT1 = robotsTxt1,
|
||||||
@@ -204,19 +271,18 @@ public class ContentFilter
|
|||||||
return siteData;
|
return siteData;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void StartProcess(string ip, int port)
|
private void StartProcess(Ip ip, int port, int threadId)
|
||||||
{
|
{
|
||||||
string fileName = port == 80 ? GetDomainPort80 : GetDomainPort443;
|
string fileName = port == 80 ? _getDomainPort80 : _getDomainPort443;
|
||||||
|
|
||||||
Process proc = new();
|
Process proc = new();
|
||||||
proc.StartInfo = new()
|
proc.StartInfo = new()
|
||||||
{
|
{
|
||||||
FileName = fileName,
|
FileName = "/bin/bash",
|
||||||
Arguments = $"{ip}",
|
Arguments = $"{fileName} {ip.Ip1}.{ip.Ip2}.{ip.Ip3}.{ip.Ip4} {_basePath}/Backend/Scripts/{port}Header{threadId}.txt",
|
||||||
UseShellExecute = false,
|
UseShellExecute = false,
|
||||||
RedirectStandardOutput = false,
|
RedirectStandardOutput = false,
|
||||||
RedirectStandardError = false,
|
RedirectStandardError = false,
|
||||||
RedirectStandardInput = false,
|
|
||||||
CreateNoWindow = true
|
CreateNoWindow = true
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,131 @@
|
|||||||
|
using System.Collections.Concurrent;
|
||||||
|
using Backend.Helper;
|
||||||
|
using Models.Model.Backend;
|
||||||
|
|
||||||
|
namespace Backend.Handler;
|
||||||
|
|
||||||
|
public class IpFilterHandler
|
||||||
|
{
|
||||||
|
private readonly ConcurrentQueue<Discarded> _discardedQueue;
|
||||||
|
private readonly ConcurrentQueue<UnfilteredQueueItem> _unfilteredQueue;
|
||||||
|
private readonly ConcurrentQueue<Ip> _preFilteredQueue;
|
||||||
|
private ThreadHandler _threadHandler;
|
||||||
|
private bool _stop;
|
||||||
|
private bool _done;
|
||||||
|
private bool _stopAutoscaledThreads;
|
||||||
|
private int _timeout;
|
||||||
|
|
||||||
|
public IpFilterHandler(ConcurrentQueue<Discarded> discardedQueue,
|
||||||
|
ConcurrentQueue<UnfilteredQueueItem> unfilteredQueue,
|
||||||
|
ConcurrentQueue<Ip> preFilteredQueue, ThreadHandler threadHandler)
|
||||||
|
{
|
||||||
|
_discardedQueue = discardedQueue;
|
||||||
|
_unfilteredQueue = unfilteredQueue;
|
||||||
|
_preFilteredQueue = preFilteredQueue;
|
||||||
|
_threadHandler = threadHandler;
|
||||||
|
|
||||||
|
_timeout = 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<WaitHandle[]> Start(int threadCount)
|
||||||
|
{
|
||||||
|
WaitHandle[] waitHandle = new WaitHandle[64];
|
||||||
|
|
||||||
|
int counter = 0;
|
||||||
|
|
||||||
|
List<WaitHandle[]> waitHandles = [];
|
||||||
|
|
||||||
|
for (int i = 0; i < threadCount; i++)
|
||||||
|
{
|
||||||
|
EventWaitHandle handle = new(false, EventResetMode.ManualReset);
|
||||||
|
|
||||||
|
if (counter < 64)
|
||||||
|
{
|
||||||
|
waitHandle[counter] = handle;
|
||||||
|
counter++;
|
||||||
|
|
||||||
|
Thread f = new (Filter!);
|
||||||
|
f.Start(handle);
|
||||||
|
|
||||||
|
Console.WriteLine($"Filter thread ({i}) started");
|
||||||
|
Thread.Sleep(16);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
counter = 0;
|
||||||
|
|
||||||
|
waitHandles.Add(waitHandle);
|
||||||
|
|
||||||
|
waitHandle = new WaitHandle[64];
|
||||||
|
}
|
||||||
|
|
||||||
|
return waitHandles;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Filter(object obj)
|
||||||
|
{
|
||||||
|
int counter = 0;
|
||||||
|
while (!_stop)
|
||||||
|
{
|
||||||
|
if (_preFilteredQueue.IsEmpty)
|
||||||
|
{
|
||||||
|
if (counter == 30_000)
|
||||||
|
{
|
||||||
|
_threadHandler.Stop();
|
||||||
|
_stop = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
counter++;
|
||||||
|
Thread.Sleep(128);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
_preFilteredQueue.TryDequeue(out Ip item);
|
||||||
|
|
||||||
|
(int, int) ports = TcpClientHelper.CheckPort(item, 80, 443);
|
||||||
|
|
||||||
|
if (ports is { Item1: 0, Item2: 0 })
|
||||||
|
{
|
||||||
|
_discardedQueue.Enqueue(CreateDiscardedQueueItem(item, item.ResponseCode));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
_unfilteredQueue.Enqueue(CreateUnfilteredQueueItem(item, ports));
|
||||||
|
}
|
||||||
|
|
||||||
|
((EventWaitHandle) obj).Set();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Discarded CreateDiscardedQueueItem(Ip ip, int responseCode)
|
||||||
|
{
|
||||||
|
return new()
|
||||||
|
{
|
||||||
|
Ip = ip,
|
||||||
|
ResponseCode = responseCode
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static UnfilteredQueueItem CreateUnfilteredQueueItem(Ip ip, (int, int) ports)
|
||||||
|
{
|
||||||
|
Unfiltered unfiltered = new()
|
||||||
|
{
|
||||||
|
Ip = ip,
|
||||||
|
Port1 = ports.Item1,
|
||||||
|
Port2 = ports.Item2,
|
||||||
|
Filtered = false
|
||||||
|
};
|
||||||
|
|
||||||
|
return new()
|
||||||
|
{
|
||||||
|
Unfiltered = unfiltered,
|
||||||
|
Operations = Operations.Insert
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Stop()
|
||||||
|
{
|
||||||
|
_stop = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
+220
-57
@@ -1,8 +1,11 @@
|
|||||||
|
using System.Buffers.Binary;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Globalization;
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.NetworkInformation;
|
using System.Net.NetworkInformation;
|
||||||
|
using System.Numerics;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
using Backend.Helper;
|
using Backend.Helper;
|
||||||
|
using Models.Experimental;
|
||||||
using Models.Handler;
|
using Models.Handler;
|
||||||
using Models.Model.Backend;
|
using Models.Model.Backend;
|
||||||
|
|
||||||
@@ -18,27 +21,38 @@ public class ScanSettings
|
|||||||
|
|
||||||
public class IpScanner
|
public class IpScanner
|
||||||
{
|
{
|
||||||
private readonly ConcurrentQueue<QueueItem> _queue;
|
|
||||||
private readonly ConcurrentQueue<Discarded> _discardedQueue;
|
private readonly ConcurrentQueue<Discarded> _discardedQueue;
|
||||||
|
private readonly ConcurrentQueue<Ip> _preFilteredQueue;
|
||||||
|
private readonly ConcurrentQueue<ScannerResumeObject> _resumeQueue;
|
||||||
private readonly DbHandler _dbHandler;
|
private readonly DbHandler _dbHandler;
|
||||||
private bool _stop;
|
private bool _stop;
|
||||||
|
private readonly int _timeout;
|
||||||
|
|
||||||
public IpScanner(ConcurrentQueue<QueueItem> queue, DbHandler dbHandler, ConcurrentQueue<Discarded> discardedQueue)
|
public IpScanner(ConcurrentQueue<Discarded> discardedQueue,
|
||||||
|
ConcurrentQueue<ScannerResumeObject> resumeQueue, DbHandler dbHandler,
|
||||||
|
ConcurrentQueue<Ip> preFilteredQueue)
|
||||||
{
|
{
|
||||||
_queue = queue;
|
|
||||||
_dbHandler = dbHandler;
|
_dbHandler = dbHandler;
|
||||||
|
_preFilteredQueue = preFilteredQueue;
|
||||||
_discardedQueue = discardedQueue;
|
_discardedQueue = discardedQueue;
|
||||||
|
_resumeQueue = resumeQueue;
|
||||||
|
|
||||||
|
_timeout = 32;
|
||||||
}
|
}
|
||||||
|
|
||||||
public WaitHandle[] Start(int threads)
|
public List<WaitHandle[]> Start(int threads)
|
||||||
{
|
{
|
||||||
int threadsAmount = 0;
|
int threadsAmount = 0;
|
||||||
if (threads % 2 == 0)
|
if (threads % 2 == 0)
|
||||||
{
|
{
|
||||||
threadsAmount = 256 / threads;
|
threadsAmount = 256 / threads;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WaitHandle[] waitHandle = new WaitHandle[64];
|
||||||
|
|
||||||
WaitHandle[] waitHandles = new WaitHandle[threads];
|
int counter = 0;
|
||||||
|
|
||||||
|
List<WaitHandle[]> waitHandles = [];
|
||||||
|
|
||||||
for (int i = 0; i < threads; i++)
|
for (int i = 0; i < threads; i++)
|
||||||
{
|
{
|
||||||
@@ -52,13 +66,25 @@ public class IpScanner
|
|||||||
Handle = handle
|
Handle = handle
|
||||||
};
|
};
|
||||||
|
|
||||||
waitHandles[i] = handle;
|
if (counter < 64)
|
||||||
|
{
|
||||||
|
waitHandle[counter] = handle;
|
||||||
|
counter++;
|
||||||
|
|
||||||
|
Thread f = new (Scan!);
|
||||||
|
f.Start(scanSettings);
|
||||||
|
|
||||||
|
Console.WriteLine($"Scanner thread ({i}) started");
|
||||||
|
Thread.Sleep(128);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
Thread f = new (Scan!);
|
counter = 0;
|
||||||
f.Start(scanSettings);
|
|
||||||
|
|
||||||
Console.WriteLine($"Scanner thread ({i}) started");
|
waitHandles.Add(waitHandle);
|
||||||
Thread.Sleep(1000);
|
|
||||||
|
waitHandle = new WaitHandle[64];
|
||||||
}
|
}
|
||||||
|
|
||||||
return waitHandles;
|
return waitHandles;
|
||||||
@@ -81,15 +107,26 @@ public class IpScanner
|
|||||||
|
|
||||||
if (resumeNow is not null)
|
if (resumeNow is not null)
|
||||||
{
|
{
|
||||||
|
if (resumeNow.Completed)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
scanSettings.Start = resumeNow.FirstByte;
|
scanSettings.Start = resumeNow.FirstByte;
|
||||||
scanSettings.End = resumeNow.EndRange;
|
scanSettings.End = resumeNow.EndRange;
|
||||||
secondByte = resumeNow.SecondByte;
|
secondByte = resumeNow.SecondByte;
|
||||||
thirdByte = resumeNow.ThirdByte;
|
thirdByte = resumeNow.ThirdByte;
|
||||||
fourthByte = resumeNow.FourthByte;
|
fourthByte = resumeNow.FourthByte;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CreateResumeObject(scanSettings.ThreadNumber, scanSettings.Start, scanSettings.End, scanSettings.Start, secondByte, thirdByte, fourthByte, false, false, Operations.Insert);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Empty buffer so we use the lowest abstracted ping.Send() method.
|
||||||
byte[] buf = [];
|
byte[] buf = [];
|
||||||
using Ping ping = new();
|
using Ping ping = new();
|
||||||
|
int x = 0;
|
||||||
|
|
||||||
for (int i = scanSettings.Start; i < scanSettings.End; i++)
|
for (int i = scanSettings.Start; i < scanSettings.End; i++)
|
||||||
{
|
{
|
||||||
@@ -108,21 +145,41 @@ public class IpScanner
|
|||||||
if (i == 192 && k == 2) continue;
|
if (i == 192 && k == 2) continue;
|
||||||
if (i == 192 && j == 88 && k == 99) continue;
|
if (i == 192 && j == 88 && k == 99) continue;
|
||||||
|
|
||||||
if (_discardedQueue.Count >= 2000)
|
if (_discardedQueue.Count >= 20_000)
|
||||||
{
|
{
|
||||||
Console.WriteLine("loooooooooooooooooooooooooooool");
|
Thread.Sleep(1000);
|
||||||
Thread.Sleep(500);
|
}
|
||||||
|
|
||||||
|
if (_preFilteredQueue.Count >= 20_000)
|
||||||
|
{
|
||||||
|
Thread.Sleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int l = fourthByte; l < 256; l++)
|
for (int l = fourthByte; l < 256; l++)
|
||||||
{
|
{
|
||||||
|
if (x == 75_000)
|
||||||
|
{
|
||||||
|
CreateResumeObject(scanSettings.ThreadNumber, scanSettings.Start, scanSettings.End, i, j, k, l, false, false, Operations.Update);
|
||||||
|
x = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
x++;
|
||||||
|
|
||||||
if (_stop)
|
if (_stop)
|
||||||
{
|
{
|
||||||
resumeObject.FourthByte = l;
|
resumeObject.FourthByte = l;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
string ip = $"{i}.{j}.{k}.{l}";
|
|
||||||
|
|
||||||
|
Ip ip = new()
|
||||||
|
{
|
||||||
|
Ip1 = i,
|
||||||
|
Ip2 = j,
|
||||||
|
Ip3 = k,
|
||||||
|
Ip4 = l
|
||||||
|
};
|
||||||
|
|
||||||
IPStatus responseCode = IPStatus.Unknown;
|
IPStatus responseCode = IPStatus.Unknown;
|
||||||
|
|
||||||
@@ -130,15 +187,26 @@ public class IpScanner
|
|||||||
{
|
{
|
||||||
// Sometimes, if the pinger gets a Destination Unreachable Communication administratively prohibited response, the pinger will throw an exception.
|
// Sometimes, if the pinger gets a Destination Unreachable Communication administratively prohibited response, the pinger will throw an exception.
|
||||||
// https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol?useskin=vector#Control_messages
|
// https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol?useskin=vector#Control_messages
|
||||||
_ = IPAddress.TryParse(ip, out IPAddress? address);
|
//_ = IPAddress.TryParse(ip.ToString(), out IPAddress? address);
|
||||||
if (address is not null)
|
|
||||||
|
responseCode = CustomPing.SendIcmpEchoRequestOverRawSocket(Parse(ip.ToString()), _timeout);
|
||||||
|
|
||||||
|
/*if (l % 2 == 0)
|
||||||
{
|
{
|
||||||
responseCode = ping.Send(address, 512, buf, null).Status;
|
responseCode = IPStatus.Success;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
responseCode = IPStatus.TimedOut;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
//responseCode = IPStatus.TimedOut;
|
||||||
|
|
||||||
|
//Thread.Sleep(0);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch
|
||||||
{
|
{
|
||||||
Console.WriteLine(e);
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
if (responseCode != IPStatus.Success)
|
if (responseCode != IPStatus.Success)
|
||||||
@@ -147,15 +215,7 @@ public class IpScanner
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
(int, int) ports = TcpClientHelper.CheckPort(ip, 80, 443);
|
_preFilteredQueue.Enqueue(CreateUnfilteredQueueItem(ip, (int)responseCode));
|
||||||
|
|
||||||
if (ports is { Item1: 0, Item2: 0 })
|
|
||||||
{
|
|
||||||
_discardedQueue.Enqueue(CreateDiscardedQueueItem(ip, (int)responseCode));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
_queue.Enqueue(CreateUnfilteredQueueItem(ip, (int)responseCode, ports));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_stop)
|
if (_stop)
|
||||||
@@ -177,53 +237,156 @@ public class IpScanner
|
|||||||
resumeObject.FirstByte = i;
|
resumeObject.FirstByte = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
//Console.WriteLine($"Thread ({scanSettings.ThreadNumber}) is at index ({i}) out of ({scanSettings.End}). Remaining ({scanSettings.End - i})");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QueueItem resume = new()
|
Console.WriteLine($"Thread ({scanSettings.ThreadNumber}) stopped.");
|
||||||
{
|
|
||||||
ResumeObject = resumeObject,
|
|
||||||
Operations = Operations.Insert
|
|
||||||
};
|
|
||||||
|
|
||||||
_queue.Enqueue(resume);
|
if (_stop)
|
||||||
|
{
|
||||||
|
resumeObject.Paused = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resumeObject.Completed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
resumeObject.Operation = Operations.Update;
|
||||||
|
|
||||||
|
_resumeQueue.Enqueue(resumeObject);
|
||||||
|
|
||||||
scanSettings.Handle!.Set();
|
scanSettings.Handle!.Set();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Discarded CreateDiscardedQueueItem(string ip, int responseCode)
|
private void CreateResumeObject(int threadNumber, int startRange, int endRange, int firstByte, int secondByte, int thirdByte, int fourthByte, bool paused, bool completed, Operations operation)
|
||||||
{
|
{
|
||||||
Discarded discarded = new()
|
ScannerResumeObject resumeObject = new();
|
||||||
|
resumeObject.ThreadNumber = threadNumber;
|
||||||
|
resumeObject.StartRange = startRange;
|
||||||
|
resumeObject.EndRange = endRange;
|
||||||
|
resumeObject.FirstByte = firstByte;
|
||||||
|
resumeObject.SecondByte = secondByte;
|
||||||
|
resumeObject.ThirdByte = thirdByte;
|
||||||
|
resumeObject.FourthByte = fourthByte;
|
||||||
|
resumeObject.Paused = paused;
|
||||||
|
resumeObject.Completed = completed;
|
||||||
|
resumeObject.Operation = operation;
|
||||||
|
|
||||||
|
_resumeQueue.Enqueue(resumeObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Discarded CreateDiscardedQueueItem(Ip ip, int responseCode)
|
||||||
|
{
|
||||||
|
return new()
|
||||||
{
|
{
|
||||||
Ip = ip,
|
Ip = ip,
|
||||||
ResponseCode = responseCode
|
ResponseCode = responseCode
|
||||||
};
|
};
|
||||||
|
|
||||||
return discarded;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static QueueItem CreateUnfilteredQueueItem(string ip, int responseCode, (int, int) ports)
|
private static Ip CreateUnfilteredQueueItem(Ip ip, int responseCode)
|
||||||
{
|
{
|
||||||
Unfiltered unfiltered = new()
|
ip.ResponseCode = responseCode;
|
||||||
{
|
|
||||||
Ip = ip,
|
|
||||||
ResponseCode = responseCode,
|
|
||||||
Port1 = ports.Item1,
|
|
||||||
Port2 = ports.Item2,
|
|
||||||
Filtered = 0
|
|
||||||
};
|
|
||||||
|
|
||||||
QueueItem superUnfilteredObject = new()
|
return ip;
|
||||||
{
|
|
||||||
Unfiltered = unfiltered,
|
|
||||||
Operations = Operations.Insert
|
|
||||||
};
|
|
||||||
|
|
||||||
return superUnfilteredObject;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Stop()
|
public void Stop()
|
||||||
{
|
{
|
||||||
_stop = true;
|
_stop = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static unsafe IPAddress Parse(ReadOnlySpan<char> ipSpan)
|
||||||
|
{
|
||||||
|
int length = ipSpan.Length;
|
||||||
|
long nonCanonical;
|
||||||
|
fixed (char* name = &MemoryMarshal.GetReference<char>(ipSpan))
|
||||||
|
nonCanonical = ParseNonCanonical(name, 0, ref length, true);
|
||||||
|
|
||||||
|
return new IPAddress(BitOperations.RotateRight((uint)nonCanonical & 16711935U, 8) + BitOperations.RotateLeft((uint)nonCanonical & 4278255360U, 8));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static unsafe long ParseNonCanonical(char* name, int start, ref int end, bool notImplicitFile)
|
||||||
|
{
|
||||||
|
long* numPtr = stackalloc long[4];
|
||||||
|
long num1 = 0;
|
||||||
|
bool flag = false;
|
||||||
|
int index1 = 0;
|
||||||
|
int index2;
|
||||||
|
for (index2 = start; index2 < end; ++index2)
|
||||||
|
{
|
||||||
|
char ch = name[index2];
|
||||||
|
num1 = 0L;
|
||||||
|
int num2 = 10;
|
||||||
|
if (ch == '0')
|
||||||
|
{
|
||||||
|
num2 = 8;
|
||||||
|
++index2;
|
||||||
|
flag = true;
|
||||||
|
if (index2 < end)
|
||||||
|
{
|
||||||
|
switch (name[index2])
|
||||||
|
{
|
||||||
|
case 'X':
|
||||||
|
case 'x':
|
||||||
|
num2 = 16;
|
||||||
|
++index2;
|
||||||
|
flag = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (; index2 < end; ++index2)
|
||||||
|
{
|
||||||
|
char c = name[index2];
|
||||||
|
int num3;
|
||||||
|
if ((num2 == 10 || num2 == 16) && char.IsAsciiDigit(c))
|
||||||
|
num3 = (int) c - 48;
|
||||||
|
else if (num2 == 8 && '0' <= c && c <= '7')
|
||||||
|
num3 = (int) c - 48;
|
||||||
|
else if (num2 == 16 && 'a' <= c && c <= 'f')
|
||||||
|
num3 = (int) c + 10 - 97;
|
||||||
|
else if (num2 == 16 && 'A' <= c && c <= 'F')
|
||||||
|
num3 = (int) c + 10 - 65;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
num1 = num1 * (long) num2 + (long) num3;
|
||||||
|
if (num1 > (long) uint.MaxValue)
|
||||||
|
return -1;
|
||||||
|
flag = true;
|
||||||
|
}
|
||||||
|
if (index2 < end && name[index2] == '.')
|
||||||
|
{
|
||||||
|
if (index1 >= 3 || !flag || num1 > (long) byte.MaxValue)
|
||||||
|
return -1;
|
||||||
|
numPtr[index1] = num1;
|
||||||
|
++index1;
|
||||||
|
flag = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!flag)
|
||||||
|
return -1;
|
||||||
|
if (index2 < end)
|
||||||
|
{
|
||||||
|
char ch;
|
||||||
|
if ((ch = name[index2]) != '/' && ch != '\\' && (!notImplicitFile || ch != ':' && ch != '?' && ch != '#'))
|
||||||
|
return -1;
|
||||||
|
end = index2;
|
||||||
|
}
|
||||||
|
numPtr[index1] = num1;
|
||||||
|
switch (index1)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return numPtr[0] > (long) uint.MaxValue ? -1L : numPtr[0];
|
||||||
|
case 1:
|
||||||
|
return numPtr[1] > 16777215L ? -1L : numPtr[0] << 24 | numPtr[1] & 16777215L;
|
||||||
|
case 2:
|
||||||
|
return numPtr[2] > (long) ushort.MaxValue ? -1L : numPtr[0] << 24 | (numPtr[1] & (long) byte.MaxValue) << 16 | numPtr[2] & (long) ushort.MaxValue;
|
||||||
|
case 3:
|
||||||
|
return numPtr[3] > (long) byte.MaxValue ? -1L : numPtr[0] << 24 | (numPtr[1] & (long) byte.MaxValue) << 16 | (numPtr[2] & (long) byte.MaxValue) << 8 | numPtr[3] & (long) byte.MaxValue;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -7,127 +7,203 @@ namespace Backend.Handler;
|
|||||||
public class ThreadHandler
|
public class ThreadHandler
|
||||||
{
|
{
|
||||||
private readonly DbHandler _dbHandler;
|
private readonly DbHandler _dbHandler;
|
||||||
private readonly Communication _communication;
|
|
||||||
private readonly IpScanner _ipScanner;
|
private readonly IpScanner _ipScanner;
|
||||||
private readonly ContentFilter _contentFilter;
|
private readonly ContentFilter _contentFilter;
|
||||||
|
private readonly IpFilterHandler _ipFilterHandler;
|
||||||
|
|
||||||
private bool _communicationStopped;
|
|
||||||
private bool _ipScannerStopped;
|
private bool _ipScannerStopped;
|
||||||
private bool _contentFilterStopped;
|
private bool _contentFilterStopped;
|
||||||
private bool _stopSignal;
|
private bool _ipFilterStopped;
|
||||||
|
|
||||||
|
private bool _stage1 = false;
|
||||||
|
private bool _stage2 = true;
|
||||||
|
private bool _stage3 = false;
|
||||||
|
|
||||||
public ThreadHandler()
|
ConcurrentQueue<Filtered> filteredQueue = new();
|
||||||
|
ConcurrentQueue<Discarded> discardedQueue = new();
|
||||||
|
ConcurrentQueue<UnfilteredQueueItem> unfilteredQueue = new();
|
||||||
|
ConcurrentQueue<ScannerResumeObject> scannerResumeQueue = new();
|
||||||
|
ConcurrentQueue<Ip> preFilteredQueue = new();
|
||||||
|
|
||||||
|
public ThreadHandler(string path)
|
||||||
{
|
{
|
||||||
ConcurrentQueue<QueueItem> contentQueue = new();
|
_dbHandler = new(filteredQueue, discardedQueue, unfilteredQueue, scannerResumeQueue, preFilteredQueue, path);
|
||||||
ConcurrentQueue<Discarded> discardedQueue = new();
|
_ipScanner = new(discardedQueue, scannerResumeQueue, _dbHandler, preFilteredQueue);
|
||||||
|
_contentFilter = new(filteredQueue, unfilteredQueue, _dbHandler, path, this);
|
||||||
_dbHandler = new(contentQueue, discardedQueue);
|
_ipFilterHandler = new(discardedQueue, unfilteredQueue, preFilteredQueue, this);
|
||||||
_communication = new(_dbHandler, this);
|
|
||||||
_ipScanner = new(contentQueue, _dbHandler, discardedQueue);
|
|
||||||
_contentFilter = new(contentQueue, _dbHandler);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Start()
|
public void Start()
|
||||||
{
|
{
|
||||||
Thread scanner = new(StartScanner);
|
Thread scanner = new(StartScanner);
|
||||||
Thread indexer = new(StartIndexer);
|
Thread ipFilter = new(StartIpFilter);
|
||||||
|
Thread indexer = new(StartContentFilter);
|
||||||
Thread database = new(StartDbHandler);
|
Thread database = new(StartDbHandler);
|
||||||
Thread discarded = new(StartDiscardedDbHandler);
|
Thread discarded = new(StartDiscardedDbHandler);
|
||||||
Thread communication = new(StartCommunicationHandler);
|
Thread filtered = new(StartFilteredDbHandler);
|
||||||
|
Thread resume = new(StartResumeDbHandler);
|
||||||
|
Thread contentFilterThread = new(StartContentFilterThread);
|
||||||
|
Thread prefilterDb = new(StartPreFilterDbHandler);
|
||||||
|
Thread fillIpFilterQueue = new(StartFillIpFilterQueue);
|
||||||
|
//Thread check = new(CheckQueue);
|
||||||
|
|
||||||
scanner.Start();
|
//check.Start();
|
||||||
indexer.Start();
|
|
||||||
database.Start();
|
|
||||||
discarded.Start();
|
|
||||||
communication.Start();
|
|
||||||
|
|
||||||
scanner.Join();
|
if (_stage1)
|
||||||
indexer.Join();
|
{
|
||||||
database.Join();
|
discarded.Start(); // de-queues from discardedQueue
|
||||||
discarded.Join();
|
prefilterDb.Start(); // de-queues from preFilteredQueue
|
||||||
communication.Join();
|
scanner.Start(); // en-queues to discardedQueue and preFilteredQueue
|
||||||
|
resume.Start(); // de-queues from resumeQueue
|
||||||
|
|
||||||
|
scanner.Join();
|
||||||
|
Stop();
|
||||||
|
|
||||||
|
discarded.Join();
|
||||||
|
prefilterDb.Join();
|
||||||
|
resume.Join();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_stage2)
|
||||||
|
{
|
||||||
|
database.Start(); // de-queues from unfilteredQueue
|
||||||
|
discarded.Start(); // de-queues from discardedQueue
|
||||||
|
ipFilter.Start(); // en-queues to discardedQueue and unfilteredQueue
|
||||||
|
fillIpFilterQueue.Start(); // reads from preFiltered database, en-queues to preFilteredQueue
|
||||||
|
|
||||||
|
ipFilter.Join();
|
||||||
|
Stop();
|
||||||
|
database.Join();
|
||||||
|
discarded.Join();
|
||||||
|
fillIpFilterQueue.Join();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_stage3)
|
||||||
|
{
|
||||||
|
filtered.Start(); // de-queues from filteredQueue
|
||||||
|
database.Start(); // de-queues from unfilteredQueue
|
||||||
|
indexer.Start(); // en-queues to unfilteredQueue and contentQueue
|
||||||
|
contentFilterThread.Start(); // de-queues from contentQueue, en-queues to filteredQueue
|
||||||
|
|
||||||
|
contentFilterThread.Join();
|
||||||
|
filtered.Join();
|
||||||
|
database.Join();
|
||||||
|
indexer.Join();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ManualGc()
|
private void CheckQueue()
|
||||||
{
|
{
|
||||||
GC.Collect();
|
while (true)
|
||||||
GC.WaitForPendingFinalizers();
|
{
|
||||||
GC.Collect();
|
Console.Clear();
|
||||||
|
Console.WriteLine($"filteredQueue.Count: {filteredQueue.Count}");
|
||||||
|
Console.WriteLine($"discardedQueue.Count: {discardedQueue.Count}");
|
||||||
|
Console.WriteLine($"unfilteredQueue.Count: {unfilteredQueue.Count}");
|
||||||
|
Console.WriteLine($"scannerResumeQueue.Count: {scannerResumeQueue.Count}");
|
||||||
|
Console.WriteLine($"preFilteredQueue.Count: {preFilteredQueue.Count}");
|
||||||
|
Thread.Sleep(5);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void StartScanner()
|
private void StartScanner()
|
||||||
{
|
{
|
||||||
Thread.Sleep(10000); // Let the database handler instantiate and warm up first.
|
Thread.Sleep(15000); // Let the database handler instantiate and warm up first.
|
||||||
|
|
||||||
WaitHandle[] wait = _ipScanner.Start(4);
|
List<WaitHandle[]> wait = _ipScanner.Start(256);
|
||||||
|
|
||||||
|
for (int i = 0; i < wait.Count; i++)
|
||||||
|
{
|
||||||
|
WaitHandle.WaitAll(wait[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("Scanner finished");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StartContentFilter()
|
||||||
|
{
|
||||||
|
Thread.Sleep(5000);
|
||||||
|
|
||||||
|
WaitHandle[] wait = _contentFilter.Start();
|
||||||
|
|
||||||
WaitHandle.WaitAll(wait);
|
WaitHandle.WaitAll(wait);
|
||||||
|
|
||||||
Console.WriteLine("Scanner finished");
|
Console.WriteLine("Content filter finished");
|
||||||
|
|
||||||
_ipScannerStopped = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void StartIndexer()
|
|
||||||
{
|
|
||||||
while (!_stopSignal)
|
|
||||||
{
|
|
||||||
WaitHandle[] wait = _contentFilter.Start();
|
|
||||||
|
|
||||||
WaitHandle.WaitAll(wait);
|
|
||||||
|
|
||||||
Thread.Sleep(300000); // 5 minutes
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.WriteLine("Indexer finished");
|
|
||||||
|
|
||||||
_contentFilterStopped = true;
|
_contentFilterStopped = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void StartContentFilterThread()
|
||||||
|
{
|
||||||
|
WaitHandle[] wait = _contentFilter.StartFilterThread(8);
|
||||||
|
|
||||||
|
WaitHandle.WaitAll(wait);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StartFillIpFilterQueue()
|
||||||
|
{
|
||||||
|
_dbHandler.GetPreFilterQueueItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StartIpFilter()
|
||||||
|
{
|
||||||
|
Thread.Sleep(1000);
|
||||||
|
|
||||||
|
List<WaitHandle[]> wait = _ipFilterHandler.Start(1024);
|
||||||
|
|
||||||
|
for (int i = 0; i < wait.Count; i++)
|
||||||
|
{
|
||||||
|
WaitHandle.WaitAll(wait[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("Ip filter finished");
|
||||||
|
|
||||||
|
_ipFilterStopped = true;
|
||||||
|
}
|
||||||
|
|
||||||
private void StartDbHandler()
|
private void StartDbHandler()
|
||||||
{
|
{
|
||||||
_dbHandler.StartContent();
|
_dbHandler.UnfilteredDbHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StartFilteredDbHandler()
|
||||||
|
{
|
||||||
|
_dbHandler.FilteredDbHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StartPreFilterDbHandler()
|
||||||
|
{
|
||||||
|
_dbHandler.PrefilteredDbHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StartResumeDbHandler()
|
||||||
|
{
|
||||||
|
_dbHandler.ResumeDbHandler();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void StartDiscardedDbHandler()
|
private void StartDiscardedDbHandler()
|
||||||
{
|
{
|
||||||
WaitHandle[] wait = _dbHandler.Start(2);
|
WaitHandle[] wait = _dbHandler.Start(4);
|
||||||
|
|
||||||
WaitHandle.WaitAll(wait);
|
WaitHandle.WaitAll(wait);
|
||||||
|
|
||||||
Console.WriteLine("Discarded DbHandler finished");
|
Console.WriteLine("Discarded DbHandler finished");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void StartCommunicationHandler()
|
public void Stop()
|
||||||
{
|
{
|
||||||
WaitHandle[] wait = _communication.Start();
|
Console.WriteLine("Stopping...");
|
||||||
|
|
||||||
WaitHandle.WaitAll(wait);
|
|
||||||
|
|
||||||
Console.WriteLine("Communicator finished");
|
|
||||||
|
|
||||||
_communicationStopped = true;
|
|
||||||
|
|
||||||
Stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Stop()
|
|
||||||
{
|
|
||||||
_stopSignal = true;
|
|
||||||
_ipScanner.Stop();
|
_ipScanner.Stop();
|
||||||
_contentFilter.Stop();
|
_contentFilter.Stop();
|
||||||
|
_ipFilterHandler.Stop();
|
||||||
|
Console.WriteLine("Stopping Extra...");
|
||||||
|
|
||||||
bool stopping = true;
|
Thread.Sleep(30_000);
|
||||||
|
|
||||||
while (stopping)
|
Console.WriteLine("Stopping Super Extra...");
|
||||||
{
|
_dbHandler.Stop();
|
||||||
if (_communicationStopped && _ipScannerStopped && _contentFilterStopped)
|
|
||||||
{
|
Console.WriteLine("Stopped.");
|
||||||
_dbHandler.Stop();
|
|
||||||
stopping = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Thread.Sleep(3000);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
using Models.Model.Backend;
|
|
||||||
|
|
||||||
namespace Backend.Helper;
|
|
||||||
|
|
||||||
public static class FilesystemHelper
|
|
||||||
{
|
|
||||||
public static DatabaseSizes GetDatabaseSizes()
|
|
||||||
{
|
|
||||||
DatabaseSizes databaseSizes = new();
|
|
||||||
|
|
||||||
FileInfo fileInfo = new("../../../../Models/mydb.db");
|
|
||||||
databaseSizes.MyDbSize = fileInfo.Length.ToSize(SizeUnits.KB);
|
|
||||||
|
|
||||||
databaseSizes.DiscardedDbSize = GetDiscardedDbSizes().ToSize(SizeUnits.KB);
|
|
||||||
|
|
||||||
fileInfo = new("../../../../Models/Filtered.db");
|
|
||||||
databaseSizes.FilteredDbSize = fileInfo.Length.ToSize(SizeUnits.KB);
|
|
||||||
|
|
||||||
return databaseSizes;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static long GetDiscardedDbSizes()
|
|
||||||
{
|
|
||||||
const string folder = "../../../../Models";
|
|
||||||
string[] files = Directory.GetFiles(folder, "*.db");
|
|
||||||
|
|
||||||
long size = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < files.Length; i++)
|
|
||||||
{
|
|
||||||
if (!files[i].Contains("Discarded")) continue;
|
|
||||||
FileInfo fileInfo = new(files[i]);
|
|
||||||
size += fileInfo.Length;
|
|
||||||
}
|
|
||||||
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static double ToSize(this long value, SizeUnits unit)
|
|
||||||
{
|
|
||||||
return double.Parse((value / Math.Pow(1024, (long)unit)).ToString("0.00"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,12 +2,10 @@ using System.Text.RegularExpressions;
|
|||||||
|
|
||||||
namespace Backend.Helper;
|
namespace Backend.Helper;
|
||||||
|
|
||||||
public static partial class FilterHelper
|
public static class FilterHelper
|
||||||
{
|
{
|
||||||
// https://stackoverflow.com/a/56116499
|
// https://stackoverflow.com/a/56116499
|
||||||
private const string DomainPattern = @"^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$";
|
private const string DomainPattern = @"^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$";
|
||||||
private const string TitlePattern = "<title>(.*)</title>";
|
|
||||||
private const string DescriptionPattern = "<meta name=\"description\" content=\"(.*?)\"";
|
|
||||||
|
|
||||||
public static void GetDomain(string data, out string result)
|
public static void GetDomain(string data, out string result)
|
||||||
{
|
{
|
||||||
@@ -42,32 +40,6 @@ public static partial class FilterHelper
|
|||||||
result = GetSubstring(data, start, end);
|
result = GetSubstring(data, start, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void GetTitle(string data, out string result)
|
|
||||||
{
|
|
||||||
result = "";
|
|
||||||
|
|
||||||
Regex titleRegex = MyRegex1();
|
|
||||||
Match match = titleRegex.Match(data);
|
|
||||||
|
|
||||||
if (match.Success)
|
|
||||||
{
|
|
||||||
result = match.Groups[1].Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void GetDescription(string data, out string result)
|
|
||||||
{
|
|
||||||
result = "";
|
|
||||||
|
|
||||||
Regex titleRegex = MyRegex2();
|
|
||||||
Match match = titleRegex.Match(data);
|
|
||||||
|
|
||||||
if (match.Success)
|
|
||||||
{
|
|
||||||
result = match.Groups[1].Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void GetHttpVersion(string data, out string result)
|
public static void GetHttpVersion(string data, out string result)
|
||||||
{
|
{
|
||||||
result = "";
|
result = "";
|
||||||
@@ -198,7 +170,7 @@ public static partial class FilterHelper
|
|||||||
case 0:
|
case 0:
|
||||||
return;
|
return;
|
||||||
case 2:
|
case 2:
|
||||||
result = $"{temp[1].Trim()} UUHHHMMM";
|
result = $"{temp[1].Trim()}";
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
result = temp[2].Trim();
|
result = temp[2].Trim();
|
||||||
@@ -241,17 +213,7 @@ public static partial class FilterHelper
|
|||||||
|
|
||||||
private static bool ValidateUrl(string url)
|
private static bool ValidateUrl(string url)
|
||||||
{
|
{
|
||||||
Regex rgx = MyRegex();
|
Regex rgx = new(DomainPattern);
|
||||||
return rgx.IsMatch(url);
|
return rgx.IsMatch(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Generate the RegEx at compile time.
|
|
||||||
[GeneratedRegex(DomainPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled, "en-US")]
|
|
||||||
private static partial Regex MyRegex();
|
|
||||||
|
|
||||||
[GeneratedRegex(TitlePattern)]
|
|
||||||
private static partial Regex MyRegex1();
|
|
||||||
|
|
||||||
[GeneratedRegex(DescriptionPattern)]
|
|
||||||
private static partial Regex MyRegex2();
|
|
||||||
}
|
}
|
||||||
@@ -1,65 +1,52 @@
|
|||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace Backend.Helper;
|
namespace Backend.Helper;
|
||||||
|
|
||||||
public static class HttpClientHelper
|
public static partial class HttpClientHelper
|
||||||
{
|
{
|
||||||
public static async Task<string> GetHtml(string url, int port)
|
// Reddit, for example, will block the GET request if you don't have a user agent.
|
||||||
{
|
private const string UserAgentHeader = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36";
|
||||||
using HttpClient client = new();
|
|
||||||
|
|
||||||
if (port == 80)
|
|
||||||
{
|
|
||||||
client.BaseAddress = new($"http://{url}");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
client.BaseAddress = new($"https://{url}");
|
|
||||||
}
|
|
||||||
|
|
||||||
client.DefaultRequestHeaders.Accept.Clear();
|
|
||||||
|
|
||||||
HttpResponseMessage? response = null;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
response = await client.GetAsync("/");
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Console.WriteLine(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (response is null || !response.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
return await response.Content.ReadAsStringAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task<bool> HasRobotsTxt(string url, int port)
|
public static async Task<bool> HasRobotsTxt(string url, int port)
|
||||||
{
|
{
|
||||||
using HttpClient client = new();
|
using HttpClient client = new();
|
||||||
|
|
||||||
if (port == 80)
|
if (port == 80)
|
||||||
{
|
{
|
||||||
client.BaseAddress = new($"http://{url}");
|
try
|
||||||
|
{
|
||||||
|
client.BaseAddress = new($"http://{url}");
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
client.BaseAddress = new($"https://{url}");
|
try
|
||||||
|
{
|
||||||
|
client.BaseAddress = new($"https://{url}");
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
client.DefaultRequestHeaders.Accept.Clear();
|
client.DefaultRequestHeaders.Accept.Clear();
|
||||||
|
client.DefaultRequestHeaders.UserAgent.ParseAdd(UserAgentHeader);
|
||||||
|
client.Timeout = TimeSpan.FromSeconds(30);
|
||||||
|
|
||||||
HttpResponseMessage? response = null;
|
HttpResponseMessage? response = null;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
response = await client.GetAsync("/robots.txt");
|
response = await client.SendAsync(new(HttpMethod.Head, "/robots.txt"));
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch
|
||||||
{
|
{
|
||||||
Console.WriteLine(e);
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
return response is not null && response.IsSuccessStatusCode;
|
return response is not null && response.IsSuccessStatusCode;
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
namespace Backend.Helper;
|
||||||
|
|
||||||
|
public static class ProjectPathHelper
|
||||||
|
{
|
||||||
|
public static string GetProjectPath()
|
||||||
|
{
|
||||||
|
return new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory).Parent!.Parent!.Parent!.Parent!.FullName;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
using FuzzySharp;
|
|
||||||
using Models.Handler;
|
|
||||||
using Models.Model.External;
|
|
||||||
|
|
||||||
namespace Backend.Helper;
|
|
||||||
|
|
||||||
public static class SearchHelper
|
|
||||||
{
|
|
||||||
public static SearchResults Search(string searchText, DbHandler dbHandler)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrWhiteSpace(searchText))
|
|
||||||
{
|
|
||||||
SearchResult searchResult = new();
|
|
||||||
searchResult.Description = "asd";
|
|
||||||
searchResult.Title = "asd";
|
|
||||||
searchResult.Url = "asd";
|
|
||||||
SearchResults searchResults = new();
|
|
||||||
searchResults.Results =
|
|
||||||
[
|
|
||||||
searchResult
|
|
||||||
];
|
|
||||||
return searchResults;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<SearchResult?> temp = dbHandler.GetSearchResults();
|
|
||||||
SearchResults searchResultsList = new();
|
|
||||||
|
|
||||||
for (int i = 0; i < temp.Count; i++)
|
|
||||||
{
|
|
||||||
if (temp[i] is null) continue;
|
|
||||||
|
|
||||||
SearchResult result = new();
|
|
||||||
|
|
||||||
if (Fuzz.Ratio(searchText, temp[i]!.Url) <= 50 && Fuzz.Ratio(searchText, temp[i]!.Title) <= 50) continue;
|
|
||||||
|
|
||||||
result.Url = temp[i]?.Url;
|
|
||||||
result.Title = temp[i]?.Title;
|
|
||||||
|
|
||||||
searchResultsList.Results.Add(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
return searchResultsList;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +1,24 @@
|
|||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
|
using Models.Model.Backend;
|
||||||
|
|
||||||
namespace Backend.Helper;
|
namespace Backend.Helper;
|
||||||
|
|
||||||
public static class TcpClientHelper
|
public static class TcpClientHelper
|
||||||
{
|
{
|
||||||
public static (int, int) CheckPort(string ip, params int[] ports)
|
public static (int, int) CheckPort(Ip ip, params int[] ports)
|
||||||
{
|
{
|
||||||
// This would be way cleaner if the TcpClient didn't throw an exception if the destination couldn't be reached,
|
// This would be way cleaner if the TcpClient didn't throw an exception if the destination couldn't be reached,
|
||||||
// and it would just return a result.error, for example.
|
// and it would just return a result.error, for example.
|
||||||
for (int i = 0; i < ports.Length; i++) {
|
for (int i = 0; i < ports.Length; i++) {
|
||||||
|
using Socket socket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||||
|
socket.SendTimeout = 250;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using TcpClient client = new();
|
socket.Connect(new IPEndPoint(IPAddress.Parse(ip.ToString()), ports[i]));
|
||||||
client.Connect(ip, ports[i]);
|
socket.Close();
|
||||||
// If the connection is successful, update the result array with the port number
|
// If the connection is not successful, update the ports array with 0.
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
|
|||||||
+2
-1
@@ -1,8 +1,9 @@
|
|||||||
using Backend.Handler;
|
using Backend.Handler;
|
||||||
|
using Backend.Helper;
|
||||||
|
|
||||||
Console.WriteLine("Program started");
|
Console.WriteLine("Program started");
|
||||||
|
|
||||||
ThreadHandler threadHandler = new();
|
ThreadHandler threadHandler = new(ProjectPathHelper.GetProjectPath());
|
||||||
threadHandler.Start();
|
threadHandler.Start();
|
||||||
|
|
||||||
Console.WriteLine("Done");
|
Console.WriteLine("Done");
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
curl -k -vvI -m 10 https://"$1" &> 443Header.txt
|
curl -k -vvI -m 10 https://"$1" &> "$2"
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
curl -k -vvI -m 10 http://"$1" &> 80Header.txt
|
curl -k -vvI -m 10 http://"$1" &> "$2"
|
||||||
|
#80Header.txt
|
||||||
|
|||||||
@@ -1,90 +0,0 @@
|
|||||||
using MessagePack;
|
|
||||||
using Models.Model.External;
|
|
||||||
using NetMQ;
|
|
||||||
using NetMQ.Sockets;
|
|
||||||
|
|
||||||
namespace Manager;
|
|
||||||
|
|
||||||
public static class Commands
|
|
||||||
{
|
|
||||||
public static void GetProgress()
|
|
||||||
{
|
|
||||||
Console.WriteLine("Getting progress ...");
|
|
||||||
|
|
||||||
CommunicationObject communicationObject = new();
|
|
||||||
communicationObject.Command = CommunicationCommand.GetScanningProgress;
|
|
||||||
|
|
||||||
ScanningStatus temp = GetProgress(communicationObject);
|
|
||||||
|
|
||||||
Console.WriteLine($"Total filtered: {temp.TotalFiltered:n0}");
|
|
||||||
Console.WriteLine($"Total discarded: {temp.TotalDiscarded:n0}");
|
|
||||||
Console.WriteLine($"Total percentage scanned: {temp.PercentageOfIpv4Scanned}");
|
|
||||||
Console.WriteLine($"Total Ips left: {temp.AmountOfIpv4Left:n0}");
|
|
||||||
Console.WriteLine($"Filtered DB size: {temp.FilteredDbSize} Kb");
|
|
||||||
Console.WriteLine($"Discarded DB size: {temp.DiscardedDbSize} Kb");
|
|
||||||
Console.WriteLine($"Mydb DB size: {temp.MyDbSize} Kb");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void StopServer()
|
|
||||||
{
|
|
||||||
CommunicationObject communicationObject = new();
|
|
||||||
communicationObject.Command = CommunicationCommand.StopScanning;
|
|
||||||
|
|
||||||
Console.WriteLine(SendAndRecieveStringMessage(communicationObject));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Vacuum()
|
|
||||||
{
|
|
||||||
CommunicationObject communicationObject = new();
|
|
||||||
communicationObject.Command = CommunicationCommand.DbVacuum;
|
|
||||||
|
|
||||||
Console.WriteLine(SendAndRecieveStringMessage(communicationObject));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void ReIndex()
|
|
||||||
{
|
|
||||||
CommunicationObject communicationObject = new();
|
|
||||||
communicationObject.Command = CommunicationCommand.DbReindex;
|
|
||||||
|
|
||||||
Console.WriteLine(SendAndRecieveStringMessage(communicationObject));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void GetHelp()
|
|
||||||
{
|
|
||||||
Console.WriteLine("Available commands:");
|
|
||||||
Console.WriteLine(" stop - stops the server");
|
|
||||||
Console.WriteLine(" clear - clears the console");
|
|
||||||
Console.WriteLine(" q - quits the program");
|
|
||||||
Console.WriteLine(" p - print the progress information of the scanner");
|
|
||||||
Console.WriteLine(" g - manual garbage collect on the server");
|
|
||||||
Console.WriteLine(" r - manual reindex the databases");
|
|
||||||
Console.WriteLine(" v - manual vacuum the databases");
|
|
||||||
Console.WriteLine(" help - shows this help");
|
|
||||||
Console.WriteLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string SendAndRecieveStringMessage(CommunicationObject communicationObject)
|
|
||||||
{
|
|
||||||
byte[] bytes = MessagePackSerializer.Serialize(communicationObject);
|
|
||||||
|
|
||||||
using RequestSocket client = new();
|
|
||||||
client.Connect("tcp://127.0.0.1:5556");
|
|
||||||
client.SendFrame(bytes);
|
|
||||||
byte[] msg = client.ReceiveFrameBytes();
|
|
||||||
client.Close();
|
|
||||||
return MessagePackSerializer.Deserialize<string>(msg, MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static ScanningStatus GetProgress(CommunicationObject communicationObject)
|
|
||||||
{
|
|
||||||
byte[] bytes = MessagePackSerializer.Serialize(communicationObject);
|
|
||||||
|
|
||||||
using RequestSocket client = new();
|
|
||||||
client.Connect("tcp://127.0.0.1:5556");
|
|
||||||
client.SendFrame(bytes);
|
|
||||||
byte[] msg = client.ReceiveFrameBytes();
|
|
||||||
client.Close();
|
|
||||||
|
|
||||||
return MessagePackSerializer.Deserialize<ScanningStatus>(msg, MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
|
|
||||||
<PublishAot>true</PublishAot>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<!--<PublishAot>true</PublishAot>-->
|
|
||||||
<PublishTrimmed>true</PublishTrimmed>
|
|
||||||
<TrimMode>link</TrimMode>
|
|
||||||
<TrimmerRemoveSymbols>true</TrimmerRemoveSymbols>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\Models\Models.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="MessagePack" Version="3.0.238-rc.1" />
|
|
||||||
<PackageReference Include="MessagePack.Annotations" Version="3.0.238-rc.1" />
|
|
||||||
<PackageReference Include="MessagePackAnalyzer" Version="3.0.238-rc.1">
|
|
||||||
<PrivateAssets>all</PrivateAssets>
|
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
||||||
</PackageReference>
|
|
||||||
<PackageReference Include="NetMQ" Version="4.0.1.13" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
using Manager;
|
|
||||||
|
|
||||||
bool stop = false;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
string? input = Console.ReadLine();
|
|
||||||
|
|
||||||
if (string.Equals(input, "stop"))
|
|
||||||
{
|
|
||||||
Commands.StopServer();
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (string.Equals(input, "q"))
|
|
||||||
{
|
|
||||||
stop = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (string.Equals(input, "clear"))
|
|
||||||
{
|
|
||||||
Console.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (string.Equals(input, "p"))
|
|
||||||
{
|
|
||||||
Commands.GetProgress();
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (string.Equals(input, "v"))
|
|
||||||
{
|
|
||||||
Commands.Vacuum();
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (string.Equals(input, "r"))
|
|
||||||
{
|
|
||||||
Commands.ReIndex();
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (string.Equals(input, "help"))
|
|
||||||
{
|
|
||||||
Commands.GetHelp();
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Commands.GetHelp();
|
|
||||||
}
|
|
||||||
|
|
||||||
} while (!stop);
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,39 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.NetworkInformation;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using Models.Model.Backend;
|
||||||
|
namespace Models.Experimental;
|
||||||
|
public class CustomPing
|
||||||
|
{
|
||||||
|
public static IPStatus SendIcmpEchoRequestOverRawSocket(IPAddress address, int timeout)
|
||||||
|
{
|
||||||
|
SocketConfig socketConfig = new SocketConfig(new IPEndPoint(address, 0), timeout, (CustomProtocolType) 1, RawSocket.CreateSendMessageBuffer(new() {Type = 8}));
|
||||||
|
using Socket rawSocket = RawSocket.GetRawSocket(socketConfig);
|
||||||
|
int ipHeaderLength = 20;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
rawSocket.SendTo(socketConfig.SendBuffer, 0, socketConfig.SendBuffer.Length, SocketFlags.None, socketConfig.EndPoint);
|
||||||
|
byte[] numArray = new byte[136];
|
||||||
|
long timestamp = Stopwatch.GetTimestamp();
|
||||||
|
|
||||||
|
// TODO: WTF ???
|
||||||
|
EndPoint lol = socketConfig.EndPoint;
|
||||||
|
|
||||||
|
while (Stopwatch.GetElapsedTime(timestamp).TotalMilliseconds < timeout)
|
||||||
|
{
|
||||||
|
int from = rawSocket.ReceiveFrom(numArray, SocketFlags.None, ref lol);
|
||||||
|
|
||||||
|
IPStatus status;
|
||||||
|
if (from - ipHeaderLength >= 8 && RawSocket.TryGetPingReply(numArray, from, ref ipHeaderLength, out status))
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (SocketException ex) when (ex.SocketErrorCode == SocketError.TimedOut)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
return IPStatus.TimedOut;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
using System.Net.NetworkInformation;
|
||||||
|
namespace Models.Experimental;
|
||||||
|
public struct MessageConstant
|
||||||
|
{
|
||||||
|
public static IPStatus MapV4TypeToIpStatus(int type, int code)
|
||||||
|
{
|
||||||
|
IPStatus ipStatus1;
|
||||||
|
switch ((IcmpV4MessageType) type)
|
||||||
|
{
|
||||||
|
case IcmpV4MessageType.EchoReply:
|
||||||
|
ipStatus1 = IPStatus.Success;
|
||||||
|
break;
|
||||||
|
case IcmpV4MessageType.DestinationUnreachable:
|
||||||
|
IPStatus ipStatus2;
|
||||||
|
switch ((byte) code)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
ipStatus2 = IPStatus.DestinationNetworkUnreachable;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
ipStatus2 = IPStatus.DestinationHostUnreachable;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
ipStatus2 = IPStatus.DestinationProtocolUnreachable;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
ipStatus2 = IPStatus.DestinationPortUnreachable;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ipStatus2 = IPStatus.DestinationUnreachable;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ipStatus1 = ipStatus2;
|
||||||
|
break;
|
||||||
|
case IcmpV4MessageType.SourceQuench:
|
||||||
|
ipStatus1 = IPStatus.SourceQuench;
|
||||||
|
break;
|
||||||
|
case IcmpV4MessageType.TimeExceeded:
|
||||||
|
ipStatus1 = IPStatus.TtlExpired;
|
||||||
|
break;
|
||||||
|
case IcmpV4MessageType.ParameterProblemBadIpHeader:
|
||||||
|
ipStatus1 = IPStatus.BadHeader;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ipStatus1 = IPStatus.Unknown;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ipStatus1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal enum IcmpV4MessageType : byte
|
||||||
|
{
|
||||||
|
EchoReply = 0,
|
||||||
|
DestinationUnreachable = 3,
|
||||||
|
SourceQuench = 4,
|
||||||
|
TimeExceeded = 11, // 0x0B
|
||||||
|
ParameterProblemBadIpHeader = 12, // 0x0C
|
||||||
|
}
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
using System.Net;
|
||||||
|
using System.Net.NetworkInformation;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using Models.Model.Backend;
|
||||||
|
|
||||||
|
namespace Models.Experimental;
|
||||||
|
|
||||||
|
public class RawSocket
|
||||||
|
{
|
||||||
|
public static unsafe Socket GetRawSocket(SocketConfig socketConfig)
|
||||||
|
{
|
||||||
|
Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, (ProtocolType)socketConfig.ProtocolType);
|
||||||
|
rawSocket.ReceiveTimeout = socketConfig.Timeout;
|
||||||
|
rawSocket.SendTimeout = socketConfig.Timeout;
|
||||||
|
rawSocket.Connect(socketConfig.EndPoint);
|
||||||
|
int num = 1;
|
||||||
|
rawSocket.SetRawSocketOption(0, 11, new ReadOnlySpan<byte>((void*) &num, 4));
|
||||||
|
return rawSocket;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool TryGetPingReply(byte[] receiveBuffer, int bytesReceived, ref int ipHeaderLength, out IPStatus reply)
|
||||||
|
{
|
||||||
|
byte num = (byte) (receiveBuffer[0] & 15U);
|
||||||
|
ipHeaderLength = 4 * num;
|
||||||
|
|
||||||
|
int start = ipHeaderLength;
|
||||||
|
int srcOffset = ipHeaderLength + 8;
|
||||||
|
|
||||||
|
IcmpHeader icmpHeader = Unsafe.ReadUnaligned<IcmpHeader>(ref MemoryMarshal.GetReference<byte>(receiveBuffer.AsSpan<byte>(start)));
|
||||||
|
byte[] numArray = new byte[bytesReceived - srcOffset];
|
||||||
|
Buffer.BlockCopy(receiveBuffer, srcOffset, numArray, 0, numArray.Length);
|
||||||
|
reply = MessageConstant.MapV4TypeToIpStatus(icmpHeader.Type, icmpHeader.Code);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static unsafe byte[] CreateSendMessageBuffer(IcmpHeader icmpHeader)
|
||||||
|
{
|
||||||
|
int length = sizeof (IcmpHeader);
|
||||||
|
byte[] sendMessageBuffer = new byte[length];
|
||||||
|
new Span<byte>((void*) &icmpHeader, length).CopyTo(new Span<byte>(sendMessageBuffer, 0, length));
|
||||||
|
ushort bufferChecksum = ComputeBufferChecksum(sendMessageBuffer.AsSpan<byte>(0));
|
||||||
|
sendMessageBuffer[2] = (byte) ((uint) bufferChecksum >> 8);
|
||||||
|
sendMessageBuffer[3] = (byte) (bufferChecksum & byte.MaxValue);
|
||||||
|
return sendMessageBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ushort ComputeBufferChecksum(ReadOnlySpan<byte> buffer)
|
||||||
|
{
|
||||||
|
uint num1 = 0;
|
||||||
|
for (int index = 0; index < buffer.Length; index += 2)
|
||||||
|
{
|
||||||
|
ushort num2 = (ushort) ((ushort) (buffer[index] << 8 & 65280) | (index + 1 < buffer.Length ? (ushort) (buffer[index + 1] & (uint) byte.MaxValue) : 0));
|
||||||
|
num1 += num2;
|
||||||
|
}
|
||||||
|
while (num1 >> 16 != 0U)
|
||||||
|
num1 = (num1 & ushort.MaxValue) + (num1 >> 16);
|
||||||
|
return (ushort) ~num1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SocketConfig
|
||||||
|
{
|
||||||
|
public EndPoint EndPoint;
|
||||||
|
public readonly int Timeout;
|
||||||
|
public readonly CustomProtocolType ProtocolType;
|
||||||
|
public readonly byte[] SendBuffer;
|
||||||
|
|
||||||
|
public SocketConfig(
|
||||||
|
EndPoint endPoint,
|
||||||
|
int timeout,
|
||||||
|
CustomProtocolType protocolType,
|
||||||
|
byte[] sendBuffer)
|
||||||
|
{
|
||||||
|
EndPoint = endPoint;
|
||||||
|
Timeout = timeout;
|
||||||
|
ProtocolType = protocolType;
|
||||||
|
SendBuffer = sendBuffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public struct IcmpHeader
|
||||||
|
{
|
||||||
|
public byte Type;
|
||||||
|
public byte Code;
|
||||||
|
public ushort HeaderChecksum;
|
||||||
|
public ushort Identifier;
|
||||||
|
public ushort SequenceNumber;
|
||||||
|
}
|
||||||
Binary file not shown.
+537
-247
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,50 @@
|
|||||||
|
using System.IO.Compression;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Models.Helper;
|
||||||
|
|
||||||
|
public static class CompressionHelper
|
||||||
|
{
|
||||||
|
public static void CompressFile(string sourceFile, string targetFile)
|
||||||
|
{
|
||||||
|
using FileStream originalFileStream = new(sourceFile, FileMode.Open);
|
||||||
|
using FileStream compressedFileStream = File.Create($"{targetFile}.gz");
|
||||||
|
using GZipStream compressor = new(compressedFileStream, CompressionLevel.SmallestSize);
|
||||||
|
originalFileStream.CopyTo(compressor);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DecompressFile(string sourceFile, string targetFile)
|
||||||
|
{
|
||||||
|
using FileStream compressedFileStream = new(sourceFile, FileMode.Open);
|
||||||
|
using FileStream decompressedFileStream = File.Create($"{targetFile}.gz");
|
||||||
|
using GZipStream decompressor = new(compressedFileStream, CompressionMode.Decompress);
|
||||||
|
decompressor.CopyTo(decompressedFileStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string CompressString(string text)
|
||||||
|
{
|
||||||
|
byte[] byteArray = Encoding.UTF8.GetBytes(text);
|
||||||
|
|
||||||
|
using MemoryStream memoryStream = new();
|
||||||
|
|
||||||
|
using (BrotliStream compressionStream = new(memoryStream, CompressionLevel.SmallestSize))
|
||||||
|
{
|
||||||
|
compressionStream.Write(byteArray, 0, byteArray.Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Convert.ToBase64String(memoryStream.ToArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string DecompressString(string compressedText)
|
||||||
|
{
|
||||||
|
byte[] byteArray = Convert.FromBase64String(compressedText);
|
||||||
|
|
||||||
|
using MemoryStream memoryStream = new(byteArray);
|
||||||
|
|
||||||
|
using BrotliStream decompressionStream = new(memoryStream, CompressionMode.Decompress);
|
||||||
|
|
||||||
|
using StreamReader reader = new(decompressionStream);
|
||||||
|
|
||||||
|
return reader.ReadToEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
namespace Models.Helper;
|
||||||
|
|
||||||
|
public static class GetDatabasesHelper
|
||||||
|
{
|
||||||
|
public static int GetTotalCompressedDatabases(string path)
|
||||||
|
{
|
||||||
|
return Directory.GetFiles(path, "*.gz").Length;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
namespace Models.Model.Backend;
|
||||||
|
|
||||||
|
public enum CustomProtocolType
|
||||||
|
{
|
||||||
|
Icmp = 1
|
||||||
|
}
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
using MessagePack;
|
|
||||||
|
|
||||||
namespace Models.Model.Backend;
|
|
||||||
|
|
||||||
[MessagePackObject]
|
|
||||||
public struct DatabaseSizes
|
|
||||||
{
|
|
||||||
[Key(0)]
|
|
||||||
public double DiscardedDbSize { get; set; }
|
|
||||||
|
|
||||||
[Key(1)]
|
|
||||||
public double FilteredDbSize { get; set; }
|
|
||||||
|
|
||||||
[Key(2)]
|
|
||||||
public double MyDbSize { get; set; }
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
namespace Models.Model.Backend;
|
namespace Models.Model.Backend;
|
||||||
|
|
||||||
public class Discarded
|
public struct Discarded
|
||||||
{
|
{
|
||||||
public string Ip { get; set; } = "";
|
public Ip Ip { get; set; }
|
||||||
|
|
||||||
public int ResponseCode { get; set; }
|
public int ResponseCode { get; set; }
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace Models.Model.Backend;
|
||||||
|
|
||||||
|
public struct FilterQueueItem
|
||||||
|
{
|
||||||
|
public Ip Ip { get; set; }
|
||||||
|
public int ResponseCode { get; set; }
|
||||||
|
}
|
||||||
@@ -2,11 +2,7 @@ namespace Models.Model.Backend;
|
|||||||
|
|
||||||
public class Filtered
|
public class Filtered
|
||||||
{
|
{
|
||||||
public string Ip { get; set; } = "";
|
public Ip Ip { get; set; }
|
||||||
public string Title1 { get; set; } = "";
|
|
||||||
public string Title2 { get; set; } = "";
|
|
||||||
public string Description1 { get; set; } = "";
|
|
||||||
public string Description2 { get; set; } = "";
|
|
||||||
public string Url1 { get; set; } = "";
|
public string Url1 { get; set; } = "";
|
||||||
public string Url2 { get; set; } = "";
|
public string Url2 { get; set; } = "";
|
||||||
public int Port1 { get; set; }
|
public int Port1 { get; set; }
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
namespace Models.Model.Backend;
|
||||||
|
|
||||||
|
public struct Ip
|
||||||
|
{
|
||||||
|
public int Ip1 { get; set; }
|
||||||
|
|
||||||
|
public int Ip2 { get; set; }
|
||||||
|
|
||||||
|
public int Ip3 { get; set; }
|
||||||
|
|
||||||
|
public int Ip4 { get; set; }
|
||||||
|
|
||||||
|
public int ResponseCode { get; set; }
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"{Ip1}.{Ip2}.{Ip3}.{Ip4}";
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint PackIp()
|
||||||
|
{
|
||||||
|
return (uint)(Ip1 << 24) | (uint)(Ip2 << 16) | (uint)(Ip3 << 8) | (uint)Ip4;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,5 +4,4 @@ public enum Operations
|
|||||||
{
|
{
|
||||||
Insert,
|
Insert,
|
||||||
Update,
|
Update,
|
||||||
Optimize,
|
|
||||||
}
|
}
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
namespace Models.Model.Backend;
|
|
||||||
|
|
||||||
public class QueueItem
|
|
||||||
{
|
|
||||||
public Unfiltered? Unfiltered { get; init; }
|
|
||||||
public Filtered? Filtered { get; init; }
|
|
||||||
public ScannerResumeObject? ResumeObject { get; init; }
|
|
||||||
public Operations Operations { get; init; }
|
|
||||||
}
|
|
||||||
@@ -9,4 +9,7 @@ public class ScannerResumeObject
|
|||||||
public int ThirdByte { get; set; }
|
public int ThirdByte { get; set; }
|
||||||
public int FourthByte { get; set; }
|
public int FourthByte { get; set; }
|
||||||
public int ThreadNumber { get; set; }
|
public int ThreadNumber { get; set; }
|
||||||
|
public Operations Operation { get; set; }
|
||||||
|
public bool Paused { get; set; }
|
||||||
|
public bool Completed { get; set; }
|
||||||
}
|
}
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
namespace Models.Model.Backend;
|
|
||||||
public enum SizeUnits
|
|
||||||
{
|
|
||||||
Byte,
|
|
||||||
KB,
|
|
||||||
MB,
|
|
||||||
GB,
|
|
||||||
}
|
|
||||||
@@ -1,16 +1,14 @@
|
|||||||
namespace Models.Model.Backend;
|
namespace Models.Model.Backend;
|
||||||
|
|
||||||
public class Unfiltered
|
public struct Unfiltered
|
||||||
{
|
{
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
public string Ip { get; set; } = "";
|
public Ip Ip { get; set; }
|
||||||
|
|
||||||
public int ResponseCode { get; init; }
|
|
||||||
|
|
||||||
public int Port1 { get; set; }
|
public int Port1 { get; set; }
|
||||||
|
|
||||||
public int Port2 { get; set; }
|
public int Port2 { get; set; }
|
||||||
|
|
||||||
public int Filtered { get; set; }
|
public bool Filtered { get; set; }
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace Models.Model.Backend;
|
||||||
|
|
||||||
|
public struct UnfilteredQueueItem
|
||||||
|
{
|
||||||
|
public Unfiltered Unfiltered { get; init; }
|
||||||
|
public Operations Operations { get; init; }
|
||||||
|
}
|
||||||
-10
@@ -1,10 +0,0 @@
|
|||||||
namespace Models.Model.External;
|
|
||||||
|
|
||||||
public enum CommunicationCommand
|
|
||||||
{
|
|
||||||
GetScanningProgress,
|
|
||||||
GetSearches,
|
|
||||||
StopScanning,
|
|
||||||
DbReindex,
|
|
||||||
DbVacuum,
|
|
||||||
}
|
|
||||||
-13
@@ -1,13 +0,0 @@
|
|||||||
using MessagePack;
|
|
||||||
|
|
||||||
namespace Models.Model.External;
|
|
||||||
|
|
||||||
[MessagePackObject]
|
|
||||||
public class CommunicationObject
|
|
||||||
{
|
|
||||||
[Key(0)]
|
|
||||||
public CommunicationCommand Command { get; set; }
|
|
||||||
|
|
||||||
[Key(1)]
|
|
||||||
public string? SearchTerm { get; set; }
|
|
||||||
}
|
|
||||||
-13
@@ -1,13 +0,0 @@
|
|||||||
using MessagePack;
|
|
||||||
|
|
||||||
namespace Models.Model.External;
|
|
||||||
|
|
||||||
[MessagePackObject]
|
|
||||||
public class CommunicationResult
|
|
||||||
{
|
|
||||||
[Key(0)]
|
|
||||||
public List<SearchResult?>? Result { get; set; }
|
|
||||||
|
|
||||||
[Key(1)]
|
|
||||||
public ScanningStatus? Status { get; set; }
|
|
||||||
}
|
|
||||||
-29
@@ -1,29 +0,0 @@
|
|||||||
using MessagePack;
|
|
||||||
using Models.Model.Backend;
|
|
||||||
|
|
||||||
namespace Models.Model.External;
|
|
||||||
|
|
||||||
[MessagePackObject]
|
|
||||||
public struct ScanningStatus
|
|
||||||
{
|
|
||||||
[Key(0)]
|
|
||||||
public float PercentageOfIpv4Scanned { get; set; }
|
|
||||||
|
|
||||||
[Key(1)]
|
|
||||||
public long TotalFiltered { get; set; }
|
|
||||||
|
|
||||||
[Key(2)]
|
|
||||||
public long AmountOfIpv4Left { get; set; }
|
|
||||||
|
|
||||||
[Key(3)]
|
|
||||||
public long TotalDiscarded { get; set; }
|
|
||||||
|
|
||||||
[Key(4)]
|
|
||||||
public double DiscardedDbSize { get; set; }
|
|
||||||
|
|
||||||
[Key(5)]
|
|
||||||
public double FilteredDbSize { get; set; }
|
|
||||||
|
|
||||||
[Key(6)]
|
|
||||||
public double MyDbSize { get; set; }
|
|
||||||
}
|
|
||||||
-8
@@ -1,8 +0,0 @@
|
|||||||
namespace Models.Model.External;
|
|
||||||
|
|
||||||
public class SearchResult
|
|
||||||
{
|
|
||||||
public string? Title { get; set; } = "";
|
|
||||||
public string? Url { get; set; } = "";
|
|
||||||
public string? Description { get; set; } = "";
|
|
||||||
}
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
namespace Models.Model.External;
|
|
||||||
|
|
||||||
public class SearchResults
|
|
||||||
{
|
|
||||||
public List<SearchResult?>? Results { get; set; }
|
|
||||||
}
|
|
||||||
@@ -1,19 +1,13 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net9.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="MessagePack" Version="3.0.238-rc.1" />
|
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.1" />
|
||||||
<PackageReference Include="MessagePack.Annotations" Version="3.0.238-rc.1" />
|
|
||||||
<PackageReference Include="MessagePackAnalyzer" Version="3.0.238-rc.1">
|
|
||||||
<PrivateAssets>all</PrivateAssets>
|
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
||||||
</PackageReference>
|
|
||||||
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.10" />
|
|
||||||
<PackageReference Include="SQLite" Version="3.13.0" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
|
||||||
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=models_005Cbackend/@EntryIndexedValue">False</s:Boolean>
|
|
||||||
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=models_005Cinternal/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
|
||||||
Binary file not shown.
@@ -0,0 +1,112 @@
|
|||||||
|
VACUUM;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "ServerType" (
|
||||||
|
"ServerId" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"Type" TEXT NOT NULL UNIQUE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "HttpVersion" (
|
||||||
|
"HttpId" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"Version" TEXT NOT NULL UNIQUE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "CertificateIssuerCountry" (
|
||||||
|
"CertificateIssuerId" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"Country" TEXT NOT NULL UNIQUE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "CertificateOrganizationName" (
|
||||||
|
"CertificateOrganizationId" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"Name" TEXT NOT NULL UNIQUE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "TlsVersion" (
|
||||||
|
"TlsId" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"Version" TEXT NOT NULL UNIQUE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "CipherSuite" (
|
||||||
|
"CipherId" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"Suite" TEXT NOT NULL UNIQUE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "KeyExchangeAlgorithm" (
|
||||||
|
"KeyExchangeId" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"Algorithm" TEXT NOT NULL UNIQUE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "PublicKeyType" (
|
||||||
|
"PublicKeyId" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"Type" TEXT NOT NULL UNIQUE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "AcceptEncoding" (
|
||||||
|
"AcceptId" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"Encoding" TEXT NOT NULL UNIQUE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "ALPN" (
|
||||||
|
"ALPNId" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"ALPNValue" TEXT NOT NULL UNIQUE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "Connection" (
|
||||||
|
"ConnectionId" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
"ConnectionValue" TEXT NOT NULL UNIQUE
|
||||||
|
);
|
||||||
|
|
||||||
|
DROP TABLE Filtered;
|
||||||
|
|
||||||
|
CREATE TABLE "Filtered" (
|
||||||
|
"Id" INTEGER NOT NULL,
|
||||||
|
"Ip1" INTEGER NOT NULL,
|
||||||
|
"Ip2" INTEGER NOT NULL,
|
||||||
|
"Ip3" INTEGER NOT NULL,
|
||||||
|
"Ip4" INTEGER NOT NULL,
|
||||||
|
"Port1" INTEGER NOT NULL,
|
||||||
|
"Port2" INTEGER NOT NULL,
|
||||||
|
"Title1" TEXT NOT NULL,
|
||||||
|
"Title2" TEXT NOT NULL,
|
||||||
|
"Description1" TEXT NOT NULL,
|
||||||
|
"Description2" TEXT NOT NULL,
|
||||||
|
"Url1" TEXT NOT NULL,
|
||||||
|
"Url2" TEXT NOT NULL,
|
||||||
|
"ServerType1" INTEGER NOT NULL,
|
||||||
|
"ServerType2" INTEGER NOT NULL,
|
||||||
|
"RobotsTXT1" TEXT NOT NULL,
|
||||||
|
"RobotsTXT2" TEXT NOT NULL,
|
||||||
|
"HttpVersion1" INTEGER NOT NULL,
|
||||||
|
"HttpVersion2" INTEGER NOT NULL,
|
||||||
|
"CertificateIssuerCountry" INTEGER NOT NULL,
|
||||||
|
"CertificateOrganizationName" INTEGER NOT NULL,
|
||||||
|
"IpV6" TEXT NOT NULL,
|
||||||
|
"TlsVersion" INTEGER NOT NULL,
|
||||||
|
"CipherSuite" INTEGER NOT NULL,
|
||||||
|
"KeyExchangeAlgorithm" INTEGER NOT NULL,
|
||||||
|
"PublicKeyType1" INTEGER NOT NULL,
|
||||||
|
"PublicKeyType2" INTEGER NOT NULL,
|
||||||
|
"PublicKeyType3" INTEGER NOT NULL,
|
||||||
|
"AcceptEncoding1" INTEGER NOT NULL,
|
||||||
|
"AcceptEncoding2" INTEGER NOT NULL,
|
||||||
|
"ALPN" INTEGER NOT NULL,
|
||||||
|
"Connection1" INTEGER NOT NULL,
|
||||||
|
"Connection2" INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY("Id" AUTOINCREMENT),
|
||||||
|
FOREIGN KEY("ALPN") REFERENCES "ALPN"("ALPNId"),
|
||||||
|
FOREIGN KEY("AcceptEncoding1") REFERENCES "AcceptEncoding"("AcceptId"),
|
||||||
|
FOREIGN KEY("AcceptEncoding2") REFERENCES "AcceptEncoding"("AcceptId"),
|
||||||
|
FOREIGN KEY("CertificateIssuerCountry") REFERENCES "CertificateIssuerCountry"("CertificateIssuerId"),
|
||||||
|
FOREIGN KEY("CertificateOrganizationName") REFERENCES "CertificateOrganizationName"("CertificateOrganizationId"),
|
||||||
|
FOREIGN KEY("CipherSuite") REFERENCES "CipherSuite"("CipherId"),
|
||||||
|
FOREIGN KEY("Connection1") REFERENCES "Connection"("ConnectionId"),
|
||||||
|
FOREIGN KEY("Connection2") REFERENCES "Connection"("ConnectionId"),
|
||||||
|
FOREIGN KEY("HttpVersion1") REFERENCES "HttpVersion"("HttpId"),
|
||||||
|
FOREIGN KEY("HttpVersion2") REFERENCES "HttpVersion"("HttpId"),
|
||||||
|
FOREIGN KEY("KeyExchangeAlgorithm") REFERENCES "KeyExchangeAlgorithm"("KeyExchangeId"),
|
||||||
|
FOREIGN KEY("PublicKeyType1") REFERENCES "PublicKeyType"("PublicKeyId"),
|
||||||
|
FOREIGN KEY("PublicKeyType2") REFERENCES "PublicKeyType"("PublicKeyId"),
|
||||||
|
FOREIGN KEY("PublicKeyType3") REFERENCES "PublicKeyType"("PublicKeyId"),
|
||||||
|
FOREIGN KEY("ServerType1") REFERENCES "ServerType"("ServerId"),
|
||||||
|
FOREIGN KEY("ServerType2") REFERENCES "ServerType"("ServerId"),
|
||||||
|
FOREIGN KEY("TlsVersion") REFERENCES "TlsVersion"("TlsId")
|
||||||
|
)
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
DROP TABLE Unfiltered;
|
||||||
|
|
||||||
|
CREATE TABLE "Unfiltered" (
|
||||||
|
"Id" INTEGER NOT NULL,
|
||||||
|
"Ip1" INTEGER NOT NULL,
|
||||||
|
"Ip2" INTEGER NOT NULL,
|
||||||
|
"Ip3" INTEGER NOT NULL,
|
||||||
|
"Ip4" INTEGER NOT NULL,
|
||||||
|
"Port1" INTEGER NOT NULL,
|
||||||
|
"Port2" INTEGER NOT NULL,
|
||||||
|
"Filtered" INTEGER NOT NULL,
|
||||||
|
CONSTRAINT "PK_Unfiltered" PRIMARY KEY("Id" AUTOINCREMENT)
|
||||||
|
)
|
||||||
Binary file not shown.
@@ -1,71 +0,0 @@
|
|||||||
using System.Text.Json;
|
|
||||||
using System.Text.Json.Serialization;
|
|
||||||
using MessagePack;
|
|
||||||
using Microsoft.AspNetCore.Cors.Infrastructure;
|
|
||||||
using Models.Model.External;
|
|
||||||
using NetMQ;
|
|
||||||
using NetMQ.Sockets;
|
|
||||||
|
|
||||||
WebApplicationBuilder builder = WebApplication.CreateSlimBuilder(args);
|
|
||||||
|
|
||||||
builder.Services.ConfigureHttpJsonOptions(options =>
|
|
||||||
{
|
|
||||||
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
|
|
||||||
});
|
|
||||||
|
|
||||||
builder.Services.AddCors(options =>
|
|
||||||
{
|
|
||||||
options.AddPolicy("CorsPolicy", x => x.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader().Build());
|
|
||||||
});
|
|
||||||
|
|
||||||
WebApplication app = builder.Build();
|
|
||||||
|
|
||||||
app.UseCors();
|
|
||||||
|
|
||||||
RouteGroupBuilder progressApi = app.MapGroup("/progress");
|
|
||||||
progressApi.AllowAnonymous();
|
|
||||||
progressApi.DisableAntiforgery();
|
|
||||||
progressApi.MapGet("/", () =>
|
|
||||||
{
|
|
||||||
CommunicationObject communicationObject = new()
|
|
||||||
{
|
|
||||||
Command = CommunicationCommand.GetScanningProgress
|
|
||||||
};
|
|
||||||
|
|
||||||
byte[] bytes = MessagePackSerializer.Serialize(communicationObject);
|
|
||||||
|
|
||||||
using RequestSocket client = new();
|
|
||||||
client.Connect("tcp://127.0.0.1:5556");
|
|
||||||
client.SendFrame(bytes);
|
|
||||||
byte[] msg = client.ReceiveFrameBytes();
|
|
||||||
client.Close();
|
|
||||||
|
|
||||||
return MessagePackSerializer.Deserialize<ScanningStatus>(msg, MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray));
|
|
||||||
});
|
|
||||||
|
|
||||||
RouteGroupBuilder searchApi = app.MapGroup("/search");
|
|
||||||
progressApi.AllowAnonymous();
|
|
||||||
searchApi.MapGet("/{term}", (string term) =>
|
|
||||||
{
|
|
||||||
CommunicationObject communicationObject = new();
|
|
||||||
communicationObject.Command = CommunicationCommand.GetSearches;
|
|
||||||
communicationObject.SearchTerm = term;
|
|
||||||
|
|
||||||
byte[] bytes = MessagePackSerializer.Serialize(communicationObject);
|
|
||||||
|
|
||||||
using RequestSocket client = new();
|
|
||||||
client.Connect("tcp://127.0.0.1:5556");
|
|
||||||
client.SendFrame(bytes);
|
|
||||||
string msg = client.ReceiveFrameString();
|
|
||||||
client.Close();
|
|
||||||
|
|
||||||
return JsonSerializer.Deserialize<SearchResults?>(msg);
|
|
||||||
});
|
|
||||||
|
|
||||||
app.Run();
|
|
||||||
|
|
||||||
[JsonSerializable(typeof(ScanningStatus))]
|
|
||||||
[JsonSerializable(typeof(SearchResults))]
|
|
||||||
internal partial class AppJsonSerializerContext : JsonSerializerContext
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "http://json.schemastore.org/launchsettings.json",
|
|
||||||
"profiles": {
|
|
||||||
"http": {
|
|
||||||
"commandName": "Project",
|
|
||||||
"dotnetRunMessages": true,
|
|
||||||
"launchBrowser": true,
|
|
||||||
"launchUrl": "",
|
|
||||||
"applicationUrl": "http://localhost:5224",
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<InvariantGlobalization>true</InvariantGlobalization>
|
|
||||||
<PublishAot>true</PublishAot>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="MessagePack" Version="3.0.238-rc.1" />
|
|
||||||
<PackageReference Include="MessagePack.Annotations" Version="3.0.238-rc.1" />
|
|
||||||
<PackageReference Include="MessagePackAnalyzer" Version="3.0.238-rc.1">
|
|
||||||
<PrivateAssets>all</PrivateAssets>
|
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
||||||
</PackageReference>
|
|
||||||
<PackageReference Include="NetMQ" Version="4.0.1.13" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\Models\Models.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
@Proxy_HostAddress = http://localhost:5224
|
|
||||||
|
|
||||||
GET {{Proxy_HostAddress}}/progress/
|
|
||||||
Accept: application/json
|
|
||||||
|
|
||||||
###
|
|
||||||
|
|
||||||
GET {{Proxy_HostAddress}}/search/asd
|
|
||||||
Accept: application/json
|
|
||||||
|
|
||||||
###
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"Logging": {
|
|
||||||
"LogLevel": {
|
|
||||||
"Default": "Information",
|
|
||||||
"Microsoft.AspNetCore": "Warning"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"Logging": {
|
|
||||||
"LogLevel": {
|
|
||||||
"Default": "Information",
|
|
||||||
"Microsoft.AspNetCore": "Warning"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"AllowedHosts": "*"
|
|
||||||
}
|
|
||||||
@@ -2,4 +2,8 @@
|
|||||||
|
|
||||||
Rasmus Search Engine
|
Rasmus Search Engine
|
||||||
|
|
||||||
This is just a hobby project I'm working on at the moment. (Rasmus is my name BTW lol)
|
This is just a hobby project I'm working on at the moment. (Rasmus is my name BTW lol)
|
||||||
|
|
||||||
|
This is also an "Anything goes" type of project. I'm not really aiming for correctness or any other type of paradigm or architecture.
|
||||||
|
|
||||||
|
I'm just trying to minimize memory usage while maximizing performance.
|
||||||
|
|||||||
@@ -4,11 +4,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Backend", "Backend\Backend.
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Models", "Models\Models.csproj", "{3B0DFF2F-334A-4039-9510-EB4DDB2C5100}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Models", "Models\Models.csproj", "{3B0DFF2F-334A-4039-9510-EB4DDB2C5100}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Manager", "Manager\Manager.csproj", "{B8F0548D-356C-48B4-909B-D6CC317E3772}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Analyze", "Analyze\Analyze.csproj", "{7B0C666E-DC4F-4008-9933-08AF5FAB0099}"
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Proxy", "Proxy\Proxy.csproj", "{55208481-5203-4B25-A20D-4EF644F76773}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "Shared\Shared.csproj", "{DEB1411C-F45A-40DA-92F8-D9B9929DBA5B}"
|
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@@ -24,17 +20,9 @@ Global
|
|||||||
{3B0DFF2F-334A-4039-9510-EB4DDB2C5100}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{3B0DFF2F-334A-4039-9510-EB4DDB2C5100}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{3B0DFF2F-334A-4039-9510-EB4DDB2C5100}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{3B0DFF2F-334A-4039-9510-EB4DDB2C5100}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{3B0DFF2F-334A-4039-9510-EB4DDB2C5100}.Release|Any CPU.Build.0 = Release|Any CPU
|
{3B0DFF2F-334A-4039-9510-EB4DDB2C5100}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{B8F0548D-356C-48B4-909B-D6CC317E3772}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{7B0C666E-DC4F-4008-9933-08AF5FAB0099}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{B8F0548D-356C-48B4-909B-D6CC317E3772}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{7B0C666E-DC4F-4008-9933-08AF5FAB0099}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{B8F0548D-356C-48B4-909B-D6CC317E3772}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{7B0C666E-DC4F-4008-9933-08AF5FAB0099}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{B8F0548D-356C-48B4-909B-D6CC317E3772}.Release|Any CPU.Build.0 = Release|Any CPU
|
{7B0C666E-DC4F-4008-9933-08AF5FAB0099}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{55208481-5203-4B25-A20D-4EF644F76773}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{55208481-5203-4B25-A20D-4EF644F76773}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{55208481-5203-4B25-A20D-4EF644F76773}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{55208481-5203-4B25-A20D-4EF644F76773}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{DEB1411C-F45A-40DA-92F8-D9B9929DBA5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{DEB1411C-F45A-40DA-92F8-D9B9929DBA5B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{DEB1411C-F45A-40DA-92F8-D9B9929DBA5B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{DEB1411C-F45A-40DA-92F8-D9B9929DBA5B}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|||||||
+39
-20
@@ -1,23 +1,42 @@
|
|||||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003A02000006pdb6Low_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003FILViewer_003Fd17d4b69379a42eb90f15b17ef6c846a5400_003F39_003F1eeed291_003F02000006pdb6Low_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003A02000002pdb1Low_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003FILViewer_003F51b607df472a454cb6ed940749bbfdfd6000_003Fde_003F2c578873_003F02000002pdb1Low_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003A02000007pdb1Low_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003FILViewer_003F096da63313a8436fb75089601a728c765200_003Fbb_003Ff6383783_003F02000007pdb1Low_002Ecs_002Fz_003A2_002D1/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003A02000009pdb7Low_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003FILViewer_003Fbbcfe225942e4131bc589e82ae4b92ab9800_003Fc0_003Fa20d693d_003F02000009pdb7Low_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003A02000007pdb1Low_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003FILViewer_003F357247e747614c8297021dd08d79da3d5200_003Ff2_003Fc4ae8c87_003F02000007pdb1Low_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003A0200000Cpdb6Low_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003FILViewer_003Fb53c196a821648e4ae3b142a6ae58d7b9400_003Fa8_003F21a43479_003F0200000Cpdb6Low_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003A02000010pdb3Low_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003FILViewer_003F80cf8253b0c2409096d0c0e368300af28200_003Fdd_003F8098fc19_003F02000010pdb3Low_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003A0200000Dpdb9Low_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003FILViewer_003Fe0d70616f09e43d786491f7daf762067ce00_003Fde_003F0a28485b_003F0200000Dpdb9Low_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003A02000011pdb4Low_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003FILViewer_003F1f6cfdd1e3a14f6390237f6ab98b06af8000_003F0d_003Febdca535_003F02000011pdb4Low_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003A02000011pdb3Low_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003FILViewer_003F7c3ed02c2ce44598b7f304f8ac45e58f8600_003F6d_003F99b875d1_003F02000011pdb3Low_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAttributes_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F9a4cb3a98df697f884fa5f45bc79e4291fa3e948c7f42560e14678e12055e_003FAttributes_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AConcurrentQueueSegment_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F4f72364deba8e6142d1f42386f1fd282d2e8c6bca41d389c28da4c3835d90_003FConcurrentQueueSegment_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAttribute_002ECoreCLR_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fbb9be2cb8efb72a7d2286fbdd10a293b55b3e2a912f49fac6a7719673268e4b_003FAttribute_002ECoreCLR_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AConcurrentQueue_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fb049a159646b52d2dd6ced21de315f79dff86421243e94ffd4f29c6f7e4df25_003FConcurrentQueue_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AConcurrentQueue_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fb049a159646b52d2dd6ced21de315f79dff86421243e94ffd4f29c6f7e4df25_003FConcurrentQueue_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AConsole_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F2ccd2056ec55b7b67558d52e32a887ed5ac7e346fc429b218c188d0a99cb5be_003FConsole_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AConcurrentQueue_00601_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb8417950f7e54f048304227d9faf80e9d1be00_003F85_003Fa8fb60ce_003FConcurrentQueue_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFormatters_002EMessagePack_002EGeneratedMessagePackResolver_002EModels_002EModel_002EExternal_002ESearchResultsFormatter_002Eg_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F99b5d033f8bfb58a6a753ca88a3d956f2228bd48_003FFormatters_002EMessagePack_002EGeneratedMessagePackResolver_002EModels_002EModel_002EExternal_002ESearchResultsFormatter_002Eg_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADirectoryInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fe4ec446cfe0489bc3ef68a45c6766d183e999ebdc657e94fb1ad059de2bb9_003FDirectoryInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFuture_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F13cbfe6856867dd1ed4e39575e46d816dae2a146a8ceec8f76b5897f5e0fe_003FFuture_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADnsEndPoint_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F7aa62fd0fbc144a6818ff7b2fd2626dc34800_003F3d_003F64a36162_003FDnsEndPoint_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpContent_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F5a55e5df9328b51021ba85b8f12ff49eca8772dba9772c0d61d5e28edf255c_003FHttpContent_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fbf9021a960b74107a7e141aa06bc9d8a0a53c929178c2fb95b1597be8af8dc_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpMethodAttribute_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F2e4732e712a98f9ac0d080ac68669b3db6d98781e0d5ad89886cb6bcc890b18_003FHttpMethodAttribute_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFileSystemEnumerator_002EUnix_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F233863917bb42f133182fb4926e94ef8139c6f704da0c4574a8de3209f4761_003FFileSystemEnumerator_002EUnix_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIFormatterResolver_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fc7d856f45ddf907f9face6c2bdba7836cc70fed4bb2b8ebd83ee6917584af3_003FIFormatterResolver_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpResponseMessage_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F85e97f467d698c9e98eae9e3a1b39d58541173e57992d8f7111eabdd3db3526_003FHttpResponseMessage_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIOThread_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F125fae6d49819da7be4fb21fbb4a936a7ec325971cf9264a24af55bf7111ad8_003FIOThread_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIcmpV6MessageType_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F0a3c9a6c6f0343119978ec009640fbbb18000_003F4e_003Fec7b627f_003FIcmpV6MessageType_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIPStatus_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F8fe420eaf60c4dfca87ce1d5f1cdfa4816200_003Fbd_003F71bcce16_003FIPStatus_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIPAddressParser_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F5a18f227dadd72bd8268cdb333cd70aa19d8663c3610d541cda4fd0199acbf4_003FIPAddressParser_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMessagePackSerializer_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fe5f8b0187e62d74a4b9fefd657c192dab367bb342ef5ffbd90a4ed2ea428ec7a_003FMessagePackSerializer_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIPAddress_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F7aa62fd0fbc144a6818ff7b2fd2626dc34800_003F48_003Fb056cfcf_003FIPAddress_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APingOptions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F77bf2fbffc5491eadd62f1dbebc233798cd7fcb9b39ab7ee3bb35519f4d94ecc_003FPingOptions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIPAddress_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fdcb058a821641cccb63e4a61914bd75ed5d336dda19353b41994ef1159c85bec_003FIPAddress_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIPStatus_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F6079bfa8f3c0474bb21ade75ce5d010318000_003F15_003F57afed32_003FIPStatus_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APingReply_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F76f05f4da452fadb1ab24cdb83dccb74b6e6484519e28acc6ce2c02c7aabac24_003FPingReply_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APing_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F0a3c9a6c6f0343119978ec009640fbbb18000_003F44_003F939f4a86_003FPing_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APing_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F3080b18e3637ea741b5b65abd6aee06e41494a82a58b3e2ed87d4ddb5cc62_003FPing_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APing_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F3080b18e3637ea741b5b65abd6aee06e41494a82a58b3e2ed87d4ddb5cc62_003FPing_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APing_002EUnix_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F8d57f5f5fd3290d6a89a5b767ad89988dd893c988eba430cd461b8b88d7ad9d_003FPing_002EUnix_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AProcess_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F4682fe5857f946a98dcb2cd6f0a403983f200_003F3d_003Fca9070b2_003FProcess_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATask_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F35f3a54f5acb408a3e219b2de039f1a39557b7e4515f11238cba07b60c0ce_003FTask_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARateLimitRule_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F8fbca8b1bca27d45830c443b2c773d979015ea216430366f285514a39fc0b9_003FRateLimitRule_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATextWriter_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fdda89b2ed0975050b6847325357a756a5866a5435e3ddb4feff535ba36facb7_003FTextWriter_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARawSocketPermissions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F0a3c9a6c6f0343119978ec009640fbbb18000_003Fc7_003Fb8dcfca9_003FRawSocketPermissions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASocket_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fc90597e9198b448fad8f1fd970196b198c600_003Ffc_003F32090d76_003FSocket_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASocket_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fed603888eeb1f16770cbbbb8321a5999df9d8962d9b5cb4d5de621123659_003FSocket_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASqliteCommand_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F7af32a60b614a4736554243e7b8aba5c9a167efe6e7254e6648651482183_003FSqliteCommand_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASqliteConnection_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fc1d827416891bc9ceaece7826dbd14f2ab1ef304d85bcc1f2187646a67c3c_003FSqliteConnection_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASqliteDataReader_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Ff74c15be4ebfb9eebdf1d29c607aa58a3dd7cfccafcbf075c7887256d97ccb40_003FSqliteDataReader_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASqliteDataRecord_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fb6b6fc545335beb5092e3c9821a4d1f34b5ef02f42bcfb7c872755f5d8f19_003FSqliteDataRecord_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASqliteException_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F154220569126135ad5d7314bf2bc694d3cf7c95840d481d44f0336f4f1f8e9c_003FSqliteException_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASqliteParameterCollection_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F56cf675b4777645c714ae85e12bde2163da8ec62d2a23f8b35ef357547a9_003FSqliteParameterCollection_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AStackFrameIterator_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F1d0213738b064ff59eef90be1f87fbbbd19c00_003F13_003Fbe8f056e_003FStackFrameIterator_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AStartupExtensions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F3ce5d581dd9cc0e4cdfd914e797ba2da05e894767d76b86f0515ef5226bac_003FStartupExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AStreamReader_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb8417950f7e54f048304227d9faf80e9d1be00_003F53_003F95e505fc_003FStreamReader_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AString_002ESearching_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F49ee52518952e16b89adee3d6c9346ae6c74be268730f0497eb14b34b49d56c_003FString_002ESearching_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATaskToAsyncResult_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F66952b4c92d2c944c42ecf9237964f8d12a6feb1734b428a866a643c391da59_003FTaskToAsyncResult_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATCPClient_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F48f66bd9377db6244f6f84da3534394e9416923c69d34598df3ea5864e75d_003FTCPClient_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThread_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F1d0213738b064ff59eef90be1f87fbbbd19c00_003F90_003F0588ec81_003FThread_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThread_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F693e634d7742afaf486acd69d84fe2a9e1ee1b11ba84f29cd1d67668d20dd59_003FThread_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWaitHandle_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F9f559e1a197aae3f0e896a08ca2436e5665aa18fbf73266415afd59de3b943_003FWaitHandle_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
namespace Shared;
|
|
||||||
|
|
||||||
public class Class1
|
|
||||||
{
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.7 MiB |
@@ -0,0 +1,24 @@
|
|||||||
|
# Nuxt dev/build outputs
|
||||||
|
.output
|
||||||
|
.data
|
||||||
|
.nuxt
|
||||||
|
.nitro
|
||||||
|
.cache
|
||||||
|
dist
|
||||||
|
|
||||||
|
# Node dependencies
|
||||||
|
node_modules
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
.DS_Store
|
||||||
|
.fleet
|
||||||
|
.idea
|
||||||
|
|
||||||
|
# Local env files
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
# Nuxt Minimal Starter
|
||||||
|
|
||||||
|
Look at the [Nuxt documentation](https://nuxt.com/docs/getting-started/introduction) to learn more.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
Make sure to install dependencies:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# npm
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# pnpm
|
||||||
|
pnpm install
|
||||||
|
|
||||||
|
# yarn
|
||||||
|
yarn install
|
||||||
|
|
||||||
|
# bun
|
||||||
|
bun install
|
||||||
|
```
|
||||||
|
|
||||||
|
## Development Server
|
||||||
|
|
||||||
|
Start the development server on `http://localhost:3000`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# npm
|
||||||
|
npm run dev
|
||||||
|
|
||||||
|
# pnpm
|
||||||
|
pnpm dev
|
||||||
|
|
||||||
|
# yarn
|
||||||
|
yarn dev
|
||||||
|
|
||||||
|
# bun
|
||||||
|
bun run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
## Production
|
||||||
|
|
||||||
|
Build the application for production:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# npm
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# pnpm
|
||||||
|
pnpm build
|
||||||
|
|
||||||
|
# yarn
|
||||||
|
yarn build
|
||||||
|
|
||||||
|
# bun
|
||||||
|
bun run build
|
||||||
|
```
|
||||||
|
|
||||||
|
Locally preview production build:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# npm
|
||||||
|
npm run preview
|
||||||
|
|
||||||
|
# pnpm
|
||||||
|
pnpm preview
|
||||||
|
|
||||||
|
# yarn
|
||||||
|
yarn preview
|
||||||
|
|
||||||
|
# bun
|
||||||
|
bun run preview
|
||||||
|
```
|
||||||
|
|
||||||
|
Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information.
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
useHead({
|
||||||
|
title: 'Rasmus Search Engine',
|
||||||
|
meta: [
|
||||||
|
{ name: 'description', content: 'Just a search engine for fun' },
|
||||||
|
{ name: 'lang', content: 'en'}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="navbar navbar-expand-md navbar-dark bg-dark">
|
||||||
|
<ul>
|
||||||
|
<li><nuxt-link to="/">Search</nuxt-link></li>
|
||||||
|
<li><nuxt-link to="/progress">Progress</nuxt-link></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<NuxtPage page-key="static" />
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
@tailwind base;
|
||||||
|
@tailwind components;
|
||||||
|
@tailwind utilities;
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
// https://nuxt.com/docs/api/configuration/nuxt-config
|
||||||
|
export default defineNuxtConfig({
|
||||||
|
compatibilityDate: '2024-12-16',
|
||||||
|
ssr: true,
|
||||||
|
|
||||||
|
devtools: { enabled: true },
|
||||||
|
css: ['@/assets/css/main.css'],
|
||||||
|
|
||||||
|
postcss: {
|
||||||
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
nitro: {
|
||||||
|
static: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
modules: ['@nuxtjs/tailwindcss', 'nuxt-purgecss'],
|
||||||
|
});
|
||||||
Generated
+11204
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"name": "nuxt-app",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"build": "nuxt build",
|
||||||
|
"dev": "nuxt dev",
|
||||||
|
"generate": "nuxt generate",
|
||||||
|
"preview": "nuxt preview",
|
||||||
|
"postinstall": "nuxt prepare"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@nuxtjs/partytown": "^1.5.0",
|
||||||
|
"nuxt": "^3.14.1592",
|
||||||
|
"vue": "latest",
|
||||||
|
"vue-router": "latest"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@nuxtjs/tailwindcss": "^6.12.2",
|
||||||
|
"autoprefixer": "^10.4.20",
|
||||||
|
"nuxt-purgecss": "^2.0.0",
|
||||||
|
"postcss": "^8.4.49",
|
||||||
|
"tailwindcss": "^3.4.16"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
const value = ref<string | null>(null)
|
||||||
|
|
||||||
|
// https://nuxt.com/docs/api/components/nuxt-link#nuxtlink
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="h-screen flex items-center justify-center">
|
||||||
|
<div class="flex space-x-2">
|
||||||
|
<input v-model="value" placeholder=".NET C#" class="text-center bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg p-2.5 w-192"/>
|
||||||
|
<nuxt-link :to="`/searchResult?search=${value}`" class="text-gray-900 bg-gray-50 border border-gray-300 px-4 py-2 rounded-lg">Search</nuxt-link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { fetchWithCache } from '~/utils/cacheUtil';
|
||||||
|
import { progressTypeToDictionary } from '~/utils/convertProgressTypeToDictionary';
|
||||||
|
|
||||||
|
const data = ref<ProgressType | null>(null);
|
||||||
|
const loading = ref<boolean>(true);
|
||||||
|
const error = ref<string | null>(null);
|
||||||
|
let dict = ref<ProgressDictionary[] | null>(null);
|
||||||
|
|
||||||
|
const fetchMyData = async () => {
|
||||||
|
try {
|
||||||
|
loading.value = true;
|
||||||
|
|
||||||
|
// Use the caching utility
|
||||||
|
data.value = await fetchWithCache<ProgressType>(
|
||||||
|
'Progress',
|
||||||
|
async () => {
|
||||||
|
const response = await fetch('https://proxy.rbwr.dk/progress');
|
||||||
|
if (!response.ok) throw new Error('API fetch failed');
|
||||||
|
return (await response.json()) as ProgressType;
|
||||||
|
},
|
||||||
|
5 // Cache max age in seconds
|
||||||
|
);
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
error.value = (err as Error).message;
|
||||||
|
} finally {
|
||||||
|
loading.value = false;
|
||||||
|
|
||||||
|
if (data.value !== null) {
|
||||||
|
dict.value = progressTypeToDictionary(data.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
fetchMyData();
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="h-screen grid place-items-center">
|
||||||
|
<table class="table-auto border-gray-300">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="px-4 py-2">Metric</th>
|
||||||
|
<th class="px-4 py-2">Value</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody v-if="dict">
|
||||||
|
<tr v-for="d in dict">
|
||||||
|
<td class="px-4 py-2">{{d.description}}</td>
|
||||||
|
<td class="px-4 py-2">{{d.value}}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
<tbody v-else>
|
||||||
|
<tr>
|
||||||
|
<td class="px-4 py-2">Percentage of Ipv4 scanned</td>
|
||||||
|
<td class="px-4 py-2"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="px-4 py-2">Total filtered</td>
|
||||||
|
<td class="px-4 py-2"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="px-4 py-2">Total Discarded</td>
|
||||||
|
<td class="px-4 py-2"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="px-4 py-2">Amount of Ipv4 left</td>
|
||||||
|
<td class="px-4 py-2"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="px-4 py-2">Discarded db size</td>
|
||||||
|
<td class="px-4 py-2"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="px-4 py-2">Filtered db size</td>
|
||||||
|
<td class="px-4 py-2"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="px-4 py-2">Unfiltered db size</td>
|
||||||
|
<td class="px-4 py-2"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
const route = useRoute();
|
||||||
|
console.log(route.query);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
|
||||||
|
</template>
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 4.2 KiB |
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"extends": "../.nuxt/tsconfig.server.json"
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
/** @type {import('tailwindcss').Config} */
|
||||||
|
export default {
|
||||||
|
content: [
|
||||||
|
"./components/**/*.{js,vue,ts}",
|
||||||
|
"./layouts/**/*.vue",
|
||||||
|
"./pages/**/*.vue",
|
||||||
|
"./plugins/**/*.{js,ts}",
|
||||||
|
"./app.vue",
|
||||||
|
"./error.vue",
|
||||||
|
],
|
||||||
|
theme: {
|
||||||
|
extend: {
|
||||||
|
width: {
|
||||||
|
'128': '32rem',
|
||||||
|
'192' : '48rem',
|
||||||
|
'256': '64rem',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
plugins: [],
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
// https://nuxt.com/docs/guide/concepts/typescript
|
||||||
|
"extends": "./.nuxt/tsconfig.json"
|
||||||
|
}
|
||||||
Vendored
+29
@@ -0,0 +1,29 @@
|
|||||||
|
interface ProgressType {
|
||||||
|
percentageOfIpv4Scanned: number; // assuming this is a number
|
||||||
|
totalFiltered: bigint;
|
||||||
|
amountOfIpv4Left: bigint;
|
||||||
|
totalDiscarded: bigint;
|
||||||
|
discardedDbSize: bigint;
|
||||||
|
filteredDbSize: bigint;
|
||||||
|
myDbSize: bigint;
|
||||||
|
};
|
||||||
|
|
||||||
|
interface ProgressDictionary {
|
||||||
|
description: string;
|
||||||
|
value: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
interface SearchResult {
|
||||||
|
title: string;
|
||||||
|
description: string;
|
||||||
|
url: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
interface SearchResults {
|
||||||
|
results: SearchResult[];
|
||||||
|
};
|
||||||
|
|
||||||
|
type CacheEntry<T> = {
|
||||||
|
data: T;
|
||||||
|
timestamp: number;
|
||||||
|
};
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
export function fetchWithCache<Type>(
|
||||||
|
cacheKey: string,
|
||||||
|
fetchFunction: () => Promise<Type>,
|
||||||
|
maxAge: number = 5 // 30 seconds
|
||||||
|
): Promise<Type> {
|
||||||
|
return new Promise(async (resolve, reject) => {
|
||||||
|
try {
|
||||||
|
const cachedData = localStorage.getItem(cacheKey);
|
||||||
|
|
||||||
|
if (cachedData) {
|
||||||
|
const { data, timestamp } = JSON.parse(cachedData) as CacheEntry<Type>;
|
||||||
|
const now = Date.now();
|
||||||
|
const ageInSeconds = (now - timestamp) / 1000;
|
||||||
|
|
||||||
|
// Check if cache is still valid
|
||||||
|
if (ageInSeconds < maxAge) {
|
||||||
|
return resolve(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cache is missing or expired, fetch fresh data
|
||||||
|
const freshData = await fetchFunction();
|
||||||
|
const cacheEntry: CacheEntry<Type> = {
|
||||||
|
data: freshData,
|
||||||
|
timestamp: Date.now(),
|
||||||
|
};
|
||||||
|
|
||||||
|
localStorage.setItem(cacheKey, JSON.stringify(cacheEntry));
|
||||||
|
resolve(freshData);
|
||||||
|
} catch (error) {
|
||||||
|
reject(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
export function progressTypeToDictionary(progress: ProgressType) {
|
||||||
|
return [
|
||||||
|
{ description: "Percentage of Ipv4 scanned", value: progress.percentageOfIpv4Scanned.toString() },
|
||||||
|
{ description: "Total filtered", value: progress.totalFiltered.toString() },
|
||||||
|
{ description: "Total Discarded", value: progress.totalDiscarded.toString() },
|
||||||
|
{ description: "Amount of Ipv4 left", value: progress.amountOfIpv4Left.toString() },
|
||||||
|
{ description: "Discarded db size", value: progress.discardedDbSize.toString() },
|
||||||
|
{ description: "Filtered db size", value: progress.filteredDbSize.toString() },
|
||||||
|
{ description: "Unfiltered db size", value: progress.myDbSize.toString() },
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"sdk": {
|
||||||
|
"version": "9.0.0",
|
||||||
|
"rollForward": "latestMajor",
|
||||||
|
"allowPrerelease": true
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user